Déploiement
Cible : un VPS Linux (Ubuntu 22.04 ou plus) avec Docker. Architecture :
Internet ─▶ Nginx (port 80/443) ─▶ Gunicorn + workers Uvicorn (ASGI, web:8000) ─▶ PostgreSQL (db) │ └─▶ Redis (cache) └─ sert /static/ et /media/ directement1. Préparer le serveur
Section intitulée « 1. Préparer le serveur »curl -fsSL https://get.docker.com | shsudo usermod -aG docker $USERPointer le domaine (enregistrement DNS A) vers l’adresse IP du serveur.
2. Récupérer le code et configurer
Section intitulée « 2. Récupérer le code et configurer »git clone https://github.com/Aziguy/fleaMarketOnline.git /opt/mfoundicd /opt/mfoundicp .env.example .envÉditer .env : SECRET_KEY, ALLOWED_HOSTS, CSRF_TRUSTED_ORIGINS, mots de passe PostgreSQL (identiques dans POSTGRES_PASSWORD et DATABASE_URL), SMTP, ADMINS, et pour la sécurité des comptes MFA_ENCRYPTION_KEY, WEBAUTHN_RP_ID et TRUSTED_PROXY_COUNT. Voir Configuration.
Générer les deux clés secrètes :
python3 -c "import secrets; print(secrets.token_urlsafe(50))"Conservez MFA_ENCRYPTION_KEY avec vos sauvegardes : sans elle, les applications d’authentification des utilisateurs ne fonctionnent plus (ils doivent alors passer par leurs codes de secours).
3. Lancer
Section intitulée « 3. Lancer »docker compose -f docker-compose.prod.yml up -d --buildLe conteneur web sert l’application en ASGI (Gunicorn avec workers Uvicorn), indispensable au flux temps réel des commerçants. Nginx transmet /espace-boutique/flux/ sans tampon (voir docker/nginx/default.conf) ; tout reverse proxy placé devant doit faire de même (proxy_buffering off, délai de lecture ≥ 6 minutes).
Au démarrage, le conteneur web applique les migrations puis collecte les fichiers statiques (désactivable avec RUN_MIGRATIONS=0 / COLLECTSTATIC=0).
Créer le compte administrateur du mall :
docker compose -f docker-compose.prod.yml exec web python manage.py createsuperuserConnectez-vous ensuite sur le site, ouvrez Sécurité du compte et activez une application d’authentification ou une clé d’accès : c’est obligatoire pour accéder à /admin/. Notez les codes de secours affichés.
4. HTTPS
Section intitulée « 4. HTTPS »Le plus simple : placer un reverse proxy TLS devant Nginx (Caddy, Traefik) ou utiliser Certbot sur l’hôte. Exemple avec Certbot et Nginx sur l’hôte : faire écouter le conteneur Nginx en local uniquement (HTTP_PORT=127.0.0.1:8080 dans .env), puis :
sudo apt install nginx certbot python3-certbot-nginxsudo certbot --nginx -d mfoundimall.cm -d www.mfoundimall.cmavec un bloc location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }.
Avec ce proxy supplémentaire devant le conteneur Nginx, définir TRUSTED_PROXY_COUNT=2 : l’application lit ainsi la vraie adresse des visiteurs (limitation des essais de connexion, liste des appareils). Une valeur trop faible fait partager un même compteur à tous les visiteurs ; une valeur trop forte permet à un visiteur de falsifier son adresse.
Une fois HTTPS validé, définir SECURE_HSTS_SECONDS=31536000.
5. Mettre à jour
Section intitulée « 5. Mettre à jour »cd /opt/mfoundigit pulldocker compose -f docker-compose.prod.yml up -d --buildLa reconstruction installe les nouvelles dépendances et le démarrage applique les migrations. Comparez .env avec .env.example après chaque mise à jour : de nouvelles variables peuvent y apparaître.
6. Sauvegardes
Section intitulée « 6. Sauvegardes »Base de données :
docker compose -f docker-compose.prod.yml exec -T db pg_dump -U mfoundi mfoundi | gzip > backup-$(date +%F).sql.gzFichiers envoyés (volume media) :
docker run --rm -v mfoundi_media:/data -v $PWD:/backup alpine tar czf /backup/media-$(date +%F).tar.gz -C /data .Restauration de la base :
gunzip -c backup-AAAA-MM-JJ.sql.gz | docker compose -f docker-compose.prod.yml exec -T db psql -U mfoundi mfoundiPlanifier ces commandes (cron) et copier les archives hors du serveur.
7. Surveillance
Section intitulée « 7. Surveillance »https://votre-domaine/healthz renvoie l’état de la base et du cache (200 ou 503) : branchez-y votre outil de supervision (UptimeRobot, Uptime Kuma…). Docker utilise python manage.py healthcheck pour l’état du conteneur.
Les logs sont au format JSON, une ligne par requête avec son request_id : un identifiant fourni par un utilisateur (en-tête X-Request-ID d’une réponse) permet de retrouver tous les logs de sa requête.
docker compose -f docker-compose.prod.yml logs -f webdocker compose -f docker-compose.prod.yml psLes erreurs 500 sont envoyées par e-mail aux ADMINS si le SMTP est configuré.
Liste de vérification
Section intitulée « Liste de vérification »-
SECRET_KEYunique et secrète,.envnon versionné -
ALLOWED_HOSTSetCSRF_TRUSTED_ORIGINSrenseignés - SMTP testé (mot de passe oublié)
- HTTPS actif, puis HSTS
-
MFA_ENCRYPTION_KEYfixée et sauvegardée,WEBAUTHN_RP_IDégal au domaine public (les clés d’accès exigent HTTPS) -
TRUSTED_PROXY_COUNTégal au nombre de proxys devant Django (1 par défaut, 2 avec un proxy HTTPS sur l’hôte) - Comptes administrateurs : double authentification activée (obligatoire pour ouvrir
/admin/) - Sauvegardes planifiées et restauration testée
-
python manage.py check --deploysans erreur