Telefonie — Architektur-Uebersicht¶
Einleitung¶
Die xynap-Telefonieanlage basiert auf FreeSwitch v1.10.10 als zentrale SIP-Engine und bietet zwei parallele Signalpfade: eine klassische PBX für interne und externe Telefonie sowie eine KI-gestützte Voice-Pipeline über LiveKit.
Alle Konfigurationsdaten (Extensions, Trunks, DIDs, Ring Groups) werden dynamisch über die Platform API bereitgestellt — FreeSwitch selbst hält keine statischen XML-Dateien für Rufnummern oder Routing.
Dual-Path Architektur¶
SIP Provider (1&1 / Plusnet)
│ SIP (UDP 5060)
▼
┌──────────────────────────────────────────────────┐
│ FreeSwitch (Container: voicebot-fs) │
│ network_mode: host │
│ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ Path A: PBX │ │ Path B: LiveKit │ │
│ │ mod_xml_curl │ │ livekit-sip :5070 │ │
│ │ → Platform API │ │ │ │
│ │ :8001 │ │ ┌───────────────┐ │ │
│ │ │ │ │ AI Voice Bot │ │ │
│ │ ┌───────────────┐ │ │ │ Dolmetscher │ │ │
│ │ │ Extensions │ │ │ │ LiveKit Rooms │ │ │
│ │ │ Ring Groups │ │ │ │ Agent Workers │ │ │
│ │ │ IVR Menues │ │ │ └───────────────┘ │ │
│ │ │ WebRTC (WSS) │ │ │ │ │
│ │ │ Outbound │ │ │ │ │
│ │ └───────────────┘ │ └─────────────────────┘ │
│ └─────────────────────┘ │
└──────────────────────────────────────────────────┘
Path A — Interne PBX¶
Der klassische Telefoniepfad nutzt mod_xml_curl, um bei jedem SIP-Event (Registrierung, eingehender Anruf, Directory-Lookup) die Platform API auf Port 8001 per HTTP POST zu befragen. Die API liefert dynamisch generiertes XML zurück.
Leistungsumfang:
- Interne Extensions (1000–1099)
- Ring Groups für Abteilungen
- IVR-Menüs mit DTMF und Sprach-Navigation
- WebRTC Softphone über WSS (Port 7443, JsSIP)
- Outbound-Calls über Provider-Trunks
- Call Filters (Blacklist / Whitelist)
Path B — LiveKit Agent¶
Für KI-gestützte Anwendungen werden Calls an den LiveKit SIP Bridge (Port 5070) weitergeleitet. Der LiveKit-Server verwaltet Räume, in denen Python-basierte Agent Workers laufen.
Anwendungen:
- AI Voice Bot — Interaktives IVR mit Spracherkennung
- Dolmetscher — Bidirektionale Echtzeit-Übersetzung (Whisper → LibreTranslate → Piper TTS)
- LiveKit Rooms — Konferenz- und Medienräume
Container-Architektur¶
| Container | Image | Netzwerk | Ports | Aufgabe |
|---|---|---|---|---|
voicebot-fs |
Custom (drachtio-freeswitch-mrf + mod_xml_curl) | host | 5060, 5061, 7443, RTP | SIP-Engine |
livekit |
livekit/livekit-server v1.7 | host | 7880 | Medienserver |
livekit-sip |
livekit/sip | host | 5070 | SIP-Bridge für LiveKit |
livekit-agent |
Custom (Python, livekit-agents 1.4) | host | — | KI-Agent Worker |
interpreter-bridge |
Custom | host | 9001 | Dolmetscher-Service |
Dateisystem-Referenz¶
| Pfad | Beschreibung |
|---|---|
/usr/local/xynap/voicebot/freeswitch/Dockerfile |
FreeSwitch Container-Image |
/usr/local/xynap/voicebot/docker-compose.yml |
Compose-Datei für Voicebot-Stack |
/etc/xynap/voicebot/freeswitch/ |
FreeSwitch-Konfiguration (Volume Mount) |
/etc/xynap/livekit/livekit.yaml |
LiveKit-Server-Config |
/etc/xynap/livekit-sip/sip.yaml |
LiveKit SIP-Bridge-Config |
/usr/local/xynap/platform/backend/app/modules/sip/ |
Platform API SIP-Modul |
/usr/local/xynap/interpreter/ |
Dolmetscher-Service Quellcode |
/var/lib/xynap/voicebot/tts-audio/ |
TTS Audio-Cache |
Sofia Profiles¶
FreeSwitch nutzt zwei Sofia-Profile für unterschiedliche Provider-Anbindungen:
external-ipv4¶
- Bind: Port 5060 auf
46.4.96.105(nur IPv4) - Zweck: Plusnet-Gateway (IP-Auth, kein REGISTER)
- RTP-IP: IPv4
internal¶
- Bind: Port 5060 auf
::(Dual-Stack, IPv4 + IPv6) - Zweck: 1&1-Gateways (REGISTER), interne Extensions, WebRTC
- ext-sip-ip / ext-rtp-ip:
2a01:4f8:140:829d::2(IPv6) - TLS: Port 5061
- WSS: Port 7443 (WebRTC)
- ACL:
sip-gateways(default deny)
IPv6 ist Pflicht für 1&1
1&1 blockiert Hetzner-IPv4-Adressen. Alle 1&1-Gateways müssen über das internal-Profil mit IPv6 registriert werden. Siehe Provider-Konfiguration für Details.
Platform API — SIP-Modul¶
Die dynamische Konfiguration läuft über einen einzigen Endpoint:
Dieser Endpoint wird nur von localhost (FreeSwitch selbst) aufgerufen und benötigt kein JWT. Je nach section-Parameter liefert er:
| Section | Funktion |
|---|---|
directory |
User-Authentifizierung + Gateway-Discovery |
dialplan |
DID-Routing im public Context |
Zusätzlich bietet die API vollständige CRUD-Endpoints:
/api/v1/sip/trunks — Provider-Gateways
/api/v1/sip/extensions — SIP-Extensions
/api/v1/sip/dids — Rufnummern (DIDs)
/api/v1/sip/lines — Line-Zuordnungen
/api/v1/sip/ring-groups — Gruppenrufe
/api/v1/sip/ivr-menus — IVR-Menüs
/api/v1/sip/call-filters — Black-/Whitelists
Live-Status der Anlage (Registrierungen, Gateway-Status):
ESL-Integration: Die Platform API hält eine asynchrone TCP-Verbindung zum FreeSwitch Event Socket. Bei Änderungen (z.B. neuer Trunk, geänderte Extension) wird automatisch ein Reload ausgelöst.
Netzwerk-Ports¶
| Port | Protokoll | Richtung | Beschreibung |
|---|---|---|---|
| 5060 | UDP | Inbound/Outbound | SIP Signaling (Provider + Intern) |
| 5061 | TCP/TLS | Inbound | SIP über TLS |
| 5070 | UDP | Intern | LiveKit SIP-Bridge |
| 7443 | TCP/WSS | Inbound | WebRTC Softphone |
| 7880 | TCP | Intern | LiveKit Server API |
| 8001 | TCP | Intern | Platform API (xml-curl) |
| 9001 | TCP | Intern | Interpreter WebSocket |
| 10000–10060 | UDP | Inbound/Outbound | RTP Media |
| 16384–16484 | UDP | Inbound/Outbound | RTP Media (erweiterter Bereich) |
Host-Netzwerk
Alle Telefonie-Container laufen mit network_mode: host. Das ist zwingend für korrektes RTP-Handling und SIP-NAT-Traversal auf Bare-Metal.
Weiterführende Dokumentation¶
- Provider-Konfiguration — 1&1, Plusnet, IPv6-Besonderheiten
- Extensions & Ring Groups — Interne Nebenstellen, WebRTC, Provisioning
- IVR & Voice Bot — IVR-Menüs, KI-Sprachnavigation, Dolmetscher
- Troubleshooting — Debugging, häufige Probleme, Firewall