Bootcamp: Ayuda para configurar la producción.

Creado en 17 oct. 2019  ·  12Comentarios  ·  Fuente: vitorfs/bootcamp

Hola, estoy tratando de poner en marcha Bootcamp como una red social para investigadores dentro de mi Universidad. Sin embargo, debido a algunas limitaciones, actualmente no puedo usar Caddy como proxy inverso para la implementación. En su lugar, uso nginx. Si es posible, ¿puede darme alguna orientación sobre los parámetros que debo especificar para el entorno de producción? Vi el archivo env.example pero como el proyecto es nuevo para mí, no sé cómo se conectan todos entre sí. Estoy atascado con el siguiente error

manage.py runworker: error: the following arguments are required: channels

Se agradece cualquier ayuda.

Support discussion help wanted

Comentario más útil

En mi caso, estoy usando python 3.7.1 en la máquina servidor de Ubuntu

Configuración opcional de la versión de Python
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1

Con este comando, python 3.7.1 es mi primera prioridad

Primero, instale el entorno en la máquina
sudo -H pip3 install virtualenv

cd /home/pages para cambiar a la carpeta correcta

mkdir bootcamp para crear la carpeta del proyecto

cd bootcamp/

crear env
virtualenv bootcampenv
Activa tu entorno
source bootcampenv/bin/activate

instalar gunicorn
pip3 install gunicorn

volver al directorio de páginas
cd ..
y crea una carpeta para el proyecto bootcamp

django-admin startproject bootcampprojectdir

cd bootcampprojectdir

E instala los requisitos
pip install -U -r requirements/production.txt

Si usa diferentes bases de datos o algo así, inicie la migración y recopile estadísticas

Actualice el firewall para permitir el puerto 8000
sudo ufw allow 8000

crear gunicorn wsgi
gunicorn --bind 0.0.0.0:8000 settings.wsgi

crear un socket del sistema
sudo nano /etc/systemd/system/gunicorn.socket

[Unidad]
Descripción = gunicorn.sock

[Enchufe]
ListenStream = / ejecutar / gunicorn.sock

[Instalar en pc]
WantedBy = sockets.target

crear un servicio
sudo nano /etc/systemd/system/gunicorn.service

[Unidad]
Descripción = demonio gunicorn
Requiere = gunicorn.socket
Después = network.target

[Servicio]
Usuario = páginas
Grupo = www-data
WorkingDirectory = / inicio / páginas / bootcampprojectdir / bootcampenv / bin / gunicorn
--access-logfile -
--trabajadores 3
- enlazar unix: run / gunicorn.sock
settings.wsgi.application

[Instalar en pc]
WantedBy = multi-user.target

habilitar todo
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket

revisalo
file /run/gunicorn.sock
Cuando no tienes ningún error, entonces está bien

Comprobar estado
sudo systemctl status gunicorn.socket

consultar servicio
curl --unix-socket /run/gunicorn.sock localhost

Cuando no ve el código htnl, algo con el servicio gunicorn.

asegúrese de que el servicio se esté ejecutando
sudo systemctl status gunicorn

Cuando todo esté bien, el siguiente paso NGinx pasa a Gunicorn
instalar nginx
sudo apt install nginx

crear un sitio en nginx
crear un servicio
sudo nano /etc/nginx/sites-available/bootcampproject

servidor {
escucha 80;
nombre_servidor 99.99.99.99

  location = /favicon.ico { access_log off; log_not_found off; }
  location /static/ {
        root /home/pages/bootcampprojectdir;
  }

localización / {
incluir proxy_params;
proxy_pass http: // unix : /run/gunicorn.sock;
}
}

guardar y copiar este archivo en sitios habilitados
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled

y verifique la configuración de nginx

sudo nginx -t

En caso de que no haya errores, reinicie nginx
sudo systemctl restart nginx

agregue puertos de firewall nginx, pero primero elimine el puerto 8000 de la prueba

sudo ufw delete allow 8000

agregar nginx
sudo ufw allow 'Nginx Full'

Todos 12 comentarios

Hola,
No estoy usando caddie. Estoy usando gunicorn para todos mis proyectos de django.

