FrickelfabrikAnmelden
LäuftAsteriskPythonFastAPIReactPostgreSQLDocker

VstPBX – eine Telefonanlage mit Weboberfläche

VstPBX macht aus Asterisk eine Telefonanlage, die man im Browser bedient: Nebenstellen, SIP-Leitungen, Rufnummern, Sammelruf, Sprachmenü, Voicemail und ein Live-Dashboard. Ein Docker-Stack, quelloffen auf GitHub, mit ausführlicher Installationsanleitung.

VstPBX: „Vst“ ist die Abkürzung für Vermittlungsstelle, so hieß früher das Amt, das Telefonleitungen zusammenschaltete. Es ist eine Weboberfläche für den Asterisk-Telefonserver: Du legst Nebenstellen, Leitungen und Rufnummern im Browser an, VstPBX schreibt daraus die Asterisk-Konfiguration und lädt sie neu. Kein Editieren von pjsip.conf, kein Wälzen von Dialplan-Beispielen aus dem Netz.

Das Projekt läuft bei mir zu Hause und ist quelloffen: github.com/ankaios76/vstpbx. Unter dem Namen GonoPBX habe ich es schon früher veröffentlicht, kurz hieß es VST, jetzt heißt es VstPBX, hat ein neues Gesicht und eine Anleitung, die bei null anfängt. Das angehängte „PBX“ hat einen Grund: „VST“ allein ist in der Audio-Welt durch das Plugin-Format von Steinberg belegt. Mit diesem Format hat das Projekt nichts zu tun.

Das Dashboard von VstPBX: Leitungen, Nebenstellen und die letzten Anrufe auf einen Blick

Selbst ausprobieren

Auf vst-demo.frickelfabrik.de läuft eine Demo mit erfundenen Daten. Melde dich mit dem Benutzer demo und dem Passwort vst-demo an, beides steht auch auf der Anmeldeseite. Du hast Administrator-Rechte und darfst alles anklicken, anlegen und löschen.

Damit das ohne Sorgen geht, ist die Demo ein Spielplatz mit festen Regeln:

  • Alle 30 Minuten wird alles auf den Ausgangszustand zurückgesetzt, auch Passwörter und Anrufliste.
  • Telefonieren geht nicht. Es können sich keine Telefone anmelden, und es gibt keine Verbindung zu einem Anbieter. Du kannst Nebenstellen, Leitungen, Rufnummern, Sammelruf und Sprachmenü einrichten, aber nicht anrufen.
  • Die Demo läuft auf einer eigenen virtuellen Maschine, die vom Rest meines Servers abgeschottet ist und nach außen nur Web-Verbindungen aufbauen darf. Du findest sie im Maschinenraum als „VstPBX-Demo“.
  • Bitte trag keine echten Zugangsdaten und keine persönlichen Daten ein: Alle Besucher sehen dieselben Daten.

Warum ich das gebaut habe

Asterisk kann fast alles, und genau das ist das Problem: Wer nur zwei Telefone, eine Rufnummer vom Provider und einen Anrufbeantworter will, steht vor Hunderten Konfigurationsoptionen. Fertige Anlagen mit Oberfläche gibt es, aber sie bringen meist viel mehr mit, als ein Haushalt oder ein kleines Büro braucht, oder sie sind nicht auf deutsche Provider zugeschnitten.

VstPBX soll genau die Mitte treffen: alles, was man im Alltag braucht, in einer Oberfläche, die man ohne Handbuch versteht, und eine Installation, die ein Skript erledigt.

Was VstPBX kann

  • Nebenstellen mit Caller-ID, Codecs, Rufumleitung (immer, bei besetzt, bei keiner Antwort), BLF und Pickup-Gruppen
  • SIP-Leitungen per Registrierung oder IP-Authentifizierung, mit fertigen Profilen für Plusnet IPfonie, dus.net, Telekom DeutschlandLAN, CompanyFlex, Telekom All-IP (Privatanschluss) und Iliad Italien, dazu ein freier Eintrag für alle anderen
  • Rufnummern: eingehende Nummern auf Nebenstellen legen, Rufnummernblöcke verwalten, die ausgehende Nummer pro Nebenstelle wählen, optional mit P-Asserted-Identity
  • Sammelruf und Sprachmenü (IVR) mit Ansagen zum Hochladen
  • Voicemail mit PIN, E-Mail-Zustellung und Player im Browser
  • Telefonbuch mit CSV-Import und -Export
  • Live-Dashboard: wer ist angemeldet, welche Leitung steht, welche Anrufe laufen
  • Anrufverlauf mit Filtern und Statistik
  • SIP-Debug: SIP-Nachrichten live mitlesen, gruppiert nach Gespräch
  • Sicherheit: IP-Whitelist für Registrierungen, Passwort-Stärkeprüfung, Audit-Log, Fail2Ban-Status, Rollen für Admins und Benutzer
  • Home Assistant: API-Schlüssel, Klick-zum-Anrufen und MQTT-Ereignisse
  • Oberfläche auf Deutsch und Englisch, Dark Mode
NebenstellenLeitung zum Provider
Nebenstellen anlegen und bearbeitenDie Leitung zum Provider
AnrufverlaufSicherheit
Anrufverlauf mit Richtung, Dauer und StatusWhitelist, Passwortprüfung und Fail2Ban

So ist es aufgebaut

VstPBX besteht aus vier Docker-Containern:

