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, ledocker-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 :
- vérification de Docker et Docker Compose ;
- génération d'une
SECRET_KEYet d'un mot de passe PostgreSQL, écrits dans un.envneuf — inutile de copier.env.exampleau préalable ; - génération de
nginx/conf.d/suddenly.confà partir du template, avec votre domaine ; - obtention d'un certificat Let's Encrypt (
certbot certonly --webroot) ; docker compose pull && up -d, puismigrate;- création du compte administrateur (
createsuperuser, interactif).
À la fin, l'instance répond en HTTPS sur votre domaine.
2. Ce que compose démarre
| Service | Image | Rôle |
|---|---|---|
web | build local | Django + gunicorn (suddenly.wsgi:application) |
db | postgres:16-alpine | Base de données |
redis | redis:7-alpine | Cache + broker Celery |
celery | build local | celery -A suddenly worker |
celery-beat | build local | Tâches planifiées (scheduler en base) |
nginx | nginx:alpine | Terminaison TLS, statiques et médias — seul service exposé (80/443) |
certbot | certbot/certbot | Renouvellement 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.shdétruit la base avant de la recréer. Il demande confirmation, mais lisez ce qu'il vous propose.
Dépannage
| Problème | Solution |
|---|---|
| Conteneur ne démarre pas | docker compose logs [service] |
| Erreur de connexion DB | docker compose exec db pg_isready -U suddenly |
| Erreur 502 Bad Gateway | Vérifier que web tourne : docker compose ps |
ModuleNotFoundError: config.wsgi | Le module WSGI est suddenly.wsgi — vous avez une commande gunicorn personnalisée à corriger |
| Réinitialisation complète | docker compose down -v && docker compose build --no-cache && docker compose up -d |
docker compose down -vsupprime les volumes — toutes les données seront perdues.