# Configuration Backend Veza - Guide de Sécurité

**Version**: 1.0  
**Date**: 2025-01-XX  
**Priorité**: P0 - Sécurité

---

## 📋 Vue d'ensemble

Ce document décrit la configuration du backend Go de Veza, avec un focus particulier sur la **sécurisation** selon l'environnement (development, test, production).

### Changements de sécurité (P0-SECURITY)

- ✅ **CORS sécurisé**: Plus de wildcard `"*"` par défaut en production
- ✅ **Validation stricte**: Production refuse de démarrer si configuration critique manquante
- ✅ **Profils d'environnement**: Comportements différents selon `APP_ENV`
- ✅ **Defaults sécurisés**: Valeurs par défaut adaptées à chaque environnement

---

## 🔧 Variables d'environnement

### Variables requises (tous environnements)

| Variable | Description | Exemple | Validation |
|----------|-------------|---------|------------|
| `JWT_SECRET` | Secret pour signer les tokens JWT | `your-super-secret-jwt-key-min-32-chars` | **REQUIS**, min 32 caractères |
| `DATABASE_URL` | URL de connexion PostgreSQL | `postgresql://user:pass@localhost:5432/veza_db` | **REQUIS**, format valide |

### Variables optionnelles avec defaults

| Variable | Description | Default | Notes |
|----------|-------------|---------|-------|
| `APP_PORT` | Port HTTP du serveur | `8080` | 1-65535 |
| `REDIS_URL` | URL de connexion Redis | `redis://localhost:6379` | Format `redis://` ou `rediss://` |
| `LOG_LEVEL` | Niveau de log | `INFO` | `DEBUG`, `INFO`, `WARN`, `ERROR` |
| `UPLOAD_DIR` | Répertoire d'upload | `uploads` | Chemin relatif ou absolu |
| `STREAM_SERVER_URL` | URL du serveur de streaming | `http://localhost:8082` | URL complète |

### Variables spécifiques CORS (P0-SECURITY)

| Variable | Description | Default (dev) | Default (prod) | Validation |
|----------|-------------|---------------|----------------|------------|
| `CORS_ALLOWED_ORIGINS` | Origines CORS autorisées (séparées par virgules) | `http://localhost:3000,http://127.0.0.1:3000,...` | **REQUIS** | **Non vide en prod**, **pas de `"*"` en prod** |

**Format**: Liste séparée par virgules
```bash
CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com,https://staging.veza.com
```

---

## 🌍 Environnements

### Détection automatique

L'environnement est détecté automatiquement selon cette priorité :

1. `APP_ENV` (priorité maximale)
2. `NODE_ENV` (compatibilité)
3. `GO_ENV` (compatibilité Go)
4. Hostname (si contient "prod" → production)
5. **Fallback**: `development`

### Environnements supportés

- `development`: Développement local
- `test`: Tests automatisés
- `staging`: Environnement de pré-production
- `production`: Production

---

## 🔒 Comportements par environnement

### Development (`APP_ENV=development`)

**Caractéristiques**:
- ✅ CORS permissif par défaut (localhost uniquement)
- ✅ Logs verbeux (DEBUG autorisé)
- ✅ Valeurs par défaut acceptées
- ⚠️ Warning si CORS contient `"*"` (mais démarrage autorisé)

**Defaults CORS** (si `CORS_ALLOWED_ORIGINS` non défini):
```
http://localhost:3000
http://127.0.0.1:3000
http://localhost:5173
http://127.0.0.1:5173
```

**Exemple de configuration minimale**:
```bash
APP_ENV=development
JWT_SECRET=dev-secret-key-minimum-32-characters-long
DATABASE_URL=postgresql://veza:password@localhost:5432/veza_db
# CORS_ALLOWED_ORIGINS optionnel - defaults locaux utilisés
```

### Test (`APP_ENV=test`)

**Caractéristiques**:
- ✅ CORS vide par défaut (peut être configuré explicitement)
- ✅ Validation adaptée aux tests
- ✅ Pas de side-effects externes (SMTP, etc.)

