一步步免费部署 LunaTV 影视聚合播放器:Zeabur 平台完整指南
【免费下载链接】LunaTV本项目采用 CC BY-NC-SA 协议,禁止任何商业化行为,任何衍生项目必须保留本项目地址并以相同协议开源项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTV
LunaTV 是一个开源的影视聚合播放器:一次搜索聚合多个资源站的结果,支持在线播放、收藏与播放记录多端同步、继续观看,还能自定义分类和站点公告。把这套功能完整地跑在自己手里,其实不需要买服务器、不需要装 Docker——Zeabur 这类云端平台用现成的 Docker 镜像就能搞定,免费额度足够个人使用。
这篇文章按实际部署顺序走一遍:先看清楚部署完长什么样,再解释平台上要建哪两个服务,然后是环境变量怎么填、域名怎么绑,最后讲配置文件怎么补、镜像怎么更新,以及几个最容易踩的坑。
部署完成后的样子
先有个预期。服务起来之后,首页左侧是功能侧边栏(首页、搜索、日历、直播、收藏),内容区上方是"继续观看"横排,下面接"热门电影"等分类栏目;点进某部剧集,右侧会出现换源面板,可以按清晰度(720p / 1080p / 4K)、码率和延迟在不同资源源之间切换:
需要说明一点:LunaTV 官方仅支持 Docker 或基于 Docker 的平台部署(见 README.md 的部署章节),Zeabur 正好属于后者,而且它直接拉取预构建镜像运行,不用等现场构建,速度很快。
动手前的准备清单
开始前确认三样东西:
- 一个 Zeabur 账户(免费注册即可);
- 一个自己想好的管理员账号和密码——后面要以环境变量形式提交,密码建议设强一点;
- 如果打算先本地熟悉代码,可把仓库克隆下来:
git clone https://gitcode.com/gh_mirrors/lu/LunaTV。直接走平台部署则连这一步都可以省掉。
架构上只记住一句话:两个服务,一个跑应用,一个存数据。应用层是 LunaTV 本身,数据层用 Kvrocks 存收藏和播放记录。顺序不能反,先建数据库服务。
第一步:添加 Kvrocks 数据库服务并挂载持久化卷
在 Zeabur 控制台点 "Add Service",选 "Docker Images",镜像填apache/kvrocks,端口开6666(TCP)。建好之后做两件事:
一是记住这个服务的名称(平台一般自动取为类似apachekvrocks的名字)。后面 LunaTV 连接它时,主机名就填这个服务名。二是挂一个持久化卷:在服务设置的 "Volumes" 里点 "Add Volume",Volume ID 起个名字(只允许字母、数字、连字符),Path 必须填/var/lib/kvrocks/db。这一步很容易被跳过,但跳过的代价是容器一重启,收藏和播放记录全部清零——卷只持久化数据库文件目录,配置文件仍留在容器内,这是官方推荐的做法。
第二步:添加 LunaTV 服务并填写环境变量
回到 "Add Service" > "Docker Images",镜像填ghcr.io/moontechlab/lunatv:latest,端口开3000(HTTP)。两个服务必须放在同一个 Project 里,这样它们才能通过服务名互相访问。
然后在 LunaTV 服务的环境变量里填配置。必填的四项决定服务能不能跑起来:
| 变量 | 作用 | 示例值 |
|---|---|---|
USERNAME | 站长(管理员)账号 | admin |
PASSWORD | 站长密码,务必设强密码 | 自行设置 |
NEXT_PUBLIC_STORAGE_TYPE | 存储方式 | kvrocks |
KVROCKS_URL | 数据库连接地址 | redis://apachekvrocks:6666 |
注意KVROCKS_URL的主机名是第一步那个服务的名称,不是 localhost,也不是 127.0.0.1。
以下几项都是可选的,按需加上:SITE_BASE(站点完整地址,填你最终的域名)、NEXT_PUBLIC_SITE_NAME(站点名称,默认 MoonTV)、ANNOUNCEMENT(首页公告),以及豆瓣数据的代理方式NEXT_PUBLIC_DOUBAN_PROXY_TYPE和图片代理NEXT_PUBLIC_DOUBAN_IMAGE_PROXY_TYPE——在 Zeabur 上推荐填社区 CDN 代理(如cmliussss-cdn-tencent),可以明显减少豆瓣数据加载失败的情况。
填完保存,Zeabur 会自动拉镜像、启动服务。到这里应用已经能跑了,但还访问不了。
第三步:绑定域名,把站点放出去
Zeabur 部署完成后不会自动给出可访问的地址,必须手动处理:进入 LunaTV 服务的 "Networking"(网络)标签,点 "Generate Domain" 生成一个免费的xxx.zeabur.app域名,就能在浏览器里打开了;想用自己的域名就点 "Add Domain",按提示把 DNS 的 CNAME 记录指到 Zeabur 给的目标地址。Zeabur 会自动配好 HTTPS,不需要你碰证书。
仓库里三个关键文件在干什么
部署过程虽然是黑盒,但值得花两分钟知道平台背后替你执行了什么,排错时会用得上:
- Dockerfile:三段式构建——先在
node:20-alpine里用 pnpm 装依赖,再跑pnpm run build出生产构建,最后只把 Next.js 的 standalone 产物拷进运行镜像,并以非 root 用户启动,监听 3000 端口。 - next.config.js:核心是
output: 'standalone',正是它让 Dockerfile 只拷一小部分文件就能跑起来;同时接入了 next-pwa,提供离线缓存和"安装到主屏"的能力。 - start.js:真正的启动入口。它先调用 scripts/generate-manifest.js 生成 PWA 清单,再启动服务,然后每秒轮询登录页做健康检查;确认服务就绪后立刻执行一次 /api/cron 定时任务,之后每小时跑一次。
另外 package.json 里的脚本定义了构建流程(gen:manifest+next build)。如果你走的是"从代码仓库导入"而非直接用镜像的路线,Zeabur 会自动识别这是 Node.js 项目并配置构建,启动命令对应next start。
补齐空壳:在管理后台填播放源配置
部署完成的应用是个空壳:没有内置播放源和直播源,搜不出东西。登录管理后台(用你设的USERNAME/PASSWORD),在配置文件设置里填入一份符合苹果 CMS V10 API 格式的 JSON:cache_time是接口缓存秒数;api_site下每个站点需要一个唯一小写的key、资源站的vodJSON API 地址api、展示名name,个别站点取不到剧集详情时还要补网页详情地址detail;custom_category则用来在导航里加个性化分类,以type(movie/tv)加query(搜索关键词)作为标识。支持哪些分类名见 README.md 的"配置文件"一节。
配置文件还有一层用法:整份配置做 base58 编码后挂一个 HTTP 地址,就是一个订阅链接,可以在后台直接导入,方便多实例或客户端同步同一套源。
更新机制:镜像不会自己变新
Zeabur 对latest标签的镜像不会自动拉新版,需要手动触发:进入对应服务页面,在服务状态下点"重启当前版本",平台会重新拉取最新镜像并部署。如果你是在意稳定性的场景,把镜像标签从latest换成固定版本号(如v5.5.6)可以彻底避免意外更新,代价是每次升级都要手改标签。数据服务(Kvrocks)一般不需要跟着动。
常见坑速查
| 现象 | 原因与处理 |
|---|---|
| 部署"成功"但打不开页面 | 忘了在 Networking 里生成/绑定域名,这是必经步骤不是可选项 |
| 登录页能开但收藏、记录存不住 | 检查KVROCKS_URL:主机名必须是服务名,端口6666,协议前缀redis:// |
| 重启后收藏和记录清空 | Kvrocks 卷路径没填对,必须精确是/var/lib/kvrocks/db |
| 搜索无结果或豆瓣海报/评分缺失 | 调整豆瓣代理类型NEXT_PUBLIC_DOUBAN_PROXY_TYPE和图片代理类型,或自行配置自定义代理 URL |
| 搜索翻页太浅或太深 | 用NEXT_PUBLIC_SEARCH_MAX_PAGE(1–50,默认 5)控制可拉取的最大页数 |
最后检查一遍
- 两个服务同项目:Kvrocks(6666 端口 + 持久化卷)在前,LunaTV(3000 端口 + 四个必填环境变量)在后;
- 域名在 Networking 里生成或绑定,HTTPS 自动生效;
- 管理后台补好
api_site配置,站点才真正能用; - 升级时手动"重启当前版本",生产环境建议固定镜像版本。
按这个顺序做完,一个带收藏同步、继续观看和多源切换的个人影视站就完整跑起来了。下一步可以看看环境变量表里没展开的搜索流式输出(NEXT_PUBLIC_FLUID_SEARCH)和内容过滤开关,按需调整体验。
【免费下载链接】LunaTV本项目采用 CC BY-NC-SA 协议,禁止任何商业化行为,任何衍生项目必须保留本项目地址并以相同协议开源项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTV
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考