甲骨文 ARM 服务器搭建私人媒体库全攻略:Ubuntu + Emby + CloudDrive2 + 115 网盘 + 302 直连

甲骨文云(Oracle Cloud)的永久免费 ARM 服务器——4 核 24GB 内存、200GB 存储、10TB 月流量——是自建媒体库的绝佳选择。配合 Emby 媒体服务器、CloudDrive2 挂载 115 网盘、以及 302 重定向直连,你可以打造一套几乎零成本的私人流媒体平台。本文将从头到尾带你完成全部搭建。

服务器机房
甲骨文 ARM 服务器资源充足,非常适合搭建媒体库 —— 图源:Thomas Jensen / Pixabay

技术栈总览

  • 服务器:甲骨文云 OCI 永久免费 ARM(Ampere A1,4C24G)
  • 系统:Ubuntu 22.04 / 24.04 LTS(ARM64)
  • 媒体服务器:Emby Server(Docker Compose,Emby Premiere 可选)
  • 网盘挂载:CloudDrive2(Docker Compose,将 115 网盘挂载为本地目录)
  • 目录索引:alist(Docker Compose,WebDAV 目录浏览)
  • 直连播放:go-emby2openlist(Docker Compose 反代 + 302 重定向)
  • 域名管理:Nginx Proxy Manager(Docker Compose,SSL 自动续签)

第一部分:开通甲骨文 ARM 服务器

1.1 注册甲骨文云账号

访问 Oracle Cloud 免费套餐 页面注册。需要一张支持外币的信用卡(仅用于身份验证,免费资源不扣费)。注册时选择就近区域——亚洲用户推荐首尔、东京、新加坡;美西用户选凤凰城延迟最低。

避坑提示:注册时务必使用真实信息,IP 地址、信用卡账单地址、注册信息三者尽量一致。甲骨文的审核非常严格,信息不一致可能导致秒拒。

1.2 创建 ARM 实例

进入控制台 → Compute → Instances → Create Instance:

  • 镜像:选择 Ubuntu 24.04 LTS(ARM64)或 Ubuntu 22.04 LTS
  • 配置:Ampere A1,4 OCPU + 24GB RAM(这是免费套餐上限)
  • 启动卷:200GB(免费额度上限,不要超过)
  • SSH 密钥:上传你的公钥(或让甲骨文自动生成后下载私钥)

创建后记下公共 IP 地址,并通过 SSH 连接:

ssh -i /path/to/ssh-key ubuntu@<你的服务器IP>

1.3 Ubuntu 初始化配置

# 更新系统
sudo apt update && sudo apt upgrade -y

# 设置时区
sudo timedatectl set-timezone Asia/Shanghai

# 创建非 root 用户(推荐)
sudo useradd -m -s /bin/bash media
sudo usermod -aG sudo media

# 配置防火墙:只开放 SSH、HTTP/HTTPS、NPM 管理端口
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp     # HTTP/HTTPS(NPM 接管)
sudo ufw allow 81/tcp          # Nginx Proxy Manager 管理界面
sudo ufw enable

# 安装基础工具(所有服务用 Docker,不需要 nginx 等)
sudo apt install -y curl wget unzip fuse3 docker.io docker-compose-v2

关键步骤:在甲骨文控制台的安全列表(Security List)中,需要放行 22、80、443、81 四个端口的入口规则。由于所有服务通过 Docker 内部网络通信,Emby(8096)、alist(5244)、CloudDrive2(19798) 等端口无需对外暴露,统一由 NPM 反代。

第二部分:安装 Emby 媒体服务器

媒体服务器设置
Emby 提供精美的媒体库界面和强大的转码能力 —— 图源:Florian Olivo / Pixabay

2.1 创建 Docker Compose 统一目录

我们创建一个总目录来管理所有服务的 Docker Compose 配置:

# 创建统一管理目录
sudo mkdir -p /opt/docker/{emby,clouddrive2,alist,go-emby2openlist,npm}
sudo mkdir -p /opt/docker/data/{emby-config,clouddrive2-config,clouddrive2-media}

