Files
Apiflow-gateway/sync/alert.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

33 lines
987 B
JavaScript

'use strict';
/**
* Alerte par webhook (Slack, Discord, Mattermost, ntfy… compatibles JSON).
* Envoie {text, content} : Slack/Mattermost lisent "text", Discord lit "content".
* Ne lève jamais d'exception.
*/
const { config } = require('./config');
const log = require('./logger');
async function sendAlert(message) {
if (!config.alertWebhookUrl) return false;
const text = String(message).slice(0, 1900); // Discord : 2000 caractères max
try {
const res = await fetch(config.alertWebhookUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text, content: text }),
signal: AbortSignal.timeout(10000),
});
if (!res.ok) {
log.warn(`Alerte webhook : réponse HTTP ${res.status}`);
return false;
}
log.info('Alerte envoyée');
return true;
} catch (err) {
log.warn(`Alerte webhook impossible : ${err.message}`);
return false;
}
}
module.exports = { sendAlert };