Bootcamp: Ajuda na configuração da produção.

Criado em 17 out. 2019  ·  12Comentários  ·  Fonte: vitorfs/bootcamp

Olá, estou tentando criar o Bootcamp como uma rede social para pesquisadores na minha universidade. No entanto, devido a algumas restrições, atualmente não posso usar caddy como proxy reverso para implantação. Em vez disso, uso o nginx. Se possível, você pode me dar alguma orientação sobre quais parâmetros preciso especificar para o ambiente de produção. Eu vi o arquivo env.example, mas como o projeto é novo para mim, não sei como tudo se conecta. Estou preso com o seguinte erro

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

Qualquer ajuda é apreciada.

Support discussion help wanted

Comentários muito úteis

No meu caso, IM usando python 3.7.1 na máquina servidor Ubuntu

Versão Python de configuração opcional
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1

Com este comando, python 3.7.1 é minha primeira prioridade

Primeiro, instale o ambiente na máquina
sudo -H pip3 install virtualenv

cd /home/pages para mudar para a pasta correta

mkdir bootcamp para criar a pasta do projeto

cd bootcamp/

criar env
virtualenv bootcampenv
Ative seu ambiente
source bootcampenv/bin/activate

instalar gunicorn
pip3 install gunicorn

voltar para o diretório de páginas
cd ..
e criar uma pasta para o projeto bootcamp

django-admin startproject bootcampprojectdir

cd bootcampprojectdir

E instale os requisitos
pip install -U -r requirements/production.txt

Se você usar diferentes bases de dados ou algo assim, inicie a migração e colete dados estáticos

Atualize o firewall para permitir a porta 8000
sudo ufw allow 8000

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

criar um soquete de sistema
sudo nano /etc/systemd/system/gunicorn.socket

[Unidade]
Descrição = gunicorn.sock

[Soquete]
ListenStream = / run / gunicorn.sock

[Instalar]
WantedBy = sockets.target

criar um serviço
sudo nano /etc/systemd/system/gunicorn.service

[Unidade]
Descrição = daemon gunicorn
Requer = gunicorn.socket
Depois de = network.target

[Serviço]
Usuário = páginas
Grupo = www-data
WorkingDirectory = / home / pages / bootcampprojectdir / bootcampenv / bin / gunicorn
--access-logfile -
--trabalhadores 3
--bind unix: run / gunicorn.sock
settings.wsgi.application

[Instalar]
WantedBy = multi-user.target

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

Confira
file /run/gunicorn.sock
Quando você não tem nenhum erro, então está bem

Verifique o status
sudo systemctl status gunicorn.socket

verificar serviço
curl --unix-socket /run/gunicorn.sock localhost

Quando você não vê o código htnl, algo com o gunicorn.service

certifique-se de que o serviço está funcionando
sudo systemctl status gunicorn

Quando estiver tudo bem, a próxima etapa NGinx passa para gunicorn
instalar nginx
sudo apt install nginx

crie um site no nginx
criar um serviço
sudo nano /etc/nginx/sites-available/bootcampproject

servidor {
escute 80;
server_name 99.99.99.99

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

localização / {
incluir proxy_params;
proxy_pass http: // unix : /run/gunicorn.sock;
}
}

salve e copie este arquivo para sites habilitados
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled

e verifique a configuração do nginx

sudo nginx -t

Caso não haja erros, reinicie o nginx
sudo systemctl restart nginx

adicione portas de firewall nginx, mas primeiro exclua a porta 8000 do teste

sudo ufw delete allow 8000

adicionar nginx
sudo ufw allow 'Nginx Full'

Todos 12 comentários

Oi,
Não estou usando o caddie. Estou usando o gunicorn para todos os meus projetos django.

Você instalou todos os requisitos?
canais> = 2.1.1 # https://github.com/django/channels
canais-redis> = 2.2.1 # https://github.com/django/channels_redis

Você pode verificar via console

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

0 significa, existe
1 significa que o módulo não existe no sistema

canais está instalado. Eu encontro outro problema agora. Aqui estão meu arquivo docker e .env. Estou tendo problemas com o serviço do trabalhador. Não tenho certeza do que isso faz. Agradeço muito sua ajuda, seu projeto é muito interessante e pode ajudar muitas pessoas na minha universidade se ele entrar em produção.

env.txt

docker-compose.txt

Aqui está o log de erros.

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]

mudança em seu ambiente
REDIS_URL=redis://127.0.0.1:6379

