这篇记录一个支持 IPv6 访问的 Nginx Proxy Manager(NPM)部署配置。核心思路很简单:需要被 HTTP/HTTPS 反代的容器统一接入同一个外部 Docker 网络 matrix,NPM 再通过多个宿主机端口把请求转发到容器内部的 443。
这种方式适合把 Synapse、JWT、LiveKit 等服务放在同一个 Docker 网络里,让 NPM 作为统一入口处理 HTTPS 代理。
注意,coturn 这类 TURN 服务不建议按普通 Web 服务接入 NPM。coturn 需要直接处理 3478/udp 和大范围 UDP 中继端口,更适合单独使用 network_mode: host,不要接入 matrix 网络,也不要交给 NPM 反代。
一、先创建 matrix 网络
在启动需要接入 matrix 的容器之前,先在宿主机终端手动创建一个供容器之间通信的 Docker 网桥:
docker network create matrix这个网络只需要创建一次。后续 NPM、Synapse、JWT、LiveKit 等需要互相访问的容器,都统一接入 matrix。
可以用下面的命令确认网络是否已经存在:
docker network ls | grep matrix如果已经能看到 matrix,就可以继续写 Compose 配置。
二、创建 docker-compose.yml
新建并编辑 docker-compose.yml:
nvim docker-compose.yml写入下面的配置:
services:
app:
image: 'docker.io/jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
# HTTP 端口
- '12332:80'
# 管理后台
- '81:81'
# HTTPS 端口:在 Docker 层面做非对称映射
# 12335 -> 443,Synapse 适用
- '0.0.0.0:12335:443'
- '[::]:12335:443'
# 12336 -> 443,JWT 适用
- '0.0.0.0:12336:443'
- '[::]:12336:443'
# 12337 -> 443,LiveKit 适用
- '0.0.0.0:12337:443'
- '[::]:12337:443'
# coturn 不写在这里。
# TURN 不是普通 HTTP/HTTPS 服务,不建议通过 NPM 转发。
# coturn 请单独使用 network_mode: host,直接监听宿主机端口。
# 下面这些 coturn 端口应在宿主机防火墙/云安全组/路由器里放行,
# 不要添加到 NPM 的 ports 里:
# - 3478/tcp
# - 3478/udp
# - 5349/tcp
# - 64000-64099/udp
# 如果公网入口在 RouterOS 软路由上,
# 就在 RouterOS 上把这些端口转发到 Docker 主机 10.20.20.8。
# IPv6 不做 dstnat,需要在 /ipv6 firewall filter 的 forward 链
# 放行转发到 coturn 的这些端口。为兼容内网访问公网域名,
# 可以不加 in-interface-list=WAN。
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- matrix
networks:
matrix:
external: true
name: matrix这里有三个重点:
matrix使用的是外部网络,所以 Compose 不会自动创建它,必须提前执行docker network create matrix。- HTTPS 端口同时写了
0.0.0.0和[::],分别用于 IPv4 和 IPv6 监听。 - coturn 不属于 NPM 反代配置的一部分,不要在 NPM 的
ports里添加3478、5349或64000-64099/udp。
三、启动 NPM
确认配置无误后启动:
docker compose up -d查看容器状态:
docker ps | grep nginx-proxy-manager查看日志:
docker logs -f nginx-proxy-manager管理后台访问地址:
http://服务器IP:81首次登录后,进入 NPM 后台添加 Proxy Host,并把目标服务地址指向同一个 matrix 网络里的容器名和端口。
四、端口对应关系
这份配置中的端口用途如下:
| 宿主机端口 | 容器端口 | 用途 |
|---|---|---|
12332 | 80 | HTTP 入口 |
81 | 81 | NPM 管理后台 |
12335 | 443 | Synapse HTTPS 入口 |
12336 | 443 | JWT HTTPS 入口 |
12337 | 443 | LiveKit HTTPS 入口 |
如果服务器防火墙、云安全组或路由器里有限制,需要同步放行这些端口的 IPv4 和 IPv6 入站访问。
五、注意事项
所有需要被 NPM 反代的 HTTP/HTTPS 容器,网络都统一接入 matrix。例如其他服务的 Compose 文件里也应使用类似配置:
networks:
matrix:
external: true
name: matrix服务本身再挂到这个网络:
services:
your-service:
networks:
- matrix这样 NPM 后台里就可以直接用容器名作为上游地址,避免跨网络访问失败。
coturn 是例外。它不要写成 ports 大范围映射,也不要挂到 matrix 网络里。单独部署 coturn 时,Compose 里直接写成下面这样:
services:
coturn:
image: coturn/coturn:latest
container_name: coturn
restart: unless-stopped
# 这里不要再写 ports,也不要把 coturn 接入 matrix 网络。
# network_mode: host 会让 coturn 直接使用宿主机网络栈。
# 容器内监听的 3478、5349 和 64000-64099/udp 就是宿主机上的端口。
# 需要在宿主机防火墙/云安全组/路由器里放行:
# - 3478/tcp
# - 3478/udp
# - 5349/tcp
# - 64000-64099/udp
# 如果公网入口在 RouterOS 软路由上,
# 就在 RouterOS 上把这些端口转发到 Docker 主机 10.20.20.8。
# IPv6 不做 dstnat,需要在 /ipv6 firewall filter 的 forward 链
# 放行转发到 coturn 的这些端口。为兼容内网访问公网域名,
# 可以不加 in-interface-list=WAN。
network_mode: host
volumes:
- /root/data/docker_data/coturn/etc/coturn/turnserver.conf:/etc/coturn/turnserver.conf
- /root/data/docker_data/coturn/etc/:/etc/
- /root/data/docker_data/coturn/var/run/turnserver.pid:/var/run/turnserver.pid也就是说,NPM 继续处理 Synapse、ntfy、LiveKit 这类 Web 服务;coturn 的 DNS 直接指向宿主机公网 IP,服务器防火墙直接放行 3478/tcp、3478/udp、5349/tcp 和 64000-64099/udp。