Folia部署到Cloudflare Workers实战:Serverless歌词动画音乐播放器完整指南
【免费下载链接】folia-major专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major
Folia(folia-major)是一款专注于绚丽歌词动画效果的本地音乐 / Navidrome / 第三方多平台在线音乐播放器,支持网易云、QQ 音乐、酷狗音源与本地音乐库。把它部署到 Cloudflare Workers,你可以在零服务器成本的情况下获得一个完整的 Serverless 音乐播放器:静态前端与后端 API 同处一个 Worker,按请求计费,空闲不花钱。本文是一份面向新手的实战部署指南,包含原理拆解、完整步骤、环境变量清单与常见问题排查。
为什么选择 Cloudflare Workers 部署 Folia
大多数音乐播放器 Web 版的部署难点在于「前端 + 后端」要分别托管,而 Folia 的 Worker 入口把两者合二为一:
- 🚀一套代码两种职责:
/api/*路由优先交给 Worker 处理(AI 主题、歌词代理、歌词切词、QQ 音乐 API),其余请求直接回落到静态资源 - 🌐SPA 友好:未命中的路径自动回退到
index.html,前端路由刷新不 404 - 💰免运维:不需要常驻 Node 进程,QQ 音乐 API 也不再需要单独部署 API 实例
- 📱手机即用:部署后可在 Chrome for Android / iOS Safari 中安装为 PWA
部署完成后的效果预览:
部署前看懂架构:4 个文件讲清 Serverless 原理
整个 Cloudflare 部署的核心配置只有 4 个文件,全部在仓库根目录:
| 文件 | 作用 |
|---|---|
| wrangler.jsonc | Workers 部署配置:入口、静态资源目录、路由优先级 |
| worker/index.ts | 请求总入口,负责分发/api/*与静态资源 |
| worker/lyric-proxy.ts | 歌词 CORS 代理,绕过浏览器跨域限制 |
| worker/qq.ts | QQ 音乐 API 的 Serverless 接入层 |
wrangler.jsonc的关键配置值得细看:
{ "main": "./worker/index.ts", "assets": { "directory": "./dist", // Vite 构建产物 "binding": "ASSETS", "not_found_handling": "single-page-application", // SPA 回退 "run_worker_first": ["/api/*"] // API 请求先走 Worker } }worker/index.ts的fetch处理器按顺序检查 5 类请求:/api/generate-theme(AI 主题生成)、/api/generate-theme_openai、/api/lyric-proxy(歌词代理)、/api/segment-lyrics(歌词逐字切词,见 worker/segment-lyrics.ts)、/api/qq/*(QQ 音乐路由),其余全部交给env.ASSETS.fetch()返回静态文件。其中 QQ 路由被特意包裹在 try/catch 中——失败降级为 502 而不是让整个 Worker 崩溃,这是一个值得学习的容错设计。
一键部署步骤:从克隆到上线只要 4 步
第一步:获取代码
git clone https://gitcode.com/GitHub_Trending/fo/folia-major cd folia-major⚠️ 项目要求 Node.js 24 或更高版本,请先确认
node -v。
第二步:安装依赖并配置环境变量
npm install cp .env.example .env.local在.env.local中填写(VITE_前缀的变量是构建时注入的,必须先配置再构建):
| 变量名 | 描述 | 是否必需 |
|---|---|---|
VITE_NETEASE_API_BASE | 网易云音乐 API 实例地址 | 是 |
VITE_AI_PROVIDER | AI 提供商:google或openai | 是(需要 AI 功能时) |
GEMINI_API_KEY | Gemini API Key | 用 Gemini 时 |
OPENAI_API_KEY/OPENAI_API_URL/OPENAI_API_MODEL | OpenAI 兼容接口配置 | 用 OpenAI 系时 |
VITE_QQ_API_BASE | 填/api/qq启用内置 serverless QQ 路由 | 否 |
QQ_SESSION_SECRET | QQ 登录态加密密钥(不加VITE_前缀) | 启用 QQ 时 |
一个最小可用的 Gemini 配置示例:
VITE_NETEASE_API_BASE=https://your-netease-api.example.com VITE_AI_PROVIDER=google GEMINI_API_KEY=your_google_gemini_api_key第三步:构建前端产物
npm run build该命令会先编译api-ts目录,再由 Vite 把前端打包到dist/——这正是wrangler.jsonc中assets.directory指向的目录。
第四步:部署到 Workers
npx wrangler deploy首次运行会引导你登录 Cloudflare 账号并选择项目(Zone / Account 均按提示选择即可)。部署成功后终端会给出https://xxx.xxx.workers.dev的访问地址,打开即可开始听歌。
可选增强:把 Serverless 能力拉满
1️⃣ QQ 音乐:内置路由 + Durable Object 扫码登录
Cloudflare 部署下 QQ 音乐不需要额外部署常驻 API 实例:VITE_QQ_API_BASE填成/api/qq再配QQ_SESSION_SECRET即可,默认支持微信扫码登录。
进阶玩法是绑定一个 Durable Object(QQ_QR_CHANNEL→QqQrChannel)增加 QQ 扫码登录。为什么非要 DO?因为 QQ 扫码通道依赖一条长连接的 MQTT WebSocket,而普通 Worker 调用结束连接就销毁,只有 Durable Object 能跨请求「握住」这条连接。相关原理与排错细节见 docs/qq-music-deployment.md。
2️⃣ 跨设备同步:Sync Server 部署在同一账号
Folia 提供可选的官方同步服务端 sync-server/,用于在多设备间同步外观设置与 AI 主题库,推荐形态正是Cloudflare Workers + D1 数据库:
- 在
sync-server/目录执行wrangler d1 create folia-sync创建数据库 - 将 sync-server/wrangler.toml 复制为
wrangler.local.toml并填入真实的database_id - 执行
wrangler deploy --config wrangler.local.toml
部署后在 Folia 的「存储设置」中填写服务端地址与SYNC_TOKEN即可启用同步。
常见问题排查清单
| 症状 | 可能原因与解法 |
|---|---|
| 刷新页面 404 | 构建后未部署最新产物;确认dist/已生成并重新wrangler deploy |
| 环境变量不生效 | VITE_变量是构建时注入的,改完.env.local必须重新npm run build再部署 |
| AI 主题生成失败 | 检查VITE_AI_PROVIDER与对应 API Key 是否匹配;QQ_SESSION_SECRET千万不要误加VITE_前缀 |
| QQ 登录路由返回 501 | 未设置QQ_SESSION_SECRET(曲库搜索仍可用,仅登录不可用) |
| 歌词加载异常 | 确认部署地址为 HTTPS(Workers 默认即是),歌词代理仅允许白名单域名,属正常安全限制 |
更完整的变量说明与环境差异,参见 docs/technical.md。
总结
回顾一下这套部署方案的关键:wrangler.jsonc让静态资源与 API 路由共用一个 Worker,/api/*优先、SPA 兜底的策略让 Folia 的歌词动画、AI 主题、QQ 音乐等功能在 Serverless 形态下开箱即用;配合 Durable Object 与 D1,甚至登录态保持与多设备同步都能免费搞定。按照本文 4 步走完,你得到的不只是一个能跑的播放器,而是一个几乎零成本的私人歌词动画舞台——下一首歌的灯光秀,就交给 Folia 吧 🎶
【免费下载链接】folia-major专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考