收起左侧

低成本、可公网访问、稳定易维护的 Emby 影视库搭建方案,随时随地看片(VPS方案)

1
回复
195
查看
[ 复制链接 ]

4

主题

15

回帖

0

牛值

江湖小虾

前言

这是我写的第一个Emby双栈访问的新手向攻略,略微带点技术活,可能大家都已经熟悉了,但不妨碍一起讨论这个前提,由于法令跟通信商的限定,公网访问已经是种奢望,所以大家切用且珍惜,本方案旨在用VPS来达到公网访问的目的,并不是免费的方案,所以大家看看就好,没必要较真,真要较真,轻点喷就行。另外我是一个连贯思路的方案,而且本人特别懒,所以图很少,大家见谅

目标

低成本、可公网访问、稳定易维护的 Emby 影视库搭建方案,随时随地看片。 我会从硬件选型 → 系统搭建 → Emby 配置 → 公网访问 → 安全加固 → 成本优化几个部分分析。

1. 硬件选型(低成本优先)

✅ 选择思路

  • 低功耗、全天候运行(省电很重要)
  • 硬盘可扩展(影视库会越存越多)
  • 解码能力好(尤其是4K和高码率)

📦 推荐方案

  1. 旧电脑 / 二手主机改造
  • 成本:几乎 0 元,如果你家里有闲置 PC。
  • 优点:性能好,可直接扩展硬盘。
  • 缺点:功耗比低功耗设备稍高。
  1. 低功耗迷你主机
  • 例如:二手 NUC、J4125/J6412 工控机(咸鱼大约 300~800 RMB)
  • 优点:功耗低(10-15W),静音,小巧。
  • 缺点:内部空间小,需要外接硬盘盒。
  1. NAS 设备(极低功耗)
  • 群晖 DS220+(二手 1000~1500 RMB),或者威联通/QNAP。
  • 优点:硬盘热插拔、系统稳定、省心。
  • 缺点:初期投资高。

💡 如果预算有限,我建议用 二手 NUC + USB3.0 硬盘盒,够便宜、省电、可扩展。

2. 系统搭建

操作系统选择

  • Windows → 入门快,驱动兼容好,但内存占用稍高。
  • Linux(Debian/Ubuntu) → 更省资源,稳定。
  • NAS系统(群晖 DSM / Unraid / TrueNAS) → 图形化管理,适合长期运行。

如果你是新手,推荐直接 Windows 10 + Emby Server,快、简单,后续熟悉了再迁移到 Linux/NAS。

3. Emby 安装与配置

  1. 下载 Emby
  1. 基础配置
  • 首次运行时,设置管理员账户。
  • 添加媒体库路径(按类型分:电影、电视剧、动漫)。
  • 选择元数据抓取源(TheMovieDB 中文版)。
  1. 转码与硬解码
  • 在设置 → 播放 → 启用硬件加速(Intel QuickSync / Nvidia NVENC)。
  • 确保 CPU/GPU 支持 H.265、4K 硬解码,减少服务器压力。
  1. 客户端播放
  • 手机/平板:Emby App(iOS/Android)
  • 浏览器访问:http://IP地址:8096

4. 公网访问方案

公网访问是关键,这里有几种方式,按成本和难度排序:

方案A:内网穿透(低成本)

  • 免费服务:ZeroTier、Tailscale、Frp、Ngrok
  • 操作:

在服务器和客户端安装内网穿透工具(如 Tailscale)。

生成一个虚拟公网IP,直接访问 Emby。

  • 优点:免费,简单。
  • 缺点:部分免费服务带宽有限(Tailscale/ZeroTier 看高清视频没问题)。

方案B:动态域名 + 路由器端口映射

  • 注册免费域名(DuckDNS、No-IP)
  • 在路由器设置端口转发:外网 8096 → 内网 Emby 8096
  • **缺点:如果你是 CGNAT(移动宽带常见),公网IP不固定,这种方式不可用。

