在CloudFlare上构建MoonTV:属于你的云端影视服务

引言
今之世,人皆爱观影追剧,盖因影视繁盛,题材百样,佳作层出不穷。然今各大平台林立,如 Netflix、Disney+、Amazon Prime 及国内之爱奇艺、腾讯视频等,各擅其场,争奇斗艳。
然观者之苦,亦在于此:若欲尽览诸家好剧,须于多 App 往返奔波,既扰心神,又浪费时日。更有不便者,各平台会员各自为政,VIP不可通用。今日为此剧而充,明日为彼片再续,银钱之出,如流水也。
于是,有识之士思变,求一途径,使观影不受拘束,资源可聚一处,自由、简便、低耗,皆可兼得。MoonTV 乃因应此需而生之开源良策。此项目可托于 Cloudflare Pages,轻量部署,无需登录,跨端可用,观之自在,赏之从容。
此项目共有三途可行,其一依托 Vercel,其二容器化部署于 Docker,其三托身于 Cloudflare 之上。今特引诸君择其三,循序渐进,搭建此站于 Cloudflare Pages,使诸般影视汇于一处,尽收掌中。不复频繁跳转诸平台,亦无各家会员之桎梏,观剧之便,由此而生。
何以选用 Cloudflare?
云端平台多如繁星,然独钟 Cloudflare,实非偶然。- 其一,轻量迅捷,无需服务器。MoonTV 依托 Cloudflare Workers 构建,前后端皆可托于边缘节点运行。无须购置传统主机,亦无须搭设庞杂环境,只一键部署,即可上线。如此布置,轻而灵,便于维护,尤适个人或轻量部署之需。
- 其二,全球节点,低延迟之利。Cloudflare 部署遍及全球,其 Workers 于边缘节点执行,可就近响应用户请求,大幅减少加载时间。无论用户身处何地,皆可快速接入,畅观影视,流畅如丝。
- 其三,免费额度,绰绰有余。Cloudflare Workers 提供每日十万请求之免费额度,于多数个人用途而言,已可应对自如。若稍加缓存、压缩等优化,负载能力更上一层楼,几可媲美中型后端。
- 其四,配套完善,集成易用。Cloudflare 提供 KV 储存、R2 对象存储、Pages 静态托管等诸多服务,可与 MoonTV 相得益彰,构建完整影视中转系统。更有 Cloudflare Gateway、Zero Trust 等安全利器,保障部署之稳妥。
何以选用 MoonTV ?
今开源之影视流项目,琳琅满目,佳者不乏其人,如 LibreTV 等皆为上乘之作。然予亲试诸多之后,心有所属,尤钟情于 MoonTV,其界面雅致,功能完备,实为观影聚合之佳选。- 🔍 多源聚合搜索:内置数十个免费资源站点,一次搜索立刻返回全源结果。
- 📄 丰富详情页:支持剧集列表、演员、年份、简介等完整信息展示。
- ▶️ 流畅在线播放:集成 HLS.js & ArtPlayer。
- ❤️ 收藏 + 继续观看:支持 Redis/D1 存储,多端同步进度。
- 📱 PWA:离线缓存、安装到桌面/主屏,移动端原生体验。
- 🌗 响应式布局:桌面侧边栏 + 移动底部导航,自适应各种屏幕尺寸。
- 🚀 极简部署:一条 Docker 命令即可将完整服务跑起来,或免费部署到 Vercel 和 Cloudflare。
- 👿 智能去广告:自动跳过视频中的切片广告(实验性)
分类 | 主要依赖 |
---|---|
前端框架 | Next.js 14 · App Router |
UI & 样式 | Tailwind CSS 3 |
语言 | TypeScript 4 |
播放器 | ArtPlayer · HLS.js |
代码质量 | ESLint · Prettier · Jest |
部署 | Docker · Vercel · CloudFlare Pages |
部署前的准备
- Domains
- Cloudflare Account
- GitHub Account
开始部署
-
普通部署(localstorage)
-
登录CLoudFlare,点击Computer(Workers) -> Workers and Pages,点击Create。
-
选择Pages,如果你是第一次创建CLoudflare账号,那么需要连接你的GiHub账号,连接成功后,选择之前fork的MoonTV仓库。
-
构建命令填写(Build command)
pnpm install --frozen-lockfile && pnpm run pages:build
预设框架(Framework preset)默认为None, 构建输出目录(Build output directory)为
.vercel/output/static
-
其余保持默认,开始构建。
-
进入设置,将兼容性标志设置(Compatibility flags)为
nodejs_compat
WARNING
若不添更改此设置,过后访问时可能会报出警示
而后重试部署
-
首次部署完成后再次进入设置,新增PASSWORD密钥(变量和机密),而后再次重试部署。
WARNING
若不添加此变量,过后访问时可能会报出警示
-
如果你需要自定义config.json文件内容,可直接修改自己仓库中的该文件。
-
每次push于main分支后,都会自动重试部署,无需手动操作。
-
D1 支持
-
完成普通部署并成功访问
WARNING
注意:如果阁下是中国大陆用户,可能无法直接访问Cloudflare自动分配的地址,需添加自定义域名,稍后,我会告诉大家如何添加。
-
点击存储和数据库(Storage & Databases) -> D1 SQL Database,创建一个新的数据库,名称随心。
-
进入刚创建的数据库,点击左上角的 Explore Data,将D1初始化内容粘贴到Query窗口后点击Run All,等待运行完成。
-
返回你的Pages项目,进入设置 -> 绑定,添加绑定D1数据库,选择创建的数据库,变量名填DB。
-
设置环境变量 NEXT_PUBLIC_STORAGE_TYPE,值为 d1;设置 USERNAME 和 PASSWORD 作为站长账号。
-
重试部署。
-
-
Docker部署
-
直接运行
# 拉取预构建镜像 docker pull ghcr.io/senshinya/moontv:latest # 运行容器 # -d: 后台运行 -p: 映射端口 3000 -> 3000 docker run -d --name moontv -p 3000:3000 --env PASSWORD=your_password ghcr.io/senshinya/moontv:latest
TIP
请放行必要端口
访问
http://<你的服务器IP>:8080
即可
-
Docker Compose
-
📁 目录结构建议:
moontv/ ├── docker-compose.yml └── data/ # 文件数据挂载目录
- Local Storage 版本
services: moontv: image: ghcr.io/senshinya/moontv:latest container_name: moontv restart: unless-stopped ports: - '3000:3000' environment: - PASSWORD=your_password # 如需自定义配置,可挂载文件 # volumes: # - ./config.json:/app/config.json:ro
- Redis 版本(推荐,多账户数据隔离,跨设备同步)
services: moontv-core: image: ghcr.io/senshinya/moontv:latest container_name: moontv restart: unless-stopped ports: - '3000:3000' environment: - USERNAME=admin - PASSWORD=admin_password - NEXT_PUBLIC_STORAGE_TYPE=redis - REDIS_URL=redis://moontv-redis:6379 - NEXT_PUBLIC_ENABLE_REGISTER=true networks: - moontv-network depends_on: - moontv-redis # 如需自定义配置,可挂载文件 # volumes: # - ./config.json:/app/config.json:ro moontv-redis: image: redis container_name: moontv-redis restart: unless-stopped networks: - moontv-network # 如需持久化 # volumes: # - ./data:/data networks: moontv-network: driver: bridge
- Local Storage 版本
-
-
如需更改自定义项集,可前往根目录config.json
{
"cache_time": 7200,
"api_site": {
"dyttzy": {
"api": "http://caiji.dyttzyapi.com/api.php/provide/vod",
"name": "电影天堂资源",
"detail": "http://caiji.dyttzyapi.com"
}
// ...更多站点
}
}
- cache_time: 接口缓存时间(s)。
- api_site: 资源站点。
- key: 唯一标识,保持小写字母/数字。
- api: 资源站提懂得vod JSON API跟地址。
- name: 人机界面展示的名称。
- detail: (option)部分无法通过 API 获取剧集详情的站点,需要提供网页详情根 URL,用于爬取。
NOTE
管理员配置
该特性目前仅支持通过非 localstorage 存储的部署方式使用,支持在运行时动态变更服务配置,设置环境变量 USERNAME 和 PASSWORD 即为站长用户,站长可设置用户为管理员,站长或管理员访问 /admin 即可进行管理员配置