前言
作为影视爱好者,本期给大家带来一款好玩的软件MoonTV ,它是一款部署即用的跨平台影视聚合播放器,通过 Docker 快速部署,实现多源搜索、在线播放、播放记录同步等功能。
MoonTV 是跨平台的影视聚合播放器。它支持多资源搜索、在线播放、收藏同步、播放记录、本地/云端存储,让你可以随时随地畅享海量免费影视内容。
功能特性:
🔍 多源聚合搜索:内置数十个免费资源站点,一次搜索立刻返回全源结果。
📄 丰富详情页:支持剧集列表、演员、年份、简介等完整信息展示。
▶️ 流畅在线播放:集成 HLS.js & VidStack。
❤️ 收藏 + 继续观看:LocalStorage 存储,后续扩展 DB 存储。
📱 PWA:离线缓存、安装到桌面/主屏,移动端原生体验。
🌗 响应式布局:桌面侧边栏 + 移动底部导航,自适应各种屏幕尺寸。
🚀 极简部署:一条 Docker 命令即可将完整服务跑起来,或免费部署到 Vercel。
👿 智能去广告:自动跳过视频中的切片广告(实验性)
部署容器
Vercel 部署
普通部署(localstorage)
- Fork 本仓库到你的 GitHub 账户。
- 登陆 Vercel,点击 Add New → Project,选择 Fork 后的仓库。
- 设置 PASSWORD 环境变量。
- 保持默认设置完成首次部署。
- 如需自定义
config.json
,请直接修改 Fork 后仓库中该文件。 - 每次 Push 到
main
分支将自动触发重新构建。
部署完成后即可通过分配的域名访问,也可以绑定自定义域名。
Upstash Redis 支持
- 完成普通部署并成功访问。
- 在 upstash 注册账号并新建一个 Redis 实例,名称任意。
- 复制新数据库的 HTTPS ENDPOINT 和 TOKEN
- 返回你的 Vercel 项目,新增环境变量 UPSTASH_URL 和 UPSTASH_TOKEN,值为第二步复制的 endpoint 和 token
- 设置环境变量 NEXT_PUBLIC_STORAGE_TYPE,值为 upstash;设置 USERNAME 和 PASSWORD 作为站长账号
- 重试部署
Cloudflare 部署
Cloudflare Pages 的环境变量尽量设置为密钥而非文本
普通部署(localstorage)
- Fork 本仓库到你的 GitHub 账户。
- 登陆 Cloudflare,点击 计算(Workers)-> Workers 和 Pages,点击创建
- 选择 Pages,导入现有的 Git 存储库,选择 Fork 后的仓库
- 构建命令填写 pnpm install --frozen-lockfile && pnpm run pages:build,预设框架为无,构建输出目录为
.vercel/output/static
- 保持默认设置完成首次部署。进入设置,将兼容性标志设置为
nodejs_compat
- 首次部署完成后进入设置,新增 PASSWORD 密钥(变量和机密下),而后重试部署。
- 如需自定义
config.json
,请直接修改 Fork 后仓库中该文件。 - 每次 Push 到
main
分支将自动触发重新构建。
Docker Compose 配置文件
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
环境变量
变量 | 说明 | 可选值 | 默认值 |
---|---|---|---|
USERNAME | redis 部署时的管理员账号 | 任意字符串 | (空) |
PASSWORD | 默认部署时为唯一访问密码,redis 部署时为管理员密码 | 任意字符串 | (空) |
SITE_NAME | 站点名称 | 任意字符串 | MoonTV |
ANNOUNCEMENT | 站点公告 | 任意字符串 | 本网站仅提供影视信息搜索服务,所有内容均来自第三方网站。本站不存储任何视频资源,不对任何内容的准确性、合法性、完整性负责。 |
NEXT_PUBLIC_STORAGE_TYPE | 播放记录/收藏的存储方式 | localstorage、redis、d1、upstash | localstorage |
REDIS_URL | redis 连接 url,若 NEXT_PUBLIC_STORAGE_TYPE 为 redis 则必填 | 连接 url | 空 |
UPSTASH_URL | upstash redis 连接 url | 连接 url | 空 |
UPSTASH_TOKEN | upstash redis 连接 token | 连接 token | 空 |
NEXT_PUBLIC_ENABLE_REGISTER | 是否开放注册,仅在非 localstorage 部署时生效 | true / false | false |
NEXT_PUBLIC_SEARCH_MAX_PAGE | 搜索接口可拉取的最大页数 | 1-50 | 5 |
NEXT_PUBLIC_IMAGE_PROXY | 默认的浏览器端图片代理 | url prefix | (空) |
NEXT_PUBLIC_DOUBAN_PROXY | 默认的浏览器端豆瓣数据代理 | url prefix | (空) |
配置说明
所有可自定义项集中在根目录的 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
:接口缓存时间(秒)。api_site
:你可以增删或替换任何资源站,字段说明:key
:唯一标识,保持小写字母/数字。api
:资源站提供的vod
JSON API 根地址。name
:在人机界面中展示的名称。detail
:(可选)部分无法通过 API 获取剧集详情的站点,需要提供网页详情根 URL,用于爬取。
MoonTV 支持标准的苹果 CMS V10 API 格式。
修改后 无需重新构建,服务会在启动时读取一次。
管理员配置
该特性目前仅支持通过非 localstorage 存储的部署方式使用
支持在运行时动态变更服务配置
设置环境变量 USERNAME 和 PASSWORD 即为站长用户,站长可设置用户为管理员
站长或管理员访问 /admin
即可进行管理员配置
MoonTV搭配OrionTV使用
MoonTV搭配OrionTV可以在电视里直接观看(注:有小孩老人的家庭不适合把MoonTV调用到电视里使用,里面有好多内容只适合适龄人观看)
下载OrionTV安卓客户端在电视端进行安装。下载地址:https://github.com/zimplexing/OrionTV/releases/download/v1.2.10/orionTV.1.2.10.apk
然后在OrionTV设置里把你刚创建的moontv的访问地址粘贴就行
部署建议
- 设置环境变量
PASSWORD
:为您的实例设置一个强密码 - 仅供个人使用:请勿将您的实例链接公开分享或传播
- 遵守当地法律:请确保您的使用行为符合当地法律法规