Database Configuration - ProbatioVault Backend¶
Configuration PostgreSQL 18 + TypeORM
📋 Vue d'ensemble¶
PD-14: Configuration TypeORM avec PostgreSQL 18, pooling optimisé, SSL/TLS et migrations maîtrisées.
- SGBD: PostgreSQL 18.1 (support jusqu'en 2030)
- ORM: TypeORM 0.3.17
- Driver: pg 8.11.3
- SSL/TLS: Activé en test/prod (PD-2)
🔧 Variables d'environnement¶
Connection Database¶
| Variable | Dev | Test | Prod | Description |
|---|---|---|---|---|
DB_HOST | localhost | localhost | xxx.postgresql.ovh.net | Hôte PostgreSQL |
DB_PORT | 5432 | 5432 | 5432 | Port PostgreSQL |
DB_NAME | probatiovault | probatiovault | probatiovault | Nom de la base |
DB_USER | probatiovault | probatiovault | probatiovault | User PostgreSQL (créé par PD-2) |
DB_PASSWORD | dev_password_change_me | **** | **** | Mot de passe (via Ansible vault) |
SSL/TLS Configuration¶
| Variable | Dev | Test | Prod | Description |
|---|---|---|---|---|
DB_SSL | false | true | true | Activer SSL/TLS |
DB_SSL_REJECT_UNAUTHORIZED | false | false | true | Vérifier certificat serveur |
Note PD-2: PostgreSQL 18 utilise des certificats Let's Encrypt en test/prod.
Connection Pool¶
| Variable | Dev | Test | Prod | Description |
|---|---|---|---|---|
DB_POOL_MIN | 1 | 2 | 5 | Connexions minimum |
DB_POOL_MAX | 5 | 8 | 20 | Connexions maximum |
DB_POOL_IDLE_TIMEOUT | 10000 | 10000 | 10000 | Timeout idle (ms) |
DB_POOL_ACQUIRE_TIMEOUT | 30000 | 30000 | 30000 | Timeout acquisition (ms) |
DB_STATEMENT_TIMEOUT | 60000 | 60000 | 60000 | Timeout requête (ms) |
Contraintes: - DB_POOL_MAX DOIT être < max_connections PostgreSQL (100 en dev) - Règle: DB_POOL_MAX * nombre_instances < max_connections * 0.8
Logging¶
| Variable | Dev | Test | Prod | Description |
|---|---|---|---|---|
DB_LOGGING | true | false | false | Log des requêtes SQL |
DB_SLOW_QUERY_THRESHOLD | 1000 | - | - | Seuil slow query (ms) |
📦 Migrations¶
Générer une migration¶
# Auto-generate à partir des changements d'entités
npm run migration:generate -- src/database/migrations/NomDeLaMigration
# Créer une migration vide
npm run migration:create -- src/database/migrations/NomDeLaMigration
Note: Les migrations sont générées dans src/database/migrations/
Exécuter les migrations¶
# Development (TypeScript via ts-node)
npm run migration:run
# Production (JavaScript compilé via dist/)
npm run build
npm run migration:run:prod
Important: En production, les migrations sont exécutées via CI/CD GitLab (jobs migrate:*)
Rollback¶
⚠️ Attention: Le rollback doit être utilisé avec précaution en production
Lister les migrations¶
Exemple de sortie:
🔍 Connexion manuelle¶
Via psql (dev local)¶
# Sans SSL (dev local)
psql "postgresql://probatiovault:dev_password_change_me@localhost:5432/probatiovault"
# Avec SSL (test/prod)
psql "postgresql://probatiovault:PASSWORD@xxx.postgresql.ovh.net:5432/probatiovault?sslmode=require"
Vérifier SSL/TLS¶
-- Vérifier que SSL est actif
SHOW ssl;
-- Vérifier la connexion actuelle utilise SSL
SELECT ssl, version, cipher, bits
FROM pg_stat_ssl
WHERE pid = pg_backend_pid();
🏥 Health Checks¶
Via l'API¶
# Health check database
curl http://localhost:3000/health/database
# Réponse attendue
{
"status": "healthy",
"connected": true,
"ssl": { "ssl": true, "version": "TLSv1.3" },
"pool": { "totalCount": 3, "idleCount": 2, "waitingCount": 0 },
"info": {
"database": "probatiovault",
"version": "PostgreSQL 18.1",
"maxConnections": 100,
"currentConnections": 5
}
}
Via SQL¶
-- Connexions actives
SELECT count(*) as active_connections
FROM pg_stat_activity
WHERE datname = 'probatiovault'
AND state = 'active';
-- Pool stats
SELECT
count(*) FILTER (WHERE state = 'active') as active,
count(*) FILTER (WHERE state = 'idle') as idle,
count(*) as total
FROM pg_stat_activity
WHERE datname = current_database();
🚀 Stratégie de déploiement¶
Development¶
- Schema changes : Via migrations TypeORM
- Execution : Automatique au
npm run start:dev(optionnel) - Validation : Tests d'intégration
Test¶
- Review MR : Validation de la migration par l'équipe
- CI/CD : Exécution automatique dans pipeline
- Rollback : Plan de rollback documenté dans la MR
Production¶
- Backup : Snapshot DB avant déploiement
- Dry-run : Test de la migration sur copie prod
- Execution : Via CI/CD avec approbation manuelle
- Monitoring : Surveillance métriques post-déploiement
⚠️ Bonnes pratiques¶
Migrations¶
✅ À FAIRE: - Toujours tester sur copie de prod avant déploiement - Documenter le plan de rollback - Utiliser des transactions (défaut TypeORM) - Éviter les ALTER TABLE sur tables volumineuses en heures de pointe
❌ À ÉVITER: - JAMAIS synchronize: true en production - JAMAIS modifier une migration déjà déployée - JAMAIS supprimer de données sans backup - JAMAIS faire confiance aux migrations auto-générées sans review
Pool de connexions¶
✅ À FAIRE: - Monitorer pg_stat_activity régulièrement - Ajuster DB_POOL_MAX selon la charge - Fermer les connexions après usage (automatique avec TypeORM)
❌ À ÉVITER: - Dépasser 80% de max_connections - Pool trop grand = overhead mémoire - Pool trop petit = contentions
Sécurité¶
✅ À FAIRE: - Toujours activer SSL en production - Utiliser des secrets managers (pas de hardcode) - Principe du moindre privilège (pas de superuser app) - Audit logging activé (PD-2)