ContainerAufgabe
pbx_asteriskAsterisk 20 mit PJSIP, das eigentliche Telefonsystem
pbx_backendFastAPI-Anwendung: REST-API, WebSocket, schreibt die Asterisk-Konfiguration und spricht über AMI mit Asterisk
pbx_frontendReact-Oberfläche, ausgeliefert von nginx
pbx_postgresPostgreSQL: Nebenstellen, Leitungen, Routen, Benutzer, Anrufverlauf

Die Datenbank ist die einzige Wahrheit. Bei jeder Änderung erzeugt das Backend aus ihr die Dateien pjsip_peers.conf, den Dialplan, die Voicemail- und Queue-Konfiguration und sagt Asterisk, dass es sie neu lesen soll. Wer die generierten Dateien von Hand ändert, verliert die Änderung beim nächsten Speichern. Das ist Absicht: So gibt es nie zwei verschiedene Stände.

Installation in Kürze

Du brauchst einen Linux-Rechner mit Docker (Raspberry Pi, Mini-PC, VM oder gemieteter Server), ein paar GB Platz und für echte Anrufe einen SIP-Zugang deines Anbieters.

sudo git clone https://github.com/ankaios76/vstpbx.git /opt/vstpbx
cd /opt/vstpbx
sudo ./install.sh

Der Installer fragt nach Netzwerkmodus, Sprache, SIP-Port und Admin-Passwort, erzeugt alle Geheimnisse selbst, baut die Images und startet den Stack. Beim ersten Mal dauert das Bauen je nach Rechner fünf bis fünfzehn Minuten. Danach meldest du dich unter http://<server>:3000 als admin an.

Die vollständige Anleitung mit Netzwerk-Vorbereitung, erster Nebenstelle, erstem Telefon, Provider-Leitung, Absicherung, Backup und Fehlersuche steht im Repository: Installationsanleitung auf Deutsch, Installation guide in English.

Die drei Stolperstellen, die ich selbst erlebt habe

SIP-ALG im Router. Viele Router „reparieren" SIP-Pakete und machen sie dabei kaputt. Die Folge: Das Telefon klingelt, aber es ist nichts zu hören, oder das Gespräch bricht nach einer halben Minute ab. Abschalten, oder bei der Installation einen anderen SIP-Port als 5060 wählen.

Die externe IP. Asterisk muss in seinen Paketen die Adresse eintragen, unter der es von außen erreichbar ist. Stimmt sie nicht, gibt es Gespräche ohne Ton in eine Richtung. Der Installer erkennt die Adresse und fragt nach.

Die Absendernummer. Bei Anschlüssen mit Rufnummernblock weisen Anbieter ausgehende Anrufe ab, wenn die Nummer nicht passt. Bei VstPBX wählst du pro Nebenstelle, welche deiner Nummern erscheint, und kannst bei Bedarf den Header P-Asserted-Identity mit der Hauptnummer setzen. Bei Telekom All-IP setzt VstPBX die Anschlussnummer von selbst.

Sicherheit

Eine Telefonanlage im Netz wird gefunden, und zwar schnell. Deshalb:

  • Die Weboberfläche spricht nur HTTP. Stell einen HTTPS-Proxy davor oder erreiche sie über ein VPN. Der Installer bietet an, die Ports nur an 127.0.0.1 zu binden.
  • Es gibt kein Standardpasswort. Der Installer erzeugt eines oder fragt nach deinem, und das Backend legt notfalls ein zufälliges an.
  • Nebenstellenpasswörter erzeugt VstPBX auf Wunsch selbst, und im Reiter Sicherheit stehen alle schwachen auf einer Liste.
  • Der Backend-Container bindet den Docker-Socket ein. Er braucht ihn, um Asterisk nach jeder Änderung neu zu laden und für das Update per Klick. Das bedeutet Root-Rechte auf dem Host für jeden, der im Backend Code ausführen kann. Deshalb gehört Port 8000 nie ins Internet, und die Oberfläche gehört hinter ein VPN oder einen HTTPS-Proxy. Die Demo läuft deshalb ohne diesen Zugang, mit dem Preis, dass dort keine Konfiguration an Asterisk übergeben wird.

Was ich beim Aufräumen gelernt habe

Bevor das Repository öffentlich wurde, habe ich die gesamte Historie durchsucht, und es war lehrreich. Zugangsdaten aus der Anfangszeit steckten noch in alten Commits, ein paar echte Rufnummern in Beispielen und Kommentaren, und der Installer schickte beim Abschluss eine anonyme Statistik an einen eigenen Server. Das alles ist raus: Die Historie ist bereinigt, die Statistik entfernt, und ein neuer Test fiel mir gleich mit auf die Füße. Ein Rufnummernblock in der Schreibweise 03023125100-03023125199 ließ das Backend den Arbeitsspeicher füllen, weil der Code nur eine Endziffer erwartete. Jetzt versteht VstPBX beide Schreibweisen und begrenzt Blöcke auf 1000 Nummern.

Der Rat daraus gilt für jedes Projekt: Bevor man etwas veröffentlicht, einmal den Installer auf einer frischen Maschine laufen lassen und die eigene Anleitung Schritt für Schritt befolgen. Ich habe es auf einer leeren VM getan, samt Backup und Wiederherstellung der Datenbank. Dabei findet man mehr als beim Lesen.

Mitmachen

Fehler, Wünsche und Ideen gern als Issue auf GitHub. Pull Requests auch. Und wenn du VstPBX ausprobierst: Schreib mir, womit du eine Anlage betreibst und wo du hängen geblieben bist. Das verbessert die Anleitung am meisten.

Du bekommst eine Mail zum Bestätigen. Abmelden geht jederzeit. Datenschutz