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

技术栈总览
- 服务器:甲骨文云 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 媒体服务器

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,按向导完成初始化:
- 选择语言(推荐英文,中文翻译不完全)
- 创建管理员账户
- 添加媒体库 —— 此时可以先跳过,等挂载 115 网盘后再配置
- 配置元数据语言和下载源
- 接受服务条款,完成设置
如果需要硬件转码,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 管理界面:
- 首次访问会要求设置管理密码
- 点击左上角”添加网盘” → 选择”115云盘”
- 选择登录方式:二维码扫码登录(推荐,用 115 手机 App 扫码)或 Cookie 登录
- 登录成功后,网盘会出现在文件列表中
- 点击”挂载”按钮,挂载到
/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 是一款支持多种存储的文件列表程序,你可以把 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 直连、完全不走服务器带宽。
第七部分:性能优化与避坑指南

常见问题与解决
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 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 条评论