**Exemple de configuration**:
```bash
APP_ENV=test
JWT_SECRET=test-secret-key-minimum-32-characters-long
DATABASE_URL=postgresql://veza:password@localhost:5432/veza_test
# CORS_ALLOWED_ORIGINS optionnel - liste vide par défaut
```

### Production (`APP_ENV=production`)

**Caractéristiques**:
- 🔴 **CORS_ALLOWED_ORIGINS REQUIS** et non vide
- 🔴 **Wildcard `"*"` INTERDIT** en production
- 🔴 **LOG_LEVEL=DEBUG INTERDIT** en production
- 🔴 **Erreur fatale** si configuration critique manquante

**Validation stricte**:
- Si `CORS_ALLOWED_ORIGINS` est vide → **Erreur fatale, serveur ne démarre pas**
- Si `CORS_ALLOWED_ORIGINS` contient `"*"` → **Erreur fatale, serveur ne démarre pas**
- Si `LOG_LEVEL=DEBUG` → **Erreur fatale, serveur ne démarre pas**

**Exemple de configuration requise**:
```bash
APP_ENV=production
JWT_SECRET=production-super-secret-key-minimum-32-characters-long
DATABASE_URL=postgresql://veza:secure-password@db.veza.com:5432/veza_prod
CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com
LOG_LEVEL=INFO
REDIS_URL=rediss://redis.veza.com:6379
```

**❌ Configuration INVALIDE en production**:
```bash
# ❌ CORS_ALLOWED_ORIGINS manquant
APP_ENV=production
JWT_SECRET=...
DATABASE_URL=...
# → Erreur: "CORS_ALLOWED_ORIGINS is required in production"

# ❌ Wildcard dans CORS
CORS_ALLOWED_ORIGINS=*
# → Erreur: "CORS wildcard '*' is not allowed in production"

# ❌ DEBUG en production
LOG_LEVEL=DEBUG
# → Erreur: "LOG_LEVEL=DEBUG is not allowed in production"
```

---

## 🚀 Démarrage du serveur

### Development

```bash
# Option 1: Via fichier .env
echo "APP_ENV=development" > .env
echo "JWT_SECRET=dev-secret-key-minimum-32-characters-long" >> .env
echo "DATABASE_URL=postgresql://veza:password@localhost:5432/veza_db" >> .env
go run cmd/api/main.go

# Option 2: Variables d'environnement
export APP_ENV=development
export JWT_SECRET=dev-secret-key-minimum-32-characters-long
export DATABASE_URL=postgresql://veza:password@localhost:5432/veza_db
go run cmd/api/main.go
```

### Production

```bash
# Configuration requise
export APP_ENV=production
export JWT_SECRET=production-super-secret-key-minimum-32-characters-long
export DATABASE_URL=postgresql://veza:secure-password@db.veza.com:5432/veza_prod
export CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com
export LOG_LEVEL=INFO
export REDIS_URL=rediss://redis.veza.com:6379

# Démarrage
./veza-backend-api
```

**Si une variable critique manque en production**, le serveur **refusera de démarrer** avec un message d'erreur explicite.

---

## 🔍 Validation de la configuration

### Validation automatique

La configuration est validée automatiquement au démarrage via `ValidateForEnvironment()` :

1. **Validation de base** (tous environnements):
   - Port valide (1-65535)
   - JWT secret ≥ 32 caractères
   - DatabaseURL et RedisURL format valide
   - LogLevel dans la liste autorisée

2. **Validation spécifique production**:
   - `CORS_ALLOWED_ORIGINS` non vide
   - Pas de wildcard `"*"` dans CORS
   - `LOG_LEVEL` ≠ `DEBUG`

### Messages d'erreur

**Production - CORS manquant**:
```
ERROR: Configuration validation failed
Error: CORS_ALLOWED_ORIGINS is required in production environment and must not be empty
```

**Production - Wildcard détecté**:
```
ERROR: Configuration validation failed
Error: CORS wildcard '*' is not allowed in production environment. Please specify explicit origins in CORS_ALLOWED_ORIGINS
```

**Production - DEBUG interdit**:
```
ERROR: Configuration validation failed
Error: LOG_LEVEL=DEBUG is not allowed in production environment for security reasons
```

