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]](mailto:[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 (vous pouvez push sur git ce fichier).

Sur le serveur de déploiement, dirigez-vous à l'endroit où se trouve le fichier requirements.txt 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 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/backend/static/;
    }
}

# Vuejs
server {
    listen 81;
    server_name  _;
    root   /home/django/project/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.

Gunicorn

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. Il faudra donc faire attention à également redémarrer le service Gunicorn quand nous toucherons à des éléments de sa configuration.

Vous devez donc ici adapter la configuration de Gunicorn afin de la faire pointer sur le dossier de votre projet Django qui contient le fichier settings.py.

Si vous changez la configuration Gunicorn, vous devrez redémarrer Gunicorn avec sudo systemctl restart gunicorn.

Dossiers sauvegardés

Les fichiers placés dans /home/django/project seront sauvegardés.

⚠️⚠️⚠️⚠️

En cas de modification / recréation du container, seul le contenu de ce dossier sera restauré veillez à garder tout document important dans ce dossier

Il est également recommandé de placer votre projet dans ce dossier pour le maintenir sauvegardé.

La configuration Nginx est sauvegardée automatiquement et restaurée automatiquement si vous utilisez le fichier /home/django/project/nginx.conf.

Automatisation

Nous avons placé un fichier custom-start.sh dans votre dossier project. Ce fichier est un script bash qui est exécuté à chaque fois que votre container est redémarré (en cas de redémarrage ou de crash p. ex.).

Le redémarrage du container survient environ une fois chaque mois, pour diverses raisons (mises à jour, etc.). Vous pouvez donc utiliser ce fichier afin d'automatiser certaines étapes de votre déploiement sur votre container, cela vous évitera de devoir refaire les étapes à chaque fois et idéalement garantir l'accessibilité de votre site web à tout moment, vous faire gagner du temps à terme et éviter les mauvaises surprises.

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.

Accès à l'application

L'url de votre application est la suivante : https://<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 :

  • ...