
Un client m’a récemment demandé quelques mises à jour sur un site que j’avais développé pour lui il y a un ou deux ans. À l’époque, le déploiement m’avait presque rendu fou tant le processus était laborieux et source d’erreurs. En repensant à toute la difficulté rencontrée pour mettre ce projet en ligne, je me suis dit qu’il était temps de trouver une solution pour automatiser le déploiement.
Heureusement, aujourd’hui, je dispose des connaissances et des compétences nécessaires pour mettre en place un processus propre et fiable. Dans cet article, je vous explique comment j’ai procédé, en espérant que cela pourra également vous être utile.
NOTES
Pre-requis
- Avoir un projet Django prêt à être déployé.
- Avoir des notions de base en Linux.
- Avoir des notions de base en Github Actions.
- Avoir accès à un serveur avec cPanel et un nom de domaine (vous pouvez suivre le tutoriel même sans cela).
Etape 1 : Configurer notre projet Django
Avant de déployer un projet Django, il y a des configurations qu'il faut faire. Comme vous le savez, une application ne fonctionne presque jamais de la même manière en développement et en production. Pour nos configurations, nous allons toucher à 3 fichiers. Pour toute information sur l'utilité et le fonctionnement de ces fichiers, excepté le dernier, vous pouvez vous référer à la documentation officielle de Django. Les explications seront dans les commentaires.
- website/website/settings.py
- website/website/wsgi.py
- website/passenger_wsgi.py
1) Settings
2) Wsgi
3) Passenger WSGI
Etape 2 : Configurer une BDD Mysql sur cPanel
Dans cette deuxième étape, nous allons créer une instance MySql sur cPanel et sauvegarder nos credentials pour être utilisées plus tard. Cette procédure est plutôt facile, nous n'allons donc pas l'explorer dans cet article. Mais au cas où ce serait votre première fois d'utiliser cPanel, vous pouvez vous référez à cet article et cette vidéo Youtube.
Etape 3 : Configurer une application Python sur cPanel
Votre hébergeur pourrait ne pas supporter les applications Python, dans lequel cas vous aurez besoin de le contacter ou de changer d'hébergeur. Pour savoir si vous avez la possibilité d'héberger du Python sur le serveur, écrivez dans votre barre de recherche Setup Python App ou alors scroller vers la section Logiciel.

