Comment déployer une application Django:

Et si vous saluiez tout le monde, ceci est mon premier article dans <» DesdeLinux (parmi plusieurs que j'ai dans mes brouillons xD), j'espère que cela vous sera utile 😀

Eh bien, dans mon nouveau travail actuel, en ce moment la migration de plusieurs systèmes vers Django est en cours (c'est étrange hein ?? xD) et l'une de mes tâches, en dehors du développement, est de les mettre en production, alors comment bon apprenti, puisque c'était la première fois que je mettais une application en production sur un vrai serveur: $ j'ai commencé à lire la doc officielle de chacun des packages requis de la pile (Gunicorn et Supervisord surtout), et en voyant que les tutoriels En espagnol, ils n'étaient pas très clairs pour moi sur certains aspects, j'ai décidé de créer un mini guide avec les étapes que j'ai suivies pour mettre l'application en production, basé sur la pile Django, Gunicorn, Supervisord, Nginx et Postgresql.

Dans le cas où je travaille, les serveurs exécutent toujours Debian Squeeze, mais le guide devrait être entièrement valide pour les autres distributions ... alors allons droit au but et commençons:

Je travaillerai en tant que super utilisateur. Tout d'abord, les packages suivants sont requis:

PIP -> Outil pour installer et gérer les packages pour Python
aptitude install python-pip

Nginx -> Serveur Web (nous l'utiliserons comme proxy inverse et pour mettre en cache les fichiers statiques 'img, js, css') Nous l'installons avec:
aptitude install nginx

Superviseur -> Application pour gérer et surveiller notre application, même si elle est utilisée pour beaucoup plus. Nous l'installons avec:
aptitude install supervisor

Environnement virtuel -> Cela nous aide à créer un environnement d'exécution virtuelle personnalisé pour notre application. Nous l'installons avec:
aptitude install python-virtualenv

Gunicorn -> serveur web pour python (nous ne l'installerons pas encore)

Je suppose qu'ils devraient déjà avoir postgresql installé et configuré

psychopg2 -> Connecteur Postgresql pour python (nous ne l'installerons pas encore non plus)

Créez un environnement virtuel avec virtualenv:

Nous allons d'abord passer au répertoire de travail que nous utiliserons pour la mise en production:
cd /var/www/

Ensuite, dans ce répertoire, nous allons créer l'environnement virtuel:
virtualenv ENV-nombreApp

Nous passons au répertoire que je viens de créer virtualenv
cd ENV-nombreAPP

Nous copions l'application dans ce répertoire et maintenant nous procédons à l'activation de l'environnement avec:
source bin/activate

L'invite devrait maintenant ressembler à (ENV)usuario@host:

Cela fera maintenant que tout ce que nous faisons est stocké dans le répertoire / var / www / ENV-appname / sans affecter les packages système

Maintenant, nous passons au répertoire de l'application:
cd nombreApp

Nous procédons à l'installation de la liste des dépendances d'application (si nécessaire), dans laquelle elles sont spécifiées dans le fichier conditions.txt:
pip install -r requirements.txt

Nous pouvons également installer des packages individuellement, par exemple pour installer le connecteur de PostgreSQL:
pip install psycopg2

Installation et configuration de GUnicorn:

Pour l'installer, nous le faisons de la même manière:
pip install gunicorn

Maintenant, nous allons le configurer, pour cela nous allons créer un fichier appelé gunicorn-deploy.py à la racine de notre application, (bien que le nom puisse être n'importe quoi) avec le contenu suivant:

bind = "127.0.0.1:8001" # dirección a donde accederá Nginx
logfile = "/var/www/logs/nombreApp/gunicorn.log" # dirección donde estarán los logs de la aplicación
workers = 1 # dependerá en medida de la carga de trabajo que tenga la aplicación, también depende del hardware con que se cuente
loglevel = 'info' # tipo de logging

Configuration du superviseur:

Maintenant, définissons le superviseur, pour cela nous générons le fichier de configuration avec

echo_supervisord_conf > /etc/supervisord.conf

Maintenant, nous éditons le fichier de configuration:
vim /etc/supervisord.conf

Et nous décommentons les lignes suivantes en supprimant le; (point-virgule):

[serveur_unix_http] file = / tmp / supervisor.sock [superviseur] logfile = / var / log / supervisord.log logfile_maxbytes = 50 Mo logfile_backups = 10 loglevel = debug pidfile = / var / run / supervisord.pid nodaemon = false minfds = 1024 minprocs = 200 [rpcinterface: supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface: make_main_rpcinterface [supervisorctl] serverurl = unix: [programme: appname] command = / var / www / ENV-appname / bin / django_unicorn -c / var / www / ENV -Appname / appname / gunicorn-deploy.py directory = / var / www / ENV-appname / appname / autostart = true autorestart = true user = Username redirect_stderr = true stdout_logfile = / var / www / logs / appname / supervisord.log

Maintenant, nous allons créer le script pour supervisord pour démarrer avec le système, pour cela nous allons créer le fichier:
vim /etc/init.d/supervisord

Et nous ajoutons le contenu suivant:

 # Démarrage automatique du superviseur # # description: Démarrage automatique du superviseur # processname: supervisord # pidfile: /var/run/supervisord.pid SUPERVISORD = / usr / local / bin / supervisord SUPERVISORCTL = / usr / local / bin / supervisorctl case $ 1 au début) echo -n "Démarrage du superviseur:" $ SUPERVISORD echo ;; stop) echo -n "Arrêt du superviseur:" $ SUPERVISORCTL shutdown echo ;; restart) echo -n "Arrêt du superviseur:" $ SUPERVISORCTL shutdown echo echo -n "Démarrage du superviseur:" $ SUPERVISORD echo ;; Cette c

Et maintenant, nous donnons des autorisations d'exécution au fichier afin qu'il puisse démarrer avec le système:
sudo chmod +x /etc/init.d/supervisord

Nous mettons à jour les liens pour démarrer le service:
sudo update-rc.d supervisord defaults

Nous démarrons le service:
sudo /etc/init.d/supervisord start

Configuration de nginx:

Cette étape est également assez simple, nous allons créer le fichier de configuration suivant de nginx pour notre application:

vim /etc/nginx/sites-enabled/nombreApp

Et nous vous ajouterons le contenu suivant

serveur {écoute 9001; # port où ils veulent que nginx écoute nom_serveur www.domaine.com; # ou 192.168.0.100, adresse à laquelle nous accéderons access_log /var/log/nginx/Appname.access.log; # où nous aurons l'emplacement du journal d'application / {# où nginx appellera lors de l'accès à www.dominio.com/ proxy_pass http://127.0.0.1:8001; proxy_set_header Host $ http_host; } location / static / {# où nginx accédera lorsque nous entrons dans www.dominio.com/static/ alias / var / www / ENV-appname / appname / staticfiles /; }}

Et nous redémarrons nginx:
service nginx restart

Configurer Django:

Modifions le fichier de configuration de django:
vim nombreApp/settings.py

Nous cherchons la ligne qui dit DEBUG = True et nous changeons la valeur, restant DEBUG = False

Nous ajoutons les paramètres DB:

DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2', # ou mysql, ou tout ce qu'ils utilisent 'NAME': 'DBName', 'USER': 'DBUser', 'PASSWORD' : 'password DB', 'HOST': 'localhost', # ou celui dont ils ont besoin 'PORT': '', # ou celui qu'ils utilisent}}

Nous cherchons la ligne ALLOWED_HOSTS = [] et nous ajoutons le domaine ou l'adresse via laquelle nous allons accéder, laissant quelque chose comme ALLOWED_HOSTS = ['www.domaine.com']

Nous configurons le répertoire pour les fichiers statiques, nous cherchons la ligne qui dit STATIC_ROOT = ' ' et nous changeons la valeur, en plaçant le chemin absolu où nous voulons que nos fichiers statiques soient, dans mon cas je l'ai laissé plus ou moins comme ça STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'

Presque terminé, nous exécutons la commande suivante:
./manage.py collectstatic

Cela créera un dossier avec le nom 'statique dans le chemin que nous spécifions dans le settings.py », c'est là que tous nos fichiers statiques seront.

Et enfin nous redémarrons le superviseur pour prendre les nouveaux changements:
supervisorctl restart nombreApp

Et ce serait tout, à la fin ce n'était pas tellement vrai? ça m'a paru simple 😀

J'espère que cela vous sera utile, salutations 😉

Documentation GUnicorn

Documentation du superviseur


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.

  1.   f3niX dit

    Je comprends que l'application Django ne doit pas être placée à la racine du dossier du serveur Web (/ var / www)? Par sécurité, je ne sais pas si je me trompe.

    Salutations.

    1.    urKh dit

      Toute la raison!!! C'était quelque chose que j'ignorais totalement, je mettrai à jour l'entrée 😛 et dès que je reviendrai lundi, je ferai des changements dans l'application xD
      merci

  2.   Rodrigo Bravo (goidor) dit

    Epale frère bon tutoriel. Récemment j'étais aussi dans le même mais dans Debian 7, je devais chercher et lire plus ou moins. Je vous recommande de créer l'environnement virtuel de virtualenv dans la maison de l'utilisateur dans un dossier caché.

    Salutations!

  3.   Servir Fenriz dit

    hahaha ctm J'ai documenté hier Django et vous êtes déjà en train de traverser la galaxie 999999 Salutations hommes xD

  4.   daniel2ac dit

    Très bon article =) il y a à peine une semaine, j'ai déployé mon application django mais je l'ai fait avec uwsgi et nginx, savez-vous quel avantage gunicorn a? Je l'ai vu beaucoup mentionné.
    C'est agréable de voir que django devient très populaire, la vérité est le meilleur framework que j'ai vu =)

  5.   ozkar dit

    Pour le STATIC_ROOT ce que je fais est de définir une variable globale. Quelque chose comme cela:

    import os
    PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
    STATIC_ROOT = os.path.join(PROJECT_PATH, '../backend/static')

    Où backend est une application que j'ai créée. De cette façon, je m'assure que là où je déploie le projet, le chemin global est le même.

  6.   intelligent dit

    Intéressant, je vais essayer dans le futur.

    Au fait, est-ce que quelqu'un sait comment activer les accents et les caractères non-ascii dans une application django?

    J'ai cherché partout, aucune des méthodes suivantes ne fonctionne pour moi:
    sys.setdefaultencoding ('utf-8') # dans sites.py

    # - * - codage: utf-8 - * - # dans chaque fichier python

    Editer site.py et mettre utf-8 au lieu de ascii est censé fonctionner, mais $ file models.py m'informe que mon fichier est toujours un ascii.

    Aucune suggestion?

    1.    intelligent dit

      Ça a marché!!!!

  7.   anime230 dit

    très bon tutoriel mais pourriez-vous faire une des façons de télécharger mon application sur un serveur Web déjà en production
    merci