Introducción
En TierraNube decidimos implementar un servicio VoIP interno para nuestro equipo. El objetivo: poder hacer y recibir llamadas telefónicas directamente desde Odoo, sin necesidad de software adicional, usando un softphone integrado en el navegador.
Aquí compartimos cómo lo logramos, la arquitectura elegida y los pasos que seguimos.
Arquitectura general
La solución se compone de tres pilares:
- Asterisk 21 como servidor PBX sobre una instancia EC2 (Debian 12 ARM64)
- Twilio como proveedor SIP trunk para conectividad con la red telefónica pública
- Odoo con su módulo VoIP nativo, conectado vía WebSocket (WSS)
Paso 1: Instancia EC2 para Asterisk
Utilizamos una instancia t4g.nano. Es una instancia de bajo costo ideal para PBX con tráfico moderado.
En el grupo de seguridad habilitamos los puertos estándar de VoIP: SIP, SIP TLS, WebSocket, HTTP/HTTPS y un rango UDP para el media stream (RTP). Todo siguiendo las mejores prácticas de seguridad con acceso restringido por IP cuando es posible.
Paso 2: Compilación de Asterisk 21
Compilamos Asterisk 21 desde fuente con soporte completo para WebRTC:
./configure --with-pjproject-bundled --with-jansson-bundled
make menuselect # Habilitar módulos WebSocket
make -j$(nproc)
make install
make samples
Los módulos clave que quedan habilitados:
res_http_websocket.so— Soporte WebSocketres_pjsip_transport_websocket.so— Transporte WSS para PJSIPchan_websocket.so— Canal WebSocket
Paso 3: Configuración de PJSIP y transports
Configuramos tres transports simultáneos:
- UDP — Para llamadas SIP tradicionales
- TLS — Para SIP seguro
- WSS — Para softphones WebRTC desde el navegador
Las extensiones se definen con templates reutilizables para mantener consistencia:
[endpoint-template](!)
type=endpoint
disallow=all
allow=ulaw,alaw,opus
direct_media=no
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
Paso 4: Certificado TLS con Let's Encrypt
Para que el softphone del navegador funcione sin advertencias de seguridad, necesitamos un certificado válido. Usamos Let's Encrypt con certbot:
- Crearamos un registro DNS apuntando al servidor
- Ejecutamos certbot en modo standalone
- Configuramos un hook de renovación automática que copia los certificados a Asterisk y reinicia el servicio
Paso 5: Integración con Odoo
Odoo 19 trae un módulo VoIP nativo que usa WebRTC. La configuración es directa:
- En Configuración → VoIP → Providers, configuramos el provider apuntando al servidor Asterisk
- En cada Usuario → pestaña VoIP, asignamos la extensión SIP y credenciales
- El softphone aparece como widget en la esquina inferior de Odoo
Paso 6: Proveedor SIP (Twilio)
Para llamadas a la red telefónica pública, configuramos un trunk con Twilio:
- Número DID nacional chileno para llamadas entrantes
- Identificación de IPs de Twilio para seguridad del trunk
- Webhook configurado para recibir llamadas entrantes
Twilio cobra por minuto de uso, sin compromiso mensual. Ideal para volumen bajo de llamadas.
Paso 7: AMI para replicabilidad
Una vez configurado todo, creamos una AMI (Amazon Machine Image) de la instancia. Esto nos permite:
- Levantar nuevas instancias idénticas para clientes
- Mantener un backup de la configuración funcional
- Escalar el servicio rápidamente
Resultado
El equipo ahora puede:
- Hacer y recibir llamadas desde el navegador dentro de Odoo
- Llamadas internas entre extensiones sin costo
- Llamadas externas vía Twilio con tarifas competitivas
- Registro de llamadas en el chatter de contactos de Odoo
Conclusiones
La combinación de Asterisk + Odoo + Twilio es una solución robusta y económica para PyMEs en Chile. La integración nativa de Odoo con WebRTC elimina la necesidad de softphones externos y la experiencia de usuario es fluida.
Si necesitas implementar VoIP en tu instancia Odoo, contáctanos.
Cómo levantamos nuestro servicio VoIP con Asterisk y Odoo