Emby轻量化反代面板Meridian:Debian一键部署教程
/ 15 min read
Table of Contents
Meridian 是什么
Meridian 是给 Emby / Jellyfin 用的反向代理面板,用 Go 写的一个二进制 + 内嵌 SQLite,没有任何外部依赖。它做的事情和 Nginx + 一个小管理后台差不多,但开箱即用:
- 多个 Emby / Jellyfin 实例统一接入,前端只暴露 Meridian 的端口
- 按域名前缀 / 子域名把请求路由到对应站点(一个站点对应一个 Emby / Jellyfin 实例)
- 每站点流量统计 + 请求日志(按域名 / 客户端 IP / 路径聚合)
- TLS 一键签发(ACME),支持按子域名前缀自动路由到不同站点
- Telegram 日报:每天自动推送昨日流量 / 异常 / 各站点状态
- 全 Web 面板配置,开源、MIT 协议
部署架构
Meridian 跟你的 Emby / Jellyfin 部署在同一台 Debian 或不同机器都行 —— 它只要求能访问到后端的 HTTP 端口。生产里把它放 Nginx / Cloudflare 后面做 TLS 终结也行,但 Meridian 自己也能签发证书。
安装方式一:Docker(推荐)
如果你已经在用 Docker、希望环境隔离、升级和清理都一行命令搞定,推荐走这条路线。
compose.yml 示例:
services: meridian: image: chanhui800/meridian:latest container_name: meridian network_mode: host restart: unless-stopped volumes: - ./data:/opt/meridian # 数据持久化 environment: TZ: Asia/Shanghai # 可选:自定义端口 # MERIDIAN_PORT: 9090启动:
mkdir meridian && cd meridian# 把上面 compose.yml 写进去docker compose up -ddocker compose logs -f meridian
数据在 ./data/,升级镜像不会丢。后续更新:
docker compose pull meridiandocker compose up -d安装方式二:原生脚本
官方提供了一行脚本,会自动装到 /opt/meridian,注册 systemd 服务,开机自启。
1. 一键安装
curl -fsSL https://raw.githubusercontent.com/chanhui800/Meridian/main/scripts/install.sh | sudo bash装完后 Meridian 监听 0.0.0.0:9090,数据目录在 /opt/meridian,日志在 /opt/meridian/logs/。
2. 验证服务
sudo systemctl status meridian # 应该是 active (running)sudo journalctl -u meridian -f # 实时看日志curl -I http://127.0.0.1:9090/ # 应该回 200 或 3023. 放行防火墙(如果开了 ufw)
sudo ufw allow 9090/tcp4. 首次访问 + 初始化
浏览器打开 http://<服务器IP>:9090/,第一次会强制让你设置一个 SETUP_TOKEN(用于保护后续 API 调用)。
# 命令行查看初始 token(也用于 API 自动化)sudo cat /opt/meridian/setup_token把这个 token 填进页面,建好管理员账号后就能进面板:
添加第一个站点
进面板后第一步是添加站点,把上游 Emby / Jellyfin 接入。
- Sites → Add Site
- 填:
- Name:随便起,比如
emby-main - Listen Prefix:域名访问前缀,留空就是根路径(
/),填了之后只匹配该前缀- 例:填
/emby/,则https://你的域名/emby/走这个站点
- 例:填
- Upstream URL:上游 Emby/Jellyfin 的完整地址,例如
http://10.0.0.5:8096 - Mode:
reverse(反代,自动转发请求头)或direct(仅做访问网关,Emby 自己处理静态资源)
- Name:随便起,比如
- 保存。
下面是 Add Site 对话框的完整面板(v1.8.33 实拍):
面板字段速查:
| 字段 | 默认 / 推荐 | 含义 |
|---|---|---|
| 主回源地址 | upstream URL + 端口 | 含 :443 时自动按 HTTPS 回源,其他端口默认 HTTP |
| 入口模式 | 域名前缀(推荐) | 域名前缀模式走面板端口转发,不会绑额外端口 |
| 独立端口 | 留空 | 域名前缀模式共享面板端口;填了会另外起监听端口 |
| 域名前缀 | 空(默认) | 留空表示访问面板根路径;填了之后只有 https://<域名>:<面板端口>/前缀 走这个站点 |
| 主机源固定请求头 | — | UPSTREAM_HEADER_KEY 加密保存的请求头配合项,只发回精确协议 + 域名 + 端口的协议协商 |
| UA 模式 | 透传(保留客户端身份) | 透传 = 把客户端的真实 UA 透到上游;脱敏 = Meridian 改写后送上游 |
| 主视频流策略 | 反代 | 反代:直达 CDN / 网盘 302 等异常会被校正到 307 走 Meridian;直连:自动判内网 / localhost / 链路本地,回源始终直连 |
| 缓存图片与静态资源 | 关闭 | 关闭则一律不缓存;开启后仅缓存 图片 / CSS / JS / 字体 / WASM,视频 / 音频 / HLS / DASH / Range 请求 / 带 Set-Cookie 的响应永不缓存 |
保存后,用 https://<Meridian IP>:9090/ 应该就能看到 Emby 的登录页了。
一个站点对应一个 Emby / Jellyfin 上游,面板会显示它的健康状态(online / offline + 延迟)。要接多台服务器,就新建多个站点、各自填自己的上游地址即可 —— Meridian 没有「单站点负载均衡到多个后端」的概念。
进阶:HTTPS / 域名前缀
1. 启用 ACME 自动签发
进入 Settings → TLS,手动证书和 ACME 在同一页配置:
Settings → TLS → ACME:
- Email:用于 Let’s Encrypt 账号
- Domains:逗号分隔多个域名
- 勾 Auto Renew
签完证书后 Meridian 直接监听 443,全站 HTTPS 生效。
2. 用子域名前缀路由
Meridian 支持按访问的子域名 / 前缀自动选站点,例如:
https://emby.example.com/→ 站点 Ahttps://jf.example.com/→ 站点 B
每个站点的 Listen Prefix 配置对应:
- 站点 A:
/ - 站点 B:
/(如果监听子域名路由,由 Meridian 根据请求 Host 头自动选)
更灵活的做法是把 Meridian 放在 Cloudflare 后面、用 Cloudflare 的 Origin Rules 区分,Meridian 端只配站点对应前缀。
进阶:Telegram 日报
Settings → Notifications → Telegram:
- 给 @BotFather 发
/newbot,拿到 bot token - 给 bot 私聊发一条消息,然后访问
https://api.telegram.org/bot<TOKEN>/getUpdates拿到 chat_id - 填入面板:
- Bot Token
- Chat ID
- Daily Report:勾上,每天上午 9 点(你设置的 TZ)推送
- 测试按钮看 bot 是否能正常推消息
日报内容示例:
📊 Meridian 日报 - 2026-08-12━━━━━━━━━━━━━━━━━━总流量:13.7 GB请求数:48,219活跃站点:3/3故障站点:无Top 3 站点: emby-main 7.2 GB 29k req jf-test 4.1 GB 12k req archive 2.4 GB 7k req异常请求:12 次(4xx/5xx 占比 0.025%)
进阶:流量 / 日志查看
流量面板
Stats → Traffic:
- 按小时 / 天 / 周聚合
- 按站点 / 客户端 IP / 路径筛选
- 导出 CSV
请求日志
Stats → Logs:
- 实时滚动所有经过 Meridian 的请求(method / path / status / 耗时 / 客户端 IP / 命中站点)
- 支持搜索(路径、IP、状态码)、分页、导出
全局设置速览
Settings → Global 里能改的:
- 监听端口:默认 9090,改完要重启 Meridian
- TLS 模式:
off/acme/manual - 认证:管理员账号、强制 2FA、登录失败锁定阈值
- API Token:用于自动化调 Meridian API(创建站点、改配置、拉统计)
- 数据保留:流量日志 / 请求日志保留多久(默认 30 天,老的自动清理)
- 备份 / 导出:一键下载整个 SQLite 数据库(含站点配置、账号、统计)
升级 / 排错
升级
原生脚本装的方式:
curl -fsSL https://raw.githubusercontent.com/chanhui800/Meridian/main/scripts/install.sh | sudo bash# 脚本会自动停旧进程、备份数据、装新版本Docker 装的:
docker compose pull meridiandocker compose up -d升级过程中 /opt/meridian/data/meridian.db 不会被覆盖,配置全保留。
排错清单
| 症状 | 排查 |
|---|---|
| 服务起不来 | journalctl -u meridian -n 100 --no-pager / docker compose logs meridian 看启动错误,常见是端口被占、SQLite 锁 |
| 客户端 IP 全是 bridge | Docker 方式下忘加 network_mode: host |
| ACME 签证书失败 | 确认 443 端口能从公网访问、A 记录已生效、ufw 没拦 |
| 站点一直显示 offline | 上游 Emby/Jellyfin 是否监听 0.0.0.0 而不是 127.0.0.1?防火墙是否放行? |
| 面板很卡 | SQLite 文件太大(>1 GB),用 Settings → Data Retention 清理老日志,或删 /opt/meridian/data/meridian.db 重建(会丢所有配置和统计) |
常用环境变量
原生脚本支持的环境变量(写在 /etc/default/meridian 或 docker-compose.yml 的 environment 里):
| 变量 | 默认值 | 说明 |
|---|---|---|
MERIDIAN_PORT |
9090 |
监听端口 |
MERIDIAN_DB |
/opt/meridian/data/meridian.db |
SQLite 数据库路径 |
MERIDIAN_LOG_DIR |
/opt/meridian/logs |
日志目录 |
TZ |
UTC |
时区(影响日报推送时间和时间戳) |
GIN_MODE |
release |
Gin 框架日志级别,debug 会有请求日志刷屏 |
性能参考(实测)
部署实例:Meridian 装在一台 2C/4G 上海云服务器上,反代一台 CF CDN 后面的 Emby 服务器,客户端在重庆联通。测了一个典型场景:
实际速度取决于哪些因素:
| 瓶颈来源 | 影响 |
|---|---|
| 代理机(Meridian 所在机器)的上行带宽 | 家用宽带的上传通常只有 30–50 Mbps,反代出去客户端最高就跑这点 |
| 客户端到代理机的网络线路 | 同省/同运营商 100+ MB/s 很正常;跨运营商/跨省(联通↔电信、移动↔电信这种历史互通问题)会掉到几 MB/s |
| TLS 加密 | 现代 CPU 不构成瓶颈;老机器没 AES-NI 才有感 |
| 媒体源(Emby / Jellyfin 后端)的磁盘 IO | 4K Remux 级别要 SSD / NAS RAID,机械盘多并发就卡 |
| 路径规则 / 缓存命中 | 大文件首次直连源站可能被限速;命中 Meridian 缓存后走代理机本地磁盘 |
几个实际经验:
- 家用场景 10–50 MB/s(80–400 Mbps)就够看绝大多数 1080p / 4K HDR,不必照搬上面的实测数字。
- 实际上大多数 Emby / Jellyfin 服务器都在海外(除非自建内网 NAS),所以跨海访问才是常态。重点看代理机的回程线路——电信 CN2、联通 CUG、移动 CMI 各家延迟和带宽天差地别。走 CF CDN 中转时,CF 边缘 PoP 是否命中本地也会显著影响速率。
- 反代对媒体流最大的价值不是带宽放大,而是 统一入口 + 多站点路由 + 流量统计 + Telegram 通知,带宽只是顺带的事。
写在最后
Meridian 的好处是完全自托管、无任何云依赖、单文件部署。如果你已经在用 Emby / Jellyfin、又有多台实例要统一管理 / 想加访问统计 / 想用 Telegram 通知,5 分钟就能装起来体验一下。
缺点也直说:UI 还比较朴素(毕竟是个 Go 单文件项目),遇到边缘 case 可能在 GitHub issue 才有解,文档不算完整 —— 但源码可读、社区活跃,核心功能稳定。
部署有坑或遇到问题,欢迎评论区交流。