feat(cluster): real-time auto-sync on apply_config + 5min cron periodic sync

This commit is contained in:
sorcier committed 2026-11-05 19:58:58 +01:00
1 parent 4c49cf8e1c
commit 3f29ac6d2e
3 files changed
+69 -1

No files matched your search

+7
View File
@@ -488,6 +488,13 @@ EOF
chmod 0644 /etc/cron.d/nexus-backup chmod 0644 /etc/cron.d/nexus-backup
touch /var/log/nexus_backup.log && chown www-data:asterisk /var/log/nexus_backup.log && chmod 664 /var/log/nexus_backup.log touch /var/log/nexus_backup.log && chown www-data:asterisk /var/log/nexus_backup.log && chmod 664 /var/log/nexus_backup.log
# Cron synchronisation Cluster HA toutes les 5 minutes
cat << 'EOF' > /etc/cron.d/nexus-cluster-sync
# Synchronisation périodique du cluster NexusPBX HA vers le nœud Backup
*/5 * * * * www-data /usr/bin/php /var/www/nexus-pbx/scripts/nexus_cluster_sync.php >> /var/log/nexus_cluster.log 2>&1
EOF
chmod 0644 /etc/cron.d/nexus-cluster-sync
# CLI symlinks # CLI symlinks
chmod +x "$TARGET_DIR/scripts/nexus-firewall" "$TARGET_DIR/scripts/nexus-banner.sh" "$TARGET_DIR/scripts/update.sh" "$TARGET_DIR/scripts/nexus-cluster" chmod +x "$TARGET_DIR/scripts/nexus-firewall" "$TARGET_DIR/scripts/nexus-banner.sh" "$TARGET_DIR/scripts/update.sh" "$TARGET_DIR/scripts/nexus-cluster"
chmod +x "$TARGET_DIR"/scripts/cluster/*.sh 2>/dev/null || true chmod +x "$TARGET_DIR"/scripts/cluster/*.sh 2>/dev/null || true
+16 -1
View File
@@ -1793,12 +1793,27 @@ try {
$ami = AmiClient::fromDatabase($db); $ami = AmiClient::fromDatabase($db);
$reloadInfo = $ami->reloadPjsipAndDialplan(); $reloadInfo = $ami->reloadPjsipAndDialplan();
// Synchronisation automatique temps réel vers le nœud pair si Cluster actif et Master
$clusterSyncMsg = null;
try {
$cm = new ClusterManager($db);
$cSet = $cm->getSettings();
if (!empty($cSet['enabled']) && !empty($cSet['auto_sync']) && ($cSet['role'] ?? '') === 'master' && !empty($cSet['peer_ip'])) {
$syncRes = $cm->pushSyncToPeer();
$clusterSyncMsg = $syncRes['message'] ?? 'Réplication pair OK';
}
} catch (\Throwable $ce) {
error_log("[CLUSTER] Auto-sync on apply_config error: " . $ce->getMessage());
$clusterSyncMsg = "Alerte réplication pair : " . $ce->getMessage();
}
echo json_encode([ echo json_encode([
'success' => true, 'success' => true,
'message' => 'Configurations écrites, pile PJSIP rechargée et Re-Register SIP envoyé à tous les opérateurs !', 'message' => 'Configurations appliquées avec succès !' . ($clusterSyncMsg ? ' (' . $clusterSyncMsg . ')' : ''),
'details' => [ 'details' => [
'files' => $writeStats, 'files' => $writeStats,
'reload' => $reloadInfo, 'reload' => $reloadInfo,
'cluster_sync' => $clusterSyncMsg,
], ],
]); ]);
break; break;
+46
View File
@@ -0,0 +1,46 @@
<?php
declare(strict_types=1);
/**
* NexusPBX HA - Synchronisation périodique du cluster par cron
* Exécuté automatiquement pour s'assurer que le nœud Backup reste 100% synchronisé.
*/
require_once __DIR__ . '/../src/Database.php';
require_once __DIR__ . '/../src/ClusterManager.php';
require_once __DIR__ . '/../src/ConfigGenerator.php';
use App\Database;
use App\ClusterManager;
try {
$db = Database::getConnection();
$cm = new ClusterManager($db);
$st = $cm->getSettings();
// 1. Si le cluster n'est pas activé ou que l'auto-sync est désactivée
if (empty($st['enabled']) || empty($st['auto_sync'])) {
exit(0);
}
// 2. Seul le nœud MASTER actif émet la synchronisation vers le nœud BACKUP
$vip = $st['virtual_ip'] ?? '';
$isVipActive = $cm->isVirtualIpActive($vip);
$configuredRole = $st['role'] ?? 'master';
// Un esclave (backup) ne doit jamais écraser le maître
if ($configuredRole !== 'master' && !$isVipActive) {
exit(0);
}
if (empty($st['peer_ip'])) {
exit(0);
}
// 3. Déclenchement de la réplication vers le pair
$result = $cm->pushSyncToPeer();
echo date('[Y-m-d H:i:s] ') . "[CLUSTER-CRON] " . ($result['message'] ?? 'Synchronisation OK') . "\n";
} catch (\Throwable $e) {
echo date('[Y-m-d H:i:s] ') . "[CLUSTER-CRON-ERROR] " . $e->getMessage() . "\n";
exit(1);
}