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

Cover image for 在CloudFlare上构建MoonTV:属于你的云端影视服务
Doc Map
  1. 引言
    1. 部署前的准备
    2. 开始部署

引言

今之世,人皆爱观影追剧,盖因影视繁盛,题材百样,佳作层出不穷。然今各大平台林立,如 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
综上所述,MoonTV 搭配 Cloudflare,乃开源观影部署之良缘,不惟简便可用,亦具性能与扩展之利,诚为影视爱好者布署私人影院之不二选择。

部署前的准备

  • Domains
  • Cloudflare Account
  • GitHub Account

开始部署

  • 普通部署(localstorage)

    • 进入MoonTV官方GitHub仓库,将其Fork于你的账号中。

    • 登录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文件内容,可直接修改自己仓库中的该文件。

    • 每次pushmain分支后,都会自动重试部署,无需手动操作。

    • D1 支持

      • 完成普通部署并成功访问

        WARNING

        注意:如果阁下是中国大陆用户,可能无法直接访问Cloudflare自动分配的地址,需添加自定义域名,稍后,我会告诉大家如何添加。

      • 点击存储和数据库(Storage & Databases) -> D1 SQL Database,创建一个新的数据库,名称随心。

      • 进入刚创建的数据库,点击左上角的 Explore Data,将D1初始化内容粘贴到Query窗口后点击Run All,等待运行完成。

      • 返回你的Pages项目,进入设置 -> 绑定,添加绑定D1数据库,选择创建的数据库,变量名填DB

      • 设置环境变量 NEXT_PUBLIC_STORAGE_TYPE,值为 d1;设置 USERNAMEPASSWORD 作为站长账号。

      • 重试部署。

  • 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
  • 如需更改自定义项集,可前往根目录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 即可进行管理员配置