🏗️ Systemarchitektur & Technische Rationale
AiPBX wurde zielgerichtet entwickelt, um restriktive Unternehmens-Firewalls zu überwinden, WebRTC-NAT-Herausforderungen zu lösen, Multi-Geräte-Identitäten zu vereinfachen und hochparalleles Instant Messaging zu bewältigen.
1. Einheitliche Schichtenarchitektur
AiPBX basiert auf einer modularen, lose gekoppelten Mehrschichtenarchitektur. Der gesamte eingehende Datenverkehr wird über einen einzigen Einstiegspunkt gebündelt und auf Protokollebene weitergeleitet:
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│ CLIENT LAYER │
│ ┌───────────────────────────────┐ ┌─────────────────────────────────┐ │
│ │ Android Mobile App │ │ Web Browser Client │ │
│ │ (Kotlin + WebRTC/SIP) │ │ (WebRTC Softphone + Portal) │ │
│ └───────────────┬───────────────┘ └────────────────┬────────────────┘ │
└───────────────────┼────────────────────────────────────────────────┼────────────────────┘
│ HTTPS / WSS / TURNS (Single Port: 443) │ HTTPS / WSS / TURNS
▼ ▼
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│ EDGE INGRESS: NGINX PORT 443 ALPN MULTIPLEXER (L4) │
│ Nginx TCP Stream module (ssl_preread on) — Transparent proxy evaluating ALPN bytes: │
│ │
│ ├── [ ALPN Present ] (http/1.1, h2: Web Browsers, Mobile REST API, Management) │
│ │ └──► Streamed to Apache 2.4 TLS Termination (127.0.0.1:8443) │
│ │ │
│ └── [ ALPN Empty / None ] (WebRTC TURNS media relay behind restrictive firewalls) │
│ └──► Streamed to Coturn TURNS Service (127.0.0.1:5349) │
└───────────────────────────────────┬────────────────────────────────┬────────────────────┘
│ │
[ ALPN Present ] [ No ALPN ]
▼ │
┌───────────────────────────────────────────────────────┐ │
│ APPLICATION & WEBSOCKET PROXY TIER │ ▼
│ Apache 2.4 (127.0.0.1:8443 with TLS Termination) │ ┌─────────────────────────────┐
│ ├── / ──► PHP 8 MVC Web Portal │ │ COTURN RELAY │
│ ├── /ws ──► Asterisk WebRTC (8088/ws) │ │ TURNS Server (Port 5349) │
│ └── /chat/ws ──► Go Chat Engine (8086/ws) │ │ Zero Media Loss for │
│ │ │ Symmetric NAT Traversal │
│ Port 80: HTTP Redirect & Let's Encrypt ACME HTTP-01 │ └─────────────────────────────┘
└──────────┬────────────────────────┬───────────────────┘
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ PHP 8 MVC │ │ Asterisk 22 │
│ Web Portal │ │ VoIP Engine │
│ (Hardened Runtime) │ │ (PJSIP/WebRTC) │
└──────────┬──────────┘ └──────────┬──────────┘
│ │
│ AMI (Port 5038) │
├────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│ DATA LAYER │
│ MariaDB 11 (utf8mb4_unicode_ci) — Two-Tier Privilege Security Model: │
│ ├── aipbx_portal (Runtime DML: SELECT, INSERT, UPDATE, DELETE only) │
│ └── aipbx_migrator (Schema DDL: Phinx Migrations only) │
└─────────────────────────────────────────────────────────────────────────────────────────┘
2. Warum Port 443 ALPN-Stream-Multiplexing?
Klassische Telefonanlagen erfordern viele offene Ports: UDP 5060 für SIP, 8089 für WebRTC WSS und 3478/5349 für STUN/TURN. Moderne Unternehmensnetzwerke (Banken, Kliniken, Behörden) blockieren jedoch strikt alle ausgehenden Ports außer 80 und 443.
ssl_preread on liest die Application-Layer Protocol Negotiation (ALPN) im TLS-ClientHello aus. Es leitet den Datenverkehr transparent weiter, ohne die SSL-Sitzung am Edge entschlüsseln zu müssen.
Nginx L4 Stream-Konfiguration:
stream {
map $ssl_preread_alpn_protocols $upstream_backend {
# Standard web browsers and mobile REST API clients
"~*http" apache_https;
"~*h2" apache_https;
# WebRTC TURNS media relay packets (send empty ALPN)
default coturn_turns;
}
upstream apache_https {
server 127.0.0.1:8443;
}
upstream coturn_turns {
server 127.0.0.1:5349;
}
server {
listen 443;
proxy_pass $upstream_backend;
ssl_preread on;
proxy_connect_timeout 5s;
proxy_timeout 3600s;
}
}
3. Dual-Endpoint PJSIP & WebRTC Architektur
Viele herkömmliche PBX-Distributionen scheitern daran, ein Tischtelefon und einen WebRTC-Browserclient gleichzeitig an einer einzigen Nebenstelle zu betreiben. Die Transport- und Verschlüsselungsprofile sind gegensätzlich:
- WebRTC (Browser & Mobil): WSS-Transport, DTLS-SRTP-Verschlüsselung, ICE-Kandidaten, AVPF-Profil und Opus-Codec.
- Tischtelefon (IP-Telefon / ATA): UDP/TLS-Transport, SDES-SRTP oder unverschlüsseltes RTP, SAVP-Profil und G.711/G.722-Codecs.
| Endpoint ID | Zielgerät | Transport & Port | Verschlüsselung & Codec |
|---|---|---|---|
| 1000 | Hardware-IP-Telefon / Tischapparat | UDP / TLS (Port 5060/5061) | SDES-SRTP / G.711a, G.722, G.729 |
| 1000-webrtc | Web-Browser & Native Mobil-App | WSS (Port 443 ALPN / 8089) | DTLS-SRTP + ICE / Opus (HD Audio) |
Dial(PJSIP/1000&PJSIP/1000-webrtc,30) aus. Tischtelefon und Smartphone klingeln gleichzeitig. Das zuerst angenommene Gerät übernimmt das Gespräch.
4. Eigenständiger Go-Echtzeit-WebSocket-Dienst
PHP eignet sich hervorragend für kurzlebige HTTP-Zyklen, ist jedoch ungeeignet für zehntausende dauerhafte WebSocket-Verbindungen. AiPBX nutzt für Instant Messaging und Gruppenkanäle einen kompakten Go-Dienst (/opt/aipbx/bin/aipbx-chat):
- Minimaler RAM-Verbrauch: 10.000 aktive Verbindungen belegen lediglich ca. 28 MB Arbeitsspeicher.
- Goroutine-Kanäle: Asynchrone Nachrichtenverteilung ohne Belastung durch Betriebssystem-Threads.
- Keine externen Abhängigkeiten: Eine einzige statische Binärdatei, betrieben als systemd-Dienst.
- Echtzeit-Präsenz & Tipp-Status: Tipp-Indikatoren, Lesebestätigungen und Online-Status in Millisekunden.
5. Asterisk Konfigurations-Synchronisation
Asterisk-Konfigurationsdateien werden in AiPBX niemals manuell editiert. Die MariaDB-Datenbank ist die zentrale Informationsquelle. Bei Änderungen greift ein atomarer Generierungs- und Rollback-Zyklus:
Web UI / REST API Request
│
▼
Controller Validation & Auth Check
│
▼
Service writes to MariaDB (DML)
│
▼
Sync Generator (src/sync/*.php)
├── 1. Backs up existing file to .bak
├── 2. Queries DB and generates modular files under /etc/asterisk/pbx/*.conf
└── 3. Issues Asterisk reload command (dialplan reload, queue reload...)
│
├── [ SUCCESS ] ──► Updates audit log, removes .bak cleanly.
└── [ FAILURE ] ──► AUTOMATIC ROLLBACK: Restores .bak immediately,
prevents downtime, and logs error report.
6. Zweistufiges MariaDB-Berechtigungsmodell
| Benutzerkonto | Einsatzbereich | Erlaubte SQL-Rechte | Eingeschränkte Rechte |
|---|---|---|---|
| aipbx_portal | PHP-Webportal & REST-API | SELECT, INSERT, UPDATE, DELETE | DROP, ALTER, CREATE, GRANT (Forbidden) |
| aipbx_migrator | Phinx Datenbank-Migrationen (CLI) | CREATE, ALTER, INDEX, DROP | Local CLI only during schema migrations |