lindev.fr

Aller au contenu | Aller au menu | Aller à la recherche

27 août 2014

Django déploiement avec Nginx Gunicorn et Supervisord

Je vois souvent passer des questions sur le forums ou autres fils de discussion concernant la mise en production d'un projet Django.
Ici je vais présenter une façon de faire, utilisant Nginx Gunicorn et Supervisord .

Prérequis

Sur une Débian toute fraiche,

Nginx

sudo apt-get install nginx

Virtualenv

Car nous travaillons toujours avec un environnement virtuel, dans lequel nous allons y installer les dépendances de notre projet.
Ce qui permet de ne pas avoir de conflit de version avec d'autres éventuels projets déjà en prod.

pip install virtualenv virtualenvwrapper

Note : Si vous n'avez pas l'outil pip de disponible, installez-le comme ceci

sudo apt-get install python-setuptools
sudo easy_install pip

Puis dans votre fichier ~/.bashrc , ajoutez les lignes suivantes, pour l'autocompletion

export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-package'
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

Gunicorn

Pourquoi pas utiliser uWSGI ? humm ... car je préfère Gunicorn qui me donne toute satisfaction sur mes projets en prod. donc ... pourquoi pas !

sudo apt-get install libevent-dev
pip install gunicorn

Supervisor

Installation simple :

sudo pip install supervisor

Récupération du fichier de conf par défaut

echo_supervisord_conf > /etc/supervisord.conf

Dans le fichier de conf, afin de pouvoir manager votre projet via l'interface web, il faut dé-commenter et paramétrer les lignes suivantes

[inet_http_server]         ; inet (TCP) server disabled by default
port=*:9001        ; (ip_address:port specifier, *:port for all iface)
username=user              ; (default is no username (open server))
password=123               ; (default is no password (open server))

Note: Changer le username et password évidemment

L'interface web sera disponible à l'adresse : http://ipduserveur:9001

Pour le lancement automatique au démarrage du système, vous pouvez utiliser ces scripts d'init:

  1. debian init supervisor
  2. debian init supervisor

Installer votre projet

Notre environnement est prêt, nous allons commencer par installer le projet Django dans l’environnement virtuel.

Création du virtualenv

mkvirtualenv monprojet

Si vous utilisez git, cloner votre projet, sinon, copier le à l'endroit que vous souhaitez, ( pour l'exemple ce sera /var/www/monprojet )

Installation des dépendances du projet

si vous utilisez également les environnements virtuels pour développer ( ce que je conseille ) vous pouvez alors enregistrer la liste des libs python installées dans cette environnement, afin de pouvoir également les installer ( avec la même version ) sur un autre serveur.

Pour avoir la liste des libs :

pip freeze > requirements.txt

puis sur votre serveur, pour installer les libs depuis un export freeze :

pip install -r requirements.txt

Configuration de Django

Il vous faudra peut-être toucher un peu à votre fichier settings.py pour le passer du mode debug au mode production.
Personnellement j'utilise une autre subtilité qui me permet de ne pas avoir à toucher au fichier settings.py ( j'expliquerai celà dans un autre billet ) .

N'oubliez pas de vérifier le paramètre STATIC_ROOT

STATIC_ROOT = '/var/www/static_monprojet/'

C'est le répertoire ou seront copiés les fichiers statiques du projet, pour ensuite être servis par Nginx

Ce répertoire DOIT EXISTER

Une fois le répertoire créé, nous allons y "placer/lier" les fichiers statiques du projet

python manage.py collectstatic --link

Perso je préfère y mettre des liens symboliques .. ( les gouts et les couleurs ... )

Liaison du projet avec Gunicorn

Nous allons créer un fichier dans notre projet qui sera utilisé pour le lancement du/des process Gunicorn ( vous devrez adapter les valeurs dans ce script )

vim /var/www/monprojet/monprojet/gunicorn.sh

Et voici le contenu

#!/bin/bash
  set -e
  NUM_WORKERS=2
  USER=www-data
  GROUP=www-data
  ADDRESS=127.0.0.1:5002
  cd /var/www/monprojet
  source /home/monuser/.virtualenvs/monprojet/bin/activate
  exec gunicorn monprojet.wsgi:application -w $NUM_WORKERS --bind=$ADDRESS \
    --user=$USER --group=$GROUP --log-level=debug

