Tuto: déploiement d'un projet Django



Documents pareils
Installation UpdatEngine serveur (CentOs apache2 / MySQL)

Serveur Linux : FTP. Mise en place d un service FTP sous Linux. Bouron Dimitri 20/04/2014

HowTo Installer egroupware 1.2 sur SME Serveur 7.0

Architecture de la plateforme SBC

Installation d'un serveur FTP géré par une base de données MySQL

Installation de Zabbix

Installation d'un serveur sftp avec connexion par login et clé rsa.

GLPI OCS Inventory. 1. Prérequis Installer un serveur LAMP : apt-get install apache2 php5 libapache2-mod-php5 apt-get install mysql-server php5-mysql

Documentation FOG. 3. Choisir le nom de la machine, le nom d utilisateur et le mot de passe correspondant (par exemple : fog, password)

04/02/2014 Tutoriel. Lubuntu & glpi. thomas [NOM DE LA SOCIETE]

PPe jaune. Domingues Almeida Nicolas Collin Leo Ferdioui Lamia Sannier Vincent [PPE PROJET FTP]

WDpStats Procédure d installation

Afin d'éviter un message d'erreur au démarrage du service Apache du type :

Projet Administration Réseaux

Classe et groupe : 1P 3 SEN TRI. Ubuntu : serveur Contrôleur de Domaine (PDC) avec SAMBA

Documentation pour administrateur Application AER

Procédure d'installation

Gestion d identités PSL Exploitation IdP Authentic

Maintenance et gestion approfondie des Systèmes d exploitation Master 2 SILI. Année universitaire David Genest

Tutoriel compte-rendu Mission 1

Raspberry pi : Développer une petite application web sur Raspberry

07/03/2014 SECURISATION DMZ

PPE GESTION PARC INFORMATIQUE

L installation a quelque peu changée depuis les derniers tutos, voici une actualisation.

Oracle WebLogic Server (WLS) 11gR1 ( et ) Installation sur Oracle Linux 5 et 6 Hypothèses Installation Oracle Linux 5 (OL5)

Tuto 2 : Configuration Virtual box, Configuration et installation du serveur XiBO

windows. deb etch main deb-src etch main

BTS SIO Dossier BTS. PURCHLA Romain

Procédures informatiques administrateurs Création d un serveur FTP sous Linux

CASE-LINUX MAIL - ROUNDCUBE

Vade mecum installation et configuration d une machine virtuelle V5.1.0

[ GLPI et OCS pour Gentoo 2006] ArtisanMicro. Alexandre BALMES

Linux et le Shell. Francois BAYART. Atelier du samedi 20 Novembre

TUTORIEL D INSTALLATION D ORACLE ET DE SQL DEVELOPPER TUTORIEL D INSTALLATION D ORACLE...1 ET DE SQL DEVELOPPER...1

Installer un serveur web de développement avec VirtualBox

OpenMediaVault installation

Mise en place d un firewall d entreprise avec PfSense

DOCUMENTATION ADMINISTRATEUR

LINUX REMPLAÇANT WINDOWS NT

Les commandes relatives aux réseaux

Installation du serveur WEB Apache ( MySQL, PHP) sous Debian 7.

Serveur de sauvegardes incrémental

Les différentes méthodes pour se connecter

Installation de la plate-forme Liberacces 2.0 «Intégrale» avec LiberInstall

Sauvegarde automatique des données de GEPI

Titre: Version: Dernière modification: Auteur: Statut: Licence:

Configuration matériel. Tâche 2 : Installation proprement dite de l application sur un serveur de test virtualisé sous VmWare Workstation.

Déploiement d'un serveur ENT

Gestion d identités PSL Installation IdP Authentic

1 Démarrage de Marionnet

TP LINUX : MISE EN PLACE DU SERVEUR DE MESSAGERIE QMAIL

Simple Database Monitoring - SDBM Guide de l'usager

CDS Invenio Installation et configuration de base

Installation du Hub. Installation du Hub. 1. Description de l installation. by LegalBox. 2 types de serveur sont à installer :

Installer un gestionnaire de parc GLPI sous Linux

Installation d OwnCloud 8.0 sous Debian Avec connexion des utilisateurs active directory et mise en place de HTTPS

contact@nqicorp.com - Web :

Installation d ORACLE 10g sous Debian Etch

Cellier Clément, Maginot Quentin, Tripier Axel, Zaorski Jean, Zini Robin. 18 mars 2015

Projet serveur OwnCloud

Synchronisation Mysql (Replication)

Installer OpenJabNab dans une framboise (un Raspberry Pi)

NRPE. Objectif. Documentation. Procédures

But de cette présentation. Contrôleur de domaine avec Samba (rédigé pour Ubuntu Server) Introduction. Samba: principes