方案C:云服务器中转

  • 买一个最便宜的轻量云服务器(阿里云/腾讯云 **/日本区,一个月 20~30 RMB)。
  • 云服务器做反向代理(Nginx)转发到家里的 Emby。
  • 优点:稳定、可定制域名+SSL。
  • 缺点:每月有一定成本。

如果你家宽带有公网IP,我推荐 B方案;如果没有公网IP,用 A方案 最省钱。

5. 安全加固

公网访问必须注意安全:

  • 管理员密码一定要复杂(不要用 **admin/123456)。
  • 启用 HTTPS(用 Cloudflare 免费SSL 或 Let’s Encrypt)。
  • 可以限制特定用户的访问权限(防止别人刷爆你的带宽)。
  • 重要:不要开放 8096 端口给全网,最好通过 Nginx 做认证。

6. 成本优化总结

项目 建议方案 成本
硬件 二手 NUC + USB硬盘盒 500~800 RMB 一次性
系统 Windows 10 / Debian 免费
Emby 官方免费版(如需多端同步需解锁高级版) 免费 / 一次性约 400 RMB
公网访问 ZeroTier / Tailscale 免费
域名 DuckDNS 免费域名 免费
电费 10~15W 主机常开 约 4~8 RMB/月

引言

好了闲话多说,不在赘述,上面我想是大家都选择的某一部分方案。那么下面不如正题,大家可以仔细观看了

楔子

NAS,跟Emby,我想大部分同僚们都已熟知。那我们直接跳过NAS和Emby的基础内容,重点放在****云服务器反向代理这块,把公网访问的部分讲到足够细,你直接照着做就行。

