TR EN DE
GitHub Repository mhrgl.com
Startseite / Architektur / Systementwurf

🏗️ 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:

ASCII Architektur-Topologie
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│                                      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.

💡
Die AiPBX-Lösung: Das Nginx Layer-4 (L4) Stream-Modul mit 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:

/etc/nginx/nginx.conf (Stream Multiplexer)
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)
📞
Parallelruf (Forked Ringing): Wird Nebenstelle 1000 angerufen, führt Asterisk 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:

Konfigurations- & Rollback-Ablauf
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
Auf dieser Seite