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 start
或make 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 内部的秘密。