¿Instalaste todos los requisitos?
canales> = 2.1.1 # https://github.com/django/channels
canales-redis> = 2.2.1 # https://github.com/django/channels_redis

Puedes comprobarlo a través de la consola.

$ python -c "import channels"
$ echo $?

0 significa, existe
1 significa que el módulo no existe en el sistema

Los canales están instalados. Me encuentro con otro problema ahora. Aquí están mi archivo de Docker y .env. Tengo problemas con el servicio de trabajador. No estoy seguro de lo que hace. Realmente agradezco su ayuda, su proyecto es muy interesante y puede ayudar a mucha gente en mi universidad si este entra en producción.

env.txt

docker-compose.txt

Aquí está el registro de errores.

worker_1    | /usr/local/lib/python3.6/site-packages/daphne/server.py:13: UserWarning: Something has already installed a non-asyncio Twisted reactor. Attempting to uninstall it; you can fix this warning by importing daphne.server early in your codebase or finding the package that imports Twisted and importing it later on.
worker_1    |   UserWarning,
django_1    | DEBUG 2019-10-17 21:28:37,751 base 1 140450066271560 Configuring Raven for host: https://sentry.io
worker_1    | DEBUG 2019-10-17 21:28:35,663 base 1 140638836505928 Configuring Raven for host: https://sentry.io
worker_1    | Running worker for channels ['channels', 'notifications']
worker_1    | DEBUG 2019-10-17 21:28:36,297 base 1 140638836505928 Sending message of length 5534 to https://sentry.io/api/1782977/store/
worker_1    | Traceback (most recent call last):
worker_1    |   File "manage.py", line 30, in <module>
worker_1    |     execute_from_command_line(sys.argv)
worker_1    |   File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
worker_1    |     utility.execute()
worker_1    |   File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 375, in execute
worker_1    |     self.fetch_command(subcommand).run_from_argv(self.argv)
worker_1    |   File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 323, in run_from_argv
worker_1    |     self.execute(*args, **cmd_options)
worker_1    |   File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 364, in execute
worker_1    |     output = self.handle(*args, **options)
worker_1    |   File "/usr/local/lib/python3.6/site-packages/channels/management/commands/runworker.py", line 46, in handle
worker_1    |     worker.run()
worker_1    |   File "/usr/local/lib/python3.6/site-packages/asgiref/server.py", line 60, in run
worker_1    |     event_loop.run_until_complete(self.handle())
worker_1    |   File "/usr/local/lib/python3.6/asyncio/base_events.py", line 484, in run_until_complete
worker_1    |     return future.result()
worker_1    |   File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 30, in handle
worker_1    |     [listener.result() for listener in listeners]
worker_1    |   File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 30, in <listcomp>
worker_1    |     [listener.result() for listener in listeners]
worker_1    |   File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 37, in listener
worker_1    |     message = await self.channel_layer.receive(channel)
worker_1    |   File "/usr/local/lib/python3.6/site-packages/channels_redis/core.py", line 461, in receive
worker_1    |     return (await self.receive_single(channel))[1]

cambio en tu env
REDIS_URL=redis://127.0.0.1:6379

¿Puede mostrarme cómo configurar el servicio de trabajador? ¿Y por qué lo necesitamos? Nuevo en este proyecto, así que no estoy seguro de dónde buscar esa información.

uhh, es mucho. Esto no se hace en unos minutos ...

En primer lugar, compruebe si ha instalado todos los requisitos en el entorno de su servidor.

pip install -U -r requirements/production.txt

En segundo lugar, ¿su proyecto está funcionando a nivel local?

Configurar un proyecto no es posible sin todos los archivos. Y no soy el mejor para configurarlo. Puedo verificar mi configuración y compartir, pero esto NO está probado y aprobado para bootcamp. Puede que necesite configuraciones adicionales.

Estoy girando el servicio usando docker compose. La implementación local funciona bien, pero production.yml es algo totalmente diferente. Me refiero a redis, daphne, postgres. Si tiene un archivo de composición acoplable a mano en algún lugar, compártalo. Gracias

Obtenga Outlook para iOS https://aka.ms/o0ukef


