Files
Apiflow-gateway/sync/config.js
T
MichaelandClaude Opus 5.5 ea084034b9 feat: gateway sécurisé, miroir de schéma automatique et sync incrémentale
- Schéma Hostinger recopié automatiquement depuis PG Debian (colonnes, PK,
  index) : plus d'init.sql maintenu à la main (corrige articles.artcentrale,
  mvtart.no_id et les 12 tables manquantes)
- Stratégies : full transactionnel (DELETE + INSERT, garde-fou de volume) et
  window (signature mensuelle + 10 derniers jours) pour les grosses tables
- Attente de la fin de la sync Debian (_run), pg_try_advisory_lock,
  cron 07:30 Europe/Paris, force honoré, alertes webhook
- Dashboard : basic auth, CSP sans script inline, plus d'innerHTML,
  port 3002 non publié (accès via Nginx Proxy Manager)
- Secrets hors du compose (.env), frps épinglé 0.71.0 avec TLS forcé,
  allowPorts et additionalScopes
- Suppression de sync.sh, tables.js, utils.js, init.sql ; README de déploiement

L'ancien mot de passe de la base `post` figure dans l'historique git :
il doit être changé sur le serveur (voir README).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 11:41:29 +02:00

60 lines
2.1 KiB
JavaScript

'use strict';
/**
* Configuration du service, lue depuis les variables d'environnement
* (fournies par docker-compose depuis gateway/.env).
*/
const { parseList, parseWindowTables } = require('./sql');
/**
* Tables copiées par "fenêtre" : signature par mois + rechargement des mois différents
* + rechargement systématique des N derniers jours. Clé = table source, valeur = colonne date.
* Une table configurée mais absente de la source est ignorée silencieusement.
* Surcharge possible via WINDOW_TABLES="table:colonne,table:colonne".
*/
const DEFAULT_WINDOW_TABLES = {
mvtart: 'datmvt',
mvtreg: 'datmvt',
mvtart_motif: 'datmvt',
histo_art_gamme: 'date',
demarques: 'datmvt',
meteo: 'date',
fidelite_jour: 'date',
};
function int(name, def) {
const v = parseInt(process.env[name], 10);
return Number.isFinite(v) && v >= 0 ? v : def;
}
const config = {
cron: process.env.SYNC_CRON || '30 7 * * *',
timeZone: process.env.SYNC_TZ || 'Europe/Paris',
port: int('SYNC_DASHBOARD_PORT', 3002),
// Tables source exclues (en plus de sync_log, traitée à part → source_sync_log)
excludeTables: new Set(parseList(process.env.EXCLUDE_TABLES)),
windowTables: process.env.WINDOW_TABLES
? parseWindowTables(process.env.WINDOW_TABLES)
: DEFAULT_WINDOW_TABLES,
recentDays: int('WINDOW_RECENT_DAYS', 10),
// Attente de la fin de la sync Debian (ligne sync_log '_run' = 'running')
waitPollMs: int('DEBIAN_WAIT_POLL_MIN', 2) * 60 * 1000,
waitMaxMs: int('DEBIAN_WAIT_MAX_MIN', 180) * 60 * 1000,
// Garde-fou volume : source < 50 % de la destination (si destination > 100 lignes) → table ignorée
volumeMinRatio: 0.5,
volumeMinRows: 100,
fetchSize: 5000,
dashboardUser: process.env.DASHBOARD_USER || '',
dashboardPass: process.env.DASHBOARD_PASSWORD || '',
alertWebhookUrl: process.env.ALERT_WEBHOOK_URL || '',
// Clé du verrou consultatif (pg_try_advisory_lock) côté destination — constante
lockKey: 4646535901,
};
module.exports = { config, DEFAULT_WINDOW_TABLES };