MoonTV部署到Cloudflare超详细教程
MoonTV部署到Cloudflare超详细教程
MoonTV是基于Next.js 14 + Tailwind CSS + TypeScript构建的跨平台影视聚合项目,支持多源搜索、收藏同步、跨设备访问等功能,官方提供Cloudflare部署支持。本教程将提供两种核心部署方案,适配不同网络环境(有无公网IP均可),并附带完整配置步骤、注意事项及问题排查,确保新手也能顺利部署。
一、前期准备工作
1.1 必备工具与账号
-
Cloudflare账号:访问Cloudflare官网注册,建议绑定邮箱并完成验证,用于管理域名、隧道、Pages等服务。
-
域名:需拥有一个域名(可在NameCheap、腾讯云、阿里云等平台购买,也可申请免费域名),并将其DNS服务器切换至Cloudflare(后续步骤详细说明)。
-
Git账号(可选,Pages方案需用):GitHub/GitLab账号,用于托管MoonTV代码,实现自动部署。
-
本地环境:需安装Node.js(v18+,建议v20)、Git,以及对应系统的cloudflared客户端(Tunnel方案需用)。
1.2 项目资源获取
MoonTV开源仓库地址:https://github.com/senshinya/MoonTV,可通过两种方式获取项目资源:
-
Git克隆:执行命令
git clone https://github.com/senshinya/MoonTV.git,将项目拉取到本地。 -
直接下载:访问仓库页面,点击“Code”→“Download ZIP”,解压至本地文件夹。
同时下载项目配置文件
config.json(用于配置影视源,可从仓库的示例配置中获取,或自定义修改),保存至项目根目录。1.3 域名DNS托管至Cloudflare
若域名未托管至Cloudflare,需先完成此步骤,为后续部署提供解析支持:
-
登录Cloudflare账号,点击右上角“添加站点”,输入你的域名(如example.com),点击“继续”。
-
Cloudflare会自动扫描域名现有DNS记录,无需保留默认记录,可全部删除,点击“继续”。
-
选择计划:个人用户选择“免费计划”即可,点击“继续”。
-
获取Cloudflare提供的名称服务器(如xxx.ns.cloudflare.com、yyy.ns.cloudflare.com),登录你的域名注册商后台,将域名的DNS服务器替换为Cloudflare提供的服务器。
-
返回Cloudflare页面,点击“继续前往激活”,等待DNS生效(通常10分钟-2小时,全球生效可能需8小时),生效后域名状态会显示“活动”。
二、方案一:Cloudflare Tunnel部署(无公网IP适用)
此方案通过Cloudflare Tunnel(原Argo Tunnel)建立加密隧道,将本地运行的MoonTV服务映射至公网域名,无需公网IP,适合家庭服务器、内网设备部署,安全性更高。
2.1 本地运行MoonTV服务
先在本地启动MoonTV服务,确保服务可正常访问:
-
进入项目根目录,执行命令
npm install,安装项目依赖(若依赖安装失败,可尝试更换npm源:npm config set registry https://registry.npmmirror.com)。 -
启动服务:执行命令
npm run dev(开发环境)或npm run build && npm start(生产环境)。 -
验证服务:浏览器访问
http://localhost:3000,若能看到MoonTV登录界面,说明服务启动成功(默认端口3000,可通过环境变量自定义)。
2.2 安装cloudflared客户端
cloudflared是建立Tunnel隧道的本地守护进程,需根据操作系统安装:
Windows系统
-
访问Cloudflare Tunnel下载页:https://github.com/cloudflare/cloudflared/releases/latest,下载Windows版本(cloudflared-windows-amd64.msi)。
-
运行安装程序,默认安装即可,安装完成后以管理员身份打开命令提示符(CMD)。
Linux系统(Ubuntu/Debian)
# 下载并安装cloudflared wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb sudo dpkg -i cloudflared-linux-amd64.deb # 验证安装 cloudflared –version
macOS系统
# 通过Homebrew安装 brew install cloudflared # 验证安装 cloudflared –version
2.3 创建并配置Cloudflare Tunnel
-
登录Cloudflare账号,依次点击“Zero Trust”→“网络”→“Tunnels”→“创建隧道”。
-
填写隧道名称(如moontv-tunnel),点击“保存隧道”。
-
选择对应的操作系统(如Windows),复制页面提供的授权命令(含隧道ID和凭证文件路径)。
-
在本地终端/CMD中粘贴授权命令并执行,完成cloudflared与Cloudflare的绑定,此时隧道状态会显示“已激活”。
-
配置公共主机名:点击隧道名称→“配置”→“添加公共主机名”。
-
子域:可自定义(如moontv,最终访问域名即为moontv.example.com),也可留空(使用根域名)。
-
域名:选择已托管至Cloudflare的域名。
-
服务:选择“HTTP”,URL填写本地MoonTV服务地址(
localhost:3000,若修改过端口则对应调整)。
-
-
点击“保存”,Cloudflare会自动添加DNS记录,此时访问设置的域名(如moontv.example.com),即可通过隧道访问本地MoonTV服务。
2.4 配置MoonTV环境变量(可选)
若需自定义密码、开启多账户隔离等功能,可通过环境变量配置,修改项目启动命令或创建
.env文件:
# .env文件内容示例 PASSWORD=your_custom_password # 自定义访问密码 NEXT_PUBLIC_STORAGE_TYPE=redis # 启用Redis存储(多账户同步需配合Redis) REDIS_URL=redis://localhost:6379 # Redis服务地址 NEXT_PUBLIC_ENABLE_REGISTER=true # 开启注册功能(首次部署后建议改为false关闭)
配置完成后,重启MoonTV服务和cloudflared隧道,使环境变量生效。
三、方案二:Cloudflare Pages+Workers部署(静态+动态代理)
此方案将MoonTV静态资源部署至Cloudflare Pages(全球CDN加速),通过Workers实现动态请求代理和数据处理,适合无本地服务器、追求高访问速度的场景。
3.1 准备项目并推送至Git仓库
-
本地完成MoonTV项目依赖安装和构建:执行
npm run build,生成.next构建目录(Next.js项目构建产物)。 -
在GitHub/GitLab创建新仓库(如moontv-deploy),将本地项目文件(含构建产物、config.json、package.json等)推送至仓库主分支(main/master)。
# 初始化Git仓库(若未克隆需执行)
git init
# 添加文件
git add .
# 提交变更
git commit -m "Initial commit for MoonTV deployment"
# 关联远程仓库
git remote add origin https://github.com/your-username/moontv-deploy.git
# 推送至主分支
git push -u origin main
3.2 部署至Cloudflare Pages
-
登录Cloudflare账号,点击左侧“Pages”→“创建项目”→“连接到Git”。
-
选择Git提供商(GitHub/GitLab),授权并选择刚才创建的仓库,点击“开始设置”。
-
配置构建设置:
-
生产分支:选择main/master分支。
-
构建命令:
npm run build(若已提前构建,可留空,但建议保留自动构建)。 -
输出目录:
.next(Next.js项目默认输出目录)。
-
-
点击“环境变量”→“添加变量”,配置必要的环境变量(参考方案一的.env示例,如PASSWORD、NEXT_PUBLIC_ENABLE_REGISTER等),点击“保存”。
-
点击“保存并部署”,Cloudflare会自动拉取仓库代码、执行构建并部署,部署完成后会生成临时访问域名(如xxx.pages.dev)。
3.3 配置Cloudflare Workers实现动态代理
由于Cloudflare Pages主要适配静态资源,MoonTV的动态请求(如影视源接口)需通过Workers代理转发,避免跨域问题:
-
登录Cloudflare账号,点击左侧“Workers和Pages”→“创建应用程序”→“创建Worker”。
-
填写Worker名称(如moontv-proxy),点击“部署”,生成默认Worker代码。
-
点击“编辑代码”,删除默认代码,粘贴以下代理脚本(根据实际影视源调整目标地址):
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
// 替换为你的影视源接口地址
const targetUrl = "https://your-source-api.com" + url.pathname + url.search;
// 转发请求并修改响应头,允许跨域
const response = await fetch(targetUrl, {
method: request.method,
headers: request.headers,
body: request.body,
redirect: "follow"
});
const modifiedHeaders = new Headers(response.headers);
modifiedHeaders.set("Access-Control-Allow-Origin", "*");
modifiedHeaders.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
modifiedHeaders.set("Access-Control-Allow-Headers", "Content-Type");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: modifiedHeaders
});
}
}; -
点击“保存并部署”,完成Worker创建,记录Worker的访问域名(如moontv-proxy.your-username.workers.dev)。
-
修改MoonTV的config.json文件,将影视源接口地址替换为Worker域名,推送至Git仓库,触发Pages自动重新部署。
3.4 绑定自定义域名至Pages
为Pages项目绑定自定义域名,替代默认的pages.dev域名:
-
进入Pages项目→“设置”→“自定义域”→“添加自定义域”。
-
输入自定义域名(如moontv.example.com),点击“继续”。
-
Cloudflare会自动验证域名并添加DNS记录,点击“激活域”,等待配置生效(约5-10分钟)。
-
生效后,访问自定义域名即可访问MoonTV服务,同时享受Cloudflare CDN加速。
四、后续配置与优化
4.1 SSL/TLS配置
Cloudflare默认提供免费SSL证书,需确保配置正确,避免访问异常:
-
登录Cloudflare账号,选择对应的域名→“SSL/TLS”→“概述”。
-
将SSL模式设置为“完全(Full)”或“完全(严格)(Full Strict)”,避免出现“重定向次数过多”错误(若源站已配置SSL,选择严格模式;未配置则选择完全模式)。
-
开启“Always Use HTTPS”,强制所有HTTP请求跳转至HTTPS,提升安全性。
4.2 关闭注册功能(重要)
首次部署后,若已注册管理员账号,需及时关闭注册功能,防止他人注册访问:
-
修改环境变量
NEXT_PUBLIC_ENABLE_REGISTER=false。 -
方案一:重启MoonTV服务和cloudflared隧道;方案二:推送修改至Git仓库,触发Pages自动部署。
4.3 CDN缓存优化
为静态资源配置CDN缓存,提升访问速度:
-
进入域名→“缓存”→“缓存规则”→“创建规则”。
-
设置规则名称,匹配条件为“URI路径”包含“/static/”“/images/”等静态资源路径。
-
缓存级别设置为“缓存所有静态资产”,TTL(缓存时间)设置为1440分钟(24小时),点击“部署”。
五、常见问题排查
5.1 隧道激活失败
原因:网络防火墙拦截、授权命令错误、cloudflared版本过低。
解决方法:关闭本地防火墙/杀毒软件;重新复制授权命令执行;更新cloudflared至最新版本。
5.2 访问域名显示404/502错误
原因:本地服务未启动、隧道配置的URL错误、Pages构建失败、DNS未生效。
解决方法:验证本地服务可正常访问;检查隧道/Workers的URL配置是否正确;查看Pages部署日志,修复构建错误;等待DNS生效(可通过
nslookup 域名验证解析)。5.3 重定向次数过多(ERR_TOO_MANY_REDIRECTS)
原因:SSL模式配置错误,源站强制HTTPS但Cloudflare使用灵活模式。
解决方法:将SSL模式改为“完全”或“完全严格”,关闭源站HTTP跳转HTTPS(或保持一致)。
5.4 影视资源无法加载
原因:config.json配置错误、影视源接口跨域、Worker代理脚本异常。
解决方法:检查config.json的影视源地址是否有效;确认Worker代理脚本配置正确,响应头包含跨域允许字段;更换可用的影视源。
六、注意事项
-
MoonTV仅用于个人学习和影视资源整理,请勿用于传播侵权内容,否则需承担法律责任。
-
Cloudflare免费计划有流量限制(无明确上限,但过度占用资源可能被限制),个人使用完全足够。
-
定期备份config.json和用户数据,避免配置丢失;若使用Redis存储,需做好Redis数据备份。
-
国内访问Cloudflare节点可能存在延迟,可通过更换优选域名、开启Argo路由(付费)优化访问速度。
按照以上步骤,即可完成MoonTV在Cloudflare的部署,享受免费、安全、跨设备的影视访问服务。若遇到其他问题,可参考Cloudflare官方文档或MoonTV仓库的Issues区寻求解决方案。