Skip to content

Déploiement : Django

Alexander Wohlfahrt edited this page Jan 31, 2023 · 38 revisions

Prérequis

  1. Clés publiques des membres du projet ajoutées sur Github
  2. Container créé
  3. Mail d'information reçu contenant : votre port, URL, etc...
  4. Au minimum le projet par défaut de Django et de Vue.js fonctionnels

Infos du container

  • 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

Connexion ssh au container

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]

Récupération de votre projet

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

Installation des dépendances

Installer les dépendances des projets Django et Vue.js.

Vue.js

Pour Vue.js il suffit d'utiliser la commande npm install.

Django

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

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.

Fichiers static

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.

Test

A ce stade, votre frontend devrait fonctionner.

L'url de votre application frontend est la suivante : https://<PROJECT>.k8s.ing.he-arc.ch

Gunicorn

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 fichier manage.py
  • Modifier ExecStart en remplaçant project du dossier contenant le fichier settings.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

Test

A ce stade, votre backend devrait fonctionner.

L'url de votre application backend est la suivante : https://api-<PROJECT>.k8s.ing.he-arc.ch

Connexion à la base de données

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.

Communication entre backend et frontend

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).

Test final

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


Erreurs courantes

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.

Pas d'erreurs apparentes / page blanches

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.

Documentations d'étudiants

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 :

  • ...