zhaozhengde/fmo-gateway-linux-v2

By zhaozhengde

Updated 4 days ago

Image
Networking
0

166

zhaozhengde/fmo-gateway-linux-v2 repository overview

FMO Gateway Linux V2

FMO Gateway Linux V2 是一个轻量级的 FMO WebSocket 网关,适用于 Linux、NAS 和 Docker 环境。

它可用于转发以下 FMO 通道:

  • audio 音频通道
  • events 事件通道
  • ws 命令通道

同时提供:

  • Web 配置页面
  • 运行状态接口
  • 健康检查接口
  • Docker 部署支持
  • Docker Compose 部署支持
  • 多架构镜像

支持架构

当前镜像支持:

  • linux/amd64
  • linux/arm64
  • linux/arm/v7

快速开始

docker run -d \
  --name fmo-gateway \
  --restart unless-stopped \
  -p 8089:8089 \
  -v "$PWD/config:/app/config" \
  -e CONFIG_PATH=/app/config/config.json \
  zhaozhengde/fmo-gateway-linux-v2:latest

启动后访问:

http://localhost:8089/

默认登录信息:

用户名:admin
密码:admin888

Important

请在首次部署后立即修改默认密码。

1. 默认配置文件

创建配置文件:

config/config.json

默认内容如下:

{
  "version": 1,
  "display_callsign": "NOCALL",
  "fmo": {
    "host": "192.168.3.165",
    "scheme": "ws",
    "audio_url": "",
    "events_url": "",
    "cmd_url": ""
  },
  "web": {
    "listen": "0.0.0.0:8089",
    "user": "admin",
    "password": "admin888",
    "auth_websocket": false
  },
  "upstream": {
    "reconnect_interval_ms": 3000,
    "network_timeout_ms": 10000,
    "write_timeout_ms": 5000
  },
  "gateway": {
    "max_clients_per_channel": 1024,
    "client_send_queue": 128,
    "broadcast_queue": 1024,
    "drop_slow_client": true
  }
}

2. 必须修改的配置

通常只需要修改 FMO 上游服务地址:

"host": "192.168.3.165"

将它改成你的 FMO 服务地址,例如:

"host": "192.168.1.100"

程序会自动生成以下上游 WebSocket 地址:

ws://192.168.1.100/audio
ws://192.168.1.100/events
ws://192.168.1.100/ws

3. 配置字段说明

version

配置文件版本:

"version": 1

通常保持默认即可。

display_callsign

Web 页面中显示的呼号或标识:

"display_callsign": "NOCALL"

可根据需要改成自己的呼号。


fmo.host

FMO 上游服务地址:

"host": "192.168.3.165"

audio_urlevents_urlcmd_url 留空时,程序会根据 host 自动生成:

ws://host/audio
ws://host/events
ws://host/ws
fmo.scheme

上游 WebSocket 协议:

"scheme": "ws"

可选值:

ws
wss

局域网普通部署通常使用:

"scheme": "ws"

通过 HTTPS 或安全 WebSocket 连接上游时,可以使用:

"scheme": "wss"
fmo.audio_url

音频通道完整地址:

"audio_url": ""

留空时自动生成:

ws://host/audio

也可以手动指定:

"audio_url": "ws://192.168.1.100/audio"
fmo.events_url

事件通道完整地址:

"events_url": ""

留空时自动生成:

ws://host/events

也可以手动指定:

"events_url": "ws://192.168.1.100/events"
fmo.cmd_url

命令通道完整地址:

"cmd_url": ""

留空时自动生成:

ws://host/ws

也可以手动指定:

"cmd_url": "ws://192.168.1.100/ws"

手动指定全部地址的示例:

{
  "fmo": {
    "host": "192.168.1.100",
    "scheme": "ws",
    "audio_url": "ws://192.168.1.100/audio",
    "events_url": "ws://192.168.1.100/events",
    "cmd_url": "ws://192.168.1.100/ws"
  }
}

web.listen

Web 服务监听地址:

