En este momento, cuando aparece una instancia, el sitio predeterminado se establece en example.com (por alguna razón).
Cambie eso o agregue instrucciones para cambiar la identificación del sitio al dominio real que se está utilizando.
Lo que es peor, si elimino example.com de la lista de sitios, obtengo 'Error del servidor (500)' y la instalación se vuelve inutilizable.
Esto es lo que hay en los registros de mailman-web:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 39, in inner
response = get_response(request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
response = self._get_response(request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/site-packages/postorius/views/list.py", line 593, in list_index
'domain_count': len(choosable_domains)})
File "/usr/local/lib/python2.7/site-packages/django/shortcuts.py", line 30, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "/usr/local/lib/python2.7/site-packages/django/template/loader.py", line 68, in render_to_string
return template.render(context, request)
File "/usr/local/lib/python2.7/site-packages/django/template/backends/django.py", line 66, in render
return self.template.render(context)
File "/usr/local/lib/python2.7/site-packages/django/template/base.py", line 206, in render
with context.bind_template(self):
File "/usr/local/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/usr/local/lib/python2.7/site-packages/django/template/context.py", line 236, in bind_template
updates.update(processor(self.request))
File "/usr/local/lib/python2.7/site-packages/django_mailman3/context_processors.py", line 33, in common
context["site_name"] = get_current_site(request).name
File "/usr/local/lib/python2.7/site-packages/django/contrib/sites/shortcuts.py", line 15, in get_current_site
return Site.objects.get_current(request)
File "/usr/local/lib/python2.7/site-packages/django/contrib/sites/models.py", line 65, in get_current
return self._get_site_by_id(site_id)
File "/usr/local/lib/python2.7/site-packages/django/contrib/sites/models.py", line 35, in _get_site_by_id
site = self.get(pk=site_id)
File "/usr/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 385, in get
self.model._meta.object_name
DoesNotExist: Site matching query does not exist.
@ulrith Sí, necesitas cambiar el SITE_ID
predeterminado en la configuración de Django a cualquier sitio que estés usando.
Por defecto, el valor es 1 en el settings.py
del contenedor y corresponde a example.com.
Debería cambiarlo a 2, que supongo que apuntaría a su dominio en settings_local.py
. Puede agregar lo siguiente:
SITE_ID=2
@maxking Sería mejor si pudiera reemplazar example.com por mi dominio real con algún comando como lo mencioné en este comentario . O por consulta sql en el contenedor de la base de datos ... ¿Pueden ayudarme?
@ulrith Sí, la línea de comando de Django lo llevará a un REPL de Python donde puede hacer lo que desee, incluso en la base de datos de producción ;-)
maxking<strong i="7">@mailman</strong>:~$ docker exec -it mailman-web python manage.py shell
Python 2.7.13 (default, Jun 21 2017, 18:14:15)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.db import models
>>> from django.contrib.sites.models import Site
>>> Site.objects.all()
<QuerySet [<Site: lists.araj.me>]>
>>> Site.objects.create(name='Random Domain', domain='mail.araj.me')
<Site: mail.araj.me>
>>> Site.objects.all()
<QuerySet [<Site: lists.araj.me>, <Site: mail.araj.me>]>
>>> for each in Site.objects.all():
... print(each.domain, each.id)
...
(u'lists.araj.me', 2)
(u'mail.araj.me', 3)
Si necesita leer más sobre esto, aquí hay un enlace al marco de sitios de Django.
@maxking En realidad, no estoy familiarizado con Python. ¿Podría darme un fragmento de código (idealmente una línea) que reemplazará Site: example.com por Site: mydomain.tld para el Mailman 3 recién instalado?
Bien, resulta que Django crea el sitio examples.com
predeterminado y no hay forma de detener este comportamiento.
Entonces, estas son sus opciones si desea crear un nuevo sitio web durante el inicio.
python manage.py loaddata <nameoffixture>
y django carga esos datos en la base de datos. Por ejemplo:El archivo a continuación se guarda en fixtures/gen_site.yaml
:
- model: sites.Site
pk: 100
fields:
domain: gmail.com
name: Google
Luego, ejecuta python manage.py loaddata gen_site
y tiene su sitio creado automáticamente. Luego cambia su SITE_ID=100
en el settings_local.py
y todo debería funcionar!
Sin embargo, hacer esto ahora mismo con los contenedores probablemente sea difícil, ya que no hay una manera fácil de ejecutar comandos personalizados en el inicio (también llamado punto de entrada en la terminología de Docker). Abrí un nuevo número 61 para rastrear ese problema.
python manage.py shell -c "from django.contrib.sites.models import Site; mysite,_=Site.objects.get_or_create(id=101, name='mysite.tld', domain='mysite.tld'); print(mysite.id, mysite.name)"
Tenga en cuenta que el comando anterior está destinado a django, por lo que debe agregar docker-compose exec -T mailman-web
antes del comando anterior.
Este comando creará un nuevo sitio llamado mysite.tld
. También imprimirá el id
que luego tendrá que poner debajo de SITE_ID=101
y reiniciará su instancia de Django para que esto surta efecto. Este comando no fallará si el sitio ya existe en la base de datos.
Yo diría que esta tampoco es la mejor manera de hacerlo porque, en primer lugar, debe reiniciar el contenedor para que esto surta efecto (solo la primera vez, pero eso es igualmente malo) y, en segundo lugar, no hay forma de editar automáticamente el settings_local.py
para reflejar el nuevo SITE_ID
sin intervención manual, a menos que, por supuesto, escriba algo de magia sed
o awk
.
example.com
y actualizarlo al dominio que desee.python manage.py shell -c "from django.contrib.sites.models import Site; Site.objects.filter(domain='example.com').update(name='My Site', domain='mysite.tld')"
Esto no requeriría ningún cambio en ninguna parte, pero en mis pruebas locales descubrí que el nombre para mostrar en la parte superior no cambia a menos que reinicie el servidor Django, y solo será necesario por primera vez. Según yo, esta parece la mejor opción, después de la primera, a la que estoy dispuesto a agregar soporte en las imágenes del contenedor.
@maxking ¡ La última opción funciona a las
Debería resolverse.
La variable de entorno DEFAULT_FROM_DOMAIN ahora también reemplaza el dominio predeterminado example.com.
Sin embargo, la descripción no se cambia y se puede cambiar desde el sitio de administración de Django.
Corregido en # 95