Guides
Production
Déploiement Remote

Déploiement Remote

Guide de déploiement avec serveurs de bases de données distants.

Concept

Mode Remote = Container CSWeb (avec MySQL métadonnées) + Bases de données breakout sur des serveurs distants existants.

En mode remote, CSWeb ne crée aucune base de données breakout localement. Il se connecte simplement aux bases déjà existantes sur le réseau. Les seuls prérequis sont les drivers PHP installés (pdo_mysql, pdo_pgsql, pdo_sqlsrv) — tous sont pré-installés dans l'image Docker.

┌───────────────────┐          ┌─────────────────────┐
│   Serveur CSWeb   │          │  Serveur(s) Distant  │
│   (Docker)        │          │                      │
│                   │          │  ┌────────────────┐  │
│  ┌─────────────┐  │  réseau  │  │  PostgreSQL    │  │
│  │   CSWeb     │──┼──────────┼──│  OU MySQL      │  │
│  │  (Apache)   │  │          │  │  OU SQL Server │  │
│  └─────────────┘  │          │  └────────────────┘  │
│                   │          │                      │
│  ┌─────────────┐  │          └─────────────────────┘
│  │   MySQL     │  │
│  │ (Metadata)  │  │   Chaque dictionnaire peut pointer
│  └─────────────┘  │   vers un serveur/driver différent
└───────────────────┘

Cas d'usage :

  • Production avec base analytics sur un serveur dédié
  • Mix de drivers (PostgreSQL pour un dict, SQL Server pour un autre)
  • Séparation metadata/analytics pour la performance

Fonctionnement

En mode remote, la configuration se fait en deux temps :

  1. .env : Définir BREAKOUT_MODE=remote et le pilote par défaut (BREAKOUT_DB_TYPE)

    • postgresql : utilise le driver pdo_pgsql
    • mysql : utilise le driver pdo_mysql
    • sqlserver : utilise le driver pdo_sqlsrv
  2. Interface CSWeb : Au moment du breakout, renseigner les informations de connexion au serveur distant (host, port, database, user, password) pour chaque dictionnaire

Le pilote par défaut est important car il détermine quel driver PDO sera utilisé pour se connecter au serveur distant.


Configuration

Étape 1 : Modifier le .env

# Passer en mode remote
BREAKOUT_MODE=remote

# Pilote par défaut selon votre serveur distant
BREAKOUT_DB_TYPE=postgresql   # ou mysql, ou sqlserver

# MySQL Metadata reste LOCAL (container Docker)
MYSQL_HOST=mysql
MYSQL_PORT=3306
MYSQL_DATABASE=csweb_metadata
MYSQL_USER=csweb_user
MYSQL_PASSWORD=VotreMotDePasse
MYSQL_ROOT_PASSWORD=VotreMotDePasseRoot

Étape 2 : Démarrer sans conteneur breakout

# Démarrer SEULEMENT CSWeb et MySQL (pas de DB breakout locale)
docker compose up -d csweb mysql
 
# Vérifier les conteneurs
docker compose ps

Sortie attendue :

NAME                      STATUS              PORTS
csweb-app                 Up (healthy)        0.0.0.0:8080->80/tcp
csweb-mysql-metadata      Up (healthy)        0.0.0.0:3306->3306/tcp

Étape 3 : Vérifier les drivers

# Vérifier que le driver correspondant est installé
docker compose exec csweb php bin/console csweb:check-database-drivers

Les 3 drivers (PostgreSQL, MySQL, SQL Server) sont installés par défaut dans l'image Docker.

Étape 4 : Configurer le breakout dans CSWeb

  1. Se connecter à http://localhost:8080
  2. Aller dans Settings > Data, onglet Data Configuration
  3. Cliquer Add Configuration et sélectionner un dictionnaire
  4. Renseigner les informations du serveur distant :
    • Database name : Nom de la base breakout (doit être différente de la base métadonnées)
    • Hostname : IP ou hostname du serveur distant
    • Port : Port du SGBD (5432, 3306, 1433)
    • Username / Password : Credentials du serveur distant

Chaque dictionnaire peut pointer vers un serveur et un driver différent.

Étape 5 : Lancer le breakout

Depuis l'onglet Breakout Scheduler : ajouter un schedule ou utiliser Run Now pour un breakout immédiat.

Ou en CLI :

# Breakout sélectif vers le serveur distant
docker compose exec csweb php bin/console csweb:process-cases-by-dict NOM_DICTIONNAIRE

Les tables seront créées directement sur le serveur distant.


Prérequis Serveur Distant

Connectivité Réseau

Depuis le conteneur CSWeb, le serveur distant doit être joignable :

# Tester depuis le conteneur CSWeb
docker compose exec csweb bash
php -r "echo @fsockopen('192.168.1.100', 5432, \$e, \$m, 5) ? 'OK' : 'FAIL: '.\$m;"

Configuration SGBD

postgresql.conf :

listen_addresses = '*'

pg_hba.conf :

# Autoriser les connexions depuis le serveur CSWeb
host    all    all    0.0.0.0/0    md5

# OU restreindre à une IP (recommandé production)
host    all    all    192.168.1.50/32    md5

Firewall :

sudo ufw allow from [IP_SERVEUR_CSWEB] to any port 5432
sudo systemctl restart postgresql

Basculer entre Local et Remote

Local vers Remote

# 1. Modifier .env : BREAKOUT_MODE=remote
# 2. Arrêter le conteneur breakout local
docker compose stop postgres
 
# 3. Relancer CSWeb
docker compose up -d csweb mysql

Remote vers Local

# 1. Modifier .env : BREAKOUT_MODE=local
# 2. Relancer avec le profil local
docker compose --profile local-postgres up -d

Exemples Production

RGPH5 Sénégal (SQL Server)

BREAKOUT_MODE=remote
BREAKOUT_DB_TYPE=sqlserver

Connexion configurée dans CSWeb :

  • Host : 172.16.0.50
  • Port : 1433
  • Database : RGPH5_Analytics

Résultat : L'ensemble des questionnaires traités en une fraction du temps initialement prévu.

Institut National de Statistique (PostgreSQL)

BREAKOUT_MODE=remote
BREAKOUT_DB_TYPE=postgresql

Connexion configurée dans CSWeb :

  • Host : 10.0.0.100
  • Port : 5432
  • Database : census_analytics

Troubleshooting

Connection Refused

Symptôme :

SQLSTATE[HY000] [2002] Connection refused

Solutions :

  1. Vérifier que le serveur distant est démarré
  2. Vérifier le firewall (ufw status, iptables -L)
  3. Vérifier listen_addresses dans la configuration SGBD
  4. Tester la connectivité depuis le conteneur

Authentication Failed

Symptôme :

SQLSTATE[28000] Invalid authorization

Solutions :

  1. Vérifier les credentials
  2. Créer l'utilisateur avec host wildcard ('%')
  3. Vérifier pg_hba.conf pour PostgreSQL
  4. Activer l'authentification SQL pour SQL Server

Timeout

Symptôme :

SQLSTATE[HYT00]: Login timeout expired

Solutions :

  1. Serveur distant non joignable (réseau)
  2. Firewall bloque le port
  3. VPN requis mais non connecté

Ressources