安装freeswitch
为什么要写这个玩意儿
由于工作需要需要部署freeswitch,官网上的部署方式windows特别简单,直接下载一个安装程序一路向西即可,但是至于linux下的,特别是debian系统,则要去注册一个token,本人尝试了几次,无奈由于伟大的“墙”token一直获取不成功,因此决定自行源码编码安装。
前提
由于本人是mac,freeswitch的安装需要特定的目录权限,而mac在权限方面又限制的十分的死,同时,由于freeswitch需要大量的端口,如internal、public端口,rtp媒体端口,因此,决定用docker的host网络模式,让容器和宿主机共享网络,实现和直接在linux上安装同样的效果。假设本地已经有了一个名字叫debian的镜像,在进入容器后,执行apt-get update && apt-get install -y git vim 。(vim用来后期修改一些配置文件,后面用到再说.注意:此处经过多次尝试,最新版的fs编译会报和ffpneg相关的错误,因此我们安装v1.10版本的fs。
准备工作
确保已经进入容器,然后cd /usr/local/src。
基础依赖库:
apt-get install -y \
subversion build-essential cmake automake autoconf libtool libtool-bin pkg-config wget \
libssl-dev zlib1g-dev libdb-dev unixodbc-dev libncurses5-dev libexpat1-dev libgdbm-dev bison erlang-dev libtpl-dev libtiff5-dev uuid-dev \
libpcre3-dev libedit-dev libsqlite3-dev libcurl4-openssl-dev nasm \
libogg-dev libspeex-dev libspeexdsp-dev \
libldns-dev \
python3-dev \
libavformat-dev libswscale-dev \
liblua5.2-dev \
libopus-dev \
libpq-dev \
libshout3-dev libmpg123-dev libmp3lame-dev \
libsndfile1-dev libflac-dev libogg-dev libvorbis-dev
FreeSWITCH较新的源代码都已将Sofia-SIP和SpanDSP移出了FreeSWITCH代码仓库,分离到了独立的仓库中,在安装FreeSWITCH之前需要单独安装:
- https://github.com/freeswitch/sofia-sip
git clone https://github.com/freeswitch/sofia-sip.git cd sofia-sip ./bootstrap.sh && ./configure && make install && cd ..
- https://github.com/freeswitch/spandsp
git clone https://github.com/freeswitch/spandsp.git cd spandsp ./bootstrap.sh && ./configure && make install && cd ..
后面在make 编译fs的时候可能会和spandsp相关的错误,这个时候spandsp需要回滚一下版本,spandsp更新太快了也不是个好事儿(如果没报错就不要回滚)
git checkout -b finecode20230705 0d2e6ac65e0e8f53d652665a743015a88bf048d4,然后重新编译一下spandsp
另外verto模块的依赖也是单独维护的,
-
https://github.com/signalwire/libks
git clone https://github.com/signalwire/libks.git cd libks cmake . && make install && cd ..
另外,需要安装一个signalwire-c,这个库依赖libks库,所以需要先安装libks库(当然这个库不是必须的,这是用于和fs官方平台通信的一个平台,其实国内搭建fs的人99%的都不需要这个模块,如果不需要,只需要注释掉这个模块,后面说)
- https://github.com/signalwire/signalwire-c
git clone https://github.com/signalwire/signalwire-c cd signalwire-c cmake . && make install && cd ..
安装freeswitch
-
https://github.com/signalwire/freeswitch.git
git clone https://github.com/signalwire/freeswitch.git
在fs的源码目录下的modules.conf文件。
在编译前最好先禁用mod_av模块(用于播放视频的,初学者基本用不到,执行./bootstrap.sh
后才可以看到这个文件,得先执行.bootstrap 命令后才能看到这个文件)
禁用mod_signalwire模块
然后开始编译:
./bootstrap.sh
./configure
make
make install
ok,如果正常的话会看到一个成功的带着freeswitch的页面,我这忘了截图,就不贴图了。
安装完成之后,freeswitch会安装在/usr/local/freeswitch这。
然后我们创建两个软连接
cd /usr/bin/
ln /usr/local/freeswitch/bin/freeswitch freeswitch
ln /usr/local/freeswitch/bin/fs_cli fs_cli
安装声音文件:
进入源码目录下:
cd /usr/local/src/freeswitch
make cd-sounds-install
make cd-moh-install
上述命令会自动从fs官网下载声音文件
然后我们启动看看,再启动前,我们在编译的时候不是禁掉了mod_signalwire和mod_av模块么,
现在也需要禁用掉这两个模块。
进入目录
```shell
cd /usr/local/freeswitch/conf/autoload_configs
然后修改modules.conf.xml这个文件,注释掉mod_signalwire和mod_av的自动加载
最后,我们还需要删除掉ip6支持,当然,你是高手另当别论。
cd /usr/local/freeswitch/conf/sip_profiles
把和ipv6的都干掉
然后我们执行freeswitch命令启动服务,首次启动会比较慢,耐心等待一会儿,如果你能看到下面的样子,恭喜,编译成功了。
安装中文语音(可有可无)
-
获取中文语音包
cd /usr/local/freeswitch/sounds git clone https://github.com/rts-cn/zh.git 经测试,这个语音包是最全的,别的网络教程里的语音包不是缺这个就是缺那个,这个中文语音包是由国内freeswitch大佬杜金房的小樱桃公司上传的
-
编译中文say模块
cd /usr/local/src/freeswitch/src/mod/say# cd mod_say_zh/
make && make install
- 加载中文say模块(如果fs已经启动的了的话)
load mod_say_zh
- 启用中文模块
找到/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml 文件, 找到这一行,取消注释 - 修改vars.xml中的配置
找到/usr/local/freeswitch/conf/vars.xml文件,找到这个 <X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/en/us/callie"/> 注释掉或者删掉,注意,由于fs是采用预处理的方式加载的,所以这普通注释是不行的,我们只需要破坏这个结构改即可,比如我么可以改成这样: <X-PRE-PROCESS-broke cmd="set" data="sound_prefix=$${sounds_dir}/en/us/callie"/> 然后加入下面一行 <X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/zh/cn/link"/> 下面三行可以加可不加 <X-PRE-PROCESS cmd="set" data="default_language=zh"/> <X-PRE-PROCESS cmd="set" data="default_dialect=cn"/> <X-PRE-PROCESS cmd="set" data="default_voice=lin"/>
- 计入中文语音配置
/usr/local/freeswitch/conf/lang
cp en zh -ra
mv zh/en.xml zh/zh.xml
然后编辑zh.xml文件,把中文相关替换成中文相关
找到/usr/local/freeswitch/conf/freeswitch.xml文件,加入对zh中文的引用
最后重启fs或者reloadxml
打包镜像
最后的最后,如果想将自己的编译后的镜像打包,过程如下:
- 通过docker ps找到刚才编译fs的容器的容器id,简称$container_id
- 通过docker export -o debian_fs_builder.tar $container_id导出容器快照
- 通过docker import debian_fs_builder.tar把容器快照导出为镜像
- 通过docker images找到刚才倒出的镜像的id,简称$image_id
- 通过docker image tag $image_id fs:base给刚才倒出的镜像打个标签
- ok,现在你已经 有了个fs:base的镜像了
- 尝试这个镜像好使不:docker load -i fs-base.tar,如果能看到显示Loaded image: fs:base
,恭喜你,done - 用刚才编译的镜像尝试启动:docker run --name fs -d -t fs:base /bin/bash…看看成功没有吧。
- 完结,撒花,我该去撸代码了
运行
ok,让我们尝试打一个电话吧。
让我们重新用我们自己打包的镜像开始吧
. 首先让我们编写一个docker-compose.yml文件吧
version: '3'
services:
fs:
image: fs:base
ports:
- 5060:5060/udp
- 5060:5060/tcp
# - 16384-32768:16384-32768/udp
networks:
- my-fs
container_name: fs
# interactive: true
tty: true
# detach: true
command: bash
networks:
my-fs:
external: true
我们只映射了5060端口,5080没映射,rtp端口也没映射(用于音视频rtp流传输的,不映射我们听不到声音的,不过无所谓了,因为我们只是个简单的测试,之所以不映射是因为默认端口是16384-32768,由于我电脑垃圾的原因,映射太多导致容器启动失败,当然这个端口是可以改的,在/usr/local/freeswitch/conf/autoload_configs/switch.conf.xml这个文件里可以自行修改,然后怎么改了怎么重新启动容器不在此文范围内,请自己阅读docker相关文档)。
然后我们进入目录:
cd /usr/local/freeswitch/bin
./freeswitch
fs内置了一些账号,在/usr/local/freeswitch/conf/directory/default目录下
每个目录都代表一个账号,默认密码为1234,
我是mac,使用telephone这个软电话
域可以在fs内部通过执行命令获取,当然这个是可以配的,这是后话
如果幸运的话,这个时候你已经可以打电话了。让我们试一下。用1000的给1001打个电话试一下
注意,首次呼叫可能需要10秒左右才能接通,原因是我们使用的默认密码1234,当然,fs的日志也提示了:
这个时候我们只需要去提示的 /usr/local/freeswitch/conf/vars.xml,找到这个地方:
把默认密码改掉,然后重新启动或者执行reloadxml就可以了。然后把软电话的用户的密码改了重新连接。
重新拨打,ok,可以立即打通了。但是我们发现一个新的问题,电话30秒就自动结束了,为啥?
下期再说!!!