---

## 📝 Fichiers de configuration

### Ordre de chargement

1. Variables d'environnement système (priorité maximale)
2. `.env.{APP_ENV}` (ex: `.env.development`, `.env.production`)
3. `.env` (fallback)
4. Valeurs par défaut (selon environnement)

### Exemple de fichiers

**`.env.development`**:
```bash
APP_ENV=development
JWT_SECRET=dev-secret-key-minimum-32-characters-long
DATABASE_URL=postgresql://veza:password@localhost:5432/veza_db
REDIS_URL=redis://localhost:6379
LOG_LEVEL=DEBUG
# CORS_ALLOWED_ORIGINS optionnel - defaults locaux utilisés
```

**`.env.production`**:
```bash
APP_ENV=production
JWT_SECRET=production-super-secret-key-minimum-32-characters-long
DATABASE_URL=postgresql://veza:secure-password@db.veza.com:5432/veza_prod
CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com
LOG_LEVEL=INFO
REDIS_URL=rediss://redis.veza.com:6379
```

**⚠️ IMPORTANT**: Ne jamais commiter les fichiers `.env.production` avec des secrets réels dans le repository.

---

## 🧪 Tests

### Exécuter les tests de configuration

```bash
cd veza-backend-api
go test ./internal/config/... -v
```

### Tests de sécurité (P0-SECURITY)

Les tests suivants valident la sécurisation :

- `TestLoadConfig_DevDefaults`: Vérifie les defaults dev
- `TestLoadConfig_ProdMissingCritical`: Vérifie que prod refuse si CORS manquant
- `TestLoadConfig_ProdWildcard`: Vérifie que prod refuse le wildcard
- `TestLoadConfig_ProdValid`: Vérifie qu'une config prod valide passe

---

## 🔐 Bonnes pratiques de sécurité

### ✅ À FAIRE

1. **Production**: Toujours définir `CORS_ALLOWED_ORIGINS` explicitement
2. **Production**: Utiliser `LOG_LEVEL=INFO` ou supérieur
3. **Secrets**: Stocker les secrets dans des variables d'environnement, jamais dans le code
4. **Validation**: Vérifier la configuration avant chaque déploiement
5. **Documentation**: Documenter les variables d'environnement requises

### ❌ À ÉVITER

1. **Production**: Ne jamais utiliser `CORS_ALLOWED_ORIGINS=*`
2. **Production**: Ne jamais utiliser `LOG_LEVEL=DEBUG`
3. **Secrets**: Ne jamais hardcoder des secrets dans le code
4. **Git**: Ne jamais commiter des fichiers `.env` avec des secrets
5. **Defaults**: Ne pas compter sur les valeurs par défaut en production

---

## 🐛 Dépannage

### Le serveur refuse de démarrer en production

**Erreur**: `CORS_ALLOWED_ORIGINS is required in production`

**Solution**: Définir `CORS_ALLOWED_ORIGINS` avec une liste explicite d'origines :
```bash
export CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com
```

### Erreur de validation CORS wildcard

**Erreur**: `CORS wildcard '*' is not allowed in production`

**Solution**: Remplacer `"*"` par une liste explicite d'origines autorisées.

### Erreur LOG_LEVEL=DEBUG en production

**Erreur**: `LOG_LEVEL=DEBUG is not allowed in production`

**Solution**: Utiliser `LOG_LEVEL=INFO` ou supérieur :
```bash
export LOG_LEVEL=INFO
```

---

## 📚 Références

- [Audit de sécurité](./AUDIT_CONFIG.md) - Rapport d'audit détaillé
- [Middleware CORS](../internal/middleware/cors.go) - Implémentation CORS
- [Validation de config](../internal/config/validator.go) - Validateur de configuration

---

## 📞 Support

Pour toute question sur la configuration, consulter :
- Le code source: `internal/config/config.go`
- Les tests: `internal/config/config_test.go`
- Ce document: `docs/BACKEND_CONFIG.md`

---

**Dernière mise à jour**: 2025-01-XX  
**Auteur**: Équipe Veza  
**Priorité**: P0 - Sécurité

