Connect modules connect_freeswitch

Provider integration

Connect FreeSWITCH

FreeSWITCH integration for Oduist Connect.

A complete self-hosted phone system where Odoo is the configuration database. FreeSWITCH runs as a plain switch and queries Odoo for every routing decision, so users, extensions, callflows, gateways, outbound routes, DIDs, caller IDs, queues and parking slots are ordinary Odoo records with the usual access rules and audit trail — and the switch picks them up on the next call rather than on the next restart.

The module ships the runtime with it: a Docker stack of Traefik, the oduist/freeswitch image and the optional firewall service. Traefik is the single TLS edge, terminating HTTPS for the XML-RPC control channel and the firewall dashboard while FreeSWITCH reuses the same ACME certificate for Verto WSS and DTLS-SRTP. Both service tokens are generated by Odoo on install and the HTTP endpoints stay closed until the containers are paired with them.

It is the deepest of the Connect backends because nothing is outsourced: browser calling is Verto rather than a vendor SDK, prompts are spoken by local Piper models rather than a cloud TTS API, and SIP brute-force protection is kernel ipset state driven from Odoo. Every XML fragment FreeSWITCH receives comes from a Jinja2 template you can open, customize, and reset to the shipped default. Voice AI connects through the Dograh (connect_dograh) and Pipecat (connect_pipecat) add-ons.

What it offers

  • Odoo generates the dialplan

    FreeSWITCH holds no static PBX configuration: it asks Odoo for the user directory, the dialplan and the sofia gateway config over mod_xml_curl on every lookup. Adding an extension, a DID or a parking slot takes effect on the next call with no file to edit and no restart.

  • IVR, ring groups and FIFO queues

    Call flows are rendered from the dialplan_ivr, dialplan_ivr_choice, dialplan_ring_group and dialplan_inbound_did templates, and queues from dialplan_fs_fifo on top of mod_fifo, with a static outbound consumer generated for every FS Queue. Callflow and per-user voicemail recordings are uploaded straight back to Odoo.

  • Verto browser softphone

    The self-hosted WebRTC phone runs over Verto WSS with DTLS-SRTP media, no third-party calling SDK involved. Its dialer, parking panel and toasts follow the user's Odoo interface language, with catalogs shipped for German, French, Italian and Russian.

  • Call parking with BLF lamps

    mod_valet_parking is wired up out of the box with six slots on extensions 701–706, and presence is enabled on the sofia profile so a DSS key subscribed to <slot>@<domain> lights up in near real time. A call is parked and retrieved from the Verto parking tab, a hardware key, or the Park button on the connect.call form.

  • Trunks that reload themselves

    SIP gateways are Odoo records — proxy, credentials, registration timers, and Inbound IPs for providers that send unauthenticated INVITEs. Saving one schedules a sofia profile external restart reloadxml, so a rotated trunk password is live within seconds without touching the container.

  • Outbound routes and caller ID

    Outgoing routes match a dialed number with a regex, then strip and prefix digits before handing the call to a gateway, evaluated in priority order. The presented number resolves from the user's own caller ID, then the system default, then their extension — and only the number is sent, so an internal caller's name never leaves the building.

  • Odoo-managed SIP firewall

    An optional service watches the ESL bus and moves source IPs between six ipset tables — whitelist, blacklist, authenticated for 7 days, banned for 24 hours, and the challenge windows — that an iptables and ip6tables chain in front of the SIP ports consults at line rate. The whitelist, the blacklist, the audit log and the unban button live in Odoo; known scanner user agents are dropped before FreeSWITCH sees them.

  • Local Piper TTS in 26 languages

    The FreeSWITCH image bundles Piper and mod_piper_tts with one neural voice per BCP-47 language, from en-US to uk-UA, cached by content hash. Callflow prompts are spoken by the switch itself, so no prompt text is sent to a cloud TTS service.

Scope of the current version

  • You run the servers. Each customer gets a dedicated Linux host with a public IPv4 and root, running the traefik, fs and firewall containers with network_mode: host — SIP and RTP do not survive Docker NAT — and there is no multi-tenancy yet.
  • Ports 5080 (UDP and TCP), 16000–17000 UDP, 48082 TCP and 443 must be reachable, while mod_xml_rpc on 8080, the firewall service on 8081 and ESL on 8021 must stay on loopback behind Traefik.
  • A production Let's Encrypt certificate is required: Odoo always verifies the XML-RPC certificate and rejects staging and self-signed ones.
  • Odoo generates the FreeSWITCH webhook token on install and the endpoints are fail-closed until you pair it into the container — registrations, dialplan lookups, CDRs and recording uploads all answer 401 while it is unset.
  • The firewall service needs the NET_ADMIN capability and the host's ip_set and xt_set kernel modules; on a host booted with ipv6.disable=1 it protects IPv4 only.
  • Inbound DID matching tolerates a leading + and nothing else — any other difference from the digits the trunk delivers must be reflected in the stored number.
  • One Piper voice per language ships in the image. Additional voices mean adding the .onnx files to the container and overriding connect.freeswitch.callflow._get_language_selection(); softphone UI translations beyond German, French, Italian and Russian fall back to English.

Installs with full features free for 30 days; buy the license inside the module.