-
Notifications
You must be signed in to change notification settings - Fork 13
Déploiement : Django
- Clés publiques des membres du projet ajoutées sur Github
- Container créé
- Mail d'information reçu contenant : votre port, URL, etc...
- Au minimum le projet par défaut de Django et de Vue.js fonctionnels
- Image Docker : Ubuntu 22.04.1 LTS
- Nginx : 1.18.0
- Gunicorn : 20.1.0
- Python : 3.10.6
- pip : 22.0.2
- Node.js : 18.13.0
- NPM : 8.15
Connectez-vous en ssh sur le port communiqué par email et avec l'utilisateur django
en utilisant la clé que vous avez ajoutée sur GitHub.
Avant de vous connecter, vérifiez que votre clé ssh soit ajoutée dans votre agent ssh local.
ssh -p<PORT> [email protected]
Vous pouvez cloner votre projet sur le serveur de déploiement dans le dossier /home/django/project/
. Utilisez idéalement SSH avec une clé de déploiement.
Source pour générer et utiliser des clés de déploiement : https://docs.github.com/en/developers/overview/managing-deploy-keys#deploy-keys
Installer les dépendances des projets Django et Vue.js.
Pour Vue.js il suffit d'utiliser la commande npm install
.
Pour Django il y a plusieurs techniques, nous utiliserons celle qui consiste à créer un fichier requirements.txt
et à utiliser ce fichier pour installer les dépendances.
Dans votre environnement de dév, déplacez-vous dans le dossier de votre projet Django et exécutez la commande pipenv requirements > requirements.txt
. Cela aura pour effet de créer un fichier requirements.txt que vous pourrez utiliser sur le serveur de production. Vous pouvez push ce fichier sur git et le mettre à jour avant de déployer.
Dirigez-vous sur le serveur de production et récupérez les modifications afin d'obtenir le fichier requirements.txt. Rendez-vous ensuite à l'endroit où se trouve ce fichier et exécutez la commande pip install -r requirements.txt
.
Vous pouvez également installer pipenv et utiliser pipenv sur le serveur à la place, mais je vous préviens la configuration n'est pas de tout repos ^^ Je vous recommande donc la technique expliquée au-dessus. Vous avez le choix ;)
Nginx est utilisé comme serveur web sur le container. La configuration que vous devez modifier se trouve dans /home/django/project/nginx.conf
.
La config de Nginx se trouve en réalité dans
/etc/nginx/sites-enabled/default
, nous avons modifié légèrement le serveur afin d'en créer un lien symbolique pour vous faciliter la tâche et éviter des problèmes de sauvegarde en cas de soucis avec le serveur.
Configuration par défaut :
# Django
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static/ {
alias /home/django/.project-default/backend/static/;
}
}
# Vuejs
server {
listen 81;
server_name _;
root /home/django/.project-default/frontend/dist;
location / {
index index.html;
try_files $uri $uri/ index.html /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Dans votre projet vous avez un frontend et un backend, il faut donc avoir une configuration pour chaque partie. Dans ce chapitre nous allons devoir l'adapter pour que le frontend puisse fonctionner, la configuration du backend est déjà correcte pour Nginx.
Vous devez donc ici adapter la configuration de Nginx afin de la faire pointer sur le dossier dist
.
Le dossier dist
peut être généré en exécutant npm run build
.
Si vous changez la configuration Nginx, vous devrez redémarrer Nginx avec sudo service nginx restart
.
Si vous avez besoin que Nginx serve vos fichiers static, il faudra mettre à jour l'alias de la configuration Nginx de /static/
avec le chemin correspondant à votre projet.
Comprenez d'abord se que sont les static files et si vous en avez besoin avant de vous soucier de ce point.
A ce stade, votre frontend devrait fonctionner.
L'url de votre application frontend est la suivante : https://<PROJECT>.k8s.ing.he-arc.ch
Gunicorn est utilisé comme serveur WSGI sur le container. La configuration que vous devez modifier se trouve dans /home/django/project/gunicorn.conf
.
La config de Nginx se trouve en réalité dans
/etc/systemd/system/gunicorn.service
, nous avons modifié légèrement le serveur afin d'en créer un lien symbolique pour vous faciliter la tâche et éviter des problèmes de sauvegarde en cas de soucis avec le serveur.
Configuration par défaut :
[Unit]
Description=GUnicorn wsgi service
[Service]
User=django
Group=www-data
WorkingDirectory=/home/django/.project-default/backend
ExecStart=/bin/sh -c "/usr/local/bin/gunicorn -w 3 project.wsgi"
Restart=always
[Install]
WantedBy=multi-user.target
Pour pouvoir déployer une app Python, Django dans notre cas, nous avons besoin d'un serveur WSGI (qui comprend le langage Python) et d'un serveur web (qui s'occupe de la communication entre client et serveur WSGI). Dans notre cas Gunicorn joue le rôle du serveur WSGI et Nginx le rôle du serveur web.
Vous devez donc ici adapter la configuration de Gunicorn de la manière suivante :
- Modifier
WorkingDirectory
en faisant pointer le chemin sur le dossier de votre projet Django qui contient le fichiermanage.py
- Modifier
ExecStart
en remplaçantproject
du dossier contenant le fichiersettings.py
Si vous changez la configuration Gunicorn, vous devrez redémarrer Gunicorn avec sudo systemctl restart gunicorn
.
sudo systemctl status gunicorn
peut vous aider à comprendre se qu'il se passe en cas de problème
Pour que votre serveur Django fonctionne en production, il faut au minimum modifier la variable ALLOWED_HOSTS
dans le fichier settings.py
et y mettre adresse de votre backend (ne pas mettre l'URL entière, juste l'adresse !) : api-<PROJECT>.k8s.ing.he-arc.ch
A ce stade, votre backend devrait fonctionner.
L'url de votre application backend est la suivante : https://api-<PROJECT>.k8s.ing.he-arc.ch
Assurez-vous
Vous ne devez pas utiliser une base de données SQLite, mais bien une base de données PostgreSQL fourni.
Dans le dossier /root/config-mount
et /root/secret-mount
vous trouverez vos identifiants de connexion à la base de données. Notamment postgres-host
, postgres-database
, postgres-user
, postgres-password
et postgres-port
. Ceux-ci sont uniquement accessibles en root (sudo su).
Vous devrez utiliser ces données dans le fichier settings.py
de votre app Django afin qu'elle puisse se connecter à la base de données.
L'environnement de production/déploiement est très différent de celui de développement, ici je ne peux pas vous donner de marche à suivre étant donné que les configurations nécessaires dépendront de vos projets. Mais voici quelques pistes et éléments aux quels il faudra faire attention, à vous de compléter ces éléments en fonction de vos projets.
Vous allez devoir adapter passablement de choses supplémentaires pour que votre application fonctionne en production, comme toutes les URLs qui font références à votre backend et votre frontend. Et vous devrez également faire attention à respecter les règles et les contraintes de déploiement des différents framework.
Afin d'éviter de devoir modifier les URLs partout dans votre projet à chaque déploiement, une bonne pratique est d'utiliser des fichiers .env
autant en frontend qu'en backend. Ces fichiers ont l'avantages de pouvoir être configurés une seule fois (attention, il ne faut jamais push de fichier .env).
A ce stade tout devrait fonctionner correctement.
L'url de votre application frontend est la suivante : https://<PROJECT>.k8s.ing.he-arc.ch
L'url de votre application backend est la suivante : https://api-<PROJECT>.k8s.ing.he-arc.ch
Afin d'avoir plus de détails sur l'état de votre déploiement vous pouvez exécuter la commande python3 manage.py check --deploy
.
Mettre le paramètre DEBUG
dans le fichier settings.py
à True
pour que Django vous renvoie davantage de détails sur les erreurs.
IMPORTANT : Une fois votre déploiement réussi, remettez ce paramètre à
False
.
Si vous avez écrit de la documentation à propos de votre déploiement, sur le wiki de votre projet ou ailleurs, vous pouvez indiquer le lien de cette dernière ci-dessous :
- ...