veza/veza-backend-api/docs/BACKEND_CONFIG.md

358 lines
10 KiB
Markdown
Raw Normal View History

P0: stabilisation backend/chat/stream + nouvelle base migrations v1 Backend Go: - Remplacement complet des anciennes migrations par la base V1 alignée sur ORIGIN. - Durcissement global du parsing JSON (BindAndValidateJSON + RespondWithAppError). - Sécurisation de config.go, CORS, statuts de santé et monitoring. - Implémentation des transactions P0 (RBAC, duplication de playlists, social toggles). - Ajout d’un job worker structuré (emails, analytics, thumbnails) + tests associés. - Nouvelle doc backend : AUDIT_CONFIG, BACKEND_CONFIG, AUTH_PASSWORD_RESET, JOB_WORKER_*. Chat server (Rust): - Refonte du pipeline JWT + sécurité, audit et rate limiting avancé. - Implémentation complète du cycle de message (read receipts, delivered, edit/delete, typing). - Nettoyage des panics, gestion d’erreurs robuste, logs structurés. - Migrations chat alignées sur le schéma UUID et nouvelles features. Stream server (Rust): - Refonte du moteur de streaming (encoding pipeline + HLS) et des modules core. - Transactions P0 pour les jobs et segments, garanties d’atomicité. - Documentation détaillée de la pipeline (AUDIT_STREAM_*, DESIGN_STREAM_PIPELINE, TRANSACTIONS_P0_IMPLEMENTATION). Documentation & audits: - TRIAGE.md et AUDIT_STABILITY.md à jour avec l’état réel des 3 services. - Cartographie complète des migrations et des transactions (DB_MIGRATIONS_*, DB_TRANSACTION_PLAN, AUDIT_DB_TRANSACTIONS, TRANSACTION_TESTS_PHASE3). - Scripts de reset et de cleanup pour la lab DB et la V1. Ce commit fige l’ensemble du travail de stabilisation P0 (UUID, backend, chat et stream) avant les phases suivantes (Coherence Guardian, WS hardening, etc.).
2025-12-06 10:14:38 +00:00
# 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é