Make NAS frpc run in Container Station

- Add a NAS-specific frpc template that forwards to tuwen_web:80 over the compose network.

- Make docker-compose-Nas.yaml create tuwen_frpc by default instead of relying on Compose profiles, which Container Station may not enable.

- Remove host networking from the NAS frpc service so the tunnel works through Docker service DNS.

- Update README and Docker docs to explain the NAS frpc behavior and logs command.
This commit is contained in:
2026-05-09 04:04:59 +08:00
parent e159d18f01
commit ba14d00c4d
4 changed files with 38 additions and 17 deletions

View File

@@ -245,7 +245,7 @@ docker-compose down
- Docker 前端同时暴露 `http://localhost:4002` 和自签名证书的 `https://localhost:4443`;麦克风听写建议使用 HTTPS 演示入口。 - Docker 前端同时暴露 `http://localhost:4002` 和自签名证书的 `https://localhost:4443`;麦克风听写建议使用 HTTPS 演示入口。
- `api` 服务运行 NestJS 后端,启动时默认执行 `prisma migrate deploy``prisma db seed`,并把上传文件目录挂载到 `uploads_data` volume。 - `api` 服务运行 NestJS 后端,启动时默认执行 `prisma migrate deploy``prisma db seed`,并把上传文件目录挂载到 `uploads_data` volume。
- `db` 服务运行 PostgreSQL 16。 - `db` 服务运行 PostgreSQL 16。
- `frpc` 服务是可选公网隧道客户端。`# XXX` 默认通过 Compose profile 关闭,配置文件在 `frpc/frpc.toml`,需要映射到公网服务器时再启用 - `frpc` 服务是可选公网隧道客户端。`# XXX` 默认 Docker Compose 通过 profile 关闭,配置文件在 `frpc/frpc.toml`NAS 版为了适配 Container Station 图形界面会默认创建 `tuwen_frpc`,读取 `frpc/frpc.nas.toml`
- `nginx.conf` 已配置 SPA 路由回退、`/api` 反向代理和 `100m` 请求体上限。 - `nginx.conf` 已配置 SPA 路由回退、`/api` 反向代理和 `100m` 请求体上限。
- `nginx.conf` 已支持 `/api/speech/iat` WebSocket upgrade。 - `nginx.conf` 已支持 `/api/speech/iat` WebSocket upgrade。
完整 Docker 说明见 [docs/docker.md](./docs/docker.md)。 完整 Docker 说明见 [docs/docker.md](./docs/docker.md)。
@@ -260,7 +260,7 @@ docker-compose down
- API 默认映射到 NAS 宿主机 `4102`,前端仍映射到 `4002` - API 默认映射到 NAS 宿主机 `4102`,前端仍映射到 `4002`
- 保留 `api` 网络别名,确保容器内 Nginx 可以继续把 `/api` 代理到后端。 - 保留 `api` 网络别名,确保容器内 Nginx 可以继续把 `/api` 代理到后端。
- 使用 `127.0.0.1` 做 API 健康检查,规避部分 NAS 固件上的 IPv6 localhost 解析问题。 - 使用 `127.0.0.1` 做 API 健康检查,规避部分 NAS 固件上的 IPv6 localhost 解析问题。
- 内置可选 `frpc` profile可复用 [frpc/frpc.toml](./frpc/frpc.toml)`4002` 映射到公网服务器 - 默认创建 `tuwen_frpc` 容器,读取 [frpc/frpc.nas.toml](./frpc/frpc.nas.toml),把容器内 `tuwen_web:80` 映射到公网服务器;如果不需要公网映射,可删除或注释 `tuwen_frpc` 服务
NAS 终端部署: NAS 终端部署:
@@ -289,12 +289,12 @@ HTTPS_PROXY=http://PROXY_IP:PROXY_PORT
NO_PROXY=localhost,127.0.0.1,LAN_CIDR,tuwen_db,tuwen_api,tuwen_web,api,db,web NO_PROXY=localhost,127.0.0.1,LAN_CIDR,tuwen_db,tuwen_api,tuwen_web,api,db,web
``` ```
启用 NAS 上的 frpc 隧道: NAS 上的 frpc 隧道:
```bash ```bash
# XXX 先编辑 frpc/frpc.toml替换 serverAddr 和 auth.token。 # XXX 先编辑 frpc/frpc.nas.toml替换 serverAddr 和 auth.token。
docker compose -f docker-compose-Nas.yaml --profile frpc up -d --build docker compose -f docker-compose-Nas.yaml up -d --build
docker compose -f docker-compose-Nas.yaml logs -f frpc docker compose -f docker-compose-Nas.yaml logs -f tuwen_frpc
``` ```
`# XXX` NAS 公网访问仍然只需要把 `4002` 通过 frpc 映射到公网服务器,再由 Nginx Proxy Manager 给 `your-domain.example` 提供 HTTPS。`4443` 仍只是本机自签名 HTTPS 演示入口,不建议映射到公网域名。 `# XXX` NAS 公网访问仍然只需要把 `4002` 通过 frpc 映射到公网服务器,再由 Nginx Proxy Manager 给 `your-domain.example` 提供 HTTPS。`4443` 仍只是本机自签名 HTTPS 演示入口,不建议映射到公网域名。

