9.3 KiB
🚀 Déploiement Portainer - Guide Final
✅ Configuration Finale Optimisée
La stack Portainer a été optimisée pour fonctionner parfaitement sur ARM64.
Modifications Appliquées
- ✅ Retiré
platform: linux/arm64(non supporté par Compose v3.8) - ✅ Images multi-architecture (AMD64 + ARM64) dans le registry
- ✅ Variables d'environnement toutes en strings
- ✅ Configuration Traefik complète avec HTTPS
- ✅ Healthchecks pour PostgreSQL et Redis
- ✅ Migrations automatiques au démarrage backend
📋 Prérequis
1. Registry Scaleway Configuré dans Portainer
Portainer → Registries → Add registry :
- Name :
Scaleway(ou n'importe quel nom) - Registry URL :
rg.fr-par.scw.cloud/weworkstudio - Authentication : ✅ Activé
- Username :
nologin - Password :
[votre token Scaleway]
Comment obtenir le token :
- Scaleway Console
- Container Registry →
weworkstudio - Push/Pull credentials → Copier le token
2. Network Traefik Créé
Le stack utilise un réseau externe traefik_network pour Traefik reverse proxy.
Vérifier :
docker network ls | grep traefik
Si absent, créer :
docker network create traefik_network
3. Images Disponibles dans Registry
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
Devrait afficher les manifests avec "architecture": "arm64" ✅
🚀 Déploiement Étape par Étape
Étape 1 : Créer le Stack dans Portainer
- Portainer → Stacks → Add stack
- Name :
xpeditis-preprod - Build method :
Web editor - Copier tout le contenu de
docker/portainer-stack.yml - Deploy the stack
Étape 2 : Vérifier le Déploiement
- Portainer → Stacks →
xpeditis-preprod - Vérifier que tous les services sont "running" :
- ✅
xpeditis-db(PostgreSQL) - ✅
xpeditis-redis(Redis) - ✅
xpeditis-minio(MinIO S3) - ✅
xpeditis-backend(NestJS API) - ✅
xpeditis-frontend(Next.js)
- ✅
Étape 3 : Vérifier les Logs Backend
Portainer → Containers → xpeditis-backend → Logs
Logs attendus :
🚀 Starting Xpeditis Backend...
⏳ Waiting for PostgreSQL to be ready...
✅ PostgreSQL is ready
🔄 Running database migrations...
✅ DataSource initialized
✅ Successfully ran 10 migration(s):
- CreateUsersTable1700000000000
- CreateOrganizationsTable1700000001000
- CreateBookingsTable1700000003000
- CreateNotificationsTable1700000002000
- CreateWebhooksTable1700000004000
- CreateAuditLogsTable1700000001000
- CreateShipmentsTable1700000005000
- CreateContainersTable1700000006000
- AddUserRoleEnum1700000007000
- AddOrganizationForeignKey1700000008000
✅ Database migrations completed
🚀 Starting NestJS application...
[Nest] 1 - LOG [NestFactory] Starting Nest application...
[Nest] 1 - LOG [InstanceLoader] AppModule dependencies initialized
[Nest] 1 - LOG [RoutesResolver] AppController {/api/v1}:
[Nest] 1 - LOG Application is running on: http://0.0.0.0:4000
Si erreur "relation does not exist" : Les migrations n'ont pas tourné. Redémarrer le container.
Étape 4 : Vérifier les Logs Frontend
Portainer → Containers → xpeditis-frontend → Logs
Logs attendus :
▲ Next.js 14.5.0
- Local: http://localhost:3000
- Network: http://0.0.0.0:3000
✓ Ready in 2.3s
Étape 5 : Tester les Endpoints
Backend API :
curl https://api.preprod.xpeditis.com/api/v1/health
# Devrait retourner :
{"status":"ok","info":{"database":{"status":"up"},"redis":{"status":"up"}}}
Frontend :
curl -I https://app.preprod.xpeditis.com
# Devrait retourner :
HTTP/2 200
MinIO Console :
curl -I https://minio.preprod.xpeditis.com
# Devrait retourner :
HTTP/2 200
🔧 Configuration DNS (Si Pas Déjà Fait)
Assurez-vous que ces domaines pointent vers votre serveur :
| Domaine | Type | Valeur | Service |
|---|---|---|---|
api.preprod.xpeditis.com |
A | [IP serveur] |
Backend API |
app.preprod.xpeditis.com |
A | [IP serveur] |
Frontend |
www.preprod.xpeditis.com |
CNAME | app.preprod.xpeditis.com |
Frontend (alias) |
s3.preprod.xpeditis.com |
A | [IP serveur] |
MinIO API |
minio.preprod.xpeditis.com |
A | [IP serveur] |
MinIO Console |
🔐 Sécurité Post-Déploiement
1. Changer les Mots de Passe par Défaut
PostgreSQL (lignes 11-13) :
POSTGRES_PASSWORD: 9Lc3M9qoPBeHLKHDXGUf1 # ← CHANGER
Redis (ligne 31) :
command: redis-server --requirepass hXiy5GMPswMtxMZujjS2O # ← CHANGER
MinIO (lignes 47-48) :
MINIO_ROOT_USER: minioadmin_preprod_CHANGE_ME # ← CHANGER
MINIO_ROOT_PASSWORD: RBJfD0QVXC5JDfAHCwdUW # ← CHANGER
JWT Secret (ligne 104) :
JWT_SECRET: 4C4tQC8qym/evv4zI5DaUE1yy3kilEnm6lApOGD0GgNBLA0BLm2tVyUr1Lr0mTnV # ← CHANGER
2. Update le Stack avec les Nouveaux Secrets
- Portainer → Stacks →
xpeditis-preprod - Editor → Modifier les valeurs
- ✅ Cocher "Re-pull image and redeploy"
- Update the stack
📊 Monitoring et Logs
Vérifier l'État des Services
Portainer → Containers :
| Container | État Attendu | Healthcheck |
|---|---|---|
xpeditis-db |
Running | Healthy (pg_isready) |
xpeditis-redis |
Running | - |
xpeditis-minio |
Running | - |
xpeditis-backend |
Running | Healthy (HTTP /health) |
xpeditis-frontend |
Running | Healthy (HTTP /) |
Logs en Temps Réel
Portainer → Containers → Sélectionner container → Logs :
- ✅ Activer "Auto-refresh logs"
- ✅ Sélectionner "Since" = "Last 100 lines"
🔄 Mise à Jour des Images
Quand la CI/CD push de nouvelles images :
Option 1 : Via Portainer Interface (Recommandé)
- Portainer → Stacks →
xpeditis-preprod - ✅ Cocher "Re-pull image and redeploy"
- Update the stack
Option 2 : Via CLI
# SSH sur le serveur
ssh votre-serveur
# Pull les nouvelles images
docker pull rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod
docker pull rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod
# Redémarrer le stack dans Portainer
# (ou via docker stack deploy si en mode Swarm)
⚠️ Troubleshooting
Erreur : "access denied" lors du pull
Cause : Registry credentials invalides ou manquants.
Solution :
- Vérifier Portainer → Registries → Credentials Scaleway
- Ou faire
docker loginsur le serveur :docker login rg.fr-par.scw.cloud/weworkstudio # Username: nologin # Password: [token]
Erreur : "relation does not exist"
Cause : Migrations pas exécutées ou base de données corrompue.
Solution :
- Vérifier les logs backend : migrations doivent s'exécuter au démarrage
- Si nécessaire, supprimer le volume et recréer :
docker volume rm xpeditis_db_data # Redéployer le stack → migrations créeront les tables
Erreur : "network traefik_network not found"
Cause : Le réseau Traefik n'existe pas.
Solution :
docker network create traefik_network
Backend reste en "Unhealthy"
Cause : L'application ne démarre pas ou le healthcheck échoue.
Solution :
- Vérifier logs backend :
docker logs xpeditis-backend - Vérifier que PostgreSQL et Redis sont accessibles
- Tester manuellement le healthcheck :
docker exec xpeditis-backend curl http://localhost:4000/api/v1/health
✅ Checklist de Déploiement
- Registry Scaleway configuré dans Portainer
- Network
traefik_networkcréé - Images ARM64 disponibles dans registry (
preprodtag) - DNS configurés (api, app, s3, minio)
- Stack créé dans Portainer
- Tous les services en état "running"
- Logs backend : migrations exécutées ✅
- Endpoint backend accessible :
https://api.preprod.xpeditis.com/api/v1/health - Frontend accessible :
https://app.preprod.xpeditis.com - MinIO accessible :
https://minio.preprod.xpeditis.com - Mots de passe par défaut changés
- Certificats HTTPS générés par Let's Encrypt
🎯 Résumé des URLs
| Service | URL | Login |
|---|---|---|
| Frontend | https://app.preprod.xpeditis.com | - |
| API Backend | https://api.preprod.xpeditis.com/api/v1 | - |
| API Docs (Swagger) | https://api.preprod.xpeditis.com/api/docs | - |
| MinIO Console | https://minio.preprod.xpeditis.com | minioadmin_preprod / [password] |
| Portainer | https://portainer.votre-domaine.com | [vos credentials] |
Date : 2025-11-19 Version Stack : Finale optimisée pour Portainer ARM64 Status : ✅ Prêt pour production pre-prod