5.7 KiB
Déploiement Portainer / Docker Swarm
Guide de déploiement de Xpeditis sur Portainer avec Docker Swarm.
Infrastructure
| Composant | Image | Registry |
|---|---|---|
| Backend NestJS | xpeditis-backend | rg.fr-par.scw.cloud/weworkstudio |
| Frontend Next.js | xpeditis-frontend | rg.fr-par.scw.cloud/weworkstudio |
| PostgreSQL 15 | postgres:15-alpine | Docker Hub |
| Redis 7 | redis:7-alpine | Docker Hub |
| MinIO | minio/minio | Docker Hub |
Registry : Scaleway Container Registry (fr-par) Portainer : https://portainer.weworkstudio.com
Prérequis
1. Configurer le registry Scaleway dans Portainer
Portainer → Registries → Add registry :
- Registry URL :
rg.fr-par.scw.cloud/weworkstudio - Username :
nologin - Password : token Scaleway (Console → Registry → Push/Pull credentials)
2. Créer le réseau Traefik
docker network create traefik_network
3. Vérifier que les images existent
docker manifest inspect rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
docker manifest inspect rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod
Build et push des images
Script de déploiement complet
# Build et push backend (supporte AMD64 + ARM64)
cd apps/backend
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod \
--push .
# Build et push frontend
cd ../frontend
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod \
--push .
Pour ARM64 seul (serveur Hetzner CAX) :
--platform linux/arm64
Déploiement dans Portainer
- Portainer → Stacks → Add stack
- Name :
xpeditis-preprod - Build method : Web editor
- Coller le contenu de
docker/portainer-stack.yml - Définir les variables d'environnement (voir section suivante)
- Deploy the stack
Variables d'environnement production
Backend
NODE_ENV=production
PORT=4000
API_PREFIX=api/v1
FRONTEND_URL=https://app.xpeditis.com
# Base de données
DATABASE_HOST=xpeditis-db
DATABASE_PORT=5432
DATABASE_USER=xpeditis
DATABASE_PASSWORD=CHANGER_EN_PROD
DATABASE_NAME=xpeditis_prod
DATABASE_SYNC=false
DATABASE_LOGGING=false
# Redis
REDIS_HOST=xpeditis-redis
REDIS_PORT=6379
REDIS_PASSWORD=CHANGER_EN_PROD
# JWT
JWT_SECRET=MINIMUM_32_CARACTERES_ALEATOIRES
JWT_ACCESS_EXPIRATION=15m
JWT_REFRESH_EXPIRATION=7d
# Email
SMTP_HOST=smtp-relay.brevo.com
SMTP_PORT=587
SMTP_USER=
SMTP_PASS=
SMTP_FROM=noreply@xpeditis.com
# Storage (MinIO en prod ou S3)
AWS_ACCESS_KEY_ID=minioadmin
AWS_SECRET_ACCESS_KEY=minioadmin
AWS_REGION=us-east-1
AWS_S3_ENDPOINT=http://xpeditis-minio:9000
# Swagger
SWAGGER_USERNAME=admin
SWAGGER_PASSWORD=CHANGER_EN_PROD
# Stripe
STRIPE_SECRET_KEY=sk_live_xxxx
STRIPE_WEBHOOK_SECRET=whsec_xxxx
STRIPE_SILVER_MONTHLY_PRICE_ID=price_xxxx
# ... autres price IDs
# Monitoring
SENTRY_DSN=
Frontend
NEXT_PUBLIC_API_URL=https://api.xpeditis.com
Migrations automatiques
Le backend exécute les migrations automatiquement au démarrage via le script docker-entrypoint.sh :
# apps/backend/docker-entrypoint.sh attend PostgreSQL puis :
npm run migration:run
node dist/main.js
Les logs Portainer affichent :
✅ PostgreSQL is ready
✅ Successfully ran N migration(s)
🚀 Xpeditis API Server Running
Vérifier le déploiement
# Depuis Portainer → Containers → xpeditis-backend → Logs
# Ou en SSH sur le serveur :
docker logs xpeditis-backend --tail 50 -f
# Tester les endpoints
curl https://api.xpeditis.com/api/v1/health
# → {"status":"ok"}
curl https://app.xpeditis.com
# → 200 OK
Problèmes courants
CSS manquant en production (Next.js)
Vérifier que la variable NEXT_PUBLIC_API_URL est définie au moment du build (pas au runtime).
Solution : passer la variable en ARG dans le Dockerfile frontend ou utiliser --build-arg.
404 sur routes Next.js
Le frontend Next.js est configuré en mode standalone. Vérifier que le serveur pointe bien sur server.js et non sur un fichier statique.
Si Traefik retourne 404 :
# Dans portainer-stack.yml, vérifier le label Traefik :
traefik.http.routers.frontend.rule=Host(`app.xpeditis.com`)
traefik.http.services.frontend.loadbalancer.server.port=3000
Migrations échouent
docker exec -it xpeditis-backend sh
cd /app && npm run migration:run
Si blocage : vérifier que PostgreSQL est accessible (DATABASE_HOST = nom du service Docker).
Registry pull échoue (401)
- Vérifier le token Scaleway (peut expirer)
- Portainer → Registries → rafraîchir les credentials
docker login rg.fr-par.scw.cloud/weworkstudio
ARM64 / multi-architecture
Les Dockerfiles sont compatibles AMD64 et ARM64. Si le build échoue sur ARM64 :
- Vérifier que
buildxest installé et activé - Utiliser le builder multi-platform :
docker buildx create --use
CI/CD GitHub Actions
Le workflow .github/workflows/ci.yml exécute en automatique :
- Lint + type-check
- Tests unitaires (backend + frontend)
- Build des images Docker
- Push vers registry Scaleway (sur merge vers
mainoupreprod)
Variables GitHub Actions requises (Settings → Secrets) :
SCALEWAY_REGISTRY_TOKEN
PORTAINER_URL
PORTAINER_API_KEY
PORTAINER_STACK_ID
Coûts d'infrastructure estimés
| Option | Coût/mois | Notes |
|---|---|---|
| Hetzner CAX21 (ARM64) | ~8€ | Recommandé pour preprod |
| Hetzner CX31 (AMD64) | ~12€ | Production |
| Scaleway Registry | Gratuit | Jusqu'à 1GB |
Voir ../deployment/hetzner/README.md pour le déploiement Kubernetes sur Hetzner.