feat(cluster): module Haute Disponibilité (Cluster HA Actif/Passif Keepalived VRRP & Réplication temps réel)
This commit is contained in:
1 parent
bee2055b62
commit
521f21dc9c
10 files changed
+1310
-7
No files matched your search
+63
-1
@@ -307,6 +307,27 @@ class Database
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 15. Table cluster_settings : Haute Disponibilité (Cluster HA Actif/Passif Keepalived/VRRP)
|
||||
CREATE TABLE IF NOT EXISTS cluster_settings (
|
||||
id INTEGER PRIMARY KEY CHECK (id = 1),
|
||||
enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
|
||||
role VARCHAR(16) NOT NULL DEFAULT 'master',
|
||||
virtual_ip VARCHAR(45) NOT NULL DEFAULT '',
|
||||
virtual_netmask VARCHAR(16) NOT NULL DEFAULT '24',
|
||||
interface VARCHAR(32) NOT NULL DEFAULT 'eth0',
|
||||
peer_ip VARCHAR(45) NOT NULL DEFAULT '',
|
||||
cluster_secret VARCHAR(64) NOT NULL DEFAULT '',
|
||||
vrid INTEGER NOT NULL DEFAULT 51,
|
||||
priority INTEGER NOT NULL DEFAULT 100,
|
||||
sync_interval INTEGER NOT NULL DEFAULT 15,
|
||||
auto_sync INTEGER NOT NULL DEFAULT 1,
|
||||
last_sync_at DATETIME DEFAULT NULL,
|
||||
last_sync_status VARCHAR(32) NOT NULL DEFAULT 'none',
|
||||
last_sync_message TEXT NOT NULL DEFAULT '',
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
SQL;
|
||||
|
||||
$db->exec($schema);
|
||||
@@ -322,6 +343,7 @@ class Database
|
||||
self::migrateFeatureCodesTable($db);
|
||||
self::migratePhonebookContactsTable($db);
|
||||
self::migratePagingGroupsTable($db);
|
||||
self::migrateClusterSettingsTable($db);
|
||||
|
||||
// Création du compte admin par défaut (admin / admin123) s'il n'existe aucun utilisateur
|
||||
$userCount = (int)$db->query('SELECT COUNT(*) FROM users')->fetchColumn();
|
||||
@@ -749,8 +771,48 @@ class Database
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
");
|
||||
}
|
||||
|
||||
// Aucun groupe de paging par défaut pour conserver une base propre
|
||||
private static function migrateClusterSettingsTable(PDO $db): void
|
||||
{
|
||||
$db->exec("
|
||||
CREATE TABLE IF NOT EXISTS cluster_settings (
|
||||
id INTEGER PRIMARY KEY CHECK (id = 1),
|
||||
enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
|
||||
role VARCHAR(16) NOT NULL DEFAULT 'master',
|
||||
virtual_ip VARCHAR(45) NOT NULL DEFAULT '',
|
||||
virtual_netmask VARCHAR(16) NOT NULL DEFAULT '24',
|
||||
interface VARCHAR(32) NOT NULL DEFAULT 'eth0',
|
||||
peer_ip VARCHAR(45) NOT NULL DEFAULT '',
|
||||
cluster_secret VARCHAR(64) NOT NULL DEFAULT '',
|
||||
vrid INTEGER NOT NULL DEFAULT 51,
|
||||
priority INTEGER NOT NULL DEFAULT 100,
|
||||
sync_interval INTEGER NOT NULL DEFAULT 15,
|
||||
auto_sync INTEGER NOT NULL DEFAULT 1,
|
||||
last_sync_at DATETIME DEFAULT NULL,
|
||||
last_sync_status VARCHAR(32) NOT NULL DEFAULT 'none',
|
||||
last_sync_message TEXT NOT NULL DEFAULT '',
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
");
|
||||
|
||||
$count = (int)$db->query('SELECT COUNT(*) FROM cluster_settings')->fetchColumn();
|
||||
if ($count === 0) {
|
||||
$defaultSecret = bin2hex(random_bytes(16));
|
||||
$stmt = $db->prepare('
|
||||
INSERT INTO cluster_settings (id, enabled, role, virtual_ip, virtual_netmask, interface, peer_ip, cluster_secret, vrid, priority, sync_interval, auto_sync)
|
||||
VALUES (1, 0, :role, :vip, :vmask, :iface, :peer, :secret, 51, 100, 15, 1)
|
||||
');
|
||||
$stmt->execute([
|
||||
':role' => 'master',
|
||||
':vip' => '',
|
||||
':vmask' => '24',
|
||||
':iface' => 'eth0',
|
||||
':peer' => '',
|
||||
':secret' => $defaultSecret,
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user