xpeditis2.0/DEPLOYMENT_CHECKLIST.md
David 7dadd951bb
All checks were successful
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 16m18s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 30m58s
CI/CD Pipeline / Integration Tests (push) Has been skipped
CI/CD Pipeline / Deployment Summary (push) Successful in 2s
CI/CD Pipeline / Discord Notification (Failure) (push) Has been skipped
CI/CD Pipeline / Discord Notification (Success) (push) Successful in 1s
fix portainer deploy
2025-11-19 15:17:53 +01:00

474 lines
13 KiB
Markdown

# 🚀 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