mirror of
https://github.com/R0m1k3/Apiflow-gateway.git
synced 2026-10-17 20:26:46 +02:00
- 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>
60 lines
2.1 KiB
JavaScript
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 };
|