Bootcamp: Aide à la mise en place de la production.

Créé le 17 oct. 2019  ·  12Commentaires  ·  Source: vitorfs/bootcamp

Salut, j'essaie de faire de Bootcamp un réseau social pour les chercheurs de mon université. Cependant, en raison de certaines contraintes, je ne peux actuellement pas utiliser caddy comme proxy inverse pour le déploiement. Au lieu de cela, j'utilise nginx. Si possible, pouvez-vous me donner des indications sur les paramètres que je dois spécifier pour l'environnement de production. J'ai vu le fichier env.example mais comme le projet est nouveau pour moi, je ne sais pas comment tout se connecte les uns aux autres. Je suis bloqué avec l'erreur suivante

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

Toute aide est appréciée.

Support discussion help wanted

Commentaire le plus utile

Dans mon cas, IM en utilisant python 3.7.1 sur la machine serveur Ubuntu

Configuration optionnelle de la version Python
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1

Avec cette commande, python 3.7.1 est ma première priorité

Tout d'abord, installez l'environnement sur la machine
sudo -H pip3 install virtualenv

cd /home/pages pour changer dans le bon dossier

mkdir bootcamp pour créer le dossier du projet

cd bootcamp/

créer un environnement
virtualenv bootcampenv
Activez votre environnement
source bootcampenv/bin/activate

installer gunicorn
pip3 install gunicorn

retourner au répertoire des pages
cd ..
et créer un dossier pour le projet bootcamp

django-admin startproject bootcampprojectdir

cd bootcampprojectdir

Et installer les exigences
pip install -U -r requirements/production.txt

Si vous utilisez différentes bases de données ou quelque chose du genre, lancez la migration et collectez les données statiques

Mettre à jour le pare-feu pour autoriser le port 8000
sudo ufw allow 8000

créer gunicorn wsgi
gunicorn --bind 0.0.0.0:8000 settings.wsgi

créer un socket système
sudo nano /etc/systemd/system/gunicorn.socket

[Unité]
Description=gunicorn.sock

[Prise]
ListenStream=/run/gunicorn.sock

[Installer]
WantedBy=sockets.target

créer un service
sudo nano /etc/systemd/system/gunicorn.service

[Unité]
Description=démon gunicorne
Requiert=gunicorn.socket
Après=network.target

[Service]
Utilisateur=pages
Groupe=www-données
WorkingDirectory=/home/pages/bootcampprojectdir/bootcampenv/bin/gunicorn
--access-logfile -
--travailleurs 3
--bind unix:run/gunicorn.sock
settings.wsgi.application

[Installer]
WantedBy=multi-user.target

tout activer
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket

vérifie ça
file /run/gunicorn.sock
Quand vous n'avez pas d'erreur, alors tout va bien

Vérifier l'état
sudo systemctl status gunicorn.socket

vérifier le service
curl --unix-socket /run/gunicorn.sock localhost

Lorsque vous ne voyez pas le code HTML, quelque chose avec le gunicorn.service

assurez-vous que le service est en cours d'exécution
sudo systemctl status gunicorn

Quand tout va bien, la prochaine étape NGinx passe à gunicorn
installer nginx
sudo apt install nginx

créer un site dans nginx
créer un service
sudo nano /etc/nginx/sites-available/bootcampproject

serveur {
écouter 80 ;
nom_serveur 99.99.99.99

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

emplacement / {
inclure proxy_params ;
proxy_pass http://unix :/run/gunicorn.sock;
}
}

enregistrer et copier ce fichier sur les sites activés
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled

et vérifier la configuration de nginx

sudo nginx -t

En cas d'absence d'erreur, redémarrez nginx
sudo systemctl restart nginx

ajoutez des ports de pare-feu nginx, mais supprimez d'abord le port 8000 du test

sudo ufw delete allow 8000

ajouter nginx
sudo ufw allow 'Nginx Full'

Tous les 12 commentaires

Salut,
Je n'utilise pas de caddie. J'utilise gunicorn pour tous mes projets Django.

Avez-vous installé toutes les exigences ?
canaux>=2.1.1 # https://github.com/django/channels
canaux-redis>=2.2.1 # https://github.com/django/channels_redis

Vous pouvez vérifier via la console

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

0 signifie, exister
1 signifie que le module n'existe pas dans le système

canaux est installé. Je rencontre un autre problème maintenant. Voici mon fichier docker et .env. Je rencontre un problème avec le service des travailleurs. Pas sûr de ce qu'il fait. J'apprécie vraiment votre aide, votre projet est très intéressant et peut aider de nombreuses personnes dans mon université s'il entre en production.

env.txt

docker-compose.txt

Voici le journal des erreurs.

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]

changer dans votre env
REDIS_URL=redis://127.0.0.1:6379

