From 42bed16e25036ec1cbd974e0de325740e91633e8 Mon Sep 17 00:00:00 2001 From: florianfederspiel Date: Thu, 21 May 2026 19:01:31 +0200 Subject: [PATCH] =?UTF-8?q?KI-AGENT:=20FreePBX=20Diagnoseprofil=20erg?= =?UTF-8?q?=C3=A4nzen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 12 ++++ docker-compose.yml | 56 +++++++++++++++++++ docs/telekom-telefonie.md | 34 +++++++++++ telephony/freepbx/init.sql | 7 +++ telephony/freepbx/my.cnf | 2 + .../freepbx/secrets/freepbxuser_password.txt | 1 + .../freepbx/secrets/mysql_root_password.txt | 1 + telephony/freepbx/secrets/sasl_passwd.txt | 1 + 8 files changed, 114 insertions(+) create mode 100644 telephony/freepbx/init.sql create mode 100644 telephony/freepbx/my.cnf create mode 100644 telephony/freepbx/secrets/freepbxuser_password.txt create mode 100644 telephony/freepbx/secrets/mysql_root_password.txt create mode 100644 telephony/freepbx/secrets/sasl_passwd.txt diff --git a/.env.example b/.env.example index bc4b372..6b1cfa5 100644 --- a/.env.example +++ b/.env.example @@ -79,6 +79,18 @@ TELEPHONY_DEV_SIP_PORT=5060 TELEPHONY_DEV_RTP_MIN_PORT=10000 TELEPHONY_DEV_RTP_MAX_PORT=10020 +# Optionales FreePBX-Diagnoseprofil. Das Profil ist nur als Referenz-PBX für +# Provider-Tests gedacht und nutzt eigene Ports, damit der FEDEO-Asterisk +# parallel bestehen bleibt. +FREEPBX_DEV_IMAGE=escomputers/freepbx:17-nofail2ban +FREEPBX_DEV_PLATFORM=linux/amd64 +FREEPBX_DEV_TZ=Europe/Berlin +FREEPBX_DEV_HTTP_PORT=18080 +FREEPBX_DEV_HTTPS_PORT=18443 +FREEPBX_DEV_SIP_PORT=15060 +FREEPBX_DEV_RTP_MIN_PORT=18000 +FREEPBX_DEV_RTP_MAX_PORT=18100 + # Externe Telefonie über Telekom/tel.t-online.de. Keine echten Zugangsdaten # einchecken. SIP-ID ist in der Regel die Rufnummer mit Vorwahl ohne Leerzeichen # und ohne Sonderzeichen, z. B. 0301234567. Wenn dein Anschluss noch die diff --git a/docker-compose.yml b/docker-compose.yml index bf61218..984b578 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -142,6 +142,49 @@ services: networks: - traefik + freepbx-dev-db: + image: mariadb:10.11 + restart: unless-stopped + profiles: + - freepbx-dev + environment: + MYSQL_ROOT_PASSWORD_FILE: /run/secrets/freepbx_mysql_root_password + MYSQL_USER: freepbxuser + MYSQL_PASSWORD_FILE: /run/secrets/freepbx_user_password + secrets: + - freepbx_mysql_root_password + - freepbx_user_password + volumes: + - freepbx_dev_mysql:/var/lib/mysql + - ./telephony/freepbx/my.cnf:/etc/mysql/my.cnf:ro + - ./telephony/freepbx/init.sql:/docker-entrypoint-initdb.d/init.sql:ro + networks: + - traefik + + freepbx-dev: + image: ${FREEPBX_DEV_IMAGE:-escomputers/freepbx:17-nofail2ban} + platform: ${FREEPBX_DEV_PLATFORM:-linux/amd64} + restart: unless-stopped + profiles: + - freepbx-dev + depends_on: + - freepbx-dev-db + environment: + - TZ=${FREEPBX_DEV_TZ:-Europe/Berlin} + secrets: + - freepbx_user_password + - freepbx_postfix_sasl_passwd + volumes: + - freepbx_dev_var:/var + - freepbx_dev_etc:/etc + ports: + - "${FREEPBX_DEV_HTTP_PORT:-18080}:80/tcp" + - "${FREEPBX_DEV_HTTPS_PORT:-18443}:443/tcp" + - "${FREEPBX_DEV_SIP_PORT:-15060}:5060/udp" + - "${FREEPBX_DEV_RTP_MIN_PORT:-18000}-${FREEPBX_DEV_RTP_MAX_PORT:-18100}:18000-18100/udp" + networks: + - traefik + matrix-db: image: postgres:16-alpine restart: unless-stopped @@ -489,6 +532,19 @@ services: - "./traefik/logs:/logs" networks: - traefik +volumes: + freepbx_dev_mysql: + freepbx_dev_var: + freepbx_dev_etc: + +secrets: + freepbx_mysql_root_password: + file: ./telephony/freepbx/secrets/mysql_root_password.txt + freepbx_user_password: + file: ./telephony/freepbx/secrets/freepbxuser_password.txt + freepbx_postfix_sasl_passwd: + file: ./telephony/freepbx/secrets/sasl_passwd.txt + networks: traefik: external: false diff --git a/docs/telekom-telefonie.md b/docs/telekom-telefonie.md index 8ebd23f..66102d8 100644 --- a/docs/telekom-telefonie.md +++ b/docs/telekom-telefonie.md @@ -67,3 +67,37 @@ docker compose --profile telephony-dev up -d asterisk-dev ``` Beim Start erzeugt der Container die Dateien `pjsip.telekom.conf` und `extensions.telekom.conf` in einem Docker-Volume. Ausgehende Anrufe mit Prefix `0` und internationale Ziele mit `+` werden über den Telekom-Trunk geroutet. Eingehende Anrufe landen standardmäßig auf Nebenstelle `1001`. + +## FreePBX als Diagnose-PBX + +Für Provider-Tests kann zusätzlich das optionale Profil `freepbx-dev` gestartet werden. FreePBX ist hier nicht als dauerhafte FEDEO-Abhängigkeit gedacht, sondern als Referenzoberfläche, um Trunk-, NAT-, CLIP- und Routing-Parameter gegen einen Provider wie Easybell zu prüfen. + +```bash +docker compose --profile freepbx-dev up -d freepbx-dev-db freepbx-dev +``` + +Beim ersten Start muss FreePBX einmal gegen die lokale MariaDB installiert werden: + +```bash +docker compose --profile freepbx-dev exec -T -w /usr/local/src/freepbx freepbx-dev \ + bash -lc 'php install -n --dbuser=freepbxuser --dbpass="$(cat /run/secrets/freepbx_user_password)" --dbhost=freepbx-dev-db' +``` + +Danach ist die Oberfläche lokal unter `http://localhost:18080` erreichbar. Beim ersten Öffnen zeigt FreePBX die Ersteinrichtung für den Web-Admin-Benutzer. Diese Zugangsdaten gelten nur für die FreePBX-Diagnoseoberfläche und sind unabhängig von FEDEO. + +Die Standardports sind bewusst konfliktarm gesetzt: + +- Web: `18080` / `18443` +- SIP UDP: `15060` +- RTP UDP: `18000-18100` + +Das verwendete FreePBX-Image ist aktuell nur für `linux/amd64` veröffentlicht. Auf Apple-Silicon-Hosts nutzt Docker Desktop deshalb über `FREEPBX_DEV_PLATFORM=linux/amd64` Emulation; für Diagnosezwecke ist das ausreichend, aber nicht als Produktionssetup gedacht. + +Für einen möglichst realistischen Easybell-Test kann der FEDEO-Asterisk kurz gestoppt und FreePBX auf dem üblichen SIP-Port gestartet werden: + +```bash +docker compose --profile telephony-dev stop asterisk-dev +FREEPBX_DEV_SIP_PORT=5060 docker compose --profile freepbx-dev up -d freepbx-dev +``` + +In FreePBX sollte der RTP-Bereich unter **Settings -> Asterisk SIP Settings** ebenfalls auf `18000-18100` gesetzt werden, damit er zur Compose-Portfreigabe passt. Wenn der Trunk dort erfolgreich registriert und ein Testanruf möglich ist, können die funktionierenden PJSIP- und NAT-Werte nach FEDEO übernommen werden. diff --git a/telephony/freepbx/init.sql b/telephony/freepbx/init.sql new file mode 100644 index 0000000..4fea153 --- /dev/null +++ b/telephony/freepbx/init.sql @@ -0,0 +1,7 @@ +CREATE DATABASE IF NOT EXISTS asterisk; +GRANT ALL PRIVILEGES ON `asterisk`.* TO 'freepbxuser'@'%'; + +CREATE DATABASE IF NOT EXISTS asteriskcdrdb; +GRANT ALL PRIVILEGES ON `asteriskcdrdb`.* TO 'freepbxuser'@'%'; + +FLUSH PRIVILEGES; diff --git a/telephony/freepbx/my.cnf b/telephony/freepbx/my.cnf new file mode 100644 index 0000000..abca86c --- /dev/null +++ b/telephony/freepbx/my.cnf @@ -0,0 +1,2 @@ +[mysqld] +sql_mode=NO_ENGINE_SUBSTITUTION diff --git a/telephony/freepbx/secrets/freepbxuser_password.txt b/telephony/freepbx/secrets/freepbxuser_password.txt new file mode 100644 index 0000000..adafd94 --- /dev/null +++ b/telephony/freepbx/secrets/freepbxuser_password.txt @@ -0,0 +1 @@ +change-this-freepbx-user-password diff --git a/telephony/freepbx/secrets/mysql_root_password.txt b/telephony/freepbx/secrets/mysql_root_password.txt new file mode 100644 index 0000000..350b98f --- /dev/null +++ b/telephony/freepbx/secrets/mysql_root_password.txt @@ -0,0 +1 @@ +change-this-freepbx-root-password diff --git a/telephony/freepbx/secrets/sasl_passwd.txt b/telephony/freepbx/secrets/sasl_passwd.txt new file mode 100644 index 0000000..6edad7e --- /dev/null +++ b/telephony/freepbx/secrets/sasl_passwd.txt @@ -0,0 +1 @@ +[smtp.example.com]:587 user@example.com:change-this-app-password