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