# 🚀 Checklist de DĂ©ploiement Portainer - Xpeditis ## 📋 Vue d'ensemble Ce document contient la checklist complĂšte pour dĂ©ployer Xpeditis sur Portainer avec les migrations automatiques et toutes les configurations nĂ©cessaires. --- ## ✅ PrĂ©-requis - [ ] AccĂšs Ă  Portainer (https://portainer.weworkstudio.com) - [ ] AccĂšs au registry Scaleway (`rg.fr-par.scw.cloud/weworkstudio`) - [ ] Docker installĂ© localement pour build et push des images - [ ] Git branch `preprod` Ă  jour avec les derniers changements --- ## 📩 Étape 1 : Build et Push des Images Docker ### Backend ```bash # 1. Se positionner dans le dossier backend cd apps/backend # 2. Build l'image avec les migrations automatiques docker build -t rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod . # 3. Login au registry Scaleway (si nĂ©cessaire) docker login rg.fr-par.scw.cloud/weworkstudio # 4. Push l'image docker push rg.fr-par.scw.cloud/weworkstudio/xpeditis-backend:preprod # 5. VĂ©rifier que l'image est bien pushed echo "✅ Backend image pushed: preprod ($(date))" ``` ### Frontend ```bash # 1. Se positionner dans le dossier frontend cd apps/frontend # 2. Build l'image avec Tailwind CSS compilĂ© docker build -t rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod . # 3. Push l'image docker push rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod # 4. VĂ©rifier que l'image est bien pushed echo "✅ Frontend image pushed: preprod ($(date))" ``` **⏱ Temps estimĂ© : 10-15 minutes** --- ## 🔧 Étape 2 : Configuration Portainer ### 2.1 - Connexion Ă  Portainer 1. Aller sur https://portainer.weworkstudio.com 2. Se connecter avec les identifiants admin 3. SĂ©lectionner l'environnement **local** ### 2.2 - Mise Ă  jour du Stack 1. Aller dans **Stacks** → Trouver **xpeditis-preprod** (ou crĂ©er si inexistant) 2. Cliquer sur **Editor** 3. Copier-coller le contenu de `docker/portainer-stack.yml` 4. **VĂ©rifier les variables d'environnement critiques** : ```yaml # Backend - Variables critiques DATABASE_PASSWORD: 9Lc3M9qoPBeHLKHDXGUf1 # ⚠ CHANGER EN PRODUCTION REDIS_PASSWORD: hXiy5GMPswMtxMZujjS2O # ⚠ CHANGER EN PRODUCTION JWT_SECRET: 4C4tQC8qym/evv4zI5DaUE1yy3kilEnm6lApOGD0GgNBLA0BLm2tVyUr1Lr0mTnV # ⚠ CHANGER EN PRODUCTION # CORS - Doit inclure tous les domaines CORS_ORIGIN: https://app.preprod.xpeditis.com,https://www.preprod.xpeditis.com,https://api.preprod.xpeditis.com ``` 5. **Options de dĂ©ploiement** : - ✅ Cocher **Re-pull image and redeploy** - ✅ Cocher **Prune services** - ❌ Ne PAS cocher **Force redeployment** (sauf si nĂ©cessaire) 6. Cliquer sur **Update the stack** **⏱ Temps estimĂ© : 5 minutes** --- ## đŸ§Ș Étape 3 : VĂ©rification du DĂ©ploiement ### 3.1 - Logs Backend (Migrations) ```bash # Via Portainer UI # Stacks → xpeditis-preprod → xpeditis-backend → Logs # Ou via Docker CLI (sur le serveur) docker logs xpeditis-backend -f --tail 200 # Ce que vous devez voir : # ✅ 🚀 Starting Xpeditis Backend... # ✅ ⏳ Waiting for PostgreSQL to be ready... # ✅ ✅ PostgreSQL is ready # ✅ 🔄 Running database migrations... # ✅ ✅ DataSource initialized # ✅ ✅ Successfully ran X migration(s): # ✅ - CreateAuditLogsTable1700000001000 # ✅ - CreateNotificationsTable1700000002000 # ✅ - ... # ✅ ✅ Database migrations completed # ✅ 🚀 Starting NestJS application... # ✅ [Nest] Application successfully started ``` ### 3.2 - État des Containers Dans Portainer, vĂ©rifier que tous les services sont **running** et **healthy** : - [x] **xpeditis-db** - Status: healthy - [x] **xpeditis-redis** - Status: running - [x] **xpeditis-minio** - Status: running - [x] **xpeditis-backend** - Status: healthy - [x] **xpeditis-frontend** - Status: running **⏱ Temps d'attente : 1-2 minutes (temps de dĂ©marrage des migrations)** ### 3.3 - Test API Backend ```bash # Test health endpoint curl https://api.preprod.xpeditis.com/health # Expected: {"status":"ok","timestamp":"..."} # Test authentication curl -X POST https://api.preprod.xpeditis.com/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{ "email": "admin@xpeditis.com", "password": "AdminPassword123!" }' # Expected: {"accessToken":"...", "refreshToken":"...", "user":{...}} ``` ### 3.4 - Test Frontend 1. Ouvrir https://app.preprod.xpeditis.com 2. VĂ©rifier que **le CSS est chargĂ©** (page stylisĂ©e, pas de texte brut) 3. Se connecter avec : - Email : `admin@xpeditis.com` - Password : `AdminPassword123!` 4. VĂ©rifier que le **dashboard se charge** sans erreur 500 **✅ Si tout fonctionne : DĂ©ploiement rĂ©ussi !** --- ## đŸ—„ïž Étape 4 : VĂ©rification de la Base de DonnĂ©es ### 4.1 - Connexion Ă  PostgreSQL ```bash # Via Portainer UI # Stacks → xpeditis-preprod → xpeditis-db → Console # Ou via Docker CLI docker exec -it xpeditis-db psql -U xpeditis -d xpeditis_preprod # Commandes utiles : \dt # Liste toutes les tables \d+ users # SchĂ©ma de la table users SELECT * FROM migrations; # Migrations appliquĂ©es SELECT COUNT(*) FROM ports; # Nombre de ports (devrait ĂȘtre ~10k) SELECT * FROM users; # Liste des utilisateurs ``` ### 4.2 - VĂ©rifier les Tables Créées ```sql -- Liste des tables essentielles SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name; -- Expected tables: -- ✅ audit_logs -- ✅ bookings -- ✅ carriers -- ✅ containers -- ✅ csv_bookings -- ✅ csv_rate_configs -- ✅ csv_rates -- ✅ migrations -- ✅ notifications -- ✅ organizations -- ✅ ports -- ✅ rate_quotes -- ✅ shipments -- ✅ users -- ✅ webhooks ``` ### 4.3 - VĂ©rifier les Utilisateurs de Test ```sql SELECT email, role, is_active, created_at FROM users ORDER BY role DESC; -- Expected: -- admin@xpeditis.com | ADMIN | true -- manager@xpeditis.com | MANAGER | true -- user@xpeditis.com | USER | true ``` **⏱ Temps estimĂ© : 5 minutes** --- ## đŸ§č Étape 5 : Nettoyage (Optionnel) ### 5.1 - Supprimer les anciennes images ```bash # Sur le serveur Portainer docker image prune -a --filter "until=24h" # VĂ©rifier l'espace disque docker system df ``` ### 5.2 - Backup de la base de donnĂ©es ```bash # CrĂ©er un backup avant dĂ©ploiement majeur docker exec xpeditis-db pg_dump -U xpeditis xpeditis_preprod > backup_$(date +%Y%m%d_%H%M%S).sql # Ou avec Portainer Volumes → xpeditis_db_data → Backup ``` --- ## ⚠ Troubleshooting ### ProblĂšme 1 : Backend crash en boucle **SymptĂŽmes** : - Container redĂ©marre constamment - Logs montrent "Failed to connect to PostgreSQL" **Solution** : ```bash # 1. VĂ©rifier que PostgreSQL est healthy docker ps | grep xpeditis-db # 2. VĂ©rifier les logs PostgreSQL docker logs xpeditis-db --tail 50 # 3. RedĂ©marrer PostgreSQL si nĂ©cessaire docker restart xpeditis-db # 4. Attendre 30s et redĂ©marrer backend sleep 30 docker restart xpeditis-backend ``` ### ProblĂšme 2 : Erreur "relation does not exist" **SymptĂŽmes** : - API retourne 500 - Logs montrent `QueryFailedError: relation "notifications" does not exist` **Solution** : ```bash # 1. VĂ©rifier que les migrations ont Ă©tĂ© exĂ©cutĂ©es docker logs xpeditis-backend | grep "Database migrations completed" # 2. Si absent, redĂ©marrer le backend pour forcer les migrations docker restart xpeditis-backend # 3. VĂ©rifier les logs de migration docker logs xpeditis-backend -f ``` ### ProblĂšme 3 : CSS ne se charge pas (Frontend) **SymptĂŽmes** : - Page affiche du texte brut sans style - Fichier CSS contient `@tailwind base;@tailwind components;` **Solution** : ```bash # 1. VĂ©rifier que le frontend a Ă©tĂ© rebuild APRÈS la correction du .dockerignore cd apps/frontend docker build -t rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod . docker push rg.fr-par.scw.cloud/weworkstudio/xpeditis-frontend:preprod # 2. Dans Portainer, forcer le redĂ©ploiement avec Re-pull image # Stacks → xpeditis-preprod → Update → ✅ Re-pull image ``` ### ProblĂšme 4 : CORS errors dans le navigateur **SymptĂŽmes** : - Console navigateur : `Access to XMLHttpRequest has been blocked by CORS policy` - Frontend ne peut pas appeler l'API **Solution** : ```yaml # Dans portainer-stack.yml, vĂ©rifier : CORS_ORIGIN: https://app.preprod.xpeditis.com,https://www.preprod.xpeditis.com,https://api.preprod.xpeditis.com # S'assurer qu'il n'y a PAS d'espace aprĂšs les virgules # ❌ Mauvais : "https://app.com, https://api.com" # ✅ Bon : "https://app.com,https://api.com" ``` ### ProblĂšme 5 : Login Ă©choue (401 Unauthorized) **SymptĂŽmes** : - Identifiants corrects mais login retourne 401 - Logs backend : "Invalid credentials" **Solution** : ```bash # 1. VĂ©rifier que les utilisateurs existent docker exec xpeditis-db psql -U xpeditis -d xpeditis_preprod -c "SELECT email, role FROM users;" # 2. Si absent, vĂ©rifier que la migration SeedTestUsers a Ă©tĂ© exĂ©cutĂ©e docker logs xpeditis-backend | grep "SeedTestUsers" # 3. RĂ©initialiser le mot de passe admin manuellement si nĂ©cessaire docker exec xpeditis-db psql -U xpeditis -d xpeditis_preprod -c " UPDATE users SET password_hash = '\$argon2id\$v=19\$m=65536,t=3,p=4\$...' WHERE email = 'admin@xpeditis.com'; " ``` --- ## 📊 MĂ©triques de Performance ### Temps de DĂ©marrage Attendus | Service | Premier dĂ©marrage | RedĂ©marrage | |---------|-------------------|-------------| | PostgreSQL | 5-10s | 3-5s | | Redis | 2-3s | 1-2s | | MinIO | 3-5s | 2-3s | | Backend (avec migrations) | 30-60s | 15-20s | | Frontend | 5-10s | 3-5s | ### Healthchecks | Service | Interval | Timeout | Retries | |---------|----------|---------|---------| | PostgreSQL | 10s | 5s | 5 | | Redis | 10s | 5s | 5 | | Backend | 30s | 10s | 3 | | Frontend | 30s | 10s | 3 | --- ## 📝 Commandes Utiles ### Portainer CLI ```bash # RedĂ©marrer un service spĂ©cifique docker service scale xpeditis-preprod_xpeditis-backend=0 sleep 5 docker service scale xpeditis-preprod_xpeditis-backend=1 # Voir les logs en temps rĂ©el docker service logs -f xpeditis-preprod_xpeditis-backend # Inspecter un service docker service inspect xpeditis-preprod_xpeditis-backend # Voir l'Ă©tat du stack docker stack ps xpeditis-preprod ``` ### Base de DonnĂ©es ```bash # Backup complet docker exec xpeditis-db pg_dump -U xpeditis -F c xpeditis_preprod > backup.dump # Restore depuis backup docker exec -i xpeditis-db pg_restore -U xpeditis -d xpeditis_preprod < backup.dump # Voir la taille de la DB docker exec xpeditis-db psql -U xpeditis -d xpeditis_preprod -c " SELECT pg_size_pretty(pg_database_size('xpeditis_preprod')); " # Lister les connexions actives docker exec xpeditis-db psql -U xpeditis -d xpeditis_preprod -c " SELECT count(*) FROM pg_stat_activity; " ``` --- ## ✅ Checklist Finale Avant de considĂ©rer le dĂ©ploiement comme rĂ©ussi, vĂ©rifier : ### Infrastructure - [ ] Tous les containers sont **running** - [ ] PostgreSQL est **healthy** - [ ] Redis est **running** - [ ] Backend est **healthy** (aprĂšs migrations) - [ ] Frontend est **running** ### Base de DonnĂ©es - [ ] Toutes les migrations sont exĂ©cutĂ©es - [ ] Table `migrations` contient 10+ entrĂ©es - [ ] Table `users` contient 3 utilisateurs de test - [ ] Table `ports` contient ~10 000 entrĂ©es - [ ] Table `organizations` contient des donnĂ©es ### API Backend - [ ] `/health` retourne 200 OK - [ ] `/api/v1/auth/login` fonctionne avec admin@xpeditis.com - [ ] `/api/v1/notifications` retourne 401 (normal sans token) - [ ] Logs backend ne montrent pas d'erreurs critiques ### Frontend - [ ] Page d'accueil se charge avec CSS - [ ] Login fonctionne - [ ] Dashboard se charge sans erreur 500 - [ ] Notifications en temps rĂ©el fonctionnent (WebSocket) - [ ] Recherche de tarifs fonctionne ### SĂ©curitĂ© - [ ] HTTPS activĂ© sur tous les domaines - [ ] Certificats Let's Encrypt valides - [ ] CORS configurĂ© correctement - [ ] Variables d'environnement sensibles changĂ©es (production) - [ ] Mots de passe par dĂ©faut changĂ©s (production) --- ## 📞 Contact & Support En cas de problĂšme lors du dĂ©ploiement : 1. **VĂ©rifier les logs** : Portainer → Stacks → xpeditis-preprod → Logs 2. **Consulter ce document** : Section Troubleshooting 3. **VĂ©rifier la documentation** : `PORTAINER_MIGRATION_AUTO.md` --- ## 📅 Historique des DĂ©ploiements | Date | Version | Changements | Statut | |------|---------|-------------|--------| | 2025-11-19 | 1.0 | Migrations automatiques + CSS fix | ✅ OK | --- **Auteur** : Claude Code **DerniĂšre mise Ă  jour** : 2025-11-19 **Version** : 1.0