编译安装Freeswitch 1.10.12
网上大部分安装博客来自https://github.com/freeswitch/mod_unimrcp 的readme 文档,但这是两年前的版本(2023),当前最新稳定版是1.10.12,2024年发布。用旧的教程安装,新的版本存在包错。但是我估计在把各个项目都切到2023年的tag或者branch,再按照文档执行编译过程应该是没问题的。不过目前需求是用2024的版本,所以没去尝试。
回到正题,https://github.com/signalwire/freeswitch 项目的 docker/build 目录有三个Dockerfile文件,是2025年提交,本人亲测按照步骤可以成功安装最新稳定版freeswitch 1.10.12。下面是三个Dockerfile的作用说明。
| 文件 | 作用 |
|---|---|
| base-image-from-repo.Dockerfile | 用docker运行此Dockerfile,从官方源安装fs,需要官网的token。优点是简单快捷。缺点是无法更改源码和配置,即无法自定义编译的模块。 |
| base-image-from-source.Dockerfile | 用docker运行此Dockerfile,生成一个镜像。该镜像包含了编译过程中需要的所有依赖。然后用此镜像可以编译fs源码,生成Debian 下的deb安装包。但是生成的安装包在Debain12 直接安装会有很多依赖包错。 |
| debs-from-source.Dockerfile | 用docker运行此Dockerfile,生成一个镜像。用该镜像可以生成安装fs 的deb 包时所需要的依赖包。 |
到一台可以访问外网(减少各种依赖和包无法访问导致的报错!)且已经安装了git和docker的Linux服务器,新建一个目录执行下面的操作。
先编译fs源码成deb安装包
git clone https://github.com/signalwire/freeswitch
cd freeswitch
# fs-base-image中具备了编译fs源码所需要的所有依赖
docker build -t fs-base-image -f docker/build/base-image-from-source.Dockerfile .
# 如果要指定标签和版本号
# docker build -t fs-base-image \
# --build-arg LIBKS_REF=v1.0.0 \
# --build-arg BUILD_NUMBER=123 \
# -f docker/build/base-image-from-source.Dockerfile .
# 创建宿主机保存的目录,也可以指定另外目录
mkdir -p "$HOME/DEBs"
# 用fs-base-image编译源码,需要时间较长根据网速和服务器性能大概10-30min
# 将$(pwd) 改成freeswitch的源码目录,因为要安装的不是当前的最新源代码,而且最新稳定版本。
# 在另外的目录克隆源码,然后通过git tag查看版本,再git checkout 到指定tag
docker run -it --rm -v "$HOME/DEBs:/var/local/deb" -v "$(pwd):/usr/local/src/freeswitch" fs-base-image scripts/packaging/build/fsdeb.sh -b 42 -o /var/local/deb
# 执行后在$HOME/DEBs目录下就有了指定版本的fs 的deb安装包。
再编译安装fs需要的依赖包
# 生成镜像fs-debian-package-builder
docker build -t fs-debian-package-builder -f docker/build/debs-from-source.Dockerfile .
# 也可指定标签
# docker build -t fs-debian-package-builder \
# --build-arg LIBKS_REF=v1.0.0 \
# --build-arg BUILD_NUMBER=123 \
# -f docker/build/debs-from-source.Dockerfile .
#创建目录
mkdir -p "$HOME/DEBs-PACK"
# 将安装fs所需要的依赖也打包成deb格式,存放到宿主机的 $HOME/DEBs 目录
# 为了区分fs的deb包,也可以将依赖的deb包存放的别的目录,后续先安装依赖的deb包,然后再安装fs的deb包
docker run -v "$HOME/DEBs-PACK:/var/local/deb" fs-debian-package-builder
现在开始用docker 构建一个含有fs的镜像。先用一个docker compose file运行一个容器。
执行docker compose -f docker-compose.yml up -d,docker-compose.yml 内容如下:
services:
fs-debian12:
container_name: fs-debian12
image: debian:bookworm
tty: true
privileged: true
restart: always
environment:
TZ: "Asia/Shanghai"
将宿主机的安装包复制到容器,也可以在docker compose file中挂载。但是不知道会不会有文件生成,影响宿主机目录,所以用复制的方式。
docker cp $HOME/DEBs-PACK fs-debian12:/root
docker cp $HOME/DEBs fs-debian12:/root
进入容器,执行安装。
docker exec -it fs-debian12 bash
apt update
# 先安装依赖
apt install -y /root/DEBs-PACK/*.deb
# 再安装fs,如果有些依赖包确定不需要但是安装时有出现了报错,直接直接mv 重命名文件修改deb后缀,这样就不会安装了
apt update
apt install -y /root/DEBs/*.deb
# 安装完成后执行,可以看到路径
whereis freeswitch
# 运行
freeswitch
此时已经在一个Debian12的容器中安装了freeswitch ,我们可以将此保存为镜像,作为基础镜像使用。
# 保存容器为镜像并且指定tag为v1
docker commit fs-debian12 fs-debian12:v1
# 也可以保存为文件方便部署使用
docker -o fs-debian12_v1.image fs-debian12:v1
下面用docker compose 得方式部署运行freeswitch:
services:
repair:
container_name: freeswitch-1.10.12
image: fs-debian12:v1
privileged: true
restart: always
environment:
TZ: "Asia/Shanghai"
network_mode: host
volumes:
- /home:/home
- ./mod_asr.so:/usr/lib/freeswitch/mod/mod_asr.so
- ./conf:/etc/freeswitch
- ./log:/var/log/freeswitch
command: ["freeswitch", "-ncwait", "-nonat", "-rp", "-elegant-term"]
关于yaml的说明:
- home 目录存放语音文件的目录。
- mod_asr.so 是调用asr的so,另外有需要的旧版的依赖包复制到容器的/lib/x86_64-linux-gnu/ 目录。
- conf 目录是配置,此目录先不做映射,开启容器后复制到宿主机根据需要修改后,再做映射。
- log 目录映射出来,用来做日志持久化
启动参数的说明:
- -ncwait : 阻塞当前shell指令不输出日志,
- -nonat: 不检测网络,避免运行在docker时可能出现的网络问题,切network_mode指定为host
- -rp:实时设置,避免延迟
- -elegant-term: 退出时优雅关闭

浙公网安备 33010602011771号