De: samazaphikel [email protected]
Enviado: jueves 17 de octubre de 2019 5:03:30 p.m.
Para: vitorfs / bootcamp [email protected]
Cc: Tri Minh Pham [email protected] ; Autor [email protected]
Asunto: Re: [vitorfs / bootcamp] Ayuda para configurar la producción. (# 193)

uhh, es mucho. Esto no se hace en unos minutos ...

En primer lugar, compruebe si ha instalado todos los requisitos en el entorno de su servidor.

pip install -U -r requisitos / production.txt

En segundo lugar, ¿su proyecto está funcionando a nivel local?

Configurar un proyecto no es posible sin todos los archivos. Y no soy el mejor para configurarlo. Puedo verificar mi configuración y compartir, pero esto NO está probado y aprobado para bootcamp. Puede que necesite configuraciones adicionales.

-
Recibes esto porque eres el autor del hilo.
Responder a este correo electrónico directamente, visualizarla en GitHub https://github.com/vitorfs/bootcamp/issues/193?email_source=notifications&email_token=ADEK4AB5JEUP5LQ4APTJ6ITQPDOLFA5CNFSM4JB4YOCKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBRVI2A#issuecomment-543380584 , o darse de baja https://github.com/notifications/unsubscribe- auth / ADEK4ADBCG24WLWIT3IM6OLQPDOLFANCNFSM4JB4YOCA .

En mi caso, estoy usando python 3.7.1 en la máquina servidor de Ubuntu

Configuración opcional de la versión de Python
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1

Con este comando, python 3.7.1 es mi primera prioridad

Primero, instale el entorno en la máquina
sudo -H pip3 install virtualenv

cd /home/pages para cambiar a la carpeta correcta

mkdir bootcamp para crear la carpeta del proyecto

cd bootcamp/

crear env
virtualenv bootcampenv
Activa tu entorno
source bootcampenv/bin/activate

instalar gunicorn
pip3 install gunicorn

volver al directorio de páginas
cd ..
y crea una carpeta para el proyecto bootcamp

django-admin startproject bootcampprojectdir

cd bootcampprojectdir

E instala los requisitos
pip install -U -r requirements/production.txt

Si usa diferentes bases de datos o algo así, inicie la migración y recopile estadísticas

Actualice el firewall para permitir el puerto 8000
sudo ufw allow 8000

crear gunicorn wsgi
gunicorn --bind 0.0.0.0:8000 settings.wsgi

crear un socket del sistema
sudo nano /etc/systemd/system/gunicorn.socket

[Unidad]
Descripción = gunicorn.sock

[Enchufe]
ListenStream = / ejecutar / gunicorn.sock

[Instalar en pc]
WantedBy = sockets.target

crear un servicio
sudo nano /etc/systemd/system/gunicorn.service

[Unidad]
Descripción = demonio gunicorn
Requiere = gunicorn.socket
Después = network.target

[Servicio]
Usuario = páginas
Grupo = www-data
WorkingDirectory = / inicio / páginas / bootcampprojectdir / bootcampenv / bin / gunicorn
--access-logfile -
--trabajadores 3
- enlazar unix: run / gunicorn.sock
settings.wsgi.application

[Instalar en pc]
WantedBy = multi-user.target

habilitar todo
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket

revisalo
file /run/gunicorn.sock
Cuando no tienes ningún error, entonces está bien

Comprobar estado
sudo systemctl status gunicorn.socket

consultar servicio
curl --unix-socket /run/gunicorn.sock localhost

Cuando no ve el código htnl, algo con el servicio gunicorn.

asegúrese de que el servicio se esté ejecutando
sudo systemctl status gunicorn

Cuando todo esté bien, el siguiente paso NGinx pasa a Gunicorn
instalar nginx
sudo apt install nginx

crear un sitio en nginx
crear un servicio
sudo nano /etc/nginx/sites-available/bootcampproject

servidor {
escucha 80;
nombre_servidor 99.99.99.99

  location = /favicon.ico { access_log off; log_not_found off; }
  location /static/ {
        root /home/pages/bootcampprojectdir;
  }

localización / {
incluir proxy_params;
proxy_pass http: // unix : /run/gunicorn.sock;
}
}

guardar y copiar este archivo en sitios habilitados
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled

y verifique la configuración de nginx

sudo nginx -t

En caso de que no haya errores, reinicie nginx
sudo systemctl restart nginx

agregue puertos de firewall nginx, pero primero elimine el puerto 8000 de la prueba

sudo ufw delete allow 8000

agregar nginx
sudo ufw allow 'Nginx Full'

Hola @phamminhtris , me alegro de que estés utilizando el proyecto y de que te resulte útil. Hay dos formas principales de implementar el proyecto en un entorno de producción. El primero sería usar Docker, pero tiene sus advertencias y, obviamente, requiere una buena cantidad de familiaridad con Docker y docker-compose . Estoy lejos de ser un experto y por eso solo lo uso para el desarrollo, pero quizás puedas encontrar algo útil aquí .

La otra forma es implementar el proyecto tal como está, lo cual es "más fácil" (o al menos puedes encontrar más recursos y guías para implementarlo), solo recuerda cargar tu archivo .env con las variables requeridas, puede utilizar la versión de ejemplo incluida para comprender cómo declararlos.

¿Es suficiente usar gunicorn como único servidor? Vi que algunas de las funciones requerían un servidor de aplicaciones ASGI como daphne para servir el tráfico de sockets web. Por favor, corríjame si estoy equivocado. Gracias por su amable ayuda. Realmente aprecio eso.

Nginx es donde llegan primero las solicitudes de Internet. Puede manejarlos muy rápidamente y, por lo general, está configurado para dejar pasar solo esas solicitudes, que realmente necesitan llegar a su aplicación web.

Gunicorn traduce las solicitudes que recibe de Nginx a un formato que su aplicación web puede manejar y se asegura de que su código se ejecute cuando sea necesario.

Cada uno puede hacer algo, lo que el otro no puede.
Nginx es un servidor web y un proxy inverso. Está altamente optimizado para todas las cosas que necesita hacer un servidor web.

Ocúpese del enrutamiento del nombre de dominio (decide dónde deben ir las solicitudes o si corresponde una respuesta de error)
Sirve archivos estáticos
Manejar muchas solicitudes que llegan a la vez
Manejar clientes lentos
Reenvía las solicitudes que deben ser dinámicas a Gunicorn
Terminar SSL (https ocurre aquí)
Ahorre recursos informáticos (CPU y memoria) en comparación con su código Python
Y mucho más, si lo configura para hacerlo (balanceo de carga, almacenamiento en caché,…)

Gunicorn
Una vez que Nginx decida, se debe pasar una solicitud en particular a Gunicorn (debido a las reglas con las que la configuró).

Gunicorn está altamente optimizado y tiene muchas funciones convenientes.

Ejecutando un grupo de procesos / subprocesos de trabajo (¡ejecutando su código!)
Traduce las solicitudes provenientes de Nginx para que sean compatibles con WSGI
Traduzca las respuestas WSGI de su aplicación en respuestas http adecuadas
Realmente llama a su código Python cuando entra una solicitud
Gunicorn puede hablar con muchos servidores web diferentes
Gunicorn es solo uno de los muchos servidores WSGI válidos. A tu aplicación no le importa cuál uses, y a Nginx tampoco le importa.

Entiendo lo anterior. Sin embargo, este proyecto es bastante especial en términos de protocolo. Sirve una notificación a través de websocket y, según tengo entendido, necesitaremos más que un gunicorn y un nginx normales para impulsar la aplicación. Cuando ejecuto la ventana acoplable local redactar, me doy cuenta de que / Notifications no parece funcionar. Sé que estoy pidiendo mucho, pero realmente agradezco su tiempo y esfuerzo para ayudarme @samazaphikel. Probaré la configuración local (sin docker-compose, docker) solo ubuntu desnudo y ver si funciona. Gracias a todos

Guía muy útil. Clausura.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

norouzzadeh picture norouzzadeh  ·  3Comentarios

yashLadha picture yashLadha  ·  21Comentarios

Shekharnunia picture Shekharnunia  ·  6Comentarios

Shekharnunia picture Shekharnunia  ·  10Comentarios

mwanjajoel picture mwanjajoel  ·  5Comentarios