2.2 Emby Docker Compose 配置

创建 /opt/docker/emby/docker-compose.yml

version: "3.1"
services:
  emby:
    image: emby/embyserver_arm64v8:latest
    container_name: emby
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - UID=1000
      - GID=1000
    volumes:
      - /opt/docker/data/emby-config:/config
      - /opt/docker/data/clouddrive2-media:/media:shared  # 挂载 CloudDrive2 的媒体目录
    ports:
      - 8096:8096    # HTTP(可限制仅内网,之后由 NPM 反代)
    devices:
      - /dev/dri:/dev/dri  # 硬件转码(如有 GPU)

参数说明/media:shared 是关键——加了 :shared 后缀后,CloudDrive2 容器挂载到该目录的内容,Emby 容器也能直接读取。

2.3 启动 Emby

cd /opt/docker/emby
docker-compose up -d

# 查看日志确认启动成功
docker logs -f emby

2.4 初始化 Emby

浏览器访问 http://<服务器IP>:8096,按向导完成初始化:

  1. 选择语言(推荐英文,中文翻译不完全)
  2. 创建管理员账户
  3. 添加媒体库 —— 此时可以先跳过,等挂载 115 网盘后再配置
  4. 配置元数据语言和下载源
  5. 接受服务条款,完成设置

如果需要硬件转码,ARM 平台目前支持有限,建议依赖直接串流(Direct Stream)——这也是后面配置 go-emby2openlist 直连的意义所在。

第三部分:CloudDrive2 挂载 115 网盘

这是整个方案最核心的环节。CloudDrive2 是一个跨平台云盘挂载工具,支持将 115 网盘、阿里云盘、天翼云盘等以本地文件系统的方式挂载到服务器上。Emby 可以直接读取挂载目录中的视频文件,就像它们在本地硬盘上一样。

3.1 CloudDrive2 Docker Compose 配置

创建 /opt/docker/clouddrive2/docker-compose.yml

version: "3.1"
services:
  clouddrive2:
    image: cloudnas/clouddrive2:latest
    container_name: clouddrive2
    restart: always
    privileged: true
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /opt/docker/data/clouddrive2-config:/Config
      - /opt/docker/data/clouddrive2-media:/CloudNAS:shared
      - /mnt:/mnt:shared
    ports:
      - 19798:19798
    devices:
      - /dev/fuse:/dev/fuse

参数说明

  • privileged: true + /dev/fuse:允许容器使用 FUSE 文件系统,这是挂载云盘的关键
  • /CloudNAS:shared:挂载点目录,标记 shared 使其他容器(如 Emby)也能访问
  • /opt/docker/data/clouddrive2-media:宿主机目录,Emby 通过 :shared 共享此目录读取挂载内容

3.2 启动 CloudDrive2

cd /opt/docker/clouddrive2
docker-compose up -d

# 查看日志
docker logs -f clouddrive2

3.3 配置 115 网盘登录

浏览器访问 http://<服务器IP>:19798 打开 CloudDrive2 Web 管理界面:

  1. 首次访问会要求设置管理密码
  2. 点击左上角”添加网盘” → 选择”115云盘”
  3. 选择登录方式:二维码扫码登录(推荐,用 115 手机 App 扫码)或 Cookie 登录
  4. 登录成功后,网盘会出现在文件列表中
  5. 点击”挂载”按钮,挂载到 /CloudNAS/115(或你喜欢的路径)

重要提示:建议在 CloudDrive2 设置中开启”开机自动挂载”和”自动重连”选项,防止服务器重启后挂载丢失。

3.4 验证 Emby 能否读取挂载内容

由于 Emby 和 CloudDrive2 共享了同一个宿主机目录(/opt/docker/data/clouddrive2-media),Emby 容器内 /media 路径可以直接看到 CloudDrive2 的挂载内容:

# 在宿主机检查挂载是否成功
ls /opt/docker/data/clouddrive2-media/115/

