xpeditis2.0/PORTAINER_YAML_FIX.md
David 2e5dcec05c
All checks were successful
CI/CD Pipeline / Backend - Build, Test & Push (push) Successful in 6m17s
CI/CD Pipeline / Frontend - Build, Test & Push (push) Successful in 14m45s
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 2s
fix
2025-11-19 18:27:42 +01:00

150 lines
5.3 KiB
Markdown

# 🔧 Fix Portainer YAML - Types de Variables d'Environnement
## ❌ Problème
Lors du déploiement sur Portainer, vous pouvez rencontrer cette erreur :
```
Deployment error
services.xpeditis-backend.environment.DATABASE_LOGGING must be a string, number or null
```
## 📝 Explication
Dans Docker Compose version 3.x (utilisé par Portainer), **toutes les variables d'environnement doivent être des strings**.
Les valeurs **booléennes** (`true`, `false`) et **numériques** sans guillemets (`5432`, `10`, `0`) ne sont **PAS acceptées** par Portainer, même si elles fonctionnent en local avec `docker-compose`.
### Pourquoi ça fonctionne en local ?
Docker Compose CLI (utilisé en local) est plus permissif et convertit automatiquement les types. Portainer est plus strict et applique la spécification YAML à la lettre.
## ✅ Solution
Convertir **toutes** les valeurs non-string en strings avec des guillemets :
### ❌ Avant (ne fonctionne pas sur Portainer)
```yaml
environment:
PORT: 4000 # ❌ Number
DATABASE_PORT: 5432 # ❌ Number
DATABASE_SYNC: false # ❌ Boolean
DATABASE_LOGGING: false # ❌ Boolean
REDIS_DB: 0 # ❌ Number
BCRYPT_ROUNDS: 10 # ❌ Number
SESSION_TIMEOUT_MS: 7200000 # ❌ Number
RATE_LIMIT_TTL: 60 # ❌ Number
RATE_LIMIT_MAX: 100 # ❌ Number
```
### ✅ Après (fonctionne sur Portainer)
```yaml
environment:
PORT: "4000" # ✅ String
DATABASE_PORT: "5432" # ✅ String
DATABASE_SYNC: "false" # ✅ String
DATABASE_LOGGING: "false" # ✅ String
REDIS_DB: "0" # ✅ String
BCRYPT_ROUNDS: "10" # ✅ String
SESSION_TIMEOUT_MS: "7200000" # ✅ String
RATE_LIMIT_TTL: "60" # ✅ String
RATE_LIMIT_MAX: "100" # ✅ String
```
## 🔍 Variables Modifiées
Dans `docker/portainer-stack.yml`, les variables suivantes ont été converties en strings :
| Variable | Avant | Après |
|----------|-------|-------|
| `PORT` | `4000` | `"4000"` |
| `DATABASE_PORT` | `5432` | `"5432"` |
| `DATABASE_SYNC` | `false` | `"false"` |
| `DATABASE_LOGGING` | `false` | `"false"` |
| `REDIS_PORT` | `6379` | `"6379"` |
| `REDIS_DB` | `0` | `"0"` |
| `BCRYPT_ROUNDS` | `10` | `"10"` |
| `SESSION_TIMEOUT_MS` | `7200000` | `"7200000"` |
| `RATE_LIMIT_TTL` | `60` | `"60"` |
| `RATE_LIMIT_MAX` | `100` | `"100"` |
## 💡 Comment l'application interprète les valeurs ?
Ne vous inquiétez pas ! Même si les variables sont des **strings**, l'application NestJS les convertira automatiquement au bon type :
```typescript
// Dans le code NestJS
const port = parseInt(process.env.PORT, 10); // "4000" → 4000
const dbPort = parseInt(process.env.DATABASE_PORT, 10); // "5432" → 5432
const dbSync = process.env.DATABASE_SYNC === 'true'; // "false" → false
const redisDb = parseInt(process.env.REDIS_DB, 10); // "0" → 0
```
Le module `@nestjs/config` et les validateurs `class-validator` gèrent cette conversion automatiquement.
## 🧪 Test de Validation
Pour vérifier que votre `portainer-stack.yml` est correct :
```bash
# 1. Vérifier la syntaxe YAML
docker-compose -f docker/portainer-stack.yml config
# 2. Vérifier qu'il n'y a pas d'erreurs de validation
# (Devrait afficher la configuration sans erreur)
```
Si vous voyez des erreurs comme :
- `must be a string`
- `must be a number`
- `must be null`
Alors il faut ajouter des guillemets autour de la valeur.
## 📋 Checklist de Vérification
Avant de déployer sur Portainer, vérifier que :
- [ ] Tous les **ports** sont entre guillemets : `"4000"`, `"5432"`, `"6379"`
- [ ] Tous les **booléens** sont entre guillemets : `"true"`, `"false"`
- [ ] Tous les **nombres** sont entre guillemets : `"10"`, `"0"`, `"7200000"`
- [ ] Les **strings** peuvent rester sans guillemets ou avec : `preprod` ou `"preprod"`
- [ ] Les **URLs** peuvent rester sans guillemets : `https://api.preprod.xpeditis.com`
## ⚠️ Exception : PostgreSQL et Redis
Pour les services PostgreSQL et Redis, certaines valeurs peuvent rester sans guillemets car elles sont utilisées par les images officielles qui sont plus permissives :
```yaml
# PostgreSQL - OK sans guillemets
environment:
POSTGRES_DB: xpeditis_preprod
POSTGRES_USER: xpeditis
POSTGRES_PASSWORD: 9Lc3M9qoPBeHLKHDXGUf1
# Redis - Commande avec guillemets pour la sécurité
command: redis-server --requirepass hXiy5GMPswMtxMZujjS2O --appendonly yes
```
Mais pour **votre application backend**, utilisez **toujours des guillemets** pour les valeurs non-string.
## 🔗 Références
- [Docker Compose Environment Variables](https://docs.docker.com/compose/environment-variables/)
- [Portainer Stack Deployment](https://docs.portainer.io/user/docker/stacks/add)
- [YAML Specification](https://yaml.org/spec/1.2/spec.html)
## 📄 Fichier Corrigé
Le fichier `docker/portainer-stack.yml` a été corrigé avec toutes les valeurs en strings.
**Avant déploiement**, vérifier que le fichier ne contient plus de valeurs booléennes ou numériques brutes dans la section `environment` du service `xpeditis-backend`.
---
**Date** : 2025-11-19
**Version** : 1.1
**Statut** : ✅ Corrigé et prêt pour déploiement