Déploiement Docker

Difficulté : Intermédiaire | Temps : 20–30 min

Prérequis

  • Docker 24+ et Docker Compose 2.x
  • Domaine avec un enregistrement DNS pointant sur le serveur
  • Ports 80 et 443 disponibles

Vous n'avez rien à écrire vous-même. Le dépôt fournit le Dockerfile, le docker-compose.yml, le template nginx et un script d'installation. Ce guide décrit ce qu'ils font.


1. Installation assistée

C'est la voie recommandée. Le script est interactif : il vous demande votre domaine et une adresse e-mail d'administration.

git clone https://github.com/RebelliousSmile/suddenly.git
cd suddenly
./scripts/install.sh

Le script enchaîne :

  1. vérification de Docker et Docker Compose ;
  2. génération d'une SECRET_KEY et d'un mot de passe PostgreSQL, écrits dans un .env neuf — inutile de copier .env.example au préalable ;
  3. génération de nginx/conf.d/suddenly.conf à partir du template, avec votre domaine ;
  4. obtention d'un certificat Let's Encrypt (certbot certonly --webroot) ;
  5. docker compose pull && up -d, puis migrate ;
  6. création du compte administrateur (createsuperuser, interactif).

À la fin, l'instance répond en HTTPS sur votre domaine.


2. Ce que compose démarre

ServiceImageRôle
webbuild localDjango + gunicorn (suddenly.wsgi:application)
dbpostgres:16-alpineBase de données
redisredis:7-alpineCache + broker Celery
celerybuild localcelery -A suddenly worker
celery-beatbuild localTâches planifiées (scheduler en base)
nginxnginx:alpineTerminaison TLS, statiques et médias — seul service exposé (80/443)
certbotcertbot/certbotRenouvellement du certificat toutes les 12 h

Le conteneur web exécute scripts/entrypoint.sh au démarrage : collectstatic, migrate, createcachetable, puis gunicorn. Les migrations sont donc appliquées à chaque déploiement, sans intervention.

Volumes persistants : pgdata, redisdata, static, media, certs, certbot-webroot.


3. Variables d'environnement

Le script écrit un .env fonctionnel. Les clés qui comptent :

DOMAIN=votre-domaine.com
SECRET_KEY=genere-par-le-script
POSTGRES_PASSWORD=genere-par-le-script

DJANGO_SETTINGS_MODULE=config.settings.production est déjà positionné dans le docker-compose.yml : c'est lui qui active DEBUG=False, les cookies Secure et HSTS. Voir la page Configuration pour les variables optionnelles (Redis, e-mail, stockage S3/R2).


4. Installation manuelle

Si vous préférez piloter chaque étape (certificat déjà en place, reverse-proxy externe…) :

git clone https://github.com/RebelliousSmile/suddenly.git
cd suddenly

cp .env.example .env
nano .env                      # DOMAIN, SECRET_KEY, POSTGRES_PASSWORD

docker compose build
docker compose up -d db redis
docker compose run --rm web python manage.py migrate
docker compose run --rm web python manage.py createsuperuser
docker compose up -d

Le template nginx (nginx/conf.d/suddenly.conf.template) doit être rendu avant de démarrer le conteneur nginx — c'est ce que fait install.sh avec envsubst.


5. Vérification

docker compose ps
docker compose logs -f web

curl https://votre-domaine.com/health/          # {"status": "ok"}
curl https://votre-domaine.com/.well-known/nodeinfo
curl "https://votre-domaine.com/.well-known/webfinger?resource=acct:admin@votre-domaine.com"

6. Mise à jour

git pull origin main
docker compose build
docker compose up -d

Inutile de lancer migrate : l'entrypoint s'en charge au redémarrage du conteneur web.


Sauvegarde et restauration

Le dépôt fournit deux scripts plutôt qu'un pg_dump manuel :

./scripts/backup.sh [dossier]   # dump PostgreSQL + médias + .env, purge au-delà de 7 jours
./scripts/restore.sh <prefixe>  # interactif : DROP DATABASE puis restauration

restore.sh détruit la base avant de la recréer. Il demande confirmation, mais lisez ce qu'il vous propose.


Dépannage

ProblèmeSolution
Conteneur ne démarre pasdocker compose logs [service]
Erreur de connexion DBdocker compose exec db pg_isready -U suddenly
Erreur 502 Bad GatewayVérifier que web tourne : docker compose ps
ModuleNotFoundError: config.wsgiLe module WSGI est suddenly.wsgi — vous avez une commande gunicorn personnalisée à corriger
Réinitialisation complètedocker compose down -v && docker compose build --no-cache && docker compose up -d

docker compose down -v supprime les volumes — toutes les données seront perdues.