部署指南
推荐用 Docker Compose 部署,它会自动拉起控制面容器,并内置一个 local Agent。你不需要额外安装 Nginx。
新手一键部署
在 VPS 上执行:
curl -fsSL https://raw.githubusercontent.com/sakullla/nginx-reverse-emby/main/scripts/deploy-compose.sh | sh脚本会创建 nginx-reverse-emby/ 目录,下载 docker-compose.yaml,生成 .env 随机 token,创建 data/ 并启动服务。如果系统还没有 Docker Compose,脚本会询问后自动安装。
脚本会优先推荐你配置域名和 Cloudflare API Token:
- 已有域名且 DNS 已指向 VPS:输入面板域名,脚本会写入
NRE_PUBLIC_URL=https://面板域名,并自动创建https://面板域名 -> http://127.0.0.1:8080的面板自代理规则。 - 使用 Cloudflare:建议创建 API Token,不要使用 Global API Key;权限给
区域 / 区域 / 读取、区域 / DNS / 读取、区域 / DNS / 编辑,Zone Resources 只选择你的域名。填入 Token 后脚本会调用 Cloudflare API 在线校验它是否有效,失败时提示原因并允许重新粘贴(网络不可达时自动跳过)。 - 暂时没有域名:脚本会提示 HTTP 风险,并生成
NRE_PANEL_PUBLIC_PATH=/panel-随机字符串作为临时面板入口。随机路径不能替代 token 和 HTTPS,只适合临时部署。
可选参数:
curl -fsSL https://raw.githubusercontent.com/sakullla/nginx-reverse-emby/main/scripts/deploy-compose.sh | sh -s -- \
--dir nginx-reverse-emby \
--public-url https://panel.example.com \
--cf-token YOUR_CF_TOKEN \
--yes完整选项:--dir、--image、--timezone、--public-url、--cf-token、--non-interactive(关闭所有提问,用于 CI/cron)、--yes(跳过部署前确认)。等价环境变量:API_TOKEN、MASTER_REGISTER_TOKEN、CF_TOKEN、ACME_DNS_PROVIDER、NRE_NONINTERACTIVE=1。交互提问优先从 /dev/tty 读取,所以 curl ... | sh 仍能在 SSH 终端里正常弹出提问。
创建目录和下载配置
mkdir -p nginx-reverse-emby && cd nginx-reverse-emby
curl -O https://raw.githubusercontent.com/sakullla/nginx-reverse-emby/main/docker-compose.yaml
mkdir -p data最终目录结构:
nginx-reverse-emby/
├── docker-compose.yaml
└── data/ # 数据持久化目录配置环境变量
编辑 docker-compose.yaml 的 environment 部分:
environment:
API_TOKEN: ${API_TOKEN:?set API_TOKEN to a random 32+ character token}
MASTER_REGISTER_TOKEN: ${MASTER_REGISTER_TOKEN:?set MASTER_REGISTER_TOKEN to a random 32+ character token}
NRE_TIMEZONE: Asia/Shanghai # 时区,国内用户建议填这个
NRE_PANEL_PUBLIC_PATH: /panel-a1b2c3d4 # 无域名 HTTP 临时部署时可选| 变量 | 必填 | 说明 |
|---|---|---|
API_TOKEN | 是 | 登录面板和调用 API 的密码。用 32 位以上随机字符串,包含大小写字母和数字 |
MASTER_REGISTER_TOKEN | 否 | 远程 Agent 注册时用的令牌。不上多台机器可以不填,会自动回退到 API_TOKEN |
NRE_TIMEZONE | 否 | 面板时区,影响流量统计和计费周期的分界点。默认 UTC |
NRE_PANEL_PUBLIC_PATH | 否 | 无域名 HTTP 临时部署时的随机面板入口路径,例如 /panel-a1b2c3d4 |
更多配置项见 环境变量速查。
启动服务
docker compose up -d # 启动
docker compose ps # 看运行状态
docker compose logs -f # 实时日志(Ctrl+C 退出)默认 Compose 只监听 127.0.0.1:8080。首次登录从本机开一条 SSH 隧道:
ssh -L 8080:127.0.0.1:8080 root@<VPS IP>然后浏览器访问 http://127.0.0.1:8080,输入 API_TOKEN 登录。
健康检查接口:http://127.0.0.1:8080/panel-api/health
给面板自身启用 HTTPS
面板可以给自己提供 HTTPS。首次通过 SSH 隧道登录后,在 流量管理 → HTTP 规则 添加一条规则:
| 字段 | 示例 |
|---|---|
| Agent | local |
| 入口域名 | https://panel.example.com |
| 后端地址 | http://127.0.0.1:8080 |
| 启用规则 | 开 |
确认 DNS 已把 panel.example.com 指向 VPS,且防火墙放行 80/443。规则同步后,local Agent 会申请证书并把公网 HTTPS 流量转回本机控制面。
完成后建议在 docker-compose.yaml 中设置:
environment:
NRE_PUBLIC_URL: https://panel.example.com这样 join script 和 Agent 更新包 URL 会使用 HTTPS 面板地址。只有在你额外使用上游反代,并且上游会清洗并重写 X-Forwarded-* 头时,才开启 NRE_TRUST_FORWARDED_HEADERS: "true"。
如果你配置了 Cloudflare API Token:
environment:
ACME_DNS_PROVIDER: cf
CF_TOKEN: <Cloudflare API Token>创建 HTTPS 规则时会优先使用 DNS-01 申请证书,不要求 80 端口先能完成 HTTP-01 校验。Token 建议只授予 区域 / 区域 / 读取、区域 / DNS / 读取、区域 / DNS / 编辑,并限制到当前域名。
为什么用 host 网络?
默认 Compose 文件用 network_mode: host。原因是:你在面板里创建规则后,Agent 需要动态监听对应的端口。Docker bridge 网络在容器启动后无法再动态映射新端口。host 模式让容器直接共享宿主机网络栈,端口管理完全灵活。
WARNING
规则里填的端口会直接占用宿主机端口。确认这些端口没被其他程序占用,并在防火墙中放行。
数据目录
Compose 把所有数据保存在宿主机的 ./data 目录(容器内路径是 /opt/nginx-reverse-emby/panel/data)。
不要提交 data 目录
./data 包含 Agent Token、证书私钥等敏感信息。不要提交到 Git 仓库,不要上传到公共网盘。
切换数据库(可选)
默认 SQLite,零配置开箱即用。需要 PostgreSQL 或 MySQL 时:
PostgreSQL:
environment:
NRE_DATABASE_DRIVER: postgres
NRE_DATABASE_DSN: "postgres://nre:nre@postgres:5432/nre?sslmode=disable"MySQL:
environment:
NRE_DATABASE_DRIVER: mysql
NRE_DATABASE_DSN: "nre:nre@tcp(mysql:3306)/nre?parseTime=true&charset=utf8mb4"已有 SQLite 数据需要迁移?见 数据迁移。
关闭不需要的模块(可选)
environment:
NRE_TRAFFIC_STATS_ENABLED: "false"