# 在 Emby 容器内验证
docker exec emby ls /media/115/

之后在 Emby 后台 → 媒体库 → 添加文件夹,路径选择 /media/115/<你的视频目录> 即可扫描识别。

第四部分:安装 Open List(alist)实现目录索引

存储设备
alist 可以将多个存储后端整合成统一的文件目录 —— 图源:Pixabay

alist 是一款支持多种存储的文件列表程序,你可以把 CloudDrive2 挂载的本地目录通过 alist 暴露为 WebDAV 或网页索引,方便在浏览器上直接浏览和下载文件。这里”Open List”通常指代的就是开源的 alist 或类似的目录索引工具。

4.1 alist Docker Compose 配置

创建 /opt/docker/alist/docker-compose.yml

version: "3.1"
services:
  alist:
    image: xhofe/alist:latest
    container_name: alist
    restart: always
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /opt/docker/data/alist-data:/opt/alist/data
      - /opt/docker/data/clouddrive2-media:/opt/alist/clouddrive2:shared  # 挂载 CloudDrive2 媒体目录
    ports:
      - 5244:5244

4.2 启动并获取初始密码

cd /opt/docker/alist
docker-compose up -d

# 查看日志获取初始管理员密码
docker logs alist | grep password

# 或手动设置密码
docker exec -it alist ./alist admin set YOUR_PASSWORD

访问 http://<服务器IP>:5244,使用用户名 admin 和你设置的密码登录。

4.3 添加本地存储

登录后进入管理后台 → 存储 → 添加:

  • 驱动:选择”本地存储”
  • 挂载路径/115(在 alist 中的访问路径)
  • 根文件夹路径/opt/alist/clouddrive2/115(CloudDrive2 挂载内容的容器内路径)

保存后,访问 http://<服务器IP>:5244/115 就能看到你 115 网盘中的所有文件了。

获取 API Token(go-emby2openlist 需要):后台 → 设置 → 其他 → 复制 Token。

第五部分:go-emby2openlist —— 302 直连播放终极方案

这是整套方案的核心——绕过甲骨文服务器的有限带宽,让客户端直接连接到 115 网盘的下载节点获取视频流。我们使用开源项目 go-emby2openlist,一个 Go 语言编写的 Emby + OpenList 网盘直链反向代理服务。

5.1 原理说明

普通模式下,Emby 的数据链路是:

客户端 → Emby源服务器 → CloudDrive2 → 115网盘 → 返回数据 → 服务器 → 客户端

服务器既要处理 API 请求,又要中转视频流量,带宽很快吃紧。

go-emby2openlist 反代方案:在 Emby 前面架设一层反向代理,所有 API 请求正常代理到 Emby 源服务器并缓存;但对于视频流请求,反代直接向 alist (OpenList) 查询网盘直链,然后返回 302 重定向,客户端自己跳到网盘 CDN 节点下载:

客户端 → go-emby2openlist (API代理+缓存) → Emby源服务器
客户端 → go-emby2openlist → alist (获取直链) → 302重定向 → 客户端直连网盘CDN

优势:视频流量完全不经过你的甲骨文服务器,播放速度取决于你的网盘会员带宽,4K 原画毫无压力。

5.2 Docker Compose 部署

首先创建配置文件和 Docker Compose 编排文件:

# 创建工作目录
mkdir -p /opt/docker/go-emby2openlist/{ssl,custom-js,custom-css,lib,openlist-local-tree}
cd /opt/docker/go-emby2openlist

# 下载示例配置
wget https://raw.githubusercontent.com/AmbitiousJun/go-emby2openlist/v2.7.1/config-example.yml -O config.yml

5.3 核心配置 config.yml

编辑 config.yml,只需配置以下关键项即可跑通:

emby:
  host: http://127.0.0.1:8096              # Emby 访问地址
  mount-path: /media                          # Emby 容器内 CloudDrive2 挂载路径
  proxy-error-strategy: origin              # 代理异常回源处理

