Aligns main with the complete application codebase (cicd branch). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
11 KiB
Guide de Déploiement Portainer - Xpeditis
Ce guide explique comment déployer les stacks Xpeditis (staging et production) sur Portainer avec Traefik.
📋 Prérequis
1. Infrastructure Serveur
- Serveur VPS/Dédié avec Docker installé
- Minimum: 4 vCPU, 8 GB RAM, 100 GB SSD
- Recommandé Production: 8 vCPU, 16 GB RAM, 200 GB SSD
- OS: Ubuntu 22.04 LTS ou Debian 11+
2. Traefik déjà déployé
- Network
traefik_networkdoit exister - Let's Encrypt configuré (
letsencryptresolver) - Ports 80 et 443 ouverts
3. DNS Configuré
Staging:
staging.xpeditis.com→ IP du serveurapi-staging.xpeditis.com→ IP du serveur
Production:
xpeditis.com→ IP du serveurwww.xpeditis.com→ IP du serveurapi.xpeditis.com→ IP du serveur
4. Images Docker
Les images Docker doivent être buildées et pushées sur un registry (Docker Hub, GitHub Container Registry, ou privé):
# Build backend
cd apps/backend
docker build -t xpeditis/backend:staging-latest .
docker push xpeditis/backend:staging-latest
# Build frontend
cd apps/frontend
docker build -t xpeditis/frontend:staging-latest .
docker push xpeditis/frontend:staging-latest
🚀 Déploiement sur Portainer
Étape 1: Créer le network Traefik (si pas déjà fait)
docker network create traefik_network
Étape 2: Préparer les variables d'environnement
Pour Staging:
- Copier
.env.staging.examplevers.env.staging - Remplir toutes les valeurs (voir section Variables d'environnement ci-dessous)
- IMPORTANT: Utiliser des mots de passe forts (min 32 caractères)
Pour Production:
- Copier
.env.production.examplevers.env.production - Remplir toutes les valeurs avec les credentials de production
- IMPORTANT: Utiliser des mots de passe ultra-forts (min 64 caractères)
Étape 3: Déployer via Portainer UI
A. Accéder à Portainer
- URL:
https://portainer.votre-domaine.com(ouhttp://IP:9000) - Login avec vos credentials admin
B. Créer la Stack Staging
- Aller dans: Stacks → Add Stack
- Name:
xpeditis-staging - Build method: Web editor
- Copier le contenu de
portainer-stack-staging.yml - Onglet "Environment variables":
- Cliquer sur "Load variables from .env file"
- Copier-coller le contenu de
.env.staging - OU ajouter manuellement chaque variable
- Cliquer: Deploy the stack
- Vérifier: Les 4 services doivent démarrer (postgres, redis, backend, frontend)
C. Créer la Stack Production
- Aller dans: Stacks → Add Stack
- Name:
xpeditis-production - Build method: Web editor
- Copier le contenu de
portainer-stack-production.yml - Onglet "Environment variables":
- Cliquer sur "Load variables from .env file"
- Copier-coller le contenu de
.env.production - OU ajouter manuellement chaque variable
- Cliquer: Deploy the stack
- Vérifier: Les 6 services doivent démarrer (postgres, redis, backend x2, frontend x2)
🔐 Variables d'environnement Critiques
Variables Obligatoires (staging & production)
| Variable | Description | Exemple |
|---|---|---|
POSTGRES_PASSWORD |
Mot de passe PostgreSQL | XpEd1t1s_pG_S3cur3_2024! |
REDIS_PASSWORD |
Mot de passe Redis | R3d1s_C4ch3_P4ssw0rd! |
JWT_SECRET |
Secret pour JWT tokens | openssl rand -base64 64 |
AWS_ACCESS_KEY_ID |
AWS Access Key | AKIAIOSFODNN7EXAMPLE |
AWS_SECRET_ACCESS_KEY |
AWS Secret Key | wJalrXUtnFEMI/K7MDENG/... |
SENTRY_DSN |
Sentry monitoring URL | https://xxx@sentry.io/123 |
MAERSK_API_KEY |
Clé API Maersk | Voir portail Maersk |
Générer des Secrets Sécurisés
# PostgreSQL password (64 chars)
openssl rand -base64 48
# Redis password (64 chars)
openssl rand -base64 48
# JWT Secret (512 bits)
openssl rand -base64 64
# Generic secure password
pwgen -s 64 1
🔍 Vérification du Déploiement
1. Vérifier l'état des conteneurs
Dans Portainer:
- Stacks →
xpeditis-staging(ou production) - Tous les services doivent être en status running (vert)
2. Vérifier les logs
Cliquer sur chaque service → Logs → Vérifier qu'il n'y a pas d'erreurs
# Ou via CLI
docker logs xpeditis-backend-staging -f
docker logs xpeditis-frontend-staging -f
3. Vérifier les health checks
# Backend health check
curl https://api-staging.xpeditis.com/health
# Réponse attendue: {"status":"ok","timestamp":"..."}
# Frontend health check
curl https://staging.xpeditis.com/api/health
# Réponse attendue: {"status":"ok"}
4. Vérifier Traefik
Dans Traefik dashboard:
- Routers: Doit afficher
xpeditis-backend-stagingetxpeditis-frontend-staging - Services: Doit afficher les load balancers avec health checks verts
- Certificats: Let's Encrypt doit être vert
5. Vérifier SSL
# Vérifier certificat SSL
curl -I https://staging.xpeditis.com
# Header "Strict-Transport-Security" doit être présent
# Test SSL avec SSLLabs
# https://www.ssllabs.com/ssltest/analyze.html?d=staging.xpeditis.com
6. Test Complet
- Frontend: Ouvrir
https://staging.xpeditis.comdans un navigateur - Backend: Tester un endpoint:
https://api-staging.xpeditis.com/health - Login: Créer un compte et se connecter
- Recherche de taux: Tester une recherche Rotterdam → Shanghai
- Booking: Créer un booking de test
🐛 Dépannage
Problème 1: Service ne démarre pas
Symptôme: Conteneur en status "Exited" ou "Restarting"
Solution:
- Vérifier les logs: Portainer → Service → Logs
- Erreurs communes:
POSTGRES_PASSWORDmanquant → Ajouter la variableCannot connect to postgres→ Vérifier que postgres est en runningRedis connection refused→ Vérifier que redis est en runningPort already in use→ Un autre service utilise le port
Problème 2: Traefik ne route pas vers le service
Symptôme: 404 Not Found ou Gateway Timeout
Solution:
- Vérifier que le network
traefik_networkexiste:docker network ls | grep traefik - Vérifier que les services sont connectés au network:
docker inspect xpeditis-backend-staging | grep traefik_network - Vérifier les labels Traefik dans Portainer → Service → Labels
- Restart Traefik:
docker restart traefik
Problème 3: SSL Certificate Failed
Symptôme: "Your connection is not private" ou certificat invalide
Solution:
- Vérifier que DNS pointe vers le serveur:
nslookup staging.xpeditis.com - Vérifier les logs Traefik:
docker logs traefik | grep -i letsencrypt - Vérifier que ports 80 et 443 sont ouverts:
sudo ufw status sudo netstat -tlnp | grep -E '80|443' - Si nécessaire, supprimer le certificat et re-déployer:
docker exec traefik rm /letsencrypt/acme.json docker restart traefik
Problème 4: Database connection failed
Symptôme: Backend logs montrent "Cannot connect to database"
Solution:
- Vérifier que PostgreSQL est en running
- Vérifier les credentials:
docker exec -it xpeditis-postgres-staging psql -U xpeditis -d xpeditis_staging - Vérifier le network interne:
docker exec -it xpeditis-backend-staging ping postgres-staging
Problème 5: High memory usage
Symptôme: Serveur lent, OOM killer
Solution:
- Vérifier l'utilisation mémoire:
docker stats - Réduire les limites dans docker-compose (section
deploy.resources) - Augmenter la RAM du serveur
- Optimiser les queries PostgreSQL (indexes, explain analyze)
🔄 Mise à Jour des Stacks
Update Rolling (Zero Downtime)
Staging:
- Build et push nouvelle image:
docker build -t xpeditis/backend:staging-v1.2.0 . docker push xpeditis/backend:staging-v1.2.0 - Dans Portainer → Stacks →
xpeditis-staging→ Editor - Changer
BACKEND_TAG=staging-v1.2.0 - Cliquer "Update the stack"
- Portainer va pull la nouvelle image et redémarrer les services
Production (avec High Availability):
La stack production a 2 instances de chaque service (backend-prod-1, backend-prod-2). Traefik va load balancer entre les deux.
Mise à jour sans downtime:
- Stopper
backend-prod-2dans Portainer - Update l'image de
backend-prod-2 - Redémarrer
backend-prod-2 - Vérifier health check OK
- Stopper
backend-prod-1 - Update l'image de
backend-prod-1 - Redémarrer
backend-prod-1 - Vérifier health check OK
OU via Portainer (plus simple):
- Portainer → Stacks →
xpeditis-production→ Editor - Changer
BACKEND_TAG=v1.2.0 - Cliquer "Update the stack"
- Portainer va mettre à jour les services un par un (rolling update automatique)
📊 Monitoring
1. Portainer Built-in Monitoring
Portainer → Containers → Sélectionner service → Stats
- CPU usage
- Memory usage
- Network I/O
- Block I/O
2. Sentry (Error Tracking)
Toutes les erreurs backend et frontend sont envoyées à Sentry (configuré via SENTRY_DSN)
URL: https://sentry.io/organizations/xpeditis/projects/
3. Logs Centralisés
Voir tous les logs en temps réel:
docker logs -f xpeditis-backend-staging
docker logs -f xpeditis-frontend-staging
docker logs -f xpeditis-postgres-staging
docker logs -f xpeditis-redis-staging
Rechercher dans les logs:
docker logs xpeditis-backend-staging 2>&1 | grep "ERROR"
docker logs xpeditis-backend-staging 2>&1 | grep "booking"
4. Health Checks Dashboard
Créer un dashboard custom avec:
- Uptime Robot: https://uptimerobot.com (free tier: 50 monitors)
- Grafana + Prometheus (advanced)
🔒 Sécurité Best Practices
1. Mots de passe forts
✅ Min 64 caractères pour production ✅ Générés aléatoirement (openssl, pwgen) ✅ Stockés dans un gestionnaire de secrets (AWS Secrets Manager, Vault)
2. Rotation des credentials
✅ Tous les 90 jours ✅ Immédiatement si compromis
3. Backups automatiques
✅ PostgreSQL: Backup quotidien ✅ Retention: 30 jours staging, 90 jours production ✅ Test restore mensuel
4. Monitoring actif
✅ Sentry configuré ✅ Uptime monitoring actif ✅ Alertes email/Slack pour downtime
5. SSL/TLS
✅ HSTS activé (Strict-Transport-Security) ✅ TLS 1.2+ minimum ✅ Certificat Let's Encrypt auto-renew
6. Rate Limiting
✅ Traefik rate limiting configuré ✅ Application-level rate limiting (NestJS throttler) ✅ Brute-force protection active
7. Firewall
✅ Ports 80, 443 ouverts uniquement ✅ PostgreSQL/Redis accessibles uniquement depuis réseau interne Docker ✅ SSH avec clés uniquement (pas de mot de passe)
📞 Support
En cas de problème critique:
- Vérifier les logs dans Portainer
- Vérifier Sentry pour les erreurs récentes
- Restart du service via Portainer (si safe)
- Rollback: Portainer → Stacks → Redeploy previous version
Contacts:
- Tech Lead: david-henri.arnaud@3ds.com
- DevOps: ops@xpeditis.com
- Support: support@xpeditis.com
📚 Ressources
- Portainer Docs: https://docs.portainer.io/
- Traefik Docs: https://doc.traefik.io/traefik/
- Docker Docs: https://docs.docker.com/
- Let's Encrypt: https://letsencrypt.org/docs/
Dernière mise à jour: 2025-10-14 Version: 1.0.0 Auteur: Xpeditis DevOps Team