我会假设你已经有:

  • NAS(群晖 / Unraid / 飞牛 都行)
  • 内网可访问的 Emby(例如 http://192.168.1.100:8096
  • 云服务器(VPS,推荐**/日本/新加坡节点,延迟低,带宽别太小,最低 1Mbps 上行也能跑1080P)
  • 一个域名(可选,用于绑定访问)

1. 为什么要用云服务器反代

你之所以需要 VPS 来中转,一般是因为:

  1. 家庭宽带没有公网IP(CGNAT)
  2. 公网IP频繁变(DDNS也不稳)
  3. 想要加 HTTPS、CDN、安全控制

反代的本质:

  • 客户端访问 → VPS(公网IP) → VPS通过隧道回到家里的NAS → Emby返回数据

2. 整体架构图

[手机/电脑] 
    ** 访问 emby.mydomain.com (443)
    ▼
[VPS:Nginx]  <——>  [内网NAS:Emby]
     ↑                   ↑
     HTTPS               内网IP:8096
     反向代理             无公网IP
​

数据流:用户访问 VPS → Nginx 解析域名并转发请求 → 通过内网穿透(FRP/Tailscale/ZeroTier)回家 → Emby 响应。

3. 反代需要的三块东西

  1. 内网穿透隧道(把 VPS 和 NAS 连接起来)
  2. Nginx 配置反向代理
  3. HTTPS 证书绑定

4. 步骤详解

步骤 1:搭建内网穿透隧道

你需要让 VPS 能访问到 NAS 内网的 8096 端口。

方法A:Tailscale(推荐)

  1. 在 VPS 和 NAS 都安装 Tailscale
  1. 登录同一个账户(Google/Microsoft 都行)
  2. **你会得到一个类似 **100.x.x.x 的虚拟 IP
  3. **在 VPS 上 **curl http://NAS虚拟IP:8096 如果能访问,就 OK

方法B:FRP(自己搭)

  • VPS 做 frps(服务端)
  • NAS 做 frpc(客户端)
  • 在 frp 配置中把 Emby 的 8096 端口映射到 VPS 的一个内网端口

步骤 2:安装 Nginx 并配置反代

在 VPS 上:

# Ubuntu / Debian
sudo apt update && sudo apt install nginx -y
​

新建一个配置文件:

sudo nano /etc/nginx/conf.d/emby.conf
​

内容:

server {
    listen 80;
    server_name emby.mydomain.com;
​
    location / {
        proxy_pass http://100.x.x.x:8096;  # 这里是NAS的Tailscale IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
​

保存并测试:

sudo nginx -t
sudo systemctl reload nginx
​

现在访问 http://emby.mydomain.com 就能通过 VPS 访问你的 NAS 了。

步骤 3:启用 HTTPS

Certbot 自动申请 Let’s Encrypt 免费证书:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d emby.mydomain.com
​

它会自动帮你配置 HTTPS,并且证书每 90 天自动续签。

步骤 4:优化 Nginx 反代性能(可选)

Emby 是流媒体服务,默认 Nginx 配置可能对长连接不友好,可以加:

    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_buffering off;
    proxy_request_buffering off;
    send_timeout 600s;
    proxy_read_timeout 600s;
    proxy_send_timeout 600s;
​

这样可以避免大文件播放时中途断流。

5. 成本预估

  • VPS(**/日本轻量云):

腾讯云 / 阿里云:活动价约 25~35 RMB/月(活动期过了可能翻倍,大家有活动再入会比较好)

搬瓦工 / RackNerd:年付 120~150 RMB

  • 域名:NameSilo/Cloudflare 注册,约 50 RMB/年(也可以有免费域名,大家应该都有的,所以我也不再赘述)
  • Tailscale / FRP:免费

6. 总结方案

  • 隧道:Tailscale(省心,无需手动映射)
  • 反代:Nginx(处理 HTTPS + 域名)
  • 优势

1.家宽无公网IP也能访问

2.HTTPS 加密

3.可控访问权限(Nginx可加IP白名单/密码)

4.VPS可顺便做其他服务

下面是一键脚本:

直接在 VPS 上运行就能完成 Emby 反代 + HTTPS 配置,你只需要提前准备好:

  • 域名(已解析到 VPS IP)
  • NAS Emby 内网 IP(通过 Tailscale / FRP 获取到)

Emby 反代一键部署脚本(Debian/Ubuntu)

假设:

  • 域名:emby.example.com
  • NAS Emby 内网 IP:100.64.0.5(Tailscale 分配的)
  • Emby 端口:8096
#!/bin/bash
​
# === 基本信息修改区 ===
DOMAIN="emby.example.com"         # 你的域名
EMBY_IP="100.64.0.5"               # NAS 的 Tailscale 内网 IP
EMBY_PORT="8096"                   # Emby 端口
EMAIL="you@example.com"            # 用于 SSL 申请的邮箱
​
# === 系统更新 ===
apt update && apt upgrade -y
​
# === 安装必要组件 ===
apt install -y nginx certbot python3-certbot-nginx
​
# === 创建 Nginx 配置 ===
cat > /etc/nginx/conf.d/emby.conf < /dev/null
​
echo "✅ Emby 反代配置完成"
echo "🌐 访问地址: https://${DOMAIN}"
​

使用方法

  1. 先解析域名 → 把 emby.example.com 指向 VPS 公网IP。
  2. 确保VPS 能访问 NAS 的 Tailscale IP:8096(测试 curl http://100.x.x.x:8096 有返回)。
  3. 将脚本保存为 emby_setup.sh,然后执行:
chmod +x emby_setup.sh
./emby_setup.sh

完成后直接用 https://emby.example.com 访问。

这个方案的好处是:

  • 一次运行,全自动配置
  • 自动申请和续签 SSL
  • 已加流媒体优化参数
  • VPS 还可以挂其他服务(直接加新的 Nginx 配置就行)

Emby 公网访问反代架构图

Emby 公网访问反代架构图,让你一眼就看懂整个流程,之后你无论加 Jellyfin、Plex 还是其他服务都能直接套用。

架构图:VPS 反向代理 Emby 公网访问

          **────────────────────────────**
          **   手机 / 平板 / 电脑客户端  **
          **  (访问 https://emby.example.com)**
          **─────────────▲──────────────**
                        **
                        ** 1. HTTPS 请求(公网)
                        **
        **───────────────**────────────────**
        **       云服务器 VPS(**/日本) **
        ** ────────────────────────────── **
        **  Nginx:                       **
        **    - 监听 443 端口              **
        **    - SSL 加密(Let's Encrypt)  **
        **    - 流媒体优化(长连接支持)   **
        **    - 反代到 NAS 内网地址        **
        **─────────────▲──────────────────**
                      **
                      ** 2. 内网穿透流量(Tailscale / FRP)
                      **
        **─────────────**──────────────────**
        **          家庭网络 NAS           **
        ** ────────────────────────────── **
        **  Emby Server:                  **
        **    - 内网 IP: 100.64.0.5:8096    **
        **    - 媒体库存储硬盘              **
        **    - 硬件解码/转码支持           **
        **────────────────────────────────**

数据流解释:

  1. 客户端访问
  • 用户输入 https://emby.example.com
  • DNS 将域名解析到 VPS 公网 IP
  1. VPS 反代
  • Nginx 接收请求
  • 验证 SSL,解密 HTTPS
  • 将请求转发到 NAS 的 Tailscale 内网 IP + 端口
  1. NAS 响应
  • Emby 根据请求返回视频流
  • 流量经过 VPS 再发回客户端(中转)
  1. 安全与优化
  • VPS 只开放 80/443(HTTP/HTTPS)
  • Emby 对公网不可见,防止暴力破解
  • Nginx 参数优化保证视频播放稳定

这样看,你的 VPS 就像是一个“门面”,对外只暴露安全的 HTTPS 端口,所有真实的 Emby 数据传输都走加密的内网隧道。 以后如果你加 Jellyfin、Plex、qBittorrent、Radarr、Sonarr 等服务,只需要在 VPS 上加一个新的 Nginx 配置文件就行,核心逻辑完全一样。

通用方案:(集成了一些常用的主流媒体服务器)

Emby + Jellyfin + Plex + qBittorrent + Radarr + Sonarr 的反代 Nginx 模板一次性写好,放到 VPS 上就可以随时启用,之后你扩展家庭多媒体中心会非常方便。

1. Nginx 反代配置合集

假设:

  • 域名:

emby.example.com(Emby)

jellyfin.example.com(Jellyfin)

plex.example.com(Plex)

qb.example.com(qBittorrent)

radarr.example.com(Radarr)

sonarr.example.com(Sonarr)

  • 内网 IP(Tailscale):100.64.0.5
  • 对应服务端口:

Emby:8096

Jellyfin:8097

Plex:32400

qBittorrent:8080

Radarr:7878

Sonarr:8989

Emby

server {
    listen 80;
    server_name emby.example.com;

    location / {
        proxy_pass http://100.64.0.5:8096;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_buffering off;
        proxy_request_buffering off;
        send_timeout 600s;
        proxy_read_timeout 600s;
        proxy_send_timeout 600s;
    }
}

Jellyfin

server {
    listen 80;
    server_name jellyfin.example.com;

    location / {
        proxy_pass http://100.64.0.5:8097;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_buffering off;
        proxy_request_buffering off;
        send_timeout 600s;
        proxy_read_timeout 600s;
        proxy_send_timeout 600s;
    }
}

Plex

server {
    listen 80;
    server_name plex.example.com;

    location / {
        proxy_pass http://100.64.0.5:32400;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_buffering off;
        proxy_request_buffering off;
    }
}

qBittorrent

server {
    listen 80;
    server_name qb.example.com;

    location / {
        proxy_pass http://100.64.0.5:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Radarr

server {
    listen 80;
    server_name radarr.example.com;

    location / {
        proxy_pass http://100.64.0.5:7878;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Sonarr

server {
    listen 80;
    server_name sonarr.example.com;

    location / {
        proxy_pass http://100.64.0.5:8989;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

2. 一次性申请所有 HTTPS 证书

把这些配置保存到 /etc/nginx/conf.d/,然后执行:

sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d emby.example.com -d jellyfin.example.com -d plex.example.com -d qb.example.com -d radarr.example.com -d sonarr.example.com

这样所有域名一次性申请 SSL,自动续签也会全部生效。

3. 后续扩展

  • 新增服务 → 复制一份配置改端口+域名
  • 限制访问 → 在 Nginx 里加 HTTP 基本认证或 IP 白名单
  • 多用户分流 → Nginx 里可按路径反代到不同 Emby 用户实例
  • 流量优化 → 开启 Brotli 压缩、HTTP/2、缓存策略

Cloudflare CDN + WARP 回源(可选方案上面已经不错了,有了这个近乎无敌,也是本栏唯一一个有技术参数的)

Cloudflare CDN + WARP 回源 这一层也加上,你的 Emby 公网访问方案就会具备:

  • 高安全性:VPS 真实 IP 隐藏
  • 防封锁:流量走 Cloudflare CDN
  • 加速效果:Cloudflare 全球节点分发
  • 低成本:依旧免费 / 低价 VPS

1. 新架构图(加上 Cloudflare 层)

[手机 / 平板 / 电脑客户端] 
       ** 访问 https://emby.example.com
       ▼
 Cloudflare CDN 节点(HTTPS 加速 + 防护)
       ** 反代请求
       ▼
 [VPS](Nginx + WARP 回源 → 内网 NAS Emby)
       ** Tailscale/FRP 隧道
       ▼
[NAS Emby Server]

2. 实现步骤

步骤 1:域名接入 Cloudflare

  1. 注册 Cloudflare 账号(免费版即可)
  2. 将你的域名 NS 记录改为 Cloudflare 提供的(在域名注册商后台操作)
  3. Cloudflare 添加 A 记录:
  • 名称:emby
  • IPv4 地址:VPS 公网 IP
  • 橙色云图标开启(代表走 CDN),这里你也可以选择不走CF,但我始终认为CF更好一点。

步骤 2:VPS 安装 WARP

WARP 会让你的 VPS 访问 Cloudflare 时走 Cloudflare 内部网络,从而****隐藏真实 IP

# 安装 WARP
wget -N https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh && bash menu.sh

在菜单里:

  • 选择 1 安装 WARP(免费流量200G一个月所以懂行的朋友尽量用WARP+)
  • 选择 2 使用 WARP+(可选,免费申请流量)(WARP可能很多人不了解,当然了解的都知道这是个神器)

安装完成后:

warp-cli status

确保是 Connected 状态。(WARP虽然有时候会断连,但他仍然会给你重新连接,自动的无须担心,并不影响观影体验)

步骤 3:Nginx 配置调整

你的 Emby 域名在 Cloudflare 上用“橙云”(CDN模式),所以客户端访问时会先到 Cloudflare,再回源到 VPS。

为了兼容流媒体:

proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off;
proxy_request_buffering off;
send_timeout 600s;
proxy_read_timeout 600s;
proxy_send_timeout 600s;

这样可以避免视频流被中途缓存或断开。(加了这条哪怕中途WARP断连也是无感的)

步骤 4:Cloudflare 设置优化(这是我最喜欢的一点,CF很多功能易用,免费!)

进入 Cloudflare 控制台 → 域名设置:

  1. SSL/TLS 模式 → 选择 Full(严格)
  2. 缓存规则 → 对视频文件(.mp4, .mkv)关闭缓存
  3. 防火墙规则 → 限制仅特定国家或 IP 访问(可选)
  4. HTTP/3 → 开启(减少延迟,这是最不可思议的地方,后期可能会收费,可不选)
  5. Always Use HTTPS → 开启(强制 HTTPS)

3. 成本 & 优势

  • VPS:依然 25~35 RMB/月(甚至更低)
  • Cloudflare:免费版足够
  • WARP:免费(WARP+ 可以加速更多地区)

效果

  • 你在国内/国外访问,都会自动走最近的 Cloudflare 节点
  • VPS IP 永远不会直接暴露(除非主动查询 DNS 的灰云记录)
  • 影视播放流畅度比直连 VPS 高(尤其跨境访问)

下面依旧是一键脚本,我的宗旨是辛苦一个人,躺平一群人。

VPS + Nginx + Tailscale + WARP + Cloudflare DNS(可选)+ Let's Encrypt HTTPS + Emby 反代 的“一键部署脚本”。 你只要把变量改成你的值,放到 Debian/Ubuntu VPS 上执行就行。脚本包含:

  • 安装并启动 Nginx / certbot / tailscale / warp
  • 在 VPS 上创建 Emby 的 Nginx 反代并加入流媒体优化(长连接、关闭缓冲等)
  • 如果你提供 Cloudflare API Token & Zone ID:脚本会自动替你在 Cloudflare 下建 A 记录并开启橙云(proxy)
  • 自动申请并启用 Let’s Encrypt 证书并设置续签任务
  • 最后打印检查项与常用调试命令

使用说明(先读一下再运行)

  1. 把下面脚本保存为 emby_full_setup.sh
  2. 编辑开头变量:DOMAINEMBY_IP(Tailscale 给 NAS 的虚拟 IP,例如 100.x.x.x)、EMBY_PORTEMAIL
  3. 可选:如果希望脚本自动在 Cloudflare 上创建 DNS 记录并启用代理(橙云),请填入 CF_API_TOKEN(需权限: Zone:DNS:Edit 或更高)和 CF_ZONE_ID(Cloudflare 控制台 -> 站点概览可见)。若不填,脚本只安装服务并生成 nginx 配置,你需手动把域名指向 VPS IP 并在 Cloudflare 打开橙云。
  4. chmod +x emby_full_setup.sh && sudo ./emby_full_setup.sh(以 root 或 sudo 运行)

脚本(Debian/Ubuntu)

#!/usr/bin/env bash
set -euo pipefail
# ========== 配置区(请修改) ==========
DOMAIN="emby.example.com"        # 你的域名
EMBY_IP="100.64.0.5"             # NAS 的内网/Tailscale IP
EMBY_PORT="8096"                 # Emby 端口
EMAIL="you@example.com"          # 用于 Let's Encrypt
# 可选:Cloudflare API(如果你想自动创建/开启橙云)
CF_API_TOKEN=""                  # 可选:Cloudflare API Token (Zone:DNS:Edit)
CF_ZONE_ID=""                    # 可选:Cloudflare Zone ID
# ========== 结束配置区 ==========
​
# 检查基本工具
command -v apt >/dev/null 2>&1 || { echo "This script requires apt (Debian/Ubuntu)."; exit 1; }
​
echo "🔎 更新系统包..."
sudo apt update && sudo apt upgrade -y
​
echo "📦 安装 nginx, certbot..."
sudo apt install -y nginx certbot python3-certbot-nginx curl jq
​
# 获取 VPS 公网 IP
VPS_IP="$(curl -s https://ifconfig.co || curl -s https://ipinfo.io/ip || hostname -I | awk '{print $1}')"
echo "VPS 公网 IP: ${VPS_IP}"
​
# ========== 安装并配置 Tailscale ==========
if ! command -v tailscale >/dev/null 2>&1; then
  echo "🔧 安装 Tailscale..."
  curl -fsSL https://tailscale.com/install.sh | sh
  echo "请在接下来的步骤中手动在 VPS 上运行 'sudo tailscale up' 并完成登录(会弹出 URL)。"
else
  echo "Tailscale 已安装"
fi
​
# ========== 安装 WARP(Cloudflare WARP 客户端) ==========
if ! command -v warp-cli >/dev/null 2>&1; then
  echo "🔧 安装 Cloudflare WARP (menu.sh 安装器)..."
  curl -fsSL https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh -o /tmp/warp-menu.sh
  chmod +x /tmp/warp-menu.sh
  # 非交互式安装:执行并选择自动安装(脚本会有交互,如需完全静默可改成包管理安装)
  bash /tmp/warp-menu.sh <<'EOF'
1
0
EOF
  echo "WARP 安装完成(请检查 warp-cli status)"
else
  echo "WARP 已安装"
fi
​
# ========== 创建 nginx 反代配置 ==========
NGINX_CONF="/etc/nginx/conf.d/emby.conf"
echo "⚙️  写入 Nginx 配置到 ${NGINX_CONF} ..."
sudo tee ${NGINX_CONF} > /dev/null < ${VPS_IP}) 并开启代理..."
  # 查找是否已有记录
  RECORDS_API="https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records"
  EXIST=$(curl -s -X GET "${RECORDS_API}?name=${DOMAIN}" \
    -H "Authorization: Bearer ${CF_API_TOKEN}" -H "Content-Type: application/json")
​
  rec_id=$(echo "${EXIST}" | jq -r '.result[0].id // empty')
  if [[ -n "${rec_id}" ]]; then
    echo "发现已存在 DNS 记录 (id=${rec_id}),更新为 IP=${VPS_IP},proxy=true ..."
    curl -s -X PUT "${RECORDS_API}/${rec_id}" \
      -H "Authorization: Bearer ${CF_API_TOKEN}" \
      -H "Content-Type: application/json" \
      --data "{\"type\":\"A\",\"name\":\"${DOMAIN}\",\"content\":\"${VPS_IP}\",\"ttl\":1,\"proxied\":true}" \
      | jq .
  else
    echo "创建新的 A 记录..."
    curl -s -X POST "${RECORDS_API}" \
      -H "Authorization: Bearer ${CF_API_TOKEN}" \
      -H "Content-Type: application/json" \
      --data "{\"type\":\"A\",\"name\":\"${DOMAIN}\",\"content\":\"${VPS_IP}\",\"ttl\":1,\"proxied\":true}" \
      | jq .
  fi
  echo "✅ Cloudflare DNS 已处理(请到 Cloudflare 控制台确认 NS 已替换并生效)"
}
​
create_cloudflare_record
​
# ========== 申请 Let's Encrypt 证书 ==========
echo "🔐 尝试使用 certbot 为 ${DOMAIN} 申请证书..."
# 若 Cloudflare 橙云已开启,certbot --nginx 仍可通过 Cloudflare 转发获取证书(正常情况下)
sudo certbot --nginx -d "${DOMAIN}" --non-interactive --agree-tos -m "${EMAIL}" || {
  echo "❗ certbot 通过 nginx 模式申请失败,尝试纯 http 验证..."
  sudo certbot certonly --webroot -w /var/www/html -d "${DOMAIN}" --non-interactive --agree-tos -m "${EMAIL}"
  echo "请手动将证书配置到 nginx(/etc/letsencrypt/live/${DOMAIN}/)"
}
​
echo "✅ 证书申请完成,certbot 已配置 nginx(若使用 nginx 模式)"
​
# ========== 设置自动续签任务 ==========
echo "🕑 设置 certbot 自动续签(每日检查)..."
sudo bash -c 'cat >/etc/cron.d/certbot-renew <
​
​

常见问题(免你踩坑)

  • Certbot 失败:如果 Cloudflare 的“橙云(proxy)”在某些设置下会干扰 HTTP 验证,临时把该子域改为灰云(非代理),申请证书成功后再开回橙云,或使用 DNS 验证(通过 Cloudflare API)来申请证书。
  • Tailscale 未登录:脚本只会安装 tailscale,登录需要你在 VPS 上执行 sudo tailscale up,然后用浏览器完成授权(一次即可)。
  • WARP 未连接/不可用:warp 安装器可能会有交互,若你希望完全无交互安装,可告知我你愿意使用 cloudflared/或不使用 warp。(这一点是最后一部分最重要的部分,如果发现不行尽量就不要用了,因为真的不是每一个人都能成功的)
  • 流媒体卡顿:确认 VPS 带宽和 Tailscale 节点稳定性(可测试 iperf 或直接用 curl 下载测试文件),必要时把 VPS 换到更靠近你的节点(HK/JP/Singapore)。

总结

这个方案虽然很长,但却仍然可以自己慢慢手搓,难点在于无法突破公网IP的限制,而我也无法从一些奇奇怪怪的问题中解决掉所有未知问题(因为我也是初次尝试),所以大家讨论的时候我可能没办法回答大家出现的所有问题,希望大家在使用过程中多多尝试,我算是提供一种思路,感谢大家看到这里,衷心希望大家能搭建属于自己的影视库。如果能有更好的方案,还请大家不吝赐教

收藏
送赞
分享

2

主题

11

回帖

0

牛值

江湖小虾

先赞再看

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则