xpeditis2.0/docker/PORTAINER-DEPLOYMENT-GUIDE.md
David 890bc189ee
Some checks failed
CI/CD Pipeline - Xpeditis PreProd / Frontend - Build & Test (push) Failing after 5m31s
CI/CD Pipeline - Xpeditis PreProd / Frontend - Docker Build & Push (push) Has been skipped
CI/CD Pipeline - Xpeditis PreProd / Backend - Build & Test (push) Failing after 5m42s
CI/CD Pipeline - Xpeditis PreProd / Backend - Docker Build & Push (push) Has been skipped
CI/CD Pipeline - Xpeditis PreProd / Deploy to PreProd Server (push) Has been skipped
CI/CD Pipeline - Xpeditis PreProd / Run Smoke Tests (push) Has been skipped
fix v0.2
2025-11-12 18:00:33 +01:00

540 lines
14 KiB
Markdown

# Guide de Déploiement Portainer - Xpeditis
Ce guide explique comment déployer l'application Xpeditis sur un serveur Docker Swarm avec Portainer et Traefik.
## Prérequis
- Docker Swarm initialisé sur votre serveur
- Traefik configuré et déployé avec le réseau `traefik_network`
- Portainer installé et accessible
- Noms de domaine configurés avec DNS pointant vers votre serveur :
- `app.xpeditis.com` - Frontend
- `api.xpeditis.com` - Backend API
- `s3.xpeditis.com` - MinIO API
- `minio.xpeditis.com` - MinIO Console
## Configuration DNS Requise
Configurez les enregistrements DNS suivants (type A) pour pointer vers l'IP de votre serveur :
```
app.xpeditis.com → IP_DU_SERVEUR
www.xpeditis.com → IP_DU_SERVEUR
api.xpeditis.com → IP_DU_SERVEUR
s3.xpeditis.com → IP_DU_SERVEUR
minio.xpeditis.com → IP_DU_SERVEUR
```
## Étape 1 : Préparer les Images Docker
### 1.1 Construire l'image Backend
```bash
cd /chemin/vers/xpeditis2.0
# Construire l'image backend
docker build -t xpeditis/backend:latest -f apps/backend/Dockerfile .
# Tag et push vers votre registre (optionnel)
docker tag xpeditis/backend:latest registry.xpeditis.com/xpeditis/backend:latest
docker push registry.xpeditis.com/xpeditis/backend:latest
```
### 1.2 Construire l'image Frontend
```bash
# Construire l'image frontend
docker build -t xpeditis/frontend:latest -f apps/frontend/Dockerfile .
# Tag et push vers votre registre (optionnel)
docker tag xpeditis/frontend:latest registry.xpeditis.com/xpeditis/frontend:latest
docker push registry.xpeditis.com/xpeditis/frontend:latest
```
### 1.3 Sauvegarder les Images (Alternative sans registre)
Si vous n'avez pas de registre Docker privé :
```bash
# Sauvegarder les images
docker save xpeditis/backend:latest | gzip > xpeditis-backend.tar.gz
docker save xpeditis/frontend:latest | gzip > xpeditis-frontend.tar.gz
# Transférer vers le serveur
scp xpeditis-backend.tar.gz user@server:/tmp/
scp xpeditis-frontend.tar.gz user@server:/tmp/
# Sur le serveur, charger les images
ssh user@server
docker load < /tmp/xpeditis-backend.tar.gz
docker load < /tmp/xpeditis-frontend.tar.gz
```
## Étape 2 : Vérifier Traefik
Assurez-vous que Traefik est correctement configuré avec :
- Network `traefik_network` externe
- Entrypoints `web` (port 80) et `websecure` (port 443)
- Certificat resolver `letsencrypt` configuré
Exemple de vérification :
```bash
# Vérifier le réseau Traefik
docker network inspect traefik_network
# Vérifier que Traefik fonctionne
docker service ls | grep traefik
```
## Étape 3 : Configurer les Variables d'Environnement
Avant de déployer, **CHANGEZ TOUS LES MOTS DE PASSE** dans le fichier `portainer-stack.yml` :
### Variables à modifier :
```yaml
# Database
POSTGRES_PASSWORD: xpeditis_prod_password_CHANGE_ME → Votre_Mot_De_Passe_Fort_DB
# Redis
REDIS_PASSWORD: xpeditis_redis_password_CHANGE_ME → Votre_Mot_De_Passe_Fort_Redis
# MinIO
MINIO_ROOT_USER: minioadmin_CHANGE_ME → Votre_Utilisateur_MinIO
MINIO_ROOT_PASSWORD: minioadmin_password_CHANGE_ME → Votre_Mot_De_Passe_Fort_MinIO
# JWT
JWT_SECRET: your-super-secret-jwt-key-CHANGE_ME-min-32-characters → Votre_Secret_JWT_32_Caracteres_Min
# Email (selon votre fournisseur)
EMAIL_HOST: smtp.example.com → smtp.votre-fournisseur.com
EMAIL_PORT: 587
EMAIL_USER: noreply@xpeditis.com → Votre_Email
EMAIL_PASSWORD: email_password_CHANGE_ME → Votre_Mot_De_Passe_Email
```
### Générer des mots de passe forts :
```bash
# Générer un mot de passe aléatoire de 32 caractères
openssl rand -base64 32
# Générer un secret JWT de 64 caractères
openssl rand -base64 64 | tr -d '\n'
```
## Étape 4 : Déployer avec Portainer
### 4.1 Accéder à Portainer
1. Ouvrez votre navigateur et accédez à Portainer (ex: `https://portainer.votre-domaine.com`)
2. Connectez-vous avec vos identifiants
3. Sélectionnez votre environnement Docker Swarm
### 4.2 Créer la Stack
1. Dans le menu latéral, cliquez sur **"Stacks"**
2. Cliquez sur **"+ Add stack"**
3. Donnez un nom à la stack : `xpeditis`
4. Choisissez **"Web editor"**
5. Copiez le contenu du fichier `portainer-stack.yml` (avec vos modifications)
6. Collez le contenu dans l'éditeur Portainer
7. Cliquez sur **"Deploy the stack"**
### 4.3 Vérifier le Déploiement
1. Attendez que tous les services soient déployés (statut vert)
2. Vérifiez les logs de chaque service :
- Cliquez sur **"Stacks"** → **"xpeditis"**
- Sélectionnez un service et consultez ses logs
## Étape 5 : Initialiser la Base de Données
### 5.1 Attendre que la DB soit prête
```bash
# Vérifier que PostgreSQL est prêt
docker service logs xpeditis_xpeditis-db --tail 50
# Vous devriez voir : "database system is ready to accept connections"
```
### 5.2 Exécuter les Migrations
```bash
# Trouver le conteneur backend
BACKEND_CONTAINER=$(docker ps --filter "name=xpeditis_xpeditis-backend" --format "{{.ID}}" | head -n 1)
# Exécuter les migrations
docker exec -it $BACKEND_CONTAINER npm run migration:run
# Vérifier que les migrations sont appliquées
docker exec -it $BACKEND_CONTAINER npm run migration:show
```
### 5.3 Créer un Bucket MinIO
```bash
# Accéder au conteneur MinIO
MINIO_CONTAINER=$(docker ps --filter "name=xpeditis_xpeditis-minio" --format "{{.ID}}" | head -n 1)
# Créer le bucket
docker exec -it $MINIO_CONTAINER mc mb local/xpeditis-documents
# Définir la politique publique en lecture pour les documents
docker exec -it $MINIO_CONTAINER mc anonymous set download local/xpeditis-documents
```
Ou via la console MinIO :
1. Accédez à `https://minio.xpeditis.com`
2. Connectez-vous avec vos identifiants MinIO
3. Créez un bucket nommé `xpeditis-documents`
## Étape 6 : Créer un Utilisateur Admin
### 6.1 Via l'API (avec curl)
```bash
# Créer une organisation
curl -X POST https://api.xpeditis.com/api/v1/organizations \
-H "Content-Type: application/json" \
-d '{
"name": "Xpeditis Admin",
"type": "FREIGHT_FORWARDER",
"address": {
"street": "123 Rue Exemple",
"city": "Paris",
"postalCode": "75001",
"country": "FR"
}
}'
# Récupérer l'ID de l'organisation dans la réponse (ex: org-id-123)
# Créer un utilisateur admin
curl -X POST https://api.xpeditis.com/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "admin@xpeditis.com",
"password": "VotreMotDePasseAdmin123!",
"firstName": "Admin",
"lastName": "Xpeditis",
"organizationId": "org-id-123"
}'
```
### 6.2 Via la Base de Données (Direct SQL)
```bash
# Accéder à PostgreSQL
POSTGRES_CONTAINER=$(docker ps --filter "name=xpeditis_xpeditis-db" --format "{{.ID}}" | head -n 1)
docker exec -it $POSTGRES_CONTAINER psql -U xpeditis -d xpeditis_prod
# Dans psql, exécuter :
INSERT INTO organizations (id, name, type, address_street, address_city, address_postal_code, address_country, is_active)
VALUES (
gen_random_uuid(),
'Xpeditis Admin',
'FREIGHT_FORWARDER',
'123 Rue Exemple',
'Paris',
'75001',
'FR',
true
);
-- Récupérer l'ID de l'organisation
SELECT id, name FROM organizations;
-- Créer un utilisateur (remplacez ORG_ID_ICI par l'UUID réel)
INSERT INTO users (id, email, password, first_name, last_name, role, organization_id, is_active)
VALUES (
gen_random_uuid(),
'admin@xpeditis.com',
'$argon2id$v=19$m=65536,t=3,p=4$VOTRE_HASH_ARGON2',
'Admin',
'Xpeditis',
'ADMIN',
'ORG_ID_ICI',
true
);
\q
```
## Étape 7 : Tester l'Application
### 7.1 Vérifier les Services
```bash
# Vérifier que tous les services sont en cours d'exécution
docker service ls | grep xpeditis
# Vérifier les endpoints
curl -I https://api.xpeditis.com/health
curl -I https://app.xpeditis.com
curl -I https://minio.xpeditis.com
```
### 7.2 Tester l'Application Web
1. Ouvrez votre navigateur et accédez à `https://app.xpeditis.com`
2. Connectez-vous avec les identifiants admin créés
3. Testez les fonctionnalités principales :
- Recherche de tarifs
- Création de réservation CSV
- Upload de documents
### 7.3 Vérifier les Certificats SSL
```bash
# Vérifier le certificat SSL
curl -vI https://api.xpeditis.com 2>&1 | grep -i "SSL certificate"
curl -vI https://app.xpeditis.com 2>&1 | grep -i "SSL certificate"
```
## Étape 8 : Monitoring et Logs
### 8.1 Voir les Logs dans Portainer
1. **Stacks****xpeditis** → Sélectionnez un service
2. Cliquez sur **"Logs"**
3. Ajustez le nombre de lignes (ex: 500 dernières lignes)
### 8.2 Logs en Ligne de Commande
```bash
# Logs du backend
docker service logs xpeditis_xpeditis-backend -f --tail 100
# Logs du frontend
docker service logs xpeditis_xpeditis-frontend -f --tail 100
# Logs de la base de données
docker service logs xpeditis_xpeditis-db -f --tail 100
# Logs de Redis
docker service logs xpeditis_xpeditis-redis -f --tail 100
# Logs de MinIO
docker service logs xpeditis_xpeditis-minio -f --tail 100
```
### 8.3 Vérifier les Ressources
```bash
# Statistiques des conteneurs
docker stats
# État des services
docker service ls
# Détails d'un service
docker service inspect xpeditis_xpeditis-backend --pretty
```
## Étape 9 : Scaling (Optionnel)
### 9.1 Scaler le Backend
```bash
# Augmenter le nombre de répliques backend à 4
docker service scale xpeditis_xpeditis-backend=4
# Vérifier
docker service ps xpeditis_xpeditis-backend
```
### 9.2 Scaler le Frontend
```bash
# Augmenter le nombre de répliques frontend à 3
docker service scale xpeditis_xpeditis-frontend=3
```
### 9.3 Via Portainer
1. **Stacks****xpeditis** → Sélectionnez un service
2. Cliquez sur **"Scale"**
3. Ajustez le nombre de répliques
4. Cliquez sur **"Apply"**
## Étape 10 : Sauvegarde
### 10.1 Sauvegarde PostgreSQL
```bash
# Créer un script de sauvegarde
cat > /opt/backups/backup-xpeditis-db.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/opt/backups/xpeditis"
DATE=$(date +%Y%m%d_%H%M%S)
CONTAINER=$(docker ps --filter "name=xpeditis_xpeditis-db" --format "{{.ID}}" | head -n 1)
mkdir -p $BACKUP_DIR
docker exec $CONTAINER pg_dump -U xpeditis xpeditis_prod | gzip > $BACKUP_DIR/xpeditis_db_$DATE.sql.gz
# Garder seulement les 7 dernières sauvegardes
find $BACKUP_DIR -name "xpeditis_db_*.sql.gz" -mtime +7 -delete
echo "Backup completed: xpeditis_db_$DATE.sql.gz"
EOF
chmod +x /opt/backups/backup-xpeditis-db.sh
# Ajouter à crontab (sauvegarde quotidienne à 2h du matin)
(crontab -l 2>/dev/null; echo "0 2 * * * /opt/backups/backup-xpeditis-db.sh") | crontab -
```
### 10.2 Sauvegarde MinIO
```bash
# Créer un script de sauvegarde
cat > /opt/backups/backup-xpeditis-minio.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/opt/backups/xpeditis"
DATE=$(date +%Y%m%d_%H%M%S)
CONTAINER=$(docker ps --filter "name=xpeditis_xpeditis-minio" --format "{{.ID}}" | head -n 1)
mkdir -p $BACKUP_DIR
docker exec $CONTAINER tar czf - /data | cat > $BACKUP_DIR/xpeditis_minio_$DATE.tar.gz
# Garder seulement les 7 dernières sauvegardes
find $BACKUP_DIR -name "xpeditis_minio_*.tar.gz" -mtime +7 -delete
echo "Backup completed: xpeditis_minio_$DATE.tar.gz"
EOF
chmod +x /opt/backups/backup-xpeditis-minio.sh
# Ajouter à crontab (sauvegarde quotidienne à 3h du matin)
(crontab -l 2>/dev/null; echo "0 3 * * * /opt/backups/backup-xpeditis-minio.sh") | crontab -
```
## Mise à Jour de l'Application
### 1. Construire les Nouvelles Images
```bash
# Sur votre machine locale
cd /chemin/vers/xpeditis2.0
# Mettre à jour le code (git pull, etc.)
git pull origin main
# Construire les nouvelles images avec un nouveau tag
docker build -t xpeditis/backend:v1.1.0 -f apps/backend/Dockerfile .
docker build -t xpeditis/frontend:v1.1.0 -f apps/frontend/Dockerfile .
# Tag comme latest
docker tag xpeditis/backend:v1.1.0 xpeditis/backend:latest
docker tag xpeditis/frontend:v1.1.0 xpeditis/frontend:latest
# Push vers le registre ou sauvegarder et transférer
```
### 2. Mettre à Jour la Stack dans Portainer
1. **Stacks****xpeditis****"Editor"**
2. Modifiez les tags d'images si nécessaire
3. Cliquez sur **"Update the stack"**
4. Cochez **"Re-pull image and redeploy"**
5. Cliquez sur **"Update"**
Docker Swarm effectuera un rolling update sans downtime.
## Dépannage
### Le service ne démarre pas
```bash
# Vérifier les logs d'erreur
docker service logs xpeditis_xpeditis-backend --tail 100
# Vérifier les tâches échouées
docker service ps xpeditis_xpeditis-backend --no-trunc
# Inspecter le service
docker service inspect xpeditis_xpeditis-backend --pretty
```
### Certificat SSL non généré
```bash
# Vérifier les logs Traefik
docker service logs traefik --tail 200
# Vérifier que les DNS pointent bien vers le serveur
dig app.xpeditis.com
dig api.xpeditis.com
# Vérifier que le port 80 est accessible (Let's Encrypt challenge)
curl http://app.xpeditis.com
```
### Base de données ne se connecte pas
```bash
# Vérifier que PostgreSQL est prêt
docker service logs xpeditis_xpeditis-db --tail 50
# Tester la connexion depuis le backend
BACKEND_CONTAINER=$(docker ps --filter "name=xpeditis_xpeditis-backend" --format "{{.ID}}" | head -n 1)
docker exec -it $BACKEND_CONTAINER nc -zv xpeditis-db 5432
```
### MinIO ne fonctionne pas
```bash
# Vérifier les logs MinIO
docker service logs xpeditis_xpeditis-minio --tail 50
# Vérifier que le bucket existe
MINIO_CONTAINER=$(docker ps --filter "name=xpeditis_xpeditis-minio" --format "{{.ID}}" | head -n 1)
docker exec -it $MINIO_CONTAINER mc ls local/
```
## URLs de l'Application
Une fois déployée, l'application sera accessible via :
- **Frontend** : https://app.xpeditis.com
- **API** : https://api.xpeditis.com
- **API Docs (Swagger)** : https://api.xpeditis.com/api/docs
- **MinIO Console** : https://minio.xpeditis.com
- **MinIO API** : https://s3.xpeditis.com
## Sécurité
### Recommandations
1. **Changez tous les mots de passe** par défaut
2. **Utilisez des secrets Docker** pour les données sensibles
3. **Configurez un firewall** (UFW) pour limiter les ports ouverts
4. **Activez le monitoring** (Prometheus + Grafana)
5. **Configurez des alertes** pour les services en erreur
6. **Mettez en place des sauvegardes automatiques**
7. **Testez régulièrement la restauration** des sauvegardes
### Ports à Ouvrir
```bash
# Firewall UFW
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP (Traefik)
sudo ufw allow 443/tcp # HTTPS (Traefik)
sudo ufw enable
```
## Support
Pour plus d'informations, consultez :
- [Documentation Xpeditis](../README.md)
- [Architecture](../ARCHITECTURE.md)
- [Deployment Guide](../DEPLOYMENT.md)