skip to content
苍狗苍狗Blog
Table of Contents

Meridian 是什么

Meridian 是给 Emby / Jellyfin 用的反向代理面板,用 Go 写的一个二进制 + 内嵌 SQLite没有任何外部依赖。它做的事情和 Nginx + 一个小管理后台差不多,但开箱即用:

  • 多个 Emby / Jellyfin 实例统一接入,前端只暴露 Meridian 的端口
  • 按域名前缀 / 子域名把请求路由到对应站点(一个站点对应一个 Emby / Jellyfin 实例)
  • 每站点流量统计 + 请求日志(按域名 / 客户端 IP / 路径聚合)
  • TLS 一键签发(ACME),支持按子域名前缀自动路由到不同站点
  • Telegram 日报:每天自动推送昨日流量 / 异常 / 各站点状态
  • 全 Web 面板配置,开源、MIT 协议
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
00K00KMIT

部署架构

部署架构一览

Meridian 跟你的 Emby / Jellyfin 部署在同一台 Debian 或不同机器都行 —— 它只要求能访问到后端的 HTTP 端口。生产里把它放 Nginx / Cloudflare 后面做 TLS 终结也行,但 Meridian 自己也能签发证书。


安装方式一:Docker(推荐)

如果你已经在用 Docker、希望环境隔离、升级和清理都一行命令搞定,推荐走这条路线。

compose.yml 示例:

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

启动:

Terminal window
mkdir meridian && cd meridian
# 把上面 compose.yml 写进去
docker compose up -d
docker compose logs -f meridian
实拍:从创建 compose.yml 到容器启动并打印初始化令牌

数据在 ./data/,升级镜像不会丢。后续更新:

Terminal window
docker compose pull meridian
docker compose up -d

安装方式二:原生脚本

官方提供了一行脚本,会自动装到 /opt/meridian,注册 systemd 服务,开机自启。

1. 一键安装

Terminal window
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. 验证服务

Terminal window
sudo systemctl status meridian # 应该是 active (running)
sudo journalctl -u meridian -f # 实时看日志
curl -I http://127.0.0.1:9090/ # 应该回 200 或 302

3. 放行防火墙(如果开了 ufw)

Terminal window
sudo ufw allow 9090/tcp

4. 首次访问 + 初始化

浏览器打开 http://<服务器IP>:9090/,第一次会强制让你设置一个 SETUP_TOKEN(用于保护后续 API 调用)。

Terminal window
# 命令行查看初始 token(也用于 API 自动化)
sudo cat /opt/meridian/setup_token

把这个 token 填进页面,建好管理员账号后就能进面板:

注册页:填用户名、密码、初始化令牌

添加第一个站点

进面板后第一步是添加站点,把上游 Emby / Jellyfin 接入。

  1. Sites → Add Site
  2. 填:
    • Name:随便起,比如 emby-main
    • Listen Prefix:域名访问前缀,留空就是根路径(/),填了之后只匹配该前缀
      • 例:填 /emby/,则 https://你的域名/emby/ 走这个站点
    • Upstream URL:上游 Emby/Jellyfin 的完整地址,例如 http://10.0.0.5:8096
    • Modereverse(反代,自动转发请求头)或 direct(仅做访问网关,Emby 自己处理静态资源)
  3. 保存。

下面是 Add Site 对话框的完整面板(v1.8.33 实拍):

添加站点对话框:站点名称 / 主回源地址( 自动 HTTPS)/ 入口模式(域名前缀推荐)/ 独立端口 / 域名前缀 / 主机源固定请求头 / UA 模式(透传 = 保留客户端身份)/ 主视频流策略(反代 或 直连)/ 缓存图片与静态资源 / 缓存规则

面板字段速查:

字段 默认 / 推荐 含义
主回源地址 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 在同一页配置:

TLS 设置:手动证书 + ACME 自动签发 + 数据 API TOKEN

Settings → TLS → ACME

  • Email:用于 Let’s Encrypt 账号
  • Domains:逗号分隔多个域名
  • Auto Renew

签完证书后 Meridian 直接监听 443,全站 HTTPS 生效。

2. 用子域名前缀路由

Meridian 支持按访问的子域名 / 前缀自动选站点,例如:

  • https://emby.example.com/ → 站点 A
  • https://jf.example.com/ → 站点 B

每个站点的 Listen Prefix 配置对应:

  • 站点 A:/
  • 站点 B:/ (如果监听子域名路由,由 Meridian 根据请求 Host 头自动选)

更灵活的做法是把 Meridian 放在 Cloudflare 后面、用 Cloudflare 的 Origin Rules 区分,Meridian 端只配站点对应前缀。

站点管理:多站点、流量统计、运行状态

进阶:Telegram 日报

Settings → Notifications → Telegram

  1. @BotFather/newbot,拿到 bot token
  2. 给 bot 私聊发一条消息,然后访问 https://api.telegram.org/bot<TOKEN>/getUpdates 拿到 chat_id
  3. 填入面板:
    • Bot Token
    • Chat ID
    • Daily Report:勾上,每天上午 9 点(你设置的 TZ)推送
  4. 测试按钮看 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%)
Telegram 日报:昨日流量、站点状态、异常请求

进阶:流量 / 日志查看

流量面板

Stats → Traffic

  • 按小时 / 天 / 周聚合
  • 按站点 / 客户端 IP / 路径筛选
  • 导出 CSV
流量统计:站点维度、客户端 IP、时段分布

请求日志

Stats → Logs

  • 实时滚动所有经过 Meridian 的请求(method / path / status / 耗时 / 客户端 IP / 命中站点)
  • 支持搜索(路径、IP、状态码)、分页、导出
日志记录:按日期 / 筛选维度(UA 类型 / 状态码 4XX-5XX / 媒体数据回响等)实时滚动

全局设置速览

Settings → Global 里能改的:

  • 监听端口:默认 9090,改完要重启 Meridian
  • TLS 模式off / acme / manual
  • 认证:管理员账号、强制 2FA、登录失败锁定阈值
  • API Token:用于自动化调 Meridian API(创建站点、改配置、拉统计)
  • 数据保留:流量日志 / 请求日志保留多久(默认 30 天,老的自动清理)
  • 备份 / 导出:一键下载整个 SQLite 数据库(含站点配置、账号、统计)
全局设置:监听端口、TLS、认证、API Token、数据保留

升级 / 排错

升级

原生脚本装的方式

Terminal window
curl -fsSL https://raw.githubusercontent.com/chanhui800/Meridian/main/scripts/install.sh | sudo bash
# 脚本会自动停旧进程、备份数据、装新版本

Docker 装的

Terminal window
docker compose pull meridian
docker 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/meridiandocker-compose.ymlenvironment 里):

变量 默认值 说明
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 服务器,客户端在重庆联通。测了一个典型场景:

实际播放速度:76 MB/s(约 608 Mbps),Jellyfin 客户端右上角实时显示,1 小时 10 分钟的 4K HDR Remux 全程不卡

实际速度取决于哪些因素:

瓶颈来源 影响
代理机(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 才有解,文档不算完整 —— 但源码可读、社区活跃,核心功能稳定。

部署有坑或遇到问题,欢迎评论区交流。