gemiman/freeswitch:0.0.3-amd64我们提供了一个生产级别的 docker-compose.yml 文件。
在启动之前,建议先将镜像内的默认配置文件复制到宿主机,以便持久化和修改。
# 创建目录
mkdir -p conf recordings log db
# 从镜像中提取默认配置
docker run --rm --entrypoint tar gemiman/freeswitch:0.0.3-amd64 -cC /usr/local/freeswitch conf | tar xC ./
执行完上述命令后,当前目录下应出现 conf/ 文件夹。
您可以直接创建该文件并根据需要取消 host 模式的注释。
version: '3.8'
services:
freeswitch:
image: gemiman/freeswitch:0.0.3-amd64
container_name: freeswitch_prod
restart: unless-stopped
# Linux 生产环境强烈建议开启 'host' 模式
# network_mode: host
ports:
- "5060:5060/tcp"
- "5060:5060/udp"
- "5080:5080/tcp"
- "5080:5080/udp"
- "5061:5061/tcp"
- "5061:5061/udp"
- "8021:8021/tcp"
- "7443:7443/tcp"
- "5066:5066/tcp"
- "8080:80/tcp"
- "16384-32768:16384-32768/udp"
volumes:
- ./conf:/usr/local/freeswitch/conf
- ./recordings:/usr/local/freeswitch/recordings
- ./log:/usr/local/freeswitch/log
- ./db:/usr/local/freeswitch/db
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
environment:
- TZ=Asia/Shanghai
ulimits:
core: -1
nofile:
soft: 65536
hard: 65536
deploy:
resources:
limits:
cpus: '4'
memory: 4G
reservations:
memory: 1G
healthcheck:
test: ["CMD", "fs_cli", "-x", "status"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "5"
确保 docker-compose.yml 在当前目录。
docker compose up -d
# 查看容器日志
docker compose logs -f
# 进入 FS 控制台
docker compose exec freeswitch fs_cli
所有配置文件均位于 ./conf 目录下。修改后需重启容器或在 fs_cli 执行 reloadxml 生效。
conf/vars.xml (全局变量)这是最重要的地方,定义了全局的 IP、密码和域名。
默认密码:
<X-PRE-PROCESS cmd="set" data="default_password=1234"/>
生产环境必须修改为强密码。这是分机注册密码。
本机 IP:
<X-PRE-PROCESS cmd="set" data="local_ip_v4=$${local_ip_v4}"/>
在 Docker NAT 模式下,FreeSWITCH 自动检测到的可能是容器内 IP (172.x.x.x)。
如果遇到单通问题,可能需要手动将其改为宿主机的公网 IP:
<X-PRE-PROCESS cmd="set" data="local_ip_v4=1.2.3.4"/>
或者设置外部 RTP/SIP IP:
<X-PRE-PROCESS cmd="set" data="external_rtp_ip=1.2.3.4"/>
<X-PRE-PROCESS cmd="set" data="external_sip_ip=1.2.3.4"/>
conf/autoload_configs/event_socket.conf.xml (ESL 接口)外部程序(如 Java/Python/Go 客户端)控制 FS 的接口。
<configuration name="event_socket.conf" description="Socket Client">
<settings>
<param name="nat-map" value="false"/>
<param name="listen-ip" value="0.0.0.0"/>
<param name="listen-port" value="8021"/>
<param name="password" value="ClueCon"/> <!-- 生产环境必须修改 -->
</settings>
</configuration>
conf/autoload_configs/acl.conf.xml (访问控制)限制谁可以连接 ESL 或发起 SIP 呼叫。
<list name="domains" default="deny">
<!-- 允许本地网络 -->
<node type="allow" cidr="192.168.0.0/16"/>
<!-- 建议添加你的业务服务器 IP -->
<node type="allow" cidr="10.0.0.5/32"/>
</list>
conf/sip_profiles/internal.xml (内网 SIP 配置文件)处理分机注册和内部呼叫。
<param name="ws-binding" value=":5066"/>
<param name="wss-binding" value=":7443"/>
通常是因为 NAT 问题,SIP 协商的 SDP 包中包含了容器内部 IP (172.x),导致外部音频发不进来。
解决方案:
docker-compose.yml 中的 network_mode: host (仅 Linux)。conf/vars.xml,显式指定公网 IP:
<X-PRE-PROCESS cmd="set" data="external_rtp_ip=YOUR_HOST_PUBLIC_IP"/>
<X-PRE-PROCESS cmd="set" data="external_sip_ip=YOUR_HOST_PUBLIC_IP"/>
检查:
-p 8080:80)。recordings 目录权限是否正确 (应属于 freeswitch 用户)。| 目标 | 命令 |
|---|---|
| 重载 XML 配置 | fs_cli -x "reloadxml" |
| 查看 SIP 状态 | fs_cli -x "sofia status" |
| 开启 SIP 抓包 | fs_cli -x "sofia global siptrace on" |
| 查看当前通话 | fs_cli -x "show channels" |
| 注册分机状态 | fs_cli -x "show registrations" |
Content type
Image
Digest
sha256:76d127d56…
Size
704.5 MB
Last updated
9 months ago
docker pull gemiman/freeswitch