HowTo文档

如何使用不带 XUI 的 XSwitch

XSwitch 功能强大,内置 XUI。内置 XUI 虽然方便,但它有数据库依赖,而且,为了迁就 XUI,增加了一些规则和限制。如果你只想使用底层的 xswitch 交换功能,可以抛开 XUI 的限制。下面,我们带大家来研究一下如何使用不带 XUI 的 XSwitch。

为了大家运行方便,XSwitch 前后端都在同一个镜像里,开箱即用。如果不使用 XUI,也可以自己写 XML 配置文件。

为了能快速上手,首先,你要先学会XSwitch Free。跑通后,关闭 XSwitch Free,执行以下操作:

make eject

上述命令是把 XSwitch Free 中默认的配置文件 Copy 到本地,实际上执行了如下命令:

docker cp xswitch-free:/usr/local/freeswitch/conf .

输出结果如下:

conf copied to local dir, please edit docker-compose.yml to use it

然后,打开docker-compose.yml文件,把里面的image:行改成 XSwitch 社区版 的镜像,如:

image: ccr.ccs.tencentyun.com/free/xswitch-lua-js-free:4.0.2

挂载本地的配置文件,如:

volumes:
  - ./conf/:/usr/local/freeswitch/conf:cached

完整文件如下:

version: "3.3"

services:
  xswitch:
    container_name: xswitch-free
    image: ccr.ccs.tencentyun.com/free/xswitch-lua-js-free:4.0.2
    environment:
      - FREESWITCH_DOMAIN=free.xswitch.cn
    env_file: .env
    # command: ["bash"]
    # stdin_open: true
    # tty: true
    # network_mode: host
    ports:
      - "${RTP_START:-2000}-${RTP_END:-2100}:${RTP_START:-2000}-${RTP_END:-2100}/udp"
      - "${SIP_PORT:-5060}:${SIP_PORT:-5060}/udp"
      - "${SIP_PORT:-5060}:${SIP_PORT:-5060}/tcp"
      - "${SIP_PUBLIC_PORT:-5080}:${SIP_PUBLIC_PORT:-5080}/udp"
      - "${SIP_PUBLIC_PORT:-5080}:${SIP_PUBLIC_PORT:-5080}/tcp"
    #   - "${VERTO_WS_PORT}:${VERTO_WS_PORT}"
    #   - "${VERTO_WSS_PORT}:${VERTO_WSS_PORT}"
    # cap_add:
    #   - SYS_PTRACE
    #   - NET_ADMIN # for iptables to work
    volumes:
      - ./conf/:/usr/local/freeswitch/conf:cached

然后,使用make startmake run就可以正常使用新的镜像了。

根据 XSwitch Free 的文档,默认的配置文件是“精减”的配置文件,你也可以根据你自己的环境需要换成你常用的配置文件。

当然,不带 XUI 的 XSwitch 也不依赖于 XSwitch Free,只是这样便于说明问题,完全理解了本文的内容后你完全可以自己手写docker-compose.yml文件和conf目录中的相关文件。

TL;DR

通过上述方法,你就知道如何不使用 XUI 了。如果你想了解更多细节,继续读。

XUI 由以下几部分构成:

  • XSwitch,也就是 FreeSWITCH
  • mod_verto,内置 HTTP 服务器
  • Lua,后台的 REST API
  • Lua,后台的数据绑定,为 XSwitch 提供 Configuration、Dialplan 等
  • XUI JS,前端 JS
  • PostgreSQL,数据库

这一切的核心就是配置文件。如果你能找到 XSwitch 的配置文件lua.conf.xml,就会发现下面两行:

<param name="xml-handler-script" value="/usr/local/freeswitch/xui/lua/xui/fs_xml_handler.lua"/>
<param name="xml-handler-bindings" value="dialplan|result|configuration|directory|channels|chatplan|languages"/>

它表示只要加载了 mod_lua,FreeSWITCH 所需的配置文件都“动态”通过执行那个 Lua 脚本获取。

把它注释掉,就无效了。当然,无效是无效了,那你需要写静态的 XML,或使用mod_xml_curl等模块提供你需要的 XML。

verto.conf.xml里有一个vhost配置,如果你熟悉 Apache,你就可以看到类似的概念,它启动一个 HTTP 服务器,静态文件从root中获取,动态 API 全部重定向到init.lua脚本处理。

<vhosts>
<vhost domain="localhost">
    <param name="alias" value="seven.local freeswitch.org"/>
    <param name="root" value="$${base_dir}/xui/www"/>
    <param name="script-root" value="$${base_dir}/xui/lua/xui"/>
    <param name="options-cross-domain" value="*"/>
    <param name="index" value="index.html"/>
<!--
    <param name="auth-realm" value="FreeSWITCH"/>
    <param name="auth-user" value="freeswitch"/>
    <param name="auth-pass" value="rocks"/>
-->
    <rewrites>
    <rule expression="^/api" value="/init.lua"/>
    </rewrites>
</vhost>

参阅本站其它文件了解更多 XSwitch 内部的秘密。

如何在XSwitch中使用XCC API