Avec Docker — đŸ”” Confirmé¶

Le projet fournit un Dockerfile. Cette mĂ©thode encapsule l’application et ses dĂ©pendances dans des conteneurs, ce qui rend le dĂ©ploiement reproductible d’une machine Ă  l’autre. Elle suppose d’ĂȘtre Ă  l’aise avec Docker et Docker Compose.

Avertissement

Le Dockerfile fourni est un point de dĂ©part, pas une image de production clĂ©s en main. Le systĂšme de fichiers d’un conteneur est Ă©phĂ©mĂšre : ne comptez pas dessus pour stocker les mĂ©dias uploadĂ©s (le VOLUME dĂ©clarĂ© ne suffit pas en production). Configurez un stockage externe pour les mĂ©dias (voir Stockage des mĂ©dias en base de donnĂ©es (DB Storage)) et durcissez l’image selon votre contexte avant toute mise en production.

Prérequis¶

  • Docker et Docker Compose installĂ©s sur le serveur

  • Git (pour cloner le dĂ©pĂŽt)

  • Un nom de domaine configurĂ© (pour la production)

Étapes¶

  1. Cloner le dépÎt.

  2. Créer un fichier docker-compose.yml à la racine du projet (adapté à votre contexte : service web, base PostgreSQL, volumes).

  3. GĂ©nĂ©rer une SECRET_KEY (Copiez la valeur affichĂ©e dans le terminal, vous la collerez dans le .env Ă  l’étape suivante) :

    python3 -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
    
  4. Créer et éditer le fichier .env en vous basant sur .env.example :

    cp .env.example .env
    

    Ouvrez ensuite .env dans un Ă©diteur de texte et renseignez les variables. Chaque variable s’écrit sur une ligne sous la forme NOM=valeur (sans espace autour du =, sans guillemets). À minima :

    • SECRET_KEY : la valeur gĂ©nĂ©rĂ©e Ă  l’étape 3

    • DATABASE_URL : l’adresse de connexion Ă  la base PostgreSQL

    • HOST_URL : votre domaine principal

    • ALLOWED_HOSTS votre domaine principal et les Ă©ventuels (sous-)domaines secondaires

    • USE_DOCKER=1 : pour que les recettes just s’exĂ©cutent Ă  l’intĂ©rieur du conteneur web

    Pour ajouter d’autres variables d’environnement, voir la rĂ©fĂ©rence des variables d’environnement.

  5. Construire et lancer les conteneurs :

    docker compose up -d --build
    
  6. Initialiser le site :

    docker compose exec web python manage.py migrate
    docker compose exec web python manage.py collectstatic --noinput --ignore="*.sass"
    docker compose exec web python manage.py createsuperuser
    docker compose exec web python manage.py set_config
    docker compose exec web python manage.py import_dsfr_pictograms
    docker compose exec web python manage.py create_starter_pages
    

    Astuce

    💡 Avec USE_DOCKER=1 dans votre .env, vous pouvez remplacer la quasi-totalitĂ© de ces commandes par un seul just deploy (qui enchaĂźne migrations, fichiers statiques, pages de dĂ©marrage, gabarits, illustrations et indexation).

    Seul createsuperuser reste à lancer séparément, via just createsuperuser (ou son alias just csu).

Indexation de la recherche¶

Les contenus des pages sont indexés pour permettre la recherche sur le site, par la commande update_index (cf. la documentation de Wagtail). Elle est déjà lancée par just deploy à chaque déploiement.

Il est recommandĂ© d’y ajouter une rĂ©indexation hebdomadaire, pour corriger d’éventuels Ă©carts entre l’index et les contenus. Selon votre plateforme :

  • Si vous disposez de cron sur la machine hĂŽte, ajoutez-y une tĂąche qui exĂ©cute la commande dans le conteneur :

    crontab -e
    # Ajouter (en adaptant le chemin du projet) :
    0 3 * * 0 cd /opt/sites-conformes && docker compose exec -T web python manage.py update_index
    

    L’option -T dĂ©sactive l’allocation d’un terminal : elle est indispensable pour une exĂ©cution via cron, qui n’en dispose pas.

  • Sur un hĂ©bergement de type container-as-a-service (oĂč cron n’est souvent pas disponible), planifiez plutĂŽt python manage.py update_index via l’ordonnanceur de tĂąches de votre plateforme (tĂąche programmĂ©e / scheduled job).

Mise à jour (Docker)¶

  1. Sauvegarder la base de données (voir Sauvegarde locale de la base de données et des médias).

  2. Récupérer la derniÚre version du code :

    git pull
    
  3. Reconstruire les images et relancer :

    docker compose up -d --build
    
  4. Appliquer les migrations et regénérer les fichiers statiques :

    docker compose exec web python manage.py migrate
    docker compose exec web python manage.py collectstatic --noinput --ignore="*.sass"
    

    Astuce

    Avec USE_DOCKER=1, la recette just update enchaßne la synchronisation des dépendances (uv sync) puis just deploy. Pratique pour une mise à jour complÚte en une commande.

    Avertissement

    Si vous venez de faire une migration depuis un site en prod avec une base de donnĂ©es de prod pour le faire tourner en local, n’oubliez pas d’effectuer la commande set_config pour réécrire la valeur de HOST_URL en base.