Puis on le rend exécutable

chmod 777 /var/www/monprojet/monprojet/gunicorn.sh

Configuration Supervisord

Notre projet est prêt, afin de lancer Gunicorn automatiquement, nous allons utiliser supervisord, qui en plus de s'occuper de démarrer le projet automatiquement au démarrage du système, va aussi le relancer en cas de crash, gérer les logs et vous donner la main pour arrêter ré-demarrer les process, via l'interface web ou en mode console.

supervisord.png

Ajoutez à la fin du fichier de configuration /etc/supervisord.conf les lignes suivantes ( paramètres à adapter selon votre cas )

[program:guni_monprojet]
directory=/var/www/monprojet/monprojet
user = www-data
autostart=true
autorestart=true
stdout_logfile=/var/log/monprojet.log
redirect_stderr=true
stopsignal=QUIT
command = /var/www/monprojet/monprojet/monprojet.sh

Ne reste plus qu'à redémarrer supervisor pour prendre en compte la nouvelle config.

Pour le lancer manuellement

sudo supervisord -c /etc/supervisord.conf

Vhost Nginx

Dernier point, la création du vhost de Nginx, pour diriger les requêtes vers Gunicorn qui écoute sur le port 5002 ( il est aussi possible d'utiliser un fichier socket à la place )

vim /etc/nginx/sites-enabled/monprojet

Et voilà le contenu ( fonctionnel, mais vous pouvez l'adapter )

upstream us_monprojet {
        server 127.0.0.1:5002;
}


server {
        listen 80;

        root /var/www/monprojet;

        gzip             on;
        gzip_min_length  1000;
        gzip_proxied     expired no-cache no-store private auth;
        gzip_types       text/plain application/xml text/css text/javascript application/x-javascript application/x-shockwave-flash video/x-flv;
        gzip_disable     "MSIE [1-6]\.";


        server_name monprojet.com;
        charset utf-8;

        client_max_body_size 75M;


        location ~ /\.ht {
            deny  all;
        }

        location /favicon.ico {
                alias /var/www/monprojet/monprojet/static/favicon.ico;

                if (-f $request_filename) {
                        access_log off;
                        expires max;
                }

        }


        location /media {
                alias /var/www/monprojet/monprojet/media;

                if (-f $request_filename) {
                        access_log off;
                        expires max;
                }

        }

        location /static {
                alias /var/www/static_monprojet/;

                if (-f $request_filename) {
                        access_log off;
                        expires max;
                }

        }
location / {

                if (-f $request_filename) {
                        access_log off;
                        expires max;
                }       

                #gunicornParams
                if (!-f $request_filename) {
                        proxy_pass         http://us_monprojet;
                        break;
                }       
                proxy_redirect     off;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        }       
}       

Ne reste plus qu'à activer le vhost, et relancer nginx

ln -s /etc/nginx/sites-available/monprojet /etc/nginx/sites-enabled/
service nginx reload

13 janv. 2013

Code School

codeschool.png

Je viens de découvrir par le plus grand des hasards, une plateforme de cours en ligne nommée CodeSchool.

Ce qui est cool

Ce qui m'a vraiment plu sur cette plateforme, c'est qu'en plus d'être agréable visuellement, elle propose des cours vidéo de 5 à 10 minutes (téléchargeables), qui une fois visionnée, ( une video = un chapitre du cours ), un atelier vous est proposé pour mettre en pratique autant que possible ce que vous venez de visionner, et le tout, en ligne.

Chaque Atelier validé, débloque le chapitre suivant et ainsi de suite.

Pour vous aider durant ces ateliers, le slide du cours complet est consultable en ligne et téléchargeable .

Le petit truc sympa

Une fois un cours complétement terminé, vous aurez la bonne surprise de recevoir des codes promo pour des ouvrages traitant du sujet étudié.

N'hésitez plus

Allez y faire un tour : Code School

14 sept. 2010

Git pour une petite équipe

header.gif Un billet sans prétention , qui explique comment mettre en place GIT sur un serveur pour partager les sources entres développeurs afin de permettre le travail en équipe sans risquer de se marcher dessus .

Installation

Cette étape est la même sur les postes clients et sur le serveur .

L'installation est très simple , dans un premier temps vérifier que les paquets suivants sont bien installé :

apt-get install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

Une fois fait ,

apt-get install git-core

Votre identité

Il vous faut ( sur chaque poste client ) définir au moins deux paramètres qui permettrons de vous identifier à chaque commit , il est donc important de les initialiser .

cd ~
git config --global user.name "Mon nom"
git config --global user.email [email protected]

Nous voilà maintenant prêt à utiliser git .

Créer l'utilisateur git

Pour simplifier les étapes suivantes ( connexion ssh ) nous allons créer tout de suite l'utilisateur **git**

sudo adduser git

Nous allons limiter les possibilités de ce nouvel utilisateur sur le serveur , pour celà , nous allons lui attribuer un autre interpréteur de commande .

sudo vim /etc/passwd

Remplacer /bin/bash à la ligne ( selon l'interpréteur par défaut )

git:x:1002:1003:,,,:/home/git:/bin/bash

par

git:x:1002:1003:,,,:/home/git:/usr/bin/git-shell

Créer un Dépôt vierge sur le serveur

Voilà une étape importante et indispensable pour ce que nous souhaitons faire .
Rendez-vous sur votre serveur de développement , dans le répertoire qui contiendra les dépôts .

su git
cd /var/www/depotsGit
mkdir monProjet.git
git --bare init 

Et voilà votre dépôt est bien créé.

Accès ssh

Afin de na pas avoir à rentrer le mot de passe de git à chaque "push" nous allons mettre en place l'authentification ssh par certificats .
Suivez les étapes suivantes :

Sur votre poste utilisateur

Génération des clef

N'entrer ni passphrase ni mot de passe , passer les étapes en tapant "enter" ...

cd ~
ssh-keygen -t rsa 

Copie de la clef public

Copier le contenu de se fichier

vim ~/.ssh/id_rsa.pub

Sur le serveur

Nous allons ajouter la clef public au compte git .

su git
cd ~
mkdir .ssh
vim authorized_keys

Copier la clef public dans de fichier , enregistrez et quittez .

Répéter cette étape ( copier-coller de clef publique ) pour chaque poste qui doit avoir un accès aux dépôt GIT .

Premier git push

Retournez sur votre machine ( poste utilisateur ) , vérifiez tout de même que vous avez un accès ssh sans mot de passe

ssh [email protected]

Vous devriez avoir un message de ce type :

fatal: What do you think I am? A shell?
Connection to golum closed.

Si c'est la cas bravo tout va bien , sinon, revoyez le passage clef ssh/public.

Nous allons maintenant nous occuper de nos fichiers sources , rendez-vous dans le répertoire qui va contenir vous sources .

mkdir /var/www/monSite
cd /var/www/monSite

Le répertoire est pour le moment vide , nous allons donc créer un premier fichier , **.giignore** qui vous servira peut être plus tard ( vous pouvez créer ce que vous voulez comme fichier , j'utilise .gitignore car quite à faire un test , autant faire quelque chose qui me servira :) )

Initialisation du dépôt local

Il nous faut initialiser notre dépôt local , afin que **git** gère les fichiers de ce répertoire .

touch .gitignore
git init
git add .
git commit -a -m "Initialisation Dépôt local"

Et voilà , vous avez désormais un dépôt local sur lequel vous pouvez gérer vos versions , vos branches ect .. bref utiliser toute la puissance de GIT.

Synchronisation avec le serveur de dépôts

Étape importante maintenant puisque nous souhaitons rendre nos sources public ( enfin public pour les postes qui auront copié leur clef public sur le serveur )

cd /var/www/monSite
git remote add origin [email protected]:/var/www/depotsGit/monProjet.git
git push origin master

Cette dernière ligne aura pour effet d'envoyer les modifications dans le dépôt sur le serveur sur a branche "master".

Chaque développeur déclaré dans authorized_keys peut maintenant cloner le dépôt à partir du serveur , mais aussi envoyer leurs modifications .
Par exemple , si je veux cloner le dépôt actuel et donc récupérer le fichier **.gitignore** que vous avez posté .

cd /var/www/
git clone [email protected]:/var/www/depotsGit/monProjet.git

Fin

Je vous laisse lire les nombreux tutoriaus concernant les commandes de bases de GIT , pour ajouter supprimer renommer les fichiers branches ect ...

www.deimos.fr
www.alexgirard.com
www.siteduzero.com
www.unixgarden.com