openlist:
  host: http://alist:5244                    # alist 容器名访问(Docker 内部网络)
  token: "你的alist API Key"                 # alist 后台 → 设置 → 其他 → Token

path:
  emby2openlist:                            # 路径前缀映射(关键!)
    - /media/115/电影:/115/电影
    - /media/115/电视剧:/115/电视剧
    - /media/115/动漫:/115/动漫
    - /media/115/综艺:/115/综艺

cache:
  enable: true
  expired: 1d                               # 缓存1天(直链固定缓存10分钟)

路径映射说明:冒号左边是 Emby 中 CloudDrive2 挂载的本地磁盘路径,右边是 alist 中的实际路径。程序会自动将 Emby 请求的文件路径替换为 alist 路径,然后查询直链。

5.4 Docker Compose 启动

创建 docker-compose.yml

version: "3.1"
services:
  go-emby2openlist:
    image: ambitiousjun/go-emby2openlist:v2.7.1
    environment:
      - TZ=Asia/Shanghai
      - GIN_MODE=release
    container_name: go-emby2openlist
    restart: always
    volumes:
      - ./config.yml:/app/config.yml
      - ./ssl:/app/ssl
      - ./custom-js:/app/custom-js
      - ./custom-css:/app/custom-css
      - ./lib:/app/lib
      - ./openlist-local-tree:/app/openlist-local-tree
    ports:
      - 8095:8095    # http 反代端口
      - 8094:8094    # https 反代端口(可选)

启动服务:

docker-compose up -d

# 查看日志确认运行正常
docker logs -f go-emby2openlist -n 100

5.5 客户端连接

部署完成后,将所有 Emby 客户端的服务器地址改为 http://<你的服务器IP>:8095(即 go-emby2openlist 的反代端口),而非原来的 8096。

  • Emby Web、Android、Android TV、Fileball、Infuse、VidHub 等主流客户端均测试通过
  • 原画直链播放不会消耗服务器带宽
  • API 接口自动缓存,体验不输直连源服务器

注意:如果后面配置了 Nginx Proxy Manager 域名反代,客户端地址应改为 https://emby.你的域名.com,而非 IP 端口形式。

第六部分:Nginx Proxy Manager —— 域名与 SSL 管理

