====== Déploiement en production ======
Déploiement via **ssh** avec la commande **rsync**.
À lire :
* [[https://www.bogotobogo.com/python/Flask/Python_Flask_HelloWorld_App_with_Apache_WSGI_Ubuntu14.php]]
* [[https://www.bortzmeyer.org/wsgi.html]]
===== Préparation du serveur =====
Serveur **Ubuntu 20.04** avec **Apache 2.4**.
Installer **mod_wsgi**
sudo apt install libapache2-mod-wsgi-py3
Installer **python3-pip** si nécessaire
sudo apt install python3-pip
Installer **python3-venv**
sudo apt install python3-venv
===== Dossier de destination =====
Créer un dossier
sudo mkdir /var/www/monsite
sudo chown marc:marc /var/www/monsite
===== Script de déploiement =====
Ajouter au projet un script **deploy.sh** :
#!/bin/sh
rsync -rlpv \
./ \
USER@SERVEUR:/var/www/monsite/ \
--exclude-from=.gitignore \
--exclude=".*" \
--exclude="run.py"
^ Voir la [[https://ss64.com/bash/rsync.html|Man Page de rsync]] ^
^ Ne pas oublier de terminer les chemins par des "/" ^
Rendre le script exécutable :
chmod +x deploy.sh
Exécuter une première fois le script, ce qui va copier l'ensemble
du projet sur le serveur.
===== Installer les dépendances du projet =====
Créer un environnement virtuel
cd /var/www/monsite
python3 -m venv venv
Activer l'environnement virtuel et y installer les dépendances du projet
source venv/bin/activate
pip install -r requirements.txt
Désactiver l'environnement virtuel
deactivate
===== Fichier wsgi =====
Créer un fichier **myapp.wsgi** à la racine du projet :
#!/usr/bin/python
import os, sys
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)))
from app import app as application
===== Créer un fichier .env =====
Si nécessaire, créer la configuration du site dans un fichier **.env** :
FLASK_ENV=production
SECRET_KEY='...(chaîne aléatoire)...'
DBPATH=...
...
Pour générer la clé secrète, voir la page [[python:generer_secret_key]]
===== Configuration d'Apache =====
Créer un nouveau **VirtualHost** :
ServerName monsite.com
ServerAdmin admin@monsite.com
WSGIDaemonProcess myapp user=www-data group=www-data python-home=/var/www/monsite/venv threads=5
WSGIProcessGroup myapp
WSGIScriptAlias / /var/www/monsite/myapp.wsgi
AllowOverride all
Require all granted
Allow from all
ErrorLog ${APACHE_LOG_DIR}/monsite.com/error.log
CustomLog ${APACHE_LOG_DIR}/monsite.com/access.log combined
^ Le nom "myapp" indiqué dans WSGIDaemonProcess et WSGIProcessGroup ne doit pas être utilisé par un autre VirtualHost ! ^
Le dossier **/var/log/apache2/monsite.com** pour les logs doit exister.
Activer le site et recharger Apache :
sudo a2ensite monsite.conf
sudo systemctl reload apache2
===== Déploiements ultérieurs =====
**En local**, exécuter le script de déploiement
./deploy.sh
** Sur le serveur**, installer les nouvelles dépendances éventuelles
. venv/bin/activate
pip install -r requirements.txt
deactivate
** Sur le serveur**, redémarrer Apache
sudo systemctl reload apache2