mirror of
https://github.com/R0m1k3/Apiflow-gateway.git
synced 2026-10-22 06:28:16 +02:00
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>
This commit is contained in:
1 parent
f8575b9ff2
commit
ea084034b9
26 files changed
+2767
-922
No files matched your search
@@ -0,0 +1,32 @@
|
||||
'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 };
|
||||
Reference in new issue
Block a user