Aller au contenu

Database Configuration - ProbatioVault Backend

Configuration PostgreSQL 18 + TypeORM

← Retour refs


📋 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

# Annuler la dernière migration
npm run migration:revert

⚠️ Attention: Le rollback doit être utilisé avec précaution en production

Lister les migrations

# Voir les migrations pending/executed
npm run migration:show

Exemple de sortie:

 [X] PD14InitialCheckpoint1732310000000
 [ ] CreateUsersTable1732320000000 (pending)


🔍 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

  1. Schema changes : Via migrations TypeORM
  2. Execution : Automatique au npm run start:dev (optionnel)
  3. Validation : Tests d'intégration

Test

  1. Review MR : Validation de la migration par l'équipe
  2. CI/CD : Exécution automatique dans pipeline
  3. Rollback : Plan de rollback documenté dans la MR

Production

  1. Backup : Snapshot DB avant déploiement
  2. Dry-run : Test de la migration sur copie prod
  3. Execution : Via CI/CD avec approbation manuelle
  4. 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)


📚 Références


← Retour refs