View File

@@ -98,17 +98,15 @@ services:
timeout: 5s timeout: 5s
retries: 6 retries: 6
frpc: tuwen_frpc:
# XXX 可选公网隧道客户端。启用前先编辑 frpc/frpc.toml # XXX 威联通 Container Station 通常不会启用 Compose profiles所以 NAS 版默认启动 frpc
# XXX 启用前先编辑 frpc/frpc.nas.toml如果不需要公网映射可删除/注释整个 tuwen_frpc 服务。
image: snowdreamtech/frpc:latest image: snowdreamtech/frpc:latest
container_name: tuwen_frpc container_name: tuwen_frpc
restart: unless-stopped restart: unless-stopped
network_mode: host
command: ["frpc", "-c", "/etc/frp/frpc.toml"] command: ["frpc", "-c", "/etc/frp/frpc.toml"]
volumes: volumes:
- ./frpc/frpc.toml:/etc/frp/frpc.toml:ro - ./frpc/frpc.nas.toml:/etc/frp/frpc.toml:ro
depends_on: depends_on:
tuwen_web: tuwen_web:
condition: service_healthy condition: service_healthy
profiles:
- frpc

View File

@@ -88,15 +88,15 @@ TRUST_PROXY=true
CORS_ORIGIN=http://NAS_IP:4002,https://your-domain.example CORS_ORIGIN=http://NAS_IP:4002,https://your-domain.example
``` ```
启用 NAS 上的 frpc 隧道: NAS 上的 frpc 隧道:
```bash ```bash
# XXX 先编辑 frpc/frpc.toml替换 serverAddr 和 auth.token。 # XXX 先编辑 frpc/frpc.nas.toml替换 serverAddr 和 auth.token。
docker compose -f docker-compose-Nas.yaml --profile frpc up -d --build docker compose -f docker-compose-Nas.yaml up -d --build
docker compose -f docker-compose-Nas.yaml logs -f frpc docker compose -f docker-compose-Nas.yaml logs -f tuwen_frpc
``` ```
`# XXX` 公网正式入口只映射 `4002` 即可;不要把 `4443` 自签名 HTTPS 演示端口映射为公网域名入口。公网 HTTPS 应由 Nginx Proxy Manager 提供。 `# XXX` NAS 版为了适配 Container Station 图形界面会默认创建 `tuwen_frpc`,不依赖 Compose profile如果不需要公网映射可删除或注释 `docker-compose-Nas.yaml` 中的 `tuwen_frpc` 服务。公网正式入口只映射 `4002` 即可;不要把 `4443` 自签名 HTTPS 演示端口映射为公网域名入口。公网 HTTPS 应由 Nginx Proxy Manager 提供。
## 初始化开关 ## 初始化开关

23
frpc/frpc.nas.toml Normal file
View File

@@ -0,0 +1,23 @@
# XXX QNAP/NAS frpc template.
# XXX Replace serverAddr and auth.token before deploying; do not commit real production tokens.
# XXX This file is mounted by docker-compose-Nas.yaml. frpc connects to tuwen_web:80 inside Docker.
# 基础连接配置
serverAddr = "XX.XX.XX.XX"
serverPort = 7000
# 权限验证 - 必须与服务端一致
auth.method = "token"
auth.token = "XXX"
# 传输配置优化
transport.poolCount = 5
transport.heartbeatTimeout = -1
# --- 映射 图文系统访问端口 (TCP) ---
[[proxies]]
name = "TuWen_System_V2"
type = "tcp"
localIP = "tuwen_web"
localPort = 80
remotePort = 4002