Une fois que vous cliquez dessus, vous serez redirigé vers une page où sont listés vos applications Python si vous en avez ou rien si vous n'en avez pas. Vous devriez avoir un bouton CREATE APPLICATION. Cliquez dessus pour être redirigé au Python Selector où vous allez configurer votre application.
- Sélectionnez une version Python. Rassurez-vous que cette version est proche ou au moins compatible avec votre version Django. Mais aussi, assurez-vous que vous avez la même version quand vous créez votre environnement virtuel sur le serveur (voir le postdep.sh script à l'étape 5). Dans mon cas, j'utilise Django 5.0 et Python 3.11.
- Dans le champ Applicaion root, entrez le nom du dossier qui contiendra votre projet sur le serveur. Dans notre cas, ce dossier sera nommé website.
- Ne mettez rien dans le champ Application URL.
- Dans le champ Application Startup, entrez passenger_wsgi.py.
- Dans le champ Application Entry Point, entrez application.
- Scrollez vers les bas et ajoutez vos variables d'environnement. Rassurez-vous qu'aucune variable ne manque et que WORKENV=production. Plus vous aurez des variables d'environnement, il vous suffira de revenir ici, ajouter ou modifier ces variables, sauvegarder et cliquer sur RESTART pour redémarrer l'application.
- Cliquez sur CREATE.
Etape 4 : Installer rsync sur notre serveur
Comme vous le savez, notre code est stocké sur Github et notre site sera hébergé sur un autre serveur. Il nous faut un moyen de transférer les fichiers de Github à notre serveur, automatiquement et de manière optimale. C'est à cela que sert rsync. C'est un outil en ligne de commande sous Linux/Unix utilisé pour synchroniser rapidement des fichiers et des répertoires, localement ou à distance. L'avantage d'utiliser rsync c'est qu'il ne copie que les fichiers qui ont été modifiés depuis le dernier transfert, ce qui permet de facilement déployer une version à jour du site tout en gagnant en temps.
Cependant, un problème se pose. Sur un serveur mutualisé, on ne peut pas installer de packages. On n'a pas accès à des outils comme apt. On n'a même pas accès au sudo. La solution, c'est d'installer des packages dans notre home directory.
Pour cela, j'ai un petit script que vous pouvez réutiliser pour installer n'importe quel autre outil dont vous pourriez avoir besoin plus tard. Nous allons l'utiliser pour installer rsync. Si vous n'êtes à l'aise avec Linux ou que Bash c'est du charabia pour vous, pas de panique. Utilisez juste le script et tout devrait bien se passer.
Connectez-vous à votre cPanel, cherchez Terminal dans la barre de recherche, ouvrez un Terminal et créez un fichier avec la commande suivante :
Si votre terminal affiche quelque chose comme GNU nano 2.9.x suivi du nom du fichier que vous venez d'écrire, c'est que tout est bon. La prochaine étape, c'est ce copier le code suivant et le coller dans cette fenêtre. Pour vous éviter des maux de tête, ne copiez pas avec Ctrl+C et ne collez pas avec Ctrl+V. Utilisez le clic droit pour choisir l'action (copier-coller, copy-paste).
Une fois que vous avez collé ce script, tapez Ctrl+O, ensuite tapez Enter (ou la commande correspondante sur les autres types de clavier) et enfin, tapez Ctrl+X. La fenêtre GNU nano va se refermer et vous allez revenir à votre terminal. Pour vous assurez que vous avez le script sur votre serveur, tapez la commande :
Si vous voyez le contenu s'afficher, c'est bon. Nettoyez le terminal, on va installer notre package. La commande d'installation est la suivante :
Etape 5 : SSH & CI/CD
Maintenant, nous allons mettre en place notre CI/CD Pipeline. Elle fonctionnera de manière très simple. Chaque fois que nous allons effectuer un push vers une branche spécifique, notre code sera copié de Github vers notre serveur où il sera actualisé. Cependant, il reste un problème : comment faisons-nous pour copier notre code d'un serveur à un autre ? Comment ces deux serveurs communiquent ?
Le protocole SSH nous aidera à résoudre cette question. Pour plus d'information sur ce qu'est le SSH, lisez cet article sur Wikipédia. Pour apprendre comment il fonctionne, lisez cet article de Digital Ocean.
Nous allons générer les chose suivantes sur notre cPanel :
- Une clé privée (SSH_PRIVATE_KEY)
- Une clé publique (SSH_PUBLIC_KEY)
- Un mot de passe (PASSPHRASE)
Pour éviter de nous écarter du sujet de cet article, nous n'allons nous étendre sur comment générer des credentials SSH sur cPanel. Cependant, vous pouvez apprendre avec ce tutotriel rapide et facile :
Une fois que vous aurez généré les credentials, vous allez les ajouter à votre repository Github.
- Allez sur Github. Dans votre repository, aller dans Settings ou l'équivalent dans votre langue.
- Cherchez Secrets and Variables ou l'équivalent dans votre langue.
- Cliquez dessus puis cliquez sur Actions.
- Cliquez sur New repository secret ou l'équivalent dans votre langue.
- Ajoutez les secrets suivants :
- APP_PATH : chemin complet vers le dossier où vivra votre code. Si votre nom utilisateur est tupac, vous aurez sûrement quelque chose comme home/tupac/website
- SSH_HOST : l'adresse IP de votre serveur ou votre nom de domaine.
- SSH_PORT : le port SSH de votre serveur. Essayez les port 22 et 2222. Si ça ne marche pas, vous pourriez avoir besoin de contacter votre hébergeur pour le lui demander.
- SSH_PASSPHRASE : le mot de passe ou passphrase qui a encodé vos clés.
- SSH_PRIVATE_KEY : votre clé privée.
- SSH_USER : votre nom d'utilisateur. Si on reste dans l'exemple ci-dessus, ça sera tupac.
Une fois que toutes ces valeurs sont bien stockées et sécurisées dans votre Github, vous allez créer dans votre projet un dossier .github dans lequel vous allez créer un autre dossier workflows. Dans ce dernier dossier, vous allez créer un fichier deploy.yml dans lequel vous allez coller le code suivant :
Ensuite, vous allez créer un dernier fichier postdep.sh à la racine de votre projet. Ce fichier est un script qui s'assurera d'exécuter toutes les commandes de post-déploiement automatiquement pour vous. Assurez-vous aussi qu'il est exécutable, comme nous avons fait ave installer.sh.
Etape 6 : Push & Deploy
Maintenant que tout est prêt, effectuez un push sur la branche que vous avez specifiée (ou sur l'une de branches, parce que vous pouvez en spécifier plusieurs) et le tour devrai être joué. Votre site Django sera automatiquement déployé, sans effort de votre part, et vous pouvez vous concentrer sur le plus importat qui est de coder.
Une stratégie que je vous conseille d'adopter, c'est d'avoir une branche réservée au code qui doit se trouver en production. Avant de push, PR ou merge dans cette brach, il faut vous assurez que votre code est testé et fonctionne comme il faut. Cela vous évitera d'avoir un site qui bugue un jour.
Etape 7 : Gestion des images et vidéos
Si vous n'avez pas configuré un bucket sur un service tierce comme AWS ou Cloudinary et que vous stockez vos images directement sur votre serveur, elles ne vont pas s'afficher. Pour cela, nous allons simuler un CDN.
- Créez un sous-domaine media.domaine.com (en supposant que votre domaine c'est domaine.com).
- Cochez Registered Domain.
- Entrez votre sous-domaine dans le champ Domain.
- Décochez Share document root.
- Dans le champ Document Root (File System Location) entrez votre sous-domaine.
- Une fois terminée, cliquez sur Envoyer, Créer, Enregistrer ou peu importe le label du boutton que vous aurez.
- Ouvrez votre fichier website/website/urls.py et assurez-vous qu'il ressemble à ceci :
WRAPPING UP
Happy Hacking ! All credits to Kendrick Lamar, Papoose, Little Brother et Erykah Badu. J'ai écrit cet article en écoutant leur musique 😂😂😂.
PS : Si vous pensez qu'une correction doit être faite dans le code ou dans le texte, n'hésitez pas à me contacter. Je suis ouvert !

