Zum Inhalt springen

Open-Source-Infrastruktur

Warum wir ein inoffizielles Docker-Image für den 3CX SBC gebaut haben

Der Session Border Controller von 3CX löst ein echtes Netzwerkproblem für Büros voller Tischtelefone. Die offizielle Installation erwartet eine eigene Maschine. Wir haben ihn stattdessen als Docker-Image verpackt, für alle, die ihre Standortdienste ohnehin in Containern betreiben, und sagen dabei klar, dass 3CX diese Konfiguration nicht unterstützt.

Von Open Source seit 20217 Min. Lesezeit
Warum wir den 3CX SBC containerisiert haben

Kurz gefasst

Das Wichtigste

  • Es schließt eine schmale Lücke: ein wiederholbares Container-Deployment für Teams, die an entfernten Standorten ohnehin Docker betreiben.
  • systemd wegzulassen war nicht kosmetisch. Ein Container will einen Prozess im Vordergrund und eine klare Antwort darauf, was beim Beenden passiert.
  • Das ist inoffiziell. Wenn die Telefonie wichtig ist, nehmen Sie eine unterstützte 3CX-Installation, sofern Sie keinen guten Grund dagegen haben.

Wofür der SBC eigentlich da ist

Ein 3CX Session Border Controller sitzt in dem Netz, in dem die Tischtelefone stehen. Er sammelt Signalisierung und Sprache ein und trägt beides durch den 3CX-Tunnel zu einer PBX an anderer Stelle. Das umgeht die üblichen Streitereien mit NAT und Firewall und gibt der PBX genau einen verwalteten Weg in das Gebäude.

3CX empfiehlt derzeit den Einsatz, sobald ein Standort mehr als zehn Telefone hat. Darunter ist ein unterstütztes Router-Telefon oft einfacher, und wer allein arbeitet, kommt meist mit der Desktop- oder Mobil-App aus.

Was immer Sie wählen, es muss laufen, wann immer jemand telefonieren will, normalerweise unter einer festen lokalen Adresse. Genau das macht Bereitstellung und Updates zu einer Betriebsfrage statt zu einer technischen Vorliebe: Steht der SBC still, kann dieses Büro niemanden anrufen.

Das Deployment, das es nicht gab

3CX dokumentiert Windows, Debian und Raspberry Pi. Docker steht nicht auf der Liste. Wer an jedem Standort ohnehin eine kleine Linux-Maschine mit allem anderen in Containern betrieb, musste den SBC als einzigen Dienst anders behandeln als alle übrigen.

Das Image schließt genau diese Lücke. Seine Konfiguration liegt bei allem anderen für diesen Standort, Hosts ziehen ein bekanntes Tag, und derselbe Aufbau läuft auf gewöhnlicher Serverhardware wie auf einer kleinen ARM-Platine im Schrank.

Das ist ein schmales Publikum, und genau deshalb war Open Source das richtige Zuhause. Es musste nie eine Firma werden. Es musste gepflegter Code sein, den andere lesen, nutzen und verbessern können.

Einen Systemdienst in einen Container verwandeln

Das Debian-Paket setzt eine normale Maschine mit laufendem systemd voraus. Ein ganzes Init-System ins Image zu schleppen hätte es viel schwerer gemacht, nachzuvollziehen, was bei einem Absturz passiert. Der Build entpackt das Paket, holt die SBC-Binärdatei heraus und führt sie direkt als Hauptprozess des Containers aus.

Die Einrichtung läuft über eine PBX-Adresse und einen Authentifizierungsschlüssel. Der Einstiegspunkt tut, was die Binärdatei erwartet, und die Konfiguration bleibt mit der 3CX-Verwaltungskonsole im Gleichschritt. Brauchen Sie eine Einstellung, die die erzeugte Datei nicht abdeckt, können Sie eine zusätzliche Konfigurationsdatei schreibgeschützt einhängen.

Er läuft mit dem Netzwerk des Hosts, weil der SBC Live-Sprache verarbeitet und unkomplizierten Zugang zu dem Netz will, in dem er steht. Das ist die praktische Wahl, bedeutet aber den Verzicht auf die Isolation, die ein Container sonst bietet, und das sollten Sie vor dem Einsatz wissen.

Minimales Deployment
docker run --rm --net host \
  -e PBX_URL=https://pbx.example.com \
  -e PBX_KEY=ihr-auth-schluessel \
  apyos/docker-3cx-sbc

Automatische Builds, bewusste Neustarts

Ein Container hilft nur, wenn aus neuen Upstream-Versionen tatsächlich neue Images werden. Das Repository baut automatisch, sobald eine kompatible 3CX-Version erscheint, und veröffentlicht sowohl feste Versions-Tags als auch bewegliche Major- und Minor-Tags.

Jedes neue Image sofort einzuspielen wäre eine schlechte Idee, denn ein Neustart des SBC trennt laufende Gespräche. Updates laufen deshalb über eine bewusst eng gefasste Watchtower-Instanz, statt unbeaufsichtigten Austausch als harmlose Wartung zu behandeln.

Diese Trennung ist der nachahmenswerte Teil: Finden, Bauen und Verpacken automatisieren und den Neustart in menschlicher Hand behalten. Continuous Delivery erfordert keine ständige Unterbrechung.

Wo der Support endet

Das ist ein Open-Source-Projekt von Apyos, kein offizielles 3CX-Image und keine unterstützte Installationsmethode. Es verpackt Software neu, die 3CX kontrolliert, und das heißt, eine Änderung auf deren Seite kann den Build kaputtmachen, obwohl sich im Container nichts geändert hat.

Für die meisten Unternehmen, und ganz sicher überall dort, wo Kunden Sie telefonisch erreichen, ist die offizielle Installation unter Debian, Windows oder Raspberry Pi die vernünftige Wahl. Sie folgt der Dokumentation des Herstellers und stellt den Support auf vertrauten Boden.

Der Container ergibt Sinn für Leute, die mit Host-Netzwerken vertraut sind, die merken, wenn der Prozess stirbt, die Updates vor dem Ausrollen testen und die genug von einheitlichem Containerbetrieb haben, um die nicht unterstützte Kante selbst zu tragen. Das offen zu sagen macht das Projekt nützlicher, nicht weniger nützlich.

Setzen Sie keine inoffizielle Telefonie ein, nur weil der Docker-Befehl kürzer ist. Verfügbarkeit und Herstellersupport wiegen schwerer als ein aufgeräumtes Infrastrukturdiagramm.

Warum das ein guter Fall für Open Source war

Die besten kleinen Open-Source-Projekte leben oft in der Lücke zwischen dem, was ein Hersteller unterstützt, und einem echten Bedarf, der ihm zu speziell ist. Das Problem ist greifbar, die Oberfläche klein, und man kann zeigen, dass es funktioniert, ohne eine Gemeinschaft darum aufzubauen.

Es hat Sterne und Forks von Leuten bekommen, die das fehlende Deployment sofort wiedererkannt haben. Nicht, weil es raffiniert wäre, sondern weil eine Handvoll Betreiber dasselbe Verpackungsproblem nicht mehr getrennt lösen muss.

Das ist zugleich der Test: Nicht jede Lücke sollte ein Produkt werden. Manchmal ist die richtige Antwort gepflegter Code, offen benannte Kompromisse und eine Dokumentation, die gut genug ist, damit der Nächste entscheiden kann, ob es passt.

Quellcode auf GitHub ansehen