"listen": "0.0.0.0:8089"

建议保持默认。

0.0.0.0 表示监听容器内所有网络接口,端口为 8089

不要改成:

"listen": "127.0.0.1:8089"

否则 Docker 容器外部可能无法访问 Web 页面和 WebSocket 服务。

web.user

Web 管理页面用户名:

"user": "admin"
web.password

Web 管理页面密码:

"password": "admin888"

默认登录信息:

admin / admin888

建议部署后立即修改默认密码。

web.auth_websocket

是否为下游 WebSocket 启用认证:

"auth_websocket": false

默认值为 false,表示下游客户端连接以下地址时不需要认证:

ws://网关IP:8089/audio
ws://网关IP:8089/events
ws://网关IP:8089/ws

启用认证:

"auth_websocket": true

启用后,下游 WebSocket 客户端需要提供 Basic Auth 认证信息。

Note

如果下游客户端不支持 WebSocket Basic Auth,请保持为 `false`。

upstream.reconnect_interval_ms

上游断线后的重连间隔,单位为毫秒:

"reconnect_interval_ms": 3000

表示断线后等待 3 秒重新连接。

upstream.network_timeout_ms

上游连接超时时间,单位为毫秒:

"network_timeout_ms": 10000

表示连接上游时,10 秒未成功则判定超时。

upstream.write_timeout_ms

命令通道写入超时时间,单位为毫秒:

"write_timeout_ms": 5000

gateway.max_clients_per_channel

每个 WebSocket 通道允许的最大下游客户端数量:

"max_clients_per_channel": 1024
gateway.client_send_queue

每个下游客户端的发送队列长度:

"client_send_queue": 128
gateway.broadcast_queue

内部广播队列长度:

"broadcast_queue": 1024
gateway.drop_slow_client

是否断开接收速度过慢的客户端:

"drop_slow_client": true

建议保持为 true

当某个客户端接收速度过慢、队列持续堆积时,程序会主动断开该客户端,避免影响整体音频流和其他连接。


4. Docker 部署

4.1 创建运行目录
mkdir -p fmo-gateway/config
cd fmo-gateway
4.2 创建配置文件

使用 nano

nano config/config.json

也可以使用其他文本编辑器。

粘贴默认配置后,至少修改:

"host": "你的 FMO 服务器 IP"

例如:

"host": "192.168.1.100"
4.3 启动容器
docker run -d \
  --name fmo-gateway \
  --restart unless-stopped \
  -p 8089:8089 \
  -v "$PWD/config:/app/config" \
  -e CONFIG_PATH=/app/config/config.json \
  zhaozhengde/fmo-gateway-linux-v2:latest

需要管理员权限时:

sudo docker run -d \
  --name fmo-gateway \
  --restart unless-stopped \
  -p 8089:8089 \
  -v "$PWD/config:/app/config" \
  -e CONFIG_PATH=/app/config/config.json \
  zhaozhengde/fmo-gateway-linux-v2:latest
4.4 查看容器状态
docker ps
4.5 查看运行日志
docker logs -f fmo-gateway
4.6 停止容器
docker stop fmo-gateway
4.7 重新启动容器
docker restart fmo-gateway
4.8 删除容器
docker rm -f fmo-gateway

配置文件保存在宿主机的 config 目录中,删除容器不会删除配置。

4.9 更新镜像
docker pull zhaozhengde/fmo-gateway-linux-v2:latest
docker rm -f fmo-gateway

然后重新执行启动命令。


5. Docker Compose 部署

创建文件:

docker-compose.yml

内容如下:

services:
  fmo-gateway:
    image: zhaozhengde/fmo-gateway-linux-v2:latest
    container_name: fmo-gateway
    restart: unless-stopped
    ports:
      - "8089:8089"
    volumes:
      - ./config:/app/config
    environment:
      CONFIG_PATH: /app/config/config.json

推荐目录结构:

fmo-gateway/
├── docker-compose.yml
└── config/
    └── config.json

启动:

docker compose up -d

旧版 Docker Compose:

docker-compose up -d

查看日志:

docker compose logs -f

或者:

docker logs -f fmo-gateway

停止并删除容器:

docker compose down

更新镜像并重新创建容器:

docker compose pull
docker compose up -d

6. 访问方式

假设部署机器的局域网 IP 是:

192.168.3.50
Web 管理页面
http://192.168.3.50:8089/

默认账号密码:

admin / admin888
健康检查
curl http://192.168.3.50:8089/healthz
状态 API
curl -u admin:admin888 \
  http://192.168.3.50:8089/api/state
下游 WebSocket 地址

音频通道:

ws://192.168.3.50:8089/audio

事件通道:

ws://192.168.3.50:8089/events

命令通道:

ws://192.168.3.50:8089/ws

7. 配置生效方式

通过 Web 页面修改

通过 Web 管理页面修改 FMO 地址后,上游连接会立即重新连接,通常不需要重启容器。

手动修改配置文件

如果手动修改了:

config/config.json

可以重启容器使配置生效:

docker restart fmo-gateway

也可以调用重新加载接口:

curl -u admin:admin888 \
  -X POST \
  http://127.0.0.1:8089/api/reload

远程调用时,将 127.0.0.1 替换为部署机器的 IP:

curl -u admin:admin888 \
  -X POST \
  http://192.168.3.50:8089/api/reload

8. 最小可用配置

如果只需要最基本的功能,可以使用以下配置:

{
  "fmo": {
    "host": "192.168.3.165",
    "scheme": "ws"
  },
  "web": {
    "listen": "0.0.0.0:8089",
    "user": "admin",
    "password": "admin888",
    "auth_websocket": false
  }
}

程序会自动补齐其他默认值。

Warning

HTTPS 页面不能连接 `ws://` 地址,否则浏览器会报 Mixed Content 错误。 当页面通过 HTTPS 访问时,WebSocket 必须使用 `wss://`。

10. 常见问题

Web 页面无法访问

检查容器是否运行:

docker ps

检查日志:

docker logs -f fmo-gateway

确认端口映射存在:

8089:8089

确认配置中的监听地址为:

"listen": "0.0.0.0:8089"
容器启动后立即退出

检查配置文件是否存在:

ls -l config/config.json

检查 JSON 格式是否正确:

python3 -m json.tool config/config.json

查看错误日志:

docker logs fmo-gateway
无法连接 FMO 上游

确认 fmo.host 地址正确:

"host": "192.168.1.100"

确认部署机器能够访问上游 FMO:

ping 192.168.1.100

确认上游 WebSocket 路径为:

/audio
/events
/ws
浏览器提示 Mixed Content

错误示例:

HTTPS 页面尝试连接不安全的 ws:// WebSocket

将:

ws://fmo.example.com/ws

改为:

wss://fmo.example.com/ws

更推荐前端根据页面协议自动选择:

const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
const socket = new WebSocket(`${protocol}//${window.location.host}/ws`);
下游客户端频繁断开

如果日志提示客户端发送队列过慢,可能是客户端处理速度不足。

可以检查:

"client_send_queue": 128,
"drop_slow_client": true

不建议轻易关闭 drop_slow_client,否则慢客户端可能影响整体转发性能。


11. 安全建议

  • 首次部署后立即修改默认账号和密码。
  • 不要将包含真实密码的 config.json 提交到公开仓库。
  • 建议通过防火墙限制 8089 端口的访问来源。
  • 通过公网访问时,建议使用 HTTPS、Cloudflare Tunnel 或反向代理。
  • 不需要公开 WebSocket 时,可在反向代理或防火墙中限制相关路径。
  • 开启 auth_websocket 前,请确认下游客户端支持 Basic Auth。
  • 定期更新 Docker 镜像。

Tag summary

Content type

Image

Digest

sha256:cae923d7e

Size

5.9 MB

Last updated

4 days ago

docker pull zhaozhengde/fmo-gateway-linux-v2:main