diff --git a/.env.example b/.env.example index 1d3d611..2d54e04 100644 --- a/.env.example +++ b/.env.example @@ -73,6 +73,24 @@ TELEPHONY_DEV_SIP_PORT=5060 TELEPHONY_DEV_RTP_MIN_PORT=10000 TELEPHONY_DEV_RTP_MAX_PORT=10020 +# 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 +# Internet-Zugangsdaten als Auth-User nutzt, kann TELEPHONY_TELEKOM_AUTH_USER +# aus Anschlusskennung + Zugangsnummer + # + Mitbenutzernummer + @t-online.de +# gebildet werden. +TELEPHONY_EXTERNAL_PROVIDER= +TELEPHONY_EXTERNAL_ENABLED=false +TELEPHONY_EXTERNAL_INBOUND_EXTENSION=1001 +TELEPHONY_TELEKOM_ENABLED=false +TELEPHONY_TELEKOM_REGISTRAR=tel.t-online.de +TELEPHONY_TELEKOM_SIP_USER= +TELEPHONY_TELEKOM_AUTH_USER= +TELEPHONY_TELEKOM_PASSWORD= +TELEPHONY_TELEKOM_CALLER_ID= +TELEPHONY_TELEKOM_INBOUND_EXTENSION=1001 +TELEPHONY_TELEKOM_OUTBOUND_PREFIX=0 + # Optionaler Erststart-Bootstrap. Wenn gesetzt, werden Admin, Mandant, # Admin-Rolle und Grunddaten beim Backend-Start idempotent angelegt. FEDEO_BOOTSTRAP_ADMIN_EMAIL=admin@example.com diff --git a/backend/src/routes/telephony.ts b/backend/src/routes/telephony.ts index fc9cf19..3acd0af 100644 --- a/backend/src/routes/telephony.ts +++ b/backend/src/routes/telephony.ts @@ -43,6 +43,32 @@ const testAccounts = () => [ }, ] +const externalTelephonyConfig = () => { + const provider = process.env.TELEPHONY_EXTERNAL_PROVIDER || ( + envFlag(process.env.TELEPHONY_TELEKOM_ENABLED, false) ? "telekom" : "" + ) + const enabled = envFlag( + process.env.TELEPHONY_EXTERNAL_ENABLED, + envFlag(process.env.TELEPHONY_TELEKOM_ENABLED, false) + ) + + return { + enabled, + provider: provider || null, + inboundExtension: process.env.TELEPHONY_EXTERNAL_INBOUND_EXTENSION + || process.env.TELEPHONY_TELEKOM_INBOUND_EXTENSION + || "1001", + outboundPrefix: process.env.TELEPHONY_TELEKOM_OUTBOUND_PREFIX || "0", + registrar: provider === "telekom" || envFlag(process.env.TELEPHONY_TELEKOM_ENABLED, false) + ? (process.env.TELEPHONY_TELEKOM_REGISTRAR || "tel.t-online.de") + : null, + sipUserConfigured: Boolean(process.env.TELEPHONY_TELEKOM_SIP_USER), + authUserConfigured: Boolean(process.env.TELEPHONY_TELEKOM_AUTH_USER), + passwordConfigured: Boolean(process.env.TELEPHONY_TELEKOM_PASSWORD), + callerIdConfigured: Boolean(process.env.TELEPHONY_TELEKOM_CALLER_ID), + } +} + const fetchWithTimeout = async (url: string, timeoutMs = 2500) => { const controller = new AbortController() const timeout = setTimeout(() => controller.abort(), timeoutMs) @@ -89,6 +115,7 @@ export default async function telephonyRoutes(server: FastifyInstance) { sipWebSocketUrl: publicAsteriskWsUrl(), echoExtension: process.env.TELEPHONY_ECHO_EXTENSION || "600", testAccounts: testAccounts(), + external: externalTelephonyConfig(), })) server.get("/telephony/status", async () => { diff --git a/docker-compose.yml b/docker-compose.yml index fc33659..a6187b4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -66,6 +66,9 @@ services: - TELEPHONY_TEST_EXTENSION_2=${TELEPHONY_TEST_EXTENSION_2:-1002} - TELEPHONY_TEST_PASSWORD_2=${TELEPHONY_TEST_PASSWORD_2:-fedeo-test-1002} - TELEPHONY_ECHO_EXTENSION=${TELEPHONY_ECHO_EXTENSION:-600} + - TELEPHONY_EXTERNAL_PROVIDER=${TELEPHONY_EXTERNAL_PROVIDER:-} + - TELEPHONY_EXTERNAL_ENABLED=${TELEPHONY_EXTERNAL_ENABLED:-false} + - TELEPHONY_EXTERNAL_INBOUND_EXTENSION=${TELEPHONY_EXTERNAL_INBOUND_EXTENSION:-1001} networks: - traefik labels: @@ -106,8 +109,24 @@ services: restart: unless-stopped profiles: - telephony-dev + environment: + - TELEPHONY_TELEKOM_ENABLED=${TELEPHONY_TELEKOM_ENABLED:-false} + - TELEPHONY_TELEKOM_REGISTRAR=${TELEPHONY_TELEKOM_REGISTRAR:-tel.t-online.de} + - TELEPHONY_TELEKOM_SIP_USER=${TELEPHONY_TELEKOM_SIP_USER:-} + - TELEPHONY_TELEKOM_AUTH_USER=${TELEPHONY_TELEKOM_AUTH_USER:-} + - TELEPHONY_TELEKOM_PASSWORD=${TELEPHONY_TELEKOM_PASSWORD:-} + - TELEPHONY_TELEKOM_CALLER_ID=${TELEPHONY_TELEKOM_CALLER_ID:-} + - TELEPHONY_TELEKOM_INBOUND_EXTENSION=${TELEPHONY_TELEKOM_INBOUND_EXTENSION:-1001} + - TELEPHONY_TELEKOM_OUTBOUND_PREFIX=${TELEPHONY_TELEKOM_OUTBOUND_PREFIX:-0} + - ASTERISK_GENERATED_DIR=/etc/asterisk/generated + command: + - /bin/sh + - -c + - /usr/local/bin/render-asterisk-config.sh && asterisk -f volumes: - ./telephony/asterisk:/etc/asterisk:ro + - asterisk-generated:/etc/asterisk/generated + - ./telephony/render-asterisk-config.sh:/usr/local/bin/render-asterisk-config.sh:ro ports: - "${TELEPHONY_DEV_WS_PORT:-8088}:8088" - "${TELEPHONY_DEV_SIP_PORT:-5060}:5060/udp" @@ -465,3 +484,6 @@ services: networks: traefik: external: false + +volumes: + asterisk-generated: diff --git a/docs/telekom-telefonie.md b/docs/telekom-telefonie.md new file mode 100644 index 0000000..a9f33a4 --- /dev/null +++ b/docs/telekom-telefonie.md @@ -0,0 +1,40 @@ +# Telekom-Telefonie in FEDEO + +FEDEO kann den lokalen Asterisk-Stack als Übergang zur externen Telefonie nutzen. Die Telekom-Anbindung wird aus Umgebungsvariablen erzeugt, damit Zugangsdaten nicht im Repository landen. + +## Zugangsdaten + +Für Telekom-SIP ist der Registrar normalerweise `tel.t-online.de`. Die SIP-ID ist in der Regel die Rufnummer mit Vorwahl ohne Leerzeichen und Sonderzeichen, zum Beispiel `0301234567`. + +Wenn dein Anschluss statt einer separaten SIP-ID die klassischen Zugangsdaten nutzt, kann der Authentifizierungsnutzer aus Anschlusskennung, Zugangsnummer, Mitbenutzernummer und `@t-online.de` gebildet werden: + +```env +TELEPHONY_TELEKOM_AUTH_USER=#@t-online.de +``` + +## `.env` + +```env +TELEPHONY_ENABLED=true +TELEPHONY_EXTERNAL_PROVIDER=telekom +TELEPHONY_EXTERNAL_ENABLED=true + +TELEPHONY_TELEKOM_ENABLED=true +TELEPHONY_TELEKOM_REGISTRAR=tel.t-online.de +TELEPHONY_TELEKOM_SIP_USER= +TELEPHONY_TELEKOM_AUTH_USER= +TELEPHONY_TELEKOM_PASSWORD= +TELEPHONY_TELEKOM_CALLER_ID= +TELEPHONY_TELEKOM_INBOUND_EXTENSION=1001 +TELEPHONY_TELEKOM_OUTBOUND_PREFIX=0 +``` + +Wenn `TELEPHONY_TELEKOM_AUTH_USER` leer bleibt, verwendet Asterisk automatisch `TELEPHONY_TELEKOM_SIP_USER` als Authentifizierungsnutzer. + +## Start + +```bash +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`. diff --git a/frontend/pages/communication/phone-setup.vue b/frontend/pages/communication/phone-setup.vue index 286ed48..b6933fd 100644 --- a/frontend/pages/communication/phone-setup.vue +++ b/frontend/pages/communication/phone-setup.vue @@ -58,6 +58,93 @@ onMounted(loadTelephony) + + + +
+
+
+ + Provider +
+

+ {{ config?.external?.provider || "-" }} +

+
+ +
+
+ + Registrar +
+

+ {{ config?.external?.registrar || "-" }} +

+
+ +
+
+ + Eingehend +
+

+ {{ config?.external?.inboundExtension || "-" }} +

+
+ +
+
+ + Ausgehend +
+

+ Prefix {{ config?.external?.outboundPrefix || "0" }} +

+
+
+ +
+ + + + +
+
+