feat(cluster): real-time auto-sync on apply_config + 5min cron periodic sync
This commit is contained in:
1 parent
4c49cf8e1c
commit
3f29ac6d2e
3 files changed
+71
-3
No files matched your search
@@ -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
|
||||||
|
|||||||
+18
-3
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
Reference in new issue
Block a user