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