Article original : How to Deploy Your Django Project on an EC2 Machine using GitHub Actions

Le déploiement d'une application Django peut être rationalisé et automatisé en utilisant GitHub Actions.

Cet article fournit un guide complet sur la façon de configurer un pipeline de déploiement continu pour un projet Django hébergé sur une instance AWS EC2.

En tirant parti de GitHub Actions, les développeurs peuvent automatiser leur processus de déploiement, le rendant plus efficace et sans erreur.

Prérequis

  • Un projet Django hébergé dans un dépôt GitHub.
  • Une instance AWS EC2 configurée pour héberger une application Django.
  • Une familiarité de base avec YAML et les workflows GitHub.

Comment configurer l'instance EC2

Avant de plonger dans GitHub Actions, assurez-vous que votre instance EC2 est prête à héberger votre application Django.

Utilisez la commande suivante pour vous connecter à votre instance EC2 :

ssh -i /path/to/your-key.pem ec2-user@your-ec2-instance-public-dns

Vous pouvez mettre à jour les paquets de votre système en utilisant ces commandes :

sudo apt-get update
sudo apt-get upgrade

Ensuite, si ce n'est pas déjà fait, installez Python et Pip :

sudo apt-get install python3
sudo apt-get install python3-pip

Puis installez Django en utilisant cette commande :

pip3 install django

Comment configurer un serveur web

Dans cette section, vous verrez comment configurer votre serveur web.

Tout d'abord, installez Nginx :

sudo apt-get install nginx

Ensuite, configurez Nginx pour Django. Commencez par créer un nouveau fichier de configuration pour votre projet Django.

sudo nano /etc/nginx/sites-available/mydjangoapp

Puis ajoutez le bloc serveur suivant :

server {
    listen 80;
    server_name your-domain.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /path/to/your/django/project;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/path/to/your/gunicorn.sock;
    }
}

Enfin, activez la configuration Nginx :

sudo ln -s /etc/nginx/sites-available/mydjangoapp /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

Comment configurer une base de données

Vous pouvez installer PostgreSQL en utilisant cette commande :

sudo apt-get install postgresql postgresql-contrib

Après l'installation, créez une base de données et un utilisateur en utilisant cette commande :

sudo -u postgres psql

Exécutez cette requête SQL pour créer une nouvelle base de données et ajouter un nouvel utilisateur :

CREATE DATABASE mydjangodb;
CREATE USER mydjangouser WITH PASSWORD 'password';
ALTER ROLE mydjangouser SET client_encoding TO 'utf8';
ALTER ROLE mydjangouser SET default_transaction_isolation TO 'read committed';
ALTER ROLE mydjangouser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE mydjangodb TO mydjangouser;
\q

Ensuite, configurez Django pour utiliser PostgreSQL. Dans votre fichier settings.py de Django, mettez à jour le paramètre DATABASES :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydjangodb',
        'USER': 'mydjangouser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

Le workflow GitHub Actions pour déployer un projet Django implique plusieurs étapes clés :

Étape #1 - Checkout et préparation

La première étape de votre workflow consiste à extraire le dernier code de votre dépôt GitHub et à configurer l'environnement pour le déploiement.

name: Déployer Django sur EC2

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Extraire le dépôt
      uses: actions/checkout@v2

Étape #2 - Script de déploiement

Le script de déploiement implique de récupérer le dernier code, d'installer les dépendances, d'exécuter les migrations et de redémarrer les serveurs web et WSGI.

Créez un nouveau fichier deploy_script.sh sur votre machine EC2 et ajoutez le code ci-dessous :

#!/bin/bash

DRY_RUN=$1

echo "Récupération du dernier code depuis le dépôt..."
# Sauter l'extraction réelle du code en mode dry run
[ "$DRY_RUN" != "true" ] && git pull origin main

echo "Installation des dépendances..."
# Sauter l'installation réelle en mode dry run
[ "$DRY_RUN" != "true" ] && pip install -r requirements.txt

echo "Exécution des migrations..."
# Sauter les migrations réelles en mode dry run
[ "$DRY_RUN" != "true" ] && python manage.py migrate

echo "Redémarrage du serveur..."
# Sauter le redémarrage réel en mode dry run
[ "$DRY_RUN" != "true" ] && sudo systemctl restart myapp

echo "Déploiement terminé."

Étape #3 - Créer une étape pour exécuter le script de déploiement

Utilisez GitHub Actions pour vous connecter en SSH à votre instance EC2. Vous devrez stocker la clé SSH de votre instance EC2 en tant que secret GitHub.

- name: Exécuter le déploiement
  run: |
    ssh -i ${{ secrets.EC2_SSH_KEY }} ec2-user@your-ec2-instance 'bash -s' < deploy_script.sh
  env:
    ACTIONS_RUNNER_DEBUG: false

Considérations de sécurité

Voici quelques considérations de sécurité à garder à l'esprit :

  • Clés SSH : Stockez vos clés privées SSH en toute sécurité dans les secrets GitHub.
  • Permissions minimales : Assurez-vous que le rôle IAM de l'instance EC2 a les permissions minimales nécessaires pour le déploiement.

Tests et validation

Avant de mettre en œuvre complètement ce workflow, testez-le avec un environnement de développement ou de pré-production pour vous assurer que le processus de déploiement fonctionne comme prévu.

Déploiement en mode dry run : Implémentez une étape dans votre workflow GitHub Actions qui effectue un "dry run" du processus de déploiement. Cela peut aider à valider les scripts de déploiement sans affecter l'instance EC2 en production. Ajoutez l'étape ci-dessous pour passer dry_run = true dans le script de déploiement.

- name: Déploiement en mode dry run
  run: |
    ssh -i ${{ secrets.EC2_SSH_KEY }} ec2-user@your-ec2-instance 'bash -s' < deploy_script.sh true
  env:
    ACTIONS_RUNNER_DEBUG: true

Journalisation et surveillance : Vous pouvez voir les logs actuels de la capture des actions du processus de déploiement depuis deploy_script.sh, qui peuvent être examinés si des problèmes surviennent.

Conclusion

Automatiser les déploiements Django en utilisant GitHub Actions offre une manière rationalisée et fiable de gérer la livraison des applications.

En suivant les étapes décrites ci-dessus, les développeurs peuvent configurer un pipeline de déploiement robuste qui pousse leur dernier code Django vers une instance EC2 de manière transparente à chaque push sur la branche principale.