Ajout et Configuration d'un nouveau poste pour BackupPC

Comment Accéder à des Bases de Données MySQL avec Windows lorqu'elles sont sur un Serveur Linux

1/ Introduction. 2/ Schéma du réseau

Table des matières Hakim Benameurlaine 1

Installation d un superviseur ZABBIX

BTS SIO SISR3 TP 1-I Le service Web [1] Le service Web [1]

Serveur d impression CUPS

REPARTITION DE CHARGE LINUX

OCS Inventory & GLPI

Service WEB, BDD MySQL, PHP et réplication Heartbeat. Conditions requises : Dans ce TP, il est nécessaire d'avoir une machine Debian sous ProxMox

il chiffrer les flux d'authentification et les flux de données il n'y a pas de soucis d'ouverture de ports avec des modes actif/passif à gérer

WGW PBX. Guide de démarrage rapide

Serveur proxy Squid3 et SquidGuard

Imprimantes et partage réseau sous Samba avec authentification Active Directory

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server

GOUTEYRON ALEXIS. SIO2 N candidat: UEpreuve E4. USituation professionnelle 2. serveurs de fichiers. Uen haute disponibilité

Installation de VirtualPOPC-1 sur Ubuntu Server LTS 64bits

Jeudis du libre, Samba ou comment donner le rythme aux stations Windows

Mise en œuvre de Rembo Toolkit

TP LINUX : MISE EN RÉSEAU D UN SERVEUR LINUX

MANUEL D INSTALLATION D UN PROXY

Gestion des utilisateurs et de leurs droits

Réaliser un inventaire Documentation utilisateur

Installation Oracle 10g : Installation sur Solaris 10 x86

Documentation d'installation Plateforme femme actuelle

Réalisation d un portail captif d accès authentifié à Internet

Installation GLPI-OCSNG-SSL Linux Debian Sarge

équipement radio Procédure

Mise en place d un serveur trixbox sur un domaine Kwartz. Version 1.0 du 25 juin 2012 Lycée Polyvalent d Artois, Noeux les Mines Adrien Bonnel

