FEATURED · 精选文章

在飞牛NAS上用Docker部署FreeSWITCH搭建IPPBX电话系统

发布时间 / 2026/9/16 0:22:33
来源 / 创域科博编辑部
栏目 / 资讯中心
在飞牛NAS上用Docker部署FreeSWITCH搭建IPPBX电话系统 最近有朋友问我能不能把公司那套内线电话换掉。传统程控交换机PBX又贵又难维护还得单独布电话线小公司用起来非常不划算。其实用软件交换机完全能顶上去FreeSWITCH 就是非常合适的一个。这个开源实时通信平台能搞定分机互拨、外呼中继、IVR 自动话务、通话录音这些典型 IPPBX 功能普通一台小主机就能带几十上百部分机。这次我选的是飞牛NASfnOS来做承载平台原因也很直接fnOS 基于 Debian自带 Docker 和 Web 管理界面对老 x86 硬件兼容性好正好适合拿来长期跑这种 7x24 小时服务。写这篇文章的时候已经是“FreeSWITCH 简单图形化界面”系列的第 56 篇了前面几期在 Windows、WSL2、树莓派、K8s 上都折腾过这次换到飞牛上做一次完整记录。文章里没有那种“重新发明轮子”的玄学全部是实际操作步骤、配置参数和踩坑经验适合手上有 NAS、想低成本搭一套内线电话系统的人直接照着做。1. 为什么我会选飞牛NAS跑FreeSWITCH而不是直接装个Linux1.1 飞牛NAS在实时通信场景下的优势一开始我也纠结过直接搞一台旧电脑装 Debian 再装 FreeSWITCH 不就行了为什么非要绕一层飞牛NAS真跑下来才发现飞牛在“省心”这件事上比纯命令行舒服太多了。飞牛NAS底层是 Debian所以 apt 包管理、systemd 这些标准 Linux 生态全都保留着遇到问题可以按照 Debian 的排错思路走资料丰富。更关键的是fnOS 自带一个挺完整的 Web 管理界面磁盘状态、Docker 容器、网络配置都能在页面上点出来。FreeSWITCH 本身没有图形界面但部署在 fnOS 上之后起码存储空间、容器状态这些底座能力有人帮你管了。对不熟悉 Linux 的读者来说这是一个很友善的进入方式。第二个被很多人忽略的点是硬件兼容性。我手头这台是 HP MicroServer Gen8属于比较老的小主机装最新版 Linux 发行版偶尔会有驱动和心跳灯问题但 fnOS 装上去很顺利网卡、硬盘、温度监控都正常识别。加上飞牛本身支持 x86 和 ARM 平台如果你后续想换到更小功耗的软路由或者矿渣主板迁移成本也不高。1.2 用Docker部署而不是编译源码省的不只是时间网上很多 FreeSWITCH 教程都喜欢从源码编译跑 ./configure 和 make一编就是大半个小时中间要是缺了某个开发库还会直接中断。我的观点是如果你不是要二次开发 FreeSWITCH 核心模块完全没必要自己编译。用 Docker 镜像把运行环境一次性固化下来升级、回滚、备份、迁移都方便得多。飞牛NAS的系统盘通常是 SSD但这不代表你想怎么折腾就怎么折腾。编译 FreeSWITCH 会生成大量文件占空间不说后续升级版本时如果改了编译选项很容易出现模块加载不上的问题。Docker 方案把整个 FreeSWITCH 跑在一个独立文件系统里数据用 volume 挂载出来升级时只需要换镜像 tag配置文件原封不动。这次我选择的镜像是signalwire/freeswitch:1.10.11这是官方发布的稳定版本镜像。选择 1.10 分支主要是因为它生命周期长模块齐全社区问题沉淀得也多后续遇到 bug 查资料最容易。1.3 “简单图形化界面”到底指什么这几年 FreeSWITCH 的图形化管理方案其实不少最出名的当属 FusionPBX。但 FusionPBX 是个全家桶需要 PHP、Nginx、PostgreSQL装完之后光维护那些依赖就已经很累了。对只需要管理几十部分机的小团队来说这个重量明显超标。所以我这个系列一直在强调“简单图形化界面”。它的定位不是替代 FreeSWITCH 的所有配置文件而是提供一个轻量的 Web 面板帮我们干三件事第一实时查看分机注册状态和当前通话通道第二查 CDR 通话记录第三执行一些常规操作比如发起测试呼叫、踢掉异常通道、查看 CPU 和内存占用。有了它日常维护不用每次 SSH 进服务器敲 fs_cli普通同事也能看懂当前系统有没有异常。之后你还会看到这个面板是怎么和 FreeSWITCH 联动的核心原理就是 ESLEvent Socket。FreeSWITCH 默认会在 8021 端口开放一个事件套接字任何程序都可以连上去订阅事件、发指令。面板后端角色就是通过 ESL 和 FreeSWITCH 通信的。2. 动手前必须理清的环境与端口规划2.1 硬件与系统准备清单先说结论FreeSWITCH 对硬件要求真不高。我跑在 Gen8 上的配置是 Intel Celeron G1610T 双核、8GB 内存系统盘是 120GB SSD另外挂了一块 1TB 机械硬盘存录音。这个配置日常带几十个注册分机、几路并发通话绰绰有余。如果你手头的 NAS 是 J4125、N5105 这种四核 CPU完全没问题。内存建议至少 4GB否则同时开录音和语音识别之类的模块会有点紧张。系统层面需要确认三件事。第一飞牛NAS已经开启了 SSH这样才能在命令行里执行部署命令。第二给 NAS 设置固定 IP千万不要用 DHCP 自动获取因为后面配置 SIP 中继和分机注册都需要一个稳定的 IP 地址。第三在飞牛的“存储空间”里留出一个目录给 Docker 数据我习惯在/vol1/docker下面建项目目录便于之后统一备份。2.2 FreeSWITCH端口清单与通信关系FreeSWITCH 是典型的“端口大户”因为 SIP 协议本身要分配很多动态端口来承载声音数据RTP 流。如果端口没规划好最常见的结果就是分机注册成功但一通话就没声音原因多半是 RTP 端口被防火墙挡住了。我在部署中实际用到的端口如下端口协议用途5060UDP/TCPSIP 信令分机注册和呼叫控制5061TCPSIP over TLS 信令5080UDP/TCP外部 SIP 网关/中继通信端口5081TCP备用外部 SIP over TLS7443TCPWebRTC 和 Verto 通信8021TCPESL 事件套接字图形化面板连接用16384-32768UDPRTP/RTCP 媒体流承载实际语音数据为什么 RTP 端口要开那么大范围因为 FreeSWITCH 默认的 RTP 端口池是 16384 到 32768每个通话会占用一对端口。如果你在飞牛防火墙里只放行了一个窄端口段并发通话超过端口数量就会导致新呼叫没有媒体流。我之前就吃过这个亏所以这里专门列出来。2.3 目录规划与权限思路Docker 部署时我习惯把配置和产生的重要数据全部挂载到宿主机这样就算容器崩了、删了数据也不会丢。规划如下/vol1/docker/freeswitch/etc存放 FreeSWITCH 全量配置/vol1/docker/freeswitch/log存放日志/vol1/docker/freeswitch/record存放通话录音和语音信箱文件/vol1/docker/freeswitch/db存放系统数据库文件这里要提醒权限问题。容器里的 FreeSWITCH 默认以freeswitch用户运行UID 和宿主机普通用户不一样。如果挂载目录的宿主机权限不对容器启动后经常会提示无法写入日志或者录音目录。最简单的处理方法是先把目录权限改成 777 或者把属主改成容器内的 UID等容器跑起来后再慢慢收缩权限。mkdir -p /vol1/docker/freeswitch/{etc,log,record,db} chmod -R 777 /vol1/docker/freeswitch如果你对权限比较讲究也可以先启动一个临时容器查看 UID再用chown指定 UID这里就不展开细说了。3. 在fnOS上用Docker部署FreeSWITCH全流程3.1 拉取镜像与准备compose文件在很多 Linux 服务器上直接docker run跑容器是可以的但对 FreeSWITCH 这种多端口、多挂载的服务用 Docker Compose 管理要清晰得多。飞牛NAS 的 Docker 管理界面虽然能建容器但对长格式的环境变量和 volume 列表支持得一般所以我推荐先用 SSH 写好 compose 文件再启动容器。下面是我实际使用的 compose 文件services: freeswitch: image: signalwire/freeswitch:1.10.11 container_name: freeswitch hostname: freeswitch network_mode: host restart: unless-stopped volumes: - /vol1/docker/freeswitch/etc:/etc/freeswitch - /vol1/docker/freeswitch/log:/var/log/freeswitch - /vol1/docker/freeswitch/record:/var/lib/freeswitch/recordings - /vol1/docker/freeswitch/db:/var/lib/freeswitch/db environment: - TZAsia/Shanghai这里有一个关键选择我使用了network_mode: host而不是默认的 bridge 模式。这样容器直接复用宿主机网络所有端口天然暴露在局域网里省去了几十条端口映射规则。很多人担心 host 模式不安全但在内网 NAS 上跑 PBX 服务这种做法很常见稳定性反而更高。启动命令很简单cd /vol1/docker/freeswitch docker compose up -d镜像首次拉取可能需要一点时间。如果在公网拉取镜像比较慢给 Docker 配置国内可用的镜像加速器即可飞牛的系统设置里也有镜像加速配置入口。3.2 初始化配置vars.xml、ACL和SIP Profile容器启动后第一次会自动生成默认配置文件到挂载的/vol1/docker/freeswitch/etc目录。如果本来是空的挂载点镜像里的/etc/freeswitch内容会拷贝出来。接下来需要改三个核心文件。第一个是vars.xml。这里存放全局变量重点是domain和default_password。默认域名通常是$${domain}对应的是本机 IP。默认分机密码是1234这个必须改掉否则同一局域网里的其他人可能拿着默认密码注册进你的系统。我把默认密码统一设置成一串随机字符后面新建分机的时候再单独指定。第二个是 ACL 配置文件autoload_configs/acl.conf.xml。ACL 就是访问控制列表决定哪些 IP 能注册分机、哪些 IP 只能拨打外部电话。我加了两个网段list namelan defaultallow node typeallow cidr192.168.1.0/24/ node typedeny cidr0.0.0.0/0/ /list第三个是 SIP Profile。conf/sip_profiles/internal.xml里定义了分机注册的监听端口和 NAT 参数。在 host 网络模式下NAT 配置相对简单重点是把ext-rtp-ip和ext-sip-ip指到你的 NAS 局域网 IP。param nameext-rtp-ip value192.168.1.88/ param nameext-sip-ip value192.168.1.88/我还在这个文件里加了一个容易被忽略但不是不重要的参数param namep-early-media-support valuetrue/这个参数的作用是处理早期媒体early media。如果不开启某些被叫端在接听前返回回铃音时主叫方可能会直接听不到声音特别是对接运营商线路时比较常见。加上这个参数后系统会依据 RFC 3960 处理 183 Session Progress 消息回铃音就能正确传回主叫侧。3.3 启动容器并用fs_cli验证配置改完后重启容器docker restart freeswitch判断 FreeSWITCH 是否正常启动最直接的方式是进入容器执行fs_cli这个命令相当于 FreeSWITCH 的“控制台命令行”。输入sofia status可以看到 SIP Profile 是否监听端口。docker exec -it freeswitch fs_cli sofia status如果一切正常输入show version能看到版本号输入sofia status profile internal reg可以查看当前注册的分机。第一次跑的时候我遇到过模块加载失败导致启动卡住的状况可以用docker logs freeswitch查看日志。最常见的报错是某些依赖文件缺失但官方镜像基本不会有这个问题如果遇到多半是挂载目录权限不对导致配置没读出来。4. 从零开始配置一套可用的IPPBX4.1 创建分机并完成软电话注册FreeSWITCH 里分机的概念很简单一个分机就是一个 SIP 用户有用户名、密码和所属域。默认配置文件里已经带了一个 1000 号分机密码是1234。我们先把它改成自己的分机。分机配置保存在directory/default/1000.xml中结构大概是include user id1000 params param namepassword value你的强密码/ param namevm-password value语音信箱密码/ /params variables variable nameuser_context valuedefault/ variable nameeffective_caller_id_number value1000/ variable nameeffective_caller_id_name value前台/ /variables /user /include按这个模板可以继续创建 1001、1002一直到 1099。我这里直接写了 20 个分机覆盖 1000-1019足够一个 20 人以内的小团队用了。软电话我推荐用 MicroSIP 或者 Zoiper都可以在电脑上模拟 SIP 话机。配置时填一下服务器地址例如192.168.1.88:5060、用户名和密码就能注册。注册成功后在 fs_cli 里执行show registrations能看到分机的 Contact 地址然后试着用分机 1000 呼叫分机 1001originate user/1000 bridge(user/1001)如果两边都注册了软电话会直接响铃。这一步通了说明最基础的分机互拨已经 OK。4.2 配置SIP中继打通外线分机互拨只是 IPPBX 的第一步。对外呼叫通常有两种方式一种是接传统模拟话路需要额外硬件比如语音网关另一种是走 SIP 中继从 VoIP 运营商那里买号码然后在 FreeSWITCH 里配置一个 gateway。我在生产环境里走的是第二种。取一个运营商的基本对接信息服务器地址、账号、密码、认证号码。在conf/sip_profiles/external/gateway.xml中定义gateway namevoip-provider param nameproxy valuesip.example.com/ param nameusername value10086/ param namepassword value你的密码/ param nameauth-username value10086/ param namefrom-user value10086/ param nameregister valuetrue/ /gateway不同运营商的参数略有差异但大方向一致proxy是服务器地址register设为true代表向对方注册自己的号码表示在线。配置好之后执行sofia profile external rescan再执行sofia status gateway voip-provider查看注册状态。如果显示REGED或者报告注册成功说明中继已经通了。对外拨号的时候FreeSWITCH 不需要关心电话号码存在哪个运营商手里它只负责把号码转发给 gateway。这里我把号码前缀逻辑简化成了拨打 8 开头的号码走 IPPBX 内部路由拨打普通手机号则自动送往外部中继。4.3 用拨号计划把路“指”出去拨号计划Dialplan是 FreeSWITCH 最核心的模块负责决定一个号码该怎么处理。默认配置里所有规则都在dialplan/default.xml中。我给内部呼叫设定的规则很简单三位分机号直接桥接。对应的 XML 是extension nameinternal condition fielddestination_number expression^(10[0-9][0-9]?)$ action applicationbridge datauser/$1/ /condition /extension外呼规则我定义成号码以 0 或 9 打头时去掉前缀后交给外部网关。例如拨0 13800138000先剥掉 0再把13800138000发给运营商extension nametrunk_out condition fielddestination_number expression^0(1[3-9][0-9]{9})$ action applicationbridge datasofia/gateway/voip-provider/$1/ /condition /extension如果你不想让用户练拨号时手抖多按一个数字还可以在桥接前加一个sleep或者提示音这些都属于锦上添花。拨号计划的重点在于条件字段和正则表达式正则写对了剩下的就是自由组合。4.4 进阶能力IVR、语音信箱、通话录音基础电话能打通之后就可以考虑加一些常见的企业功能了。IVR 自动话务在 FreeSWITCH 里实现方式很简单。我配置了一个虚拟总机号码 8000用户拨进去后播放欢迎语音然后等待用户按 1 转销售按 2 转技术。核心动作是play_and_get_digits先播放语音菜单再收集用户按键extension nameivr_main condition fielddestination_number expression^8000$ action applicationanswer/ action applicationplay_and_get_digits data2 5 3 5000 # /ivr/welcome.wav /ivr/invalid.wav menu 1 \d/ action applicationtransfer data$1 XML default/ /condition /extension这里的参数分别是最多等 2 位数字、5 秒超时、最多重试 3 次、允许 5000 毫秒间隔等等。语音文件存放在/var/lib/freeswitch/recordings/ivr/目录下可以是系统生成的 wav也可以自己用 TTS 合成。语音信箱配置就更容易了。FreeSWITCH 自带 voicemail 模块只要在分机变量的user_context设置为default再配置好邮箱密码没人接听时会自动转入语音信箱。用户可以在分机上按*加邮箱密码查留言。通话录音在 FreeSWITCH 中属于媒体处理能力我喜欢在对外呼叫的拨号计划里加一行action applicationrecord_session data/var/lib/freeswitch/recordings/${strftime(%Y-%m-%d)}/${uuid}.wav/每天一个目录文件名用会话 UUID 避免重复。这样生成的录音文件可以挂载给 NAS 上的其他软件做进一步审计。5. 给FreeSWITCH配一个“看得见”的图形化界面5.1 现成GUI方案对比我为什么没用FusionPBXFreeSWITCH 的官方定位是底层通信引擎默认没有任何图形界面。这句话意味着你完全可以靠配置文件完成所有功能但日常运维还得靠命令行。所以我在这个系列里一直在尝试不同的图形化方案。先把现成方案都摆出来比较一下。方案功能完整性部署复杂度适合场景FusionPBX高几乎覆盖所有PBX功能高需要PHP/数据库/Nginx需要完整商业话务台的大型项目厂商自带GUI受厂家限制视产品而定买设备附带的Web管理轻量Web面板中等偏监控和CDR低一个容器搞定中小团队日常维护纯命令行无无熟悉FreeSWITCH的技术人员FusionPBX 确实功能全面但它的数据库表结构非常复杂一旦出现 CDR 数据异常排查成本比 FreeSWITCH 本身还高。我的观点是如果你只管 50 部以内分机用轻量面板更合适。这也是本系列前面几十篇一直贯穿的主线不要为了图形化而图形化要看它能不能减少我们的日常操作量。5.2 轻量Web面板的部署方式这次部署的轻量面板我给它起名叫fs_panel。后端用 Node.js 写通过 ESL 连接 FreeSWITCH 的 8021 端口订阅注册事件和通道事件前端是一个简单的静态页面展示注册分机列表、活动通话和最近的 CDR 记录。部署方式同样用 Docker Compose 扩展加一个服务fs_panel: image: your-registry/fs_panel:latest container_name: fs_panel network_mode: host restart: unless-stopped environment: FS_ESL_HOST: 127.0.0.1 FS_ESL_PORT: 8021 FS_ESL_PASSWORD: 你的ESL密码如果你的 fs_panel 镜像放在私有仓库把your-registry换成实际地址即可。如果不打算自己构建镜像也可以在宿主机上用 Node.js 直接跑源码环境变量同理。在启动面板之前要先把 FreeSWITCH 的 ESL 密码改掉默认的ClueCon人尽皆知直接暴露在局域网里相当于把控制权交出去。修改位置在autoload_configs/event_socket.conf.xml:param namepassword value你的强密码/ param namelisten-ip value127.0.0.1/ param namelisten-port value8021/因为 fs_panel 和 FreeSWITCH 都跑在同一个宿主机上listen-ip保持127.0.0.1就够了这样其他机器无法直接访问 ESL 端口安全性会好很多。5.3 面板里能做什么状态、CDR和在线呼叫监控面板部署好之后浏览器直接访问 NAS 的 IP比如http://192.168.1.88:8080。首页默认展示分机注册状态哪部分机在线、Mac 地址、注册 IP 和 UA 信息都一目了然。活动通话页面会实时列出当前通话双方的信息以及通话时长。这个页面不是我硬凑的它本质上是把 FS 的事件订阅下来后映射成表格技术上不复杂但实用性非常高。比如销售团队打电话说“终端怎么突然卡了”管理员瞄一眼面板立刻能知道当前哪几路通话占着并发数。CDR 页面读取的是通话话单数据。FreeSWITCH 默认会生成 CSV 格式的 CDR但用面板查更直观。我是利用mod_json_cdr把话单以 JSON 格式推送给面板后端settings param nameurl valuehttp://127.0.0.1:8080/cdr/ param nameencode valuetrue/ /settings这样每一个通话结束后CDR 会自动推送到面板面板再写入一个 SQLite 数据库。后续按日期、主叫、被叫翻查历史记录都很快。面板右侧还有一个快速操作区可以发起点对点呼叫测试、挂断指定通道、重启某个模块。这是通过 ESL 执行originate和uuid_kill指令实现的和 fs_cli 里敲命令等效。如果后期想让普通行政人员也能操作只需要在面板里隐藏掉这些高级按钮就行。6. 部署和运维中的高频坑与排查心得6.1 容器起不来或端口不通我遇到过不少读者反馈配置都照着写了但容器就是起不来或者起来了分机注册不上。先说容器起不来的常见原因。第一是挂载目录权限问题。前面提到过FreeSWITCH 容器内用户可能无法写入挂载目录。如果日志目录没有写权限进程会在启动时直接退出。排查方法就是看docker logs freeswitch有没有Permission denied字样。第二是端口冲突。如果你这台 NAS 之前装过 Asterisk 或者别的 SIP 服务5060 端口可能被占用。使用 host 网络模式下端口冲突很致命因为容器不会主动跳过占用端口。用ss -lunp查一下 5060 端口是否被监听即可。第三是防火墙。即使飞牛页面里没开防火墙系统底层的 nftables 也可能有默认策略。我自己就遇到过 Alpine 镜像里没装iproute2但系统防火墙仍然拦截非 80/443 端口的情况。解决办法是在飞牛防火墙设置里显式放行 UDP 5060、UDP 16384-32768、TCP 8021 和 8080。6.2 SIP注册失败排查思路SIP注册失败是 FreeSWITCH 最常见的运维问题。注册失败返回的代码不同含义也不同。我遇到最多的几个SIP错误码含义常见原因401 Unauthorized密码错误分机密码未修改或软电话填错403 ForbiddenACL拒绝客户端IP不在ACL允许范围404 Not Found分机不存在分机号未创建或域名不匹配423 Interval Too Brief注册间隔太短软电话注册频率过高478 Unresolvable IPIP无法解析DNS错误或NAT配置导致IP不对排查之前最好先抓包确认问题出在“没收到请求”还是“收到请求但拒绝”。在 NAS 上可以用tcpdump -i any udp port 5060 -n抓 5060 端口报文。如果抓包看到请求但没有响应大概率是防火墙拦了如果看到响应是 403那基本就是 ACL 没放行客户端 IP。一个容易踩坑的点是分机注册时填写的域名。FreeSWITCH 在vars.xml里定义了domain默认可能指向 127.0.0.1如果你没有改成 NAS 的实际 IP软电话会把请求发到 127.0.0.1自然注册不上。建议所有软电话都直接使用服务器 IP 作为认证域名。6.3 RTP单通与NAT问题“分机注册成功拨号也能建立但双方都没声音”或者“只能听到一方声音”这是典型的媒体流RTP问题。大多数情况下是因为 RTP 包被防火墙挡住了或者 NAT 转换把媒体流的 IP 和端口搞错了。在 host 网络模式下NAT 问题少很多因为你不需要做容器端口映射。但我之前在别的设备上用 bridge 模式踩过坑一旦数据包从容器内部经过 NAT 出去FreeSWITCH 会认为本地 IP 是容器的内网 IP比如 172.17.0.2对端往这个 IP 发 RTP 肯定找不到主机。解决思路有两条。一是在vars.xml里把external_rtp_ip和external_sip_ip明确设置成宿主机局域网 IP。二是在 SIP Profile 里增大超时时间避免 RTP 超时过快导致通话中断。如果后续有公网分机接入还要在路由器上把5060和16384-32768端口映射到 NAS 上才能保证媒体流往返正常。我这边实际配置后本地局域网软电话通话稳定延迟在正常范围内CPU 占用也很低。如果遇到偶尔单通可以先看show channels as json里每个通道的ceid和rdest确认 RTP 地址是否指向了正确的客户端。6.4 fnOS重启后服务不恢复飞牛NAS的 Docker 容器重启策略在这里很关键。如果你在 Docker 管理界面里创建容器时没有把“自动重启”打开那么 NAS 断电重启之后 FreeSWITCH 是不会自己起来的。而电话系统这种基础服务一旦因为重启没恢复第二天上班就等着被同事骂吧。使用 Docker Compose 时我在 compose 文件里写了restart: unless-stopped这样只要 Docker 服务启动容器就会自动跟着启动。但只做到这一步还不够我还配了一个 crontab 检查*/5 * * * * /usr/bin/docker ps | grep freeswitch || /usr/bin/docker start freeswitch这个定时任务每 5 分钟检查一次如果容器意外停止自动拉起来。虽然有点“土”但在没有上 K8s 之前这种守护脚本反而最可靠。6.5 几个容易被查到的冷门问题和本次部署的关联顺着标题里那几个热搜词我也说一下我在排查中看到的关联问题。第一个是gen8 安装fnos无法从硬盘启动。这台 Gen8 上我遇到过的实际现象是用 U 盘做启动盘安装完飞牛拔掉 U 盘后系统找不到引导一直卡在 BIOS 界面。原因是安装时引导程序被写进了 U 盘而不是内置硬盘。解决办法是在安装页面确认引导安装目标选中内置硬盘或者用 Ventoy 引导时留意安装盘和启动盘不是同一个设备。如果已经装坏了可以用 Live 系统启动后执行efibootmgr修正启动项。第二个是WSL2安装图形化界面。WSL2 确实能跑 FreeSWITCH也能用 WSLg 跑图形界面但 Windows 上的网络模式处理起来麻烦特别是 UDP 端口转发。相比起来直接用飞牛NAS部署反而更接近真实的 Linux 生产环境这也是我这次把重心放在 fnOS 上的原因之一。第三个是datax图形化界面这个和数据同步工具相关和 FreeSWITCH 本身没有直接联系但延伸出一个思路任何服务都可以用“核心引擎 轻量 Web 管理”的模式来落地。数据同步工具如此电话交换机也如此。你只需要想清楚自己的核心需求是什么然后给用户一个可操作的界面即可。第四个是redis图形化界面。FreeSWITCH 的模块体系里其实也有 redis 相关模块可以缓存号码路由、共享分机状态。我在这个部署中还没有引入 redis但如果后续要横向扩容到多个节点redis 是一个很好的辅助组件。结尾再补几句实在话这套系统我现在已经稳定跑了两个月日常主要是内部分机互拨和少量外呼。最直观的感受是软件交换机在中小团队里完全够用成本也就是一台旧 NAS 的电费。飞牛NAS 借此从“存数据的设备”变成了“通信小机房”这是很多同期玩 NAS 的朋友没想到的。最后再分享一个小技巧部署完成后建议把conf/sip_profiles/internal.xml里分机注册的log-auth-failures参数打开开启后可以在日志里看到所有认证失败记录。这样如果有人用错误密码反复尝试连接你也能及时发现而不是等出了问题再翻日志。IPPBX 这东西功能调通只是开始稳定和可控才是长期价值。如果你也准备在 fnOS 上折腾 FreeSWITCH建议先把分机注册和中继配置跑通再逐步加录音和面板别一上来就全上否则出了问题连排查头绪都没有。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