Você pode me mostrar como configurar o serviço do trabalhador? E por que precisamos disso? Novo neste projeto, não tenho certeza de onde procurar essas informações

uhh, é muito. Isso não é feito em alguns minutos ...

Em primeiro lugar, verifique se você instalou todos os requisitos em seu ambiente de servidor

pip install -U -r requirements/production.txt

Em segundo lugar, seu projeto está trabalhando no local?

Configurar um projeto não é possível sem todos os arquivos. E eu não sou o melhor para configurá-lo. Posso verificar minha configuração e compartilhar, mas NÃO foi testado e aprovado para bootcamp. Talvez você precise de configurações adicionais.

Estou ativando o serviço usando o docker compose. A implantação local funciona bem, mas o production.yml é uma coisa totalmente diferente. Eu envolvo redis, daphne, postgres. Se você tiver um arquivo docker-compose à mão em algum lugar, compartilhe. Obrigado

Obtenha o Outlook para iOS https://aka.ms/o0ukef


De: samazaphikel [email protected]
Enviado: quinta-feira, 17 de outubro de 2019 17h03:30
Para: vitorfs / bootcamp [email protected]
Cc: Tri Minh Pham [email protected] ; Autor [email protected]
Assunto: Re: [vitorfs / bootcamp] Ajuda com a configuração da produção. (# 193)

uhh, é muito. Isso não é feito em alguns minutos ...

Em primeiro lugar, verifique se você instalou todos os requisitos em seu ambiente de servidor

pip install -U -r requisitos / produção.txt

Em segundo lugar, seu projeto está trabalhando no local?

Configurar um projeto não é possível sem todos os arquivos. E eu não sou o melhor para configurá-lo. Posso verificar minha configuração e compartilhar, mas NÃO foi testado e aprovado para bootcamp. Talvez você precise de configurações adicionais.

-
Você está recebendo isso porque é o autor do tópico.
Responda a este e-mail diretamente, vê-lo no GitHub https://github.com/vitorfs/bootcamp/issues/193?email_source=notifications&email_token=ADEK4AB5JEUP5LQ4APTJ6ITQPDOLFA5CNFSM4JB4YOCKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBRVI2A#issuecomment-543380584 , ou unsubscribe https://github.com/notifications/unsubscribe- auth / ADEK4ADBCG24WLWIT3IM6OLQPDOLFANCNFSM4JB4YOCA .

No meu caso, IM usando python 3.7.1 na máquina servidor Ubuntu

Versão Python de configuração opcional
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1

Com este comando, python 3.7.1 é minha primeira prioridade

Primeiro, instale o ambiente na máquina
sudo -H pip3 install virtualenv

cd /home/pages para mudar para a pasta correta

mkdir bootcamp para criar a pasta do projeto

cd bootcamp/

criar env
virtualenv bootcampenv
Ative seu ambiente
source bootcampenv/bin/activate

instalar gunicorn
pip3 install gunicorn

voltar para o diretório de páginas
cd ..
e criar uma pasta para o projeto bootcamp

django-admin startproject bootcampprojectdir

cd bootcampprojectdir

E instale os requisitos
pip install -U -r requirements/production.txt

Se você usar diferentes bases de dados ou algo assim, inicie a migração e colete dados estáticos

Atualize o firewall para permitir a porta 8000
sudo ufw allow 8000

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

criar um soquete de sistema
sudo nano /etc/systemd/system/gunicorn.socket

[Unidade]
Descrição = gunicorn.sock

[Soquete]
ListenStream = / run / gunicorn.sock

[Instalar]
WantedBy = sockets.target

criar um serviço
sudo nano /etc/systemd/system/gunicorn.service

[Unidade]
Descrição = daemon gunicorn
Requer = gunicorn.socket
Depois de = network.target

[Serviço]
Usuário = páginas
Grupo = www-data
WorkingDirectory = / home / pages / bootcampprojectdir / bootcampenv / bin / gunicorn
--access-logfile -
--trabalhadores 3
--bind unix: run / gunicorn.sock
settings.wsgi.application

[Instalar]
WantedBy = multi-user.target

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

Confira
file /run/gunicorn.sock
Quando você não tem nenhum erro, então está bem

Verifique o status
sudo systemctl status gunicorn.socket

verificar serviço
curl --unix-socket /run/gunicorn.sock localhost

Quando você não vê o código htnl, algo com o gunicorn.service

certifique-se de que o serviço está funcionando
sudo systemctl status gunicorn

Quando estiver tudo bem, a próxima etapa NGinx passa para gunicorn
instalar nginx
sudo apt install nginx

crie um site no nginx
criar um serviço
sudo nano /etc/nginx/sites-available/bootcampproject

servidor {
escute 80;
server_name 99.99.99.99

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

localização / {
incluir proxy_params;
proxy_pass http: // unix : /run/gunicorn.sock;
}
}

salve e copie este arquivo para sites habilitados
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled

e verifique a configuração do nginx

sudo nginx -t

Caso não haja erros, reinicie o nginx
sudo systemctl restart nginx

adicione portas de firewall nginx, mas primeiro exclua a porta 8000 do teste

sudo ufw delete allow 8000

adicionar nginx
sudo ufw allow 'Nginx Full'

Olá @phamminhtris , fico feliz que você esteja usando o projeto e que seja útil para você. Existem duas maneiras principais de implantar o projeto em um ambiente de produção. O primeiro seria usar o Docker, mas tem suas ressalvas e, obviamente, requer uma boa familiaridade com o Docker e docker-compose . Estou longe de ser um especialista e é por isso que só o uso para desenvolvimento, mas talvez você possa encontrar algo útil aqui .

A outra maneira é implementar o projeto como está, o que é "mais fácil" (ou pelo menos você pode encontrar mais recursos e guias para implantá-lo), apenas lembre-se de carregar seu arquivo .env com as variáveis ​​necessárias, você pode usar a versão de exemplo incluída para entender como declará-los.

É suficiente apenas usar o gunicorn como o único servidor? Eu vi que alguns dos recursos exigiam um servidor de aplicativos ASGI como o daphne para atender ao tráfego de soquete da web. Por favor corrija-me se eu estiver errado. Obrigado por sua ajuda gentil. Realmente aprecio isso.

Nginx é onde as solicitações da Internet chegam primeiro. Ele pode lidar com eles muito rapidamente e geralmente é configurado para permitir que apenas essas solicitações passem, que realmente precisam chegar ao seu aplicativo da web.

O Gunicorn traduz as solicitações que recebe do Nginx em um formato que seu aplicativo da web pode manipular e garante que seu código seja executado quando necessário.

Cada um pode fazer algo que o outro não pode.
Nginx é um servidor web e proxy reverso. É altamente otimizado para todas as coisas que um servidor web precisa fazer.

Cuide do roteamento do nome de domínio (decide para onde as solicitações devem ir ou se uma resposta de erro é necessária)
Servir arquivos estáticos
Lidar com muitos pedidos que chegam de uma vez
Lidar com clientes lentos
Encaminha solicitações que precisam ser dinâmicas para Gunicorn
Encerrar SSL (https acontece aqui)
Economize recursos de computação (CPU e memória) em comparação com seu código Python
E muito mais, se você configurá-lo para fazer isso (balanceamento de carga, armazenamento em cache, ...)

Gunicorn
Assim que o Nginx decidir, que uma solicitação específica deve ser repassada ao Gunicorn (devido às regras com as quais você o configurou).

O Gunicorn é altamente otimizado e possui muitos recursos convenientes.

Executando um pool de processos / threads de trabalho (executando seu código)
Traduz solicitações vindas do Nginx para serem compatíveis com WSGI
Traduzir as respostas WSGI do seu aplicativo em respostas http adequadas
Na verdade, chama seu código Python quando uma solicitação chega
O Gunicorn pode se comunicar com muitos servidores da web diferentes
Gunicorn é apenas um dos muitos servidores WSGI válidos. Seu aplicativo não se importa com qual você usa, e o Nginx também não se importa.

Eu entendo o acima. No entanto, este projeto é bastante especial em termos de protocolo. Ele serve notificação via websocket e, no meu entendimento, precisaremos de mais do que um gunicorn e nginx regulares para conduzir o aplicativo? Quando executo o docker compose local, noto que / Notifications parece não funcionar. Sei que estou pedindo muito, mas realmente agradeço seu tempo e esforço em me ajudar @samazaphikel. Vou tentar a configuração local (sem docker-compose, docker), basta usar o Ubuntu e ver se funciona. Obrigado a todos

Guia muito útil. Fechando.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

ssahilsahil798 picture ssahilsahil798  ·  5Comentários

Allan-Nava picture Allan-Nava  ·  14Comentários

Shekharnunia picture Shekharnunia  ·  10Comentários

sebastian-code picture sebastian-code  ·  11Comentários

mwanjajoel picture mwanjajoel  ·  5Comentários