Xubuntu Une alternative à Windows et à Ubuntu, (pour ceux qui ne veulent pas d'unity) : installer Xubuntu.

Formation en Sécurité Informatique

Transcription:

Tuto: déploiement d'un projet Django 20 décembre 2015 [u'systeme'] par VulgaireDev Voici les prérequis : - avoir un projet django fonctionel en local - avoir un serveur auquel on a accès via ssh. Ça marche très bien avec un VPS aussi, ce qui ne coûte pas grand chose : de l'ordre de quelques euros par mois pour un serveur sur lequel vous pouvez installer ce que vous voulez + plusieurs Go d'espace, ça peut être vraiment intéressant (https://www.ovh.com/fr/vps/ par exemple). - un peu de temps Nous allons donc faire cette mise en prod, avec un serveur nginx + gunicorn. Connectons-nous via ssh au serveur. ssh root@vps5469658.hebergeur.net C'est parti. Comment ça marche en gros On va installer la triplette django+nginx+gunicorn sur le serveur. En gros nginx est le serveur HTTP qui se charge de recevoir les requêtes du même nom, va communiquer avec gunicorn, qui lui-même communique avec django via la norme wsgi. Ci-dessous un schéma récapitulatif pompé chez sam et max (http:// sametmax.com/quest-ce-que-wsgi-et-a-quoi-ca-sert/)

En parallèle, on va installer une base de données MySQL, pour stocker nos données, avec laquelle django va communiquer. Pour une application plus importante où on souhaite répartir la charge, on conseille de ne pas avoir et la base de données et le serveur applicatif sur la même machine, mais ici on s'en contentera largement (laaargement). Mettre son système à jour sudo apt-get update sudo apt-get upgrade Installer MySQL J'ai choisi MySQL comme base de donné, mais on peut tout aussi bien prendre MariaDB, PostgreSQL, Oracle etc. On télécharge MySQL sudo apt-get install mysql-server libmysqlclient-dev Puis: sudo mysql_install_db Et enfin: sudo mysql_secure_installation Il faudra répondre à quelques simples questions, telles que définir un compte administrateur et son mot de passe. On va maintenant créer un nouvel utilisateur pour la BD On se log en tant qu'admin dans le shell MySQL: mysql -u root -p On crée la base de données relative à notre projet, CREATE DATABASE monprojet CHARACTER SET UTF8; puis on créé un nouvel utilisateur, qui aura les droits sur monprojet, et pas sur tout MySQL comme le compte admin précédemment créé CREATE USER usermonprojet@localhost IDENTIFIED BY 'monmotdepasse'; On lui donne les droits (lecture, écriture, exécution) sur monprojet:

GRANT ALL PRIVILEGES ON monprojet.* TO usermonprojet@localhost; Et on valide FLUSH PRIVILEGES; Puis on quitte le shell MySQL exit NB: Pour ce qui est de l'interfaçage avec django, voir la fin de ce tuto dans "masquer ses mots de passe" Créer un nouvel User Maintenant on va créer un nouvel utilisateur : les applications seront lancées sous sa juridiction. Ainsi, en cas de faille de sécurité, on peut espérer que l'attaquant ne puisse causer de dommages que là où ce nouvel utilisateur peut agir. sudo useradd --system --shell /bin/bash --home /webapps webuser (le dernier paramètre est le nom du nouvel user, et le --home définit le répertoire home, celui sur lequel on arrive en faisant "cd ~", de webuser) Installer VirtualEnv et pip VirtualEnv est un outil qui permet de créer un environnement virtuel Python. En gros, ça veut dire que toutes les installations python faites lorsqu'on est dans un environnement virtuel ne seront disponibles que dans cet environnement virtuel, et pas en-dehors. Ainsi, on peut avoir sur le même système plusieurs projets dont les versions de python, de django etc sont différentes. Un autre avantage est que si on se foire dans l'installation, ce n'est pas toute l'installation linux qui est compromise, mais simplement le virtualenv! (c'est assez pratique) Mieux encore que VirtualEnv, nous allons installer virtualenvwrapper, qui est juste une surcouche nous permettant d'utiliser plus simplement les environnements virtuels. Pip, quand à lui, est le gestionnaire de paquets de python (plus d'infos ici http:// sametmax.com/votre-python-aime-les-pip/) D'abord on installe des outils de bases pour python sudo apt-get install python-setuptools

Parmi eux, se trouve easy_install, qui est comme pip mais en moins bien (ne gère pas la désinstallation des paquets par exemple : ca s'appelle easy_install pas easy_uninstall). On l'utilise pour installer pip: easy_install pip Maintenant on installe virtualenvwrapper : sudo pip install virtualenvwrapper On va maintenant ecrire dans le.profile afin que le virtualenvwrapper se lance quand on se log dans linux: puis on écrit à la fin: nano ~/.profile export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh On recharge le fichier de démarrage:. ~/.profile Enfin, il ne nous reste plus qu'à créer notre environnement virtuel : mkvirtualenv virtualmonprojet --no-site-packages --no-site-packages permet de n'avoir que python et pip dans son environnement. Pour se placer dans l'environnement virtuel, il suffit de faire: workon virtualmonprojet Vous verrez alors écrit (virtualmonprojet)root@monserveur dans la console. Si vous souhaitez sortir de l'environnement tapez "deactivate". Attention pour la suite soyez bien dans votre environnement virtuel. Installer Django et créer le dossier Projet Ca devrait rouler tout seul étant donné ce qu'on a fait avant : sudo pip install django Maintenant on va choisir où mettre notre projet, on peut choisir de le mettre dans /webapps:

sudo mkdir -p /webapps sudo chown webuser /webapps Maintenant on va rapatrier notre projet depuis le local vers le serveur, en local, on tape: scp -r monprojet root@serveur:/webapps Et une fois sur le serveur on définit webuser comme propriétaire de ce dossier: sudo chown webuser /webapps/monprojet/ Installer Gunicorn On va donc maintenant installer Gunicorn, qui va communiquer avec django comme on a vu dans le schéma plus haut. sudo pip install gunicorn Il faut configurer gunicorn dans un fichier avant de la lancer. On va le mettre dans /webapps/monprojet/bin nano /webapps/monprojet/bin/gunicorn_start Je vous file un fichier de config, reste juste à l'adapter: #!/bin/bash

Pour gérer gunicorn (restart, stop etc), on va utiliser supervisor. Celui-ci permet de relancer automatiquement les applications qu'on lui donne en cas de crash serveur, et de gérer des scripts (ici gunicorn_start). sudo apt-get install supervisor Pour spécifier un fichier de configuration pour supervisor relatif à gunicorn, il faut l'écrire dans /etc/supervisor/conf.d sudo nano /etc/supervisor/conf.d/hello.conf Puis on configure de cette manière ceci : [program:monprojet] command = /webapps/monprojet/bin/ gunicorn_start ; Command to start app user = webuser ; User to run as stdout_logfile = /var/log/gunicorn/ gunicorn.log ; Where to write log messages redirect_stderr = true ; Save stderr in the same log

et encore une fois un fichier de configuration à adapter à votre projet: # Configuration du server server { listen 80; server_name www.mondomaine.fr mondomaine.fr; charset utf-8; access_log /var/log/nginx/monprojet.access.log; error_log /var/log/nginx/monprojet.error.log; proxy_connect_timeout 300s; proxy_read_timeout 300s; # Fichiers media et statiques, délivrés par nginx directement location /media { alias /webapps/monprojet/media; } location /static { alias /webapps/monprojet/static; } location / { proxy_pass http://127.0.0.1:8000; # Pass to Gunicorn proxy_set_header X-Real- IP $remote_addr; # get real Client IP } } Il faut maintenant faire en sorte que le site soit disponible, pour cela il faut créer un lien symbolique dans sites-enable: sudo ln -s /etc/nginx/sites-available/monprojet /etc/nginx/sitesenabled/monprojet Puis on peut redémarrer le service nginx. sudo service nginx restart Maintenant ca devrait presque marcher, il faut juste ne pas oublier de mettre le debug = FALSE dans setting.py, et de bien faire l'interfaçage avec la BDD (juste après)

Masquer ses mots de passe Avoir ses mots de passe directement écrits dans le setting.py c'est nul. On ne peut pas publier son code sur github ou autre sans que tout le monde les connaisse ce qui serait dramatique (ou alors on passe par un.gitignore), et franchement voir mes mots de passe écrits en dur comme ça, ça me met mal à l'aise. Une solution est de les écrire dans le.profile, en bash, pour qu'à chaque fois qu'un utilisateur arrive, les mots de passe soient en variable d'environnement. On va écrire dans le.profile (si vous voulez plus d'explications sur le comment du pourquoi on écrit dans.profile et pas dans.bashrc http://superuser.com/ questions/183870/difference-between-bashrc-and-bash-profile) nano /home/webuser/.profile Puis on ajoute ceci à la fin, ce qui va rendre cette variable globale au système linux (variable d'environnement): export MONSITE_DB_PASSWORD='monMotdePasse' Maintenant on ajoute une ligne à notre fichier gunicorn_start dans /webapps/ MonProjet/bin/gunicorn_start, pour qu'à chaque fois que le serveur se lance il exécute.profile. source /home/webuser/.profile Enfin, il ne reste plus qu'à les récupérer dans le fichier setting.py, ici dans la connexion à la BD. DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'monprojet', 'USER': 'adminmonprojet', 'PASSWORD': os.environ.get

Utiliser git pour envoyer son projet sur le serveur On utilise git pour versionner son projet, et/ou pour travailler à plusieurs le plus souvent. Mais ce qui est cool c'est qu'on peut aussi l'utiliser pour envoyer notre projet sur le serveur. Vous faites vos modifications en local, tout marche bien, vous faites un commit, et bam vous balancez tout sur la prod, rien de plus à faire. On commence par créer un repo git un peu particulier : un --bare, qui ne contient aucun fichier source sudo mkdir -p /var/repo/monprojet.git cd /var/repo/monprojet.git git init --bare Maintenant que c'est fait, vous verrez un dossier hook dans le dossier monprojet.git. On peut y définir des fichiers qui vont intercepter les push, et faire des actions. Ici on va définir un fichier qui intercepte les push de l'utilisateur, et rediriger ce qui a été push non pas vers /var/repo/monprojet.git, mais vers / webapps/monprojet puis on écrit dedans: nano hooks/post-receive #!/bin/sh git --work-tree=/webapps/monprojet --git-dir=/var/repo/ monprojet.git checkout -f "--git-dir" spécifie le repertoire source, "--work-tree" spécifie l'endroit vers lequel on veut rediriger le push. On remarque que c'est encore un checkout (git utilise souvent cette commande) : ici il ne signifie pas "changer de branche", mais "mettre à jour l'espace de travail" On ajoute les droits d'execution : chmod +x hooks/post-receive Maintenant, on se met sur la machine local, et on init un repo git dans notre dossier cd /chemin/vers/projet/monprojet git init Et maintenant, on ajoute une "remote" à notre repo : git remote add prod ssh://user@mydomain.com/var/repo/ monprojet.git

Et voilà, à chaque fois qu'on voudra envoyer notre projet en prod, on fera : git push prod master (bien sûr ca ne push que les commit, ça reste un dépôt git hein) Pour finir J'espère que le tuto vous aura permis de bien vous débrouiller, et que vous saurez résoudre vos problèmes, car soyons sérieux, si vous n'êtes pas habitués à effectuer des mises en prod, il y en aura surement. Méfiez-vous notamment des droits linux sur les dossiers et fichiers, parfois vous ne les avez pas et ça plante. Bon courage! Sources : http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenvsupervisor/ https://www.digitalocean.com/community/tutorials/how-to-set-up-automaticdeployment-with-git-with-a-vps https://www.digitalocean.com/community/tutorials/how-to-use-mysql-or-mariadbwith-your-django-application-on-ubuntu-14-04 http://sametmax.com/votre-python-aime-les-pip/