前面的所有服务都通过 IP + 端口访问,既不方便也不安全。Nginx Proxy Manager(NPM) 是一个带 Web 管理界面的反向代理工具,可以帮我们实现:

  • 域名 代替 IP + 端口(如 emby.yourdomain.com
  • 自动申请和续签 Let’s Encrypt SSL 证书(HTTPS)
  • 统一管理所有服务的反代规则
  • Web 界面操作,无需手写 Nginx 配置

6.1 前置准备:域名 DNS 解析

在域名 DNS 管理后台添加 A 记录,将你的域名指向甲骨文服务器的公网 IP:

  • 主域名A → 服务器IP(如 media.yourdomain.com → 1.2.3.4
  • 通配符*.media.yourdomain.com → 服务器IP(推荐,一个记录覆盖所有子域名)

6.2 NPM Docker Compose 部署

创建 /opt/docker/npm/docker-compose.yml

version: "3.1"
services:
  npm:
    image: jc21/nginx-proxy-manager:latest
    container_name: npm
    restart: always
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /opt/docker/data/npm-data:/data
      - /opt/docker/data/npm-letsencrypt:/etc/letsencrypt
    ports:
      - 80:80        # HTTP
      - 443:443      # HTTPS
      - 81:81        # NPM 管理界面

启动:

cd /opt/docker/npm
docker-compose up -d

访问 http://<服务器IP>:81,默认账号:[email protected],密码:changeme(首次登录会要求修改)。

6.3 配置反代规则

登录 NPM 后台 → Proxy Hosts → Add Proxy Host,为每个服务添加反代:

Domain Forward Hostname Port SSL
emby.yourdomain.com go-emby2openlist 8095 ✅ 开启
alist.yourdomain.com alist 5244 ✅ 开启
cd2.yourdomain.com clouddrive2 19798 ✅ 开启

关键细节

  • Forward Hostname 填的是 Docker 容器名(如 go-emby2openlist),因为所有容器在同一个 Docker 网络内可以通过容器名互相访问
  • SSL 标签页选择 “Request a new SSL Certificate”,勾选 Force SSL 和 HTTP/2 Support
  • Emby 反代时 务必指向 go-emby2openlist 的 8095 端口,而非 Emby 原生 8096,这样才能走 302 直连

6.4 Docker 自定义网络(推荐)

为了让容器间通过容器名互访,建议创建一个 Docker 自定义网络,将所有服务加入其中。在 NPM 的 docker-compose.yml 中添加:

# 在 npm 的 docker-compose.yml 底部添加
networks:
  default:
    name: media-net
    external: true   # 使用外部已创建的网络

然后给其他服务(emby、clouddrive2、alist、go-emby2openlist)的 docker-compose.yml 也加上同样的网络配置,并移除不必要的 ports 暴露(只保留 NPM 的 80/443 对外):

# 创建共享网络
docker network create media-net

# 在每个服务的 docker-compose.yml 底部加入
networks:
  default:
    name: media-net
    external: true

配置完成后,重启所有容器:

cd /opt/docker
for dir in emby clouddrive2 alist go-emby2openlist npm; do
  cd $dir && docker-compose down && docker-compose up -d && cd ..
done

现在你可以通过 https://emby.yourdomain.com 安全地访问媒体库了——自动 HTTPS、302 直连、完全不走服务器带宽。

第七部分:性能优化与避坑指南

服务器管理
ARM 服务器的日常维护同样重要 —— 图源:Pixabay

常见问题与解决

问题 原因 解决方案
115 网盘挂载后 Emby 扫描不到文件 Docker 容器间挂载共享未生效 确保使用 :shared 标记,或改用 --net=host
CloudDrive2 经常掉线 115 Cookie 过期或网络波动 开启自动重连 + 定期刷新登录态;考虑使用 Webhook 监控
甲骨文 ARM 被回收 闲置实例被判定为 Idle 保持 CPU/memory 使用率 > 10%,可运行轻量监控脚本
302 直连偶尔失效 网盘 CDN 直链有时效性 go-emby2openlist 自带 10 分钟直链缓存,自动刷新
ARM 平台某些软件无预编译包 架构不兼容 优先用 Docker 镜像(多架构支持),备选自行编译

防止被回收的保活脚本

# 添加到 crontab:每 5 分钟运行一次轻度负载
*/5 * * * * /usr/bin/stress --cpu 1 --timeout 30s >/dev/null 2>&1

总结

通过甲骨文永久免费 ARM 服务器 + 6 个 Docker Compose 服务(Emby + CloudDrive2 + alist + go-emby2openlist + Nginx Proxy Manager),你获得了一个:

  • 零服务器成本的私人流媒体平台
  • 无限存储(依托 115 网盘的海量空间)
  • 直连播放不消耗服务器带宽(4K 原画无压力)
  • 全平台客户端支持(Emby 覆盖 iOS / Android / TV / Web)
  • HTTPS 域名访问(NPM 自动管理 SSL 证书)
  • 统一 Docker Compose 管理,一条命令启停所有服务

最终架构一览

Internet → NPM (:80/443) → go-emby2openlist (:8095) → Emby (:8096)
                           → alist (:5244)
                           → CloudDrive2 (:19798)
        302 直链: 客户端 → 网盘CDN(视频流不经过服务器)

这套方案唯一的成本是你 115 网盘的会员费用(年费约 150 元)和一个域名(年费约 30 元),换来的是一台 24 小时在线、支持 HTTPS、自动直连播放的私人流媒体服务器。

下一步建议:使用 Watchtower 自动更新 Docker 镜像、添加更多云盘做冗余备份、配置 Emby 硬件转码(如果有兼容的 GPU)、开启 go-emby2openlist 的 OpenList 本地目录树自动生成功能以替代 CloudDrive2 挂载。


0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注