diff --git a/src/ConfigGenerator.php b/src/ConfigGenerator.php index 2284395..6ef1b0d 100644 --- a/src/ConfigGenerator.php +++ b/src/ConfigGenerator.php @@ -87,6 +87,21 @@ class ConfigGenerator $lines[] = "; ==========================================================================="; $lines[] = ""; + // 0. Paramètres globaux PJSIP (Keepalive applicatif TLS/TCP toutes les 30s pour préserver les sessions NAT hors réseau) + $lines[] = "; --- PARAMÈTRES GLOBAUX PJSIP (KEEPALIVE NAT / HORS RÉSEAU) ---"; + $lines[] = "[global]"; + $lines[] = "type = global"; + $lines[] = "keep_alive_interval = 30"; + $lines[] = "contact_expiration_check_interval = 15"; + $lines[] = ""; + + $tcpKeepaliveLines = [ + "tcp_keepalive_enable = yes", + "tcp_keepalive_idle_time = 20", + "tcp_keepalive_interval_time = 5", + "tcp_keepalive_probe_count = 3", + ]; + // 1. Transport UDP (Postes internes LAN & Trunks standards) $lines[] = "; --- TRANSPORT UDP (LAN / INTERNE) ---"; $lines[] = "[transport-udp]"; @@ -136,6 +151,7 @@ class ConfigGenerator $lines[] = "external_media_address = {$haVip}"; $lines[] = "external_signaling_address = {$haVip}"; } + array_push($lines, ...$tcpKeepaliveLines); $lines[] = "allow_reload = no"; $lines[] = ""; @@ -209,6 +225,7 @@ class ConfigGenerator $lines[] = "external_media_address = {$haVip}"; $lines[] = "external_signaling_address = {$haVip}"; } + array_push($lines, ...$tcpKeepaliveLines); $lines[] = "allow_reload = no"; $lines[] = ""; @@ -223,10 +240,10 @@ class ConfigGenerator $clusterSt = $this->db->query('SELECT enabled, blf_expiry FROM cluster_settings WHERE id = 1')->fetch(PDO::FETCH_ASSOC) ?: []; } catch (\Throwable $e) {} $isHaActive = !empty($clusterSt['enabled']); - // En mode Haute Disponibilité, on plafonne l'expiration d'enregistrement des AOR (REGISTER) sur la valeur configurée (par défaut 120s) - // afin que les téléphones se réenregistrent très vite en cas de bascule HA. Sans HA, on conserve le standard 1800s (30 min). - $regExpiration = $isHaActive ? max(30, min(3600, (int)($clusterSt['blf_expiry'] ?? 120))) : 1800; - $subMinExpiry = $isHaActive ? 30 : 0; + // En mode HA, on plafonne sur la valeur configurée (par défaut 120s). + // Sans HA, on garde 120s-300s afin de maintenir actives les tables NAT des postes hors réseau. + $regExpiration = $isHaActive ? max(30, min(3600, (int)($clusterSt['blf_expiry'] ?? 120))) : 120; + $regMaxExpiration = $isHaActive ? $regExpiration : 300; foreach ($extensions as $ext) { $num = trim((string)$ext['extension']); @@ -316,7 +333,7 @@ class ConfigGenerator $lines[] = "max_contacts = {$maxContacts}"; $lines[] = "remove_existing = yes"; $lines[] = "default_expiration = {$regExpiration}"; - $lines[] = "maximum_expiration = {$regExpiration}"; + $lines[] = "maximum_expiration = {$regMaxExpiration}"; $lines[] = "minimum_expiration = " . ($isHaActive ? 30 : 60); $lines[] = "qualify_frequency = 30"; if ($hasVm) {