Pouvez-vous me montrer comment configurer le service de travail ? Et pourquoi en avons-nous besoin ? Nouveau dans ce projet, donc je ne sais pas où chercher cette information

euh, c'est beaucoup. Cela ne se fait pas en quelques minutes...

Tout d'abord, veuillez vérifier si vous avez installé toutes les exigences sur votre environnement de serveur

pip install -U -r requirements/production.txt

Deuxièmement, votre projet travaille-t-il au niveau local ?

Configurer un projet n'est pas possible sans tous les fichiers. Et je ne suis pas le meilleur pour le configurer. Je peux vérifier ma configuration et partager, mais ce n'est PAS testé et approuvé pour bootcamp. Peut-être avez-vous besoin de paramètres supplémentaires.

Je lance le service à l'aide de docker compose. Le déploiement local fonctionne bien, mais production.yml est une chose totalement différente. J'implique redis, daphne, postgres. Si vous avez un fichier docker-compose à portée de main quelque part, veuillez le partager. Merci

Obtenez Outlook pour iOS https://aka.ms/o0ukef


De : samazaphikel [email protected]
Envoyé : jeudi 17 octobre 2019 17:03:30
À : vitorfs/bootcamp [email protected]
Cc : Tri Minh Pham [email protected] ; Auteur [email protected]
Objet : Re : [vitorfs/bootcamp] Aide à la mise en place de la production. (#193)

euh, c'est beaucoup. Cela ne se fait pas en quelques minutes...

Tout d'abord, veuillez vérifier si vous avez installé toutes les exigences sur votre environnement de serveur

pip install -U -r requirements/production.txt

Deuxièmement, votre projet travaille-t-il au niveau local ?

Configurer un projet n'est pas possible sans tous les fichiers. Et je ne suis pas le meilleur pour le configurer. Je peux vérifier ma configuration et partager, mais ce n'est PAS testé et approuvé pour bootcamp. Peut-être avez-vous besoin de paramètres supplémentaires.

-
Vous recevez ceci parce que vous avez créé le fil.
Répondre à cet e - mail directement, voir sur GitHub https://github.com/vitorfs/bootcamp/issues/193?email_source=notifications&email_token=ADEK4AB5JEUP5LQ4APTJ6ITQPDOLFA5CNFSM4JB4YOCKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBRVI2A#issuecomment-543380584 ou désabonnement https://github.com/notifications/unsubscribe- auth/ADEK4ADBCG24WLWIT3IM6OLQPDOLFANCNFSM4JB4YOCA .

Dans mon cas, IM en utilisant python 3.7.1 sur la machine serveur Ubuntu

Configuration optionnelle de la version Python
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1

Avec cette commande, python 3.7.1 est ma première priorité

Tout d'abord, installez l'environnement sur la machine
sudo -H pip3 install virtualenv

cd /home/pages pour changer dans le bon dossier

mkdir bootcamp pour créer le dossier du projet

cd bootcamp/

créer un environnement
virtualenv bootcampenv
Activez votre environnement
source bootcampenv/bin/activate

installer gunicorn
pip3 install gunicorn

retourner au répertoire des pages
cd ..
et créer un dossier pour le projet bootcamp

django-admin startproject bootcampprojectdir

cd bootcampprojectdir

Et installer les exigences
pip install -U -r requirements/production.txt

Si vous utilisez différentes bases de données ou quelque chose du genre, lancez la migration et collectez les données statiques

Mettre à jour le pare-feu pour autoriser le port 8000
sudo ufw allow 8000

créer gunicorn wsgi
gunicorn --bind 0.0.0.0:8000 settings.wsgi

créer un socket système
sudo nano /etc/systemd/system/gunicorn.socket

[Unité]
Description=gunicorn.sock

[Prise]
ListenStream=/run/gunicorn.sock

[Installer]
WantedBy=sockets.target

créer un service
sudo nano /etc/systemd/system/gunicorn.service

[Unité]
Description=démon gunicorne
Requiert=gunicorn.socket
Après=network.target

[Service]
Utilisateur=pages
Groupe=www-données
WorkingDirectory=/home/pages/bootcampprojectdir/bootcampenv/bin/gunicorn
--access-logfile -
--travailleurs 3
--bind unix:run/gunicorn.sock
settings.wsgi.application

[Installer]
WantedBy=multi-user.target

tout activer
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket

vérifie ça
file /run/gunicorn.sock
Quand vous n'avez pas d'erreur, alors tout va bien

Vérifier l'état
sudo systemctl status gunicorn.socket

vérifier le service
curl --unix-socket /run/gunicorn.sock localhost

Lorsque vous ne voyez pas le code HTML, quelque chose avec le gunicorn.service

assurez-vous que le service est en cours d'exécution
sudo systemctl status gunicorn

Quand tout va bien, la prochaine étape NGinx passe à gunicorn
installer nginx
sudo apt install nginx

créer un site dans nginx
créer un service
sudo nano /etc/nginx/sites-available/bootcampproject

serveur {
écouter 80 ;
nom_serveur 99.99.99.99

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

emplacement / {
inclure proxy_params ;
proxy_pass http://unix :/run/gunicorn.sock;
}
}

enregistrer et copier ce fichier sur les sites activés
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled

et vérifier la configuration de nginx

sudo nginx -t

En cas d'absence d'erreur, redémarrez nginx
sudo systemctl restart nginx

ajoutez des ports de pare-feu nginx, mais supprimez d'abord le port 8000 du test

sudo ufw delete allow 8000

ajouter nginx
sudo ufw allow 'Nginx Full'

Salut @phamminhtris, je suis heureux que vous utilisiez le projet et que vous le trouviez utile. Il existe deux manières principales de déployer le projet dans un environnement de production. Le premier utiliserait Docker, mais il a ses inconvénients, et il nécessite évidemment une bonne connaissance de Docker et de docker-compose . Je suis loin d'être un expert et c'est pourquoi je ne l'utilise que pour le développement, mais peut-être pouvez-vous trouver quelque chose d'utile ici .

L'autre façon est d'implémenter le projet tel qu'il est, ce qui est "plus facile" (ou du moins vous pouvez trouver plus de ressources et de guides pour le déployer), n'oubliez pas de charger votre fichier .env avec les variables requises, vous pouvez utiliser l'exemple de version inclus pour comprendre comment les déclarer.

Est-ce suffisant d'utiliser simplement gunicorn comme seul serveur ? J'ai vu que certaines fonctionnalités nécessitaient un serveur d'applications ASGI comme Daphne pour servir le trafic de socket Web. S'il vous plait corrigez moi si je me trompe. Merci pour votre aimable aide. Appréciez vraiment cela.

Nginx est l'endroit où les demandes provenant d'Internet arrivent en premier. Il peut les gérer très rapidement et est généralement configuré pour ne laisser passer que les demandes qui doivent vraiment arriver à votre application Web.

Gunicorn traduit les demandes qu'il reçoit de Nginx dans un format que votre application Web peut gérer et s'assure que votre code est exécuté en cas de besoin.

Chacun peut faire quelque chose, ce que l'autre ne peut pas faire.
Nginx est un serveur Web et un proxy inverse. Il est hautement optimisé pour tout ce qu'un serveur Web doit faire.

Prendre soin du routage des noms de domaine (décide où les demandes doivent aller, ou si une réponse d'erreur est en ordre)
Servir des fichiers statiques
Traiter de nombreuses demandes qui arrivent à la fois
Gérer les clients lents
Transfère les demandes qui doivent être dynamiques à Gunicorn
Terminer SSL (https se produit ici)
Économisez des ressources de calcul (CPU et mémoire) par rapport à votre code Python
Et bien plus encore, si vous le configurez pour cela (load balancing, mise en cache, …)

Guncorne
Une fois que Nginx décide qu'une demande particulière doit être transmise à Gunicorn (en raison des règles avec lesquelles vous l'avez configuré).

Gunicorn est hautement optimisé et possède de nombreuses fonctionnalités pratiques.

Exécution d'un pool de processus/threads de travail (exécution de votre code !)
Traduit les demandes provenant de Nginx pour qu'elles soient compatibles WSGI
Traduire les réponses WSGI de votre application en réponses http appropriées
Appelle réellement votre code Python lorsqu'une requête arrive
Gunicorn peut parler à de nombreux serveurs Web différents
Gunicorn n'est qu'un des nombreux serveurs WSGI valides. Votre application ne se soucie pas de celle que vous utilisez, et Nginx s'en fiche non plus.

Je comprends ce qui précède. Cependant, ce projet est assez particulier en terme de protocole. Il sert de notification via websocket et, à ma connaissance, nous aurons besoin de plus qu'un gunicorn et un nginx ordinaires pour piloter l'application ? Lorsque je lance le docker local compose, je remarque que /notifications ne semble pas fonctionner. Je sais que je demande beaucoup mais j'apprécie vraiment votre temps et vos efforts pour m'aider @samazaphikel. J'essaierai la configuration locale (pas de docker-compose, docker) juste nu ubuntu et voir si cela fonctionne. Merci à tous

Guide très utile. Fermeture.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

Shekharnunia picture Shekharnunia  ·  10Commentaires

Shekharnunia picture Shekharnunia  ·  6Commentaires

sebastian-code picture sebastian-code  ·  11Commentaires

yashLadha picture yashLadha  ·  21Commentaires

sebastian-code picture sebastian-code  ·  11Commentaires