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_curlon 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_groupanddialplan_inbound_didtemplates, and queues fromdialplan_fs_fifoon top ofmod_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_parkingis 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 theconnect.callform. -
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
ipsettables — whitelist, blacklist, authenticated for 7 days, banned for 24 hours, and the challenge windows — that aniptablesandip6tableschain 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_ttswith one neural voice per BCP-47 language, fromen-UStouk-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,fsandfirewallcontainers withnetwork_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_rpcon 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_ADMINcapability and the host'sip_setandxt_setkernel modules; on a host booted withipv6.disable=1it 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
.onnxfiles to the container and overridingconnect.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.