<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>自部署 |</title><link>https://www.zhangmeng.me/tags/%E8%87%AA%E9%83%A8%E7%BD%B2/</link><atom:link href="https://www.zhangmeng.me/tags/%E8%87%AA%E9%83%A8%E7%BD%B2/index.xml" rel="self" type="application/rss+xml"/><description>自部署</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>zh-Hans</language><lastBuildDate>Mon, 01 Jun 2026 00:00:00 +0000</lastBuildDate><image><url>https://www.zhangmeng.me/media/icon_hu_c34fe11d876a6919.png</url><title>自部署</title><link>https://www.zhangmeng.me/tags/%E8%87%AA%E9%83%A8%E7%BD%B2/</link></image><item><title>CloudMail 自托管邮箱服务</title><link>https://www.zhangmeng.me/projects/cloud-mail/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><guid>https://www.zhangmeng.me/projects/cloud-mail/</guid><description>&lt;p&gt;弃用传统邮箱平台，用自己域名收发邮件的自托管方案：前端 Vue3 SPA、后端 Hono Worker，数据落在 D1/KV/R2，服务器成本为零。&lt;/p&gt;
&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;个人域名邮箱的需求很朴素：用自己的域名收发邮件、注册各类服务、随用随建隔离别名。商业邮箱平台按席位收费且数据在他方，传统自建（Postfix + VPS）又运维繁琐、IP 信誉难维护。CloudMail 把整套邮件服务搬进 Cloudflare 无服务器生态——一个域名、一个 Worker，就能拥有多邮箱、附件收发、管理后台的完整邮件服务。&lt;/p&gt;
&lt;h2 id="核心功能"&gt;核心功能&lt;/h2&gt;
&lt;h3 id="收件"&gt;收件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多邮箱管理&lt;/strong&gt;：一个域名创建多个邮箱，类似主流邮箱平台的多账户体验&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;附件接收&lt;/strong&gt;：入站邮件附件自动转存 R2 对象存储，支持在线预览与下载&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实时推送&lt;/strong&gt;：新邮件可转发至 Telegram 机器人或其他邮箱，不错过任何验证码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证码识别&lt;/strong&gt;：Workers AI 自动从邮件中提取验证码，免复制粘贴&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="发信"&gt;发信&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resend 集成&lt;/strong&gt;：稳定送达率，支持群发、内嵌图片与附件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发送状态&lt;/strong&gt;：每封信的投递状态可查，失败可追溯&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="管理与安全"&gt;管理与安全&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RBAC 权限&lt;/strong&gt;：按角色控制功能与资源配额，用户/邮件后台管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人机验证&lt;/strong&gt;：Turnstile 集成，防止批量注册&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开放 API&lt;/strong&gt;：批量生成用户、多条件查询邮件，便于自动化接入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据可视化&lt;/strong&gt;：ECharts 展示系统数据与用户邮件增长趋势&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="架构"&gt;架构&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─────────────┐ ┌──────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Email Routing│────▶│ Mail Worker (Hono) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ (CF 收件路由) │ │ API + 邮件处理 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─────────────┘ └──────┬───────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌────────────┼────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌─────▼─────┐ ┌────▼────┐ ┌────▼────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ D1 (数据) │ │ KV(缓存) │ │ R2(附件) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └───────────┘ └─────────┘ └─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▲
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌───────┴────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Vue3 + Element │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Plus 管理前端 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;收件链路&lt;/strong&gt;：Cloudflare Email Routing 接收入站邮件 → 投递至 Worker &lt;code&gt;email&lt;/code&gt; 事件 → 解析 MIME、附件落 R2、正文落 D1 → 触发推送&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分层后端&lt;/strong&gt;：&lt;code&gt;api/&lt;/code&gt; 接口层、&lt;code&gt;service/&lt;/code&gt; 业务层、&lt;code&gt;dao/&lt;/code&gt; 数据访问层、&lt;code&gt;security/&lt;/code&gt; 认证鉴权，职责清晰&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端&lt;/strong&gt;：Vue3 + Element Plus 响应式布局，PC 与移动端自适应&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="挑战与解决"&gt;挑战与解决&lt;/h2&gt;
&lt;h3 id="邮件接收链路"&gt;邮件接收链路&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：无服务器环境没有常驻 SMTP 服务，如何收邮件？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：利用 Cloudflare Email Routing 将域名 MX 收到的邮件直接投递给 Worker 的 &lt;code&gt;email&lt;/code&gt; 事件，配合 MIME 解析库在边缘完成正文与附件分离，全程无需一台服务器。&lt;/p&gt;
&lt;h3 id="附件存储与流量成本"&gt;附件存储与流量成本&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：附件体积大，塞进数据库既撑爆 D1 又拖慢查询。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：附件与元数据分离——D1 只存索引，二进制内容进 R2，下载走预签名直链，边缘缓存降低回源。&lt;/p&gt;
&lt;h3 id="验证码提取"&gt;验证码提取&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：验证码邮件模板千差万别，正则规则维护不过来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：接入 Workers AI 对邮件正文做智能提取，规则兜底为辅，验证码一键复制。&lt;/p&gt;
&lt;h2 id="技术栈细节"&gt;技术栈细节&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;后端&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare Workers + Hono：路由、拦截器、全局异常、i18n&lt;/li&gt;
&lt;li&gt;Drizzle ORM 操作 D1（SQLite），KV 做缓存加速&lt;/li&gt;
&lt;li&gt;Resend 发信，Email Routing 收信&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;前端&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vue3 + Element Plus 组件库&lt;/li&gt;
&lt;li&gt;ECharts 数据可视化&lt;/li&gt;
&lt;li&gt;Axios 统一请求层，Pinia 全局状态&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;安全&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JWT 身份认证 + RBAC 鉴权&lt;/li&gt;
&lt;li&gt;Turnstile 人机验证&lt;/li&gt;
&lt;li&gt;自定义异常体系与错误码&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="成果"&gt;成果&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;成本&lt;/strong&gt;：Workers + D1 + KV + R2 免费额度内运行，零固定支出&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐私&lt;/strong&gt;：邮件数据完全自持，不经过第三方邮箱平台&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灵活&lt;/strong&gt;：别名随用随建，注册服务时一键生成隔离邮箱&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;体验&lt;/strong&gt;：验证码自动识别 + TG 实时推送，收验证码快过手机短信&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="后续计划"&gt;后续计划&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 邮件搜索全文索引&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 日程/订阅邮件智能归档&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 自定义域名多域支持&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 移动端 PWA&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;项目状态&lt;/strong&gt;：✅ 生产运行中&lt;br&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;：
&lt;br&gt;
&lt;strong&gt;Demo&lt;/strong&gt;：
&lt;/p&gt;</description></item><item><title>SubsTracker 订阅提醒系统</title><link>https://www.zhangmeng.me/projects/substracker/</link><pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate><guid>https://www.zhangmeng.me/projects/substracker/</guid><description>&lt;p&gt;一套自托管的订阅管理与到期提醒系统，部署在 Cloudflare Workers 边缘运行时上，用 KV 做持久化存储，零服务器成本管理域名、会员、账单等各类订阅的到期提醒。&lt;/p&gt;
&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;日常订阅的服务越来越多——域名、云服务、会员、保号套餐——散落在各个平台的续费日期很难手动追踪。SubsTracker 提供了一个网页管理后台统一录入订阅，由 Cloudflare Cron Triggers 每小时整点检查，命中提醒规则时自动通过即时消息渠道推送，避免因忘记续费导致服务中断。&lt;/p&gt;
&lt;h2 id="核心功能"&gt;核心功能&lt;/h2&gt;
&lt;h3 id="订阅管理"&gt;订阅管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;增删改查&lt;/strong&gt;：名称、周期、金额、分类、备注一目了然，支持克隆同构订阅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;两种续订模式&lt;/strong&gt;：循环订阅（从当前到期日顺延）与到期重置（从支付日重新起算），覆盖会员续费和充值重置两类场景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;周期灵活性&lt;/strong&gt;：季度/半年/年快捷选项、公历&amp;quot;每月最后一天&amp;quot;、农历周期&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;支付记录&lt;/strong&gt;：手动续订时记录支付历史，配合仪表盘统计多币种支出&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="提醒调度"&gt;提醒调度&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多规则提醒&lt;/strong&gt;：默认预设到期前 7/3/1 天与到期当天，每条订阅可自定义多条规则&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;精确日语义&lt;/strong&gt;：仅在剩余天数正好等于 N 的当天发送一次，配合去重机制避免重复打扰&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发送时间窗口&lt;/strong&gt;：可配置允许发送的小时（如仅早 8 点），按时区判断，非窗口整点正常跳过&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;到期后追偿&lt;/strong&gt;：支持&amp;quot;到期后每隔 X 小时提醒，直到续费&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="消息渠道"&gt;消息渠道&lt;/h3&gt;
&lt;p&gt;Telegram（支持群话题 Topic）、Bark、企业微信、ntfy、Resend 邮件、Webhook、Gotify、Server酱、PushPlus、NotifyX 共 10 种渠道，任意勾选组合，每渠道可一键发送测试通知。&lt;/p&gt;
&lt;h3 id="可观测性"&gt;可观测性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通知历史：每条发送的成功/失败明细与错误原因&lt;/li&gt;
&lt;li&gt;调度日志：命中、去重、跳过的完整链路记录，排查&amp;quot;为什么没收到&amp;quot;不求人&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/debug&lt;/code&gt; 诊断页：时区与通知窗口实时检查&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="架构"&gt;架构&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──────────────┐ ┌───────────────────┐ ┌─────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 管理后台(SPA) │────▶│ Worker (Hono) │────▶│ KV 存储 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└──────────────┘ │ API + 定时调度 │ └─────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─────────┬─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Cron Triggers（每小时整点）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌─────────▼─────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 通知服务（10 渠道）│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Telegram/Bark/... │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └───────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;入口&lt;/strong&gt;：&lt;code&gt;fetch&lt;/code&gt; 处理网页与 API 请求，&lt;code&gt;scheduled&lt;/code&gt; 处理定时调度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分层设计&lt;/strong&gt;：&lt;code&gt;core/&lt;/code&gt;（时间、农历、货币、JWT）、&lt;code&gt;data/&lt;/code&gt;（KV 与迁移）、&lt;code&gt;services/&lt;/code&gt;（调度器与渠道）、&lt;code&gt;api/&lt;/code&gt;（路由）、&lt;code&gt;views/&lt;/code&gt;（管理端页面）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据迁移&lt;/strong&gt;：首次访问自动执行 KV 结构迁移，升级无感&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="挑战与解决"&gt;挑战与解决&lt;/h2&gt;
&lt;h3 id="时区一致性"&gt;时区一致性&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：Cron 按 UTC 触发，&amp;ldquo;到期前 3 天&amp;quot;&amp;ldquo;早 8 点发送&amp;quot;的判断若按 UTC 理解会整天偏移。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：所有调度判断统一收敛到配置时区（如 &lt;code&gt;Asia/Shanghai&lt;/code&gt;），配置页提供实时预览（当前会发/不会发），并有 &lt;code&gt;/debug&lt;/code&gt; 页面诊断时区与窗口。&lt;/p&gt;
&lt;h3 id="通知可靠性"&gt;通知可靠性&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：用户常反馈&amp;quot;没收到通知&amp;rdquo;，可能原因横跨渠道配置、时间窗口、规则命中、去重四层。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：把每次调度决策落盘——通知历史记录发送结果与错误详情，调度日志记录命中/去重/跳过原因，配合 FAQ 排查路径，让每次&amp;quot;没收到&amp;quot;都能定位到具体一层。&lt;/p&gt;
&lt;h3 id="零成本持久化"&gt;零成本持久化&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：Workers 无本地磁盘，传统数据库在免费额度内成本高。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：采用 Cloudflare KV 单键 JSON 文档存储，配合结构版本迁移与 JSON 备份导入导出（合并/覆盖两种模式），免费额度内即可长期稳定运行，数据随时可迁移。&lt;/p&gt;
&lt;h2 id="技术栈细节"&gt;技术栈细节&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;运行时&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare Workers 边缘运行时，全球就近响应&lt;/li&gt;
&lt;li&gt;KV 低延迟读、最终一致性写，契合订阅场景&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;框架与工程化&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hono 轻量 Web 框架，路由与中间件&lt;/li&gt;
&lt;li&gt;Vitest + workerd 单元/集成测试&lt;/li&gt;
&lt;li&gt;GitHub Actions 自动化 CI&lt;/li&gt;
&lt;li&gt;第三方通知 API 令牌，便于外部系统接入&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="成果"&gt;成果&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;成本&lt;/strong&gt;：完全运行在 Cloudflare 免费额度内，零固定支出&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可靠性&lt;/strong&gt;：整点调度 + 去重 + 失败明细，漏发/重发可追溯&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可移植&lt;/strong&gt;：JSON 备份一键迁移，不锁定平台&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可扩展&lt;/strong&gt;：10 种渠道抽象统一接口，新渠道接入成本低&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="后续计划"&gt;后续计划&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 支出趋势图表&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 日历视图&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 更多币种汇率源&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; PWA 离线查看&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;项目状态&lt;/strong&gt;：✅ 生产运行中&lt;br&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;：
&lt;br&gt;
&lt;strong&gt;Demo&lt;/strong&gt;：
&lt;/p&gt;</description></item><item><title>MoonTV 影视聚合播放器</title><link>https://www.zhangmeng.me/projects/moontv/</link><pubDate>Fri, 18 Jul 2025 00:00:00 +0000</pubDate><guid>https://www.zhangmeng.me/projects/moontv/</guid><description>&lt;p&gt;开箱即用的影视聚合播放器：输入片名一次搜索，聚合数十个免费资源站的结果，直接在线播放，收藏和观看进度跨设备同步——自托管，全端适配。&lt;/p&gt;
&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;看片资源的痛点从来不是&amp;quot;没有源&amp;quot;，而是源太散：不同资源站各自搜索、画质参差、进度互不相通。MoonTV 用一个 Web 应用把这些源聚合起来——前端 Next.js 14 App Router + Tailwind CSS，播放器集成 ArtPlayer 与 HLS.js，存储层抽象出 localStorage / Redis / Cloudflare D1 / Upstash 四种后端，从单机自用到多账户同步都能覆盖。&lt;/p&gt;
&lt;h2 id="核心功能"&gt;核心功能&lt;/h2&gt;
&lt;h3 id="聚合搜索"&gt;聚合搜索&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多源并发&lt;/strong&gt;：内置数十个免费资源站，一次输入立刻返回全源结果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;详情聚合&lt;/strong&gt;：剧集列表、演员、年份、简介等完整信息一页展示&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="播放体验"&gt;播放体验&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HLS 流媒体&lt;/strong&gt;：HLS.js 处理 m3u8 切片，ArtPlayer 提供统一的播放控制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能去广告&lt;/strong&gt;：自动跳过视频中的切片广告（实验性）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;播放记忆&lt;/strong&gt;：继续观看自动定位到上次进度&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="数据同步"&gt;数据同步&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多账户隔离&lt;/strong&gt;：账号体系下各用户收藏、播放记录互不干扰&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨端同步&lt;/strong&gt;：Redis / D1 / Upstash 云端存储，手机、平板、电脑进度无缝衔接&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;管理后台&lt;/strong&gt;：站长可管理用户与站点配置&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="多端适配"&gt;多端适配&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;响应式布局&lt;/strong&gt;：桌面侧边栏 + 移动端底部导航&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PWA&lt;/strong&gt;：离线缓存、安装到桌面/主屏，移动端接近原生体验&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AndroidTV&lt;/strong&gt;：适配电视端使用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="架构"&gt;架构&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌────────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Next.js 14 (App Router) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 搜索聚合页 │ 详情页 │ 播放页 │ 管理后台 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└───────────────┬────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 存储抽象层（统一接口）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌────────────┼────────────┬────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──▼─────┐ ┌────▼───┐ ┌──────▼───┐ ┌──────▼─────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│localSt.│ │ Redis │ │ CF D1 │ │ Upstash │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│(单机) │ │(Docker)│ │(CF Pages)│ │(Vercel) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└────────┘ └────────┘ └──────────┘ └────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;存储抽象&lt;/strong&gt;：四种存储后端实现同一套数据接口，按部署环境选择，业务代码无感知&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源站配置化&lt;/strong&gt;：&lt;code&gt;config.json&lt;/code&gt; 声明采集源，增删源不改代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;部署矩阵&lt;/strong&gt;：Docker（含 Redis 全家桶 Compose）、Vercel（Upstash）、Cloudflare Pages（D1 + &lt;code&gt;nodejs_compat&lt;/code&gt;），各自有最佳实践文档&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="挑战与解决"&gt;挑战与解决&lt;/h2&gt;
&lt;h3 id="多源搜索的延迟与稳定性"&gt;多源搜索的延迟与稳定性&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：数十个资源站并发请求，慢源会拖垮整体响应，个别源宕机还会报错。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：并发聚合 + 单源超时熔断，单个源失败不影响其余结果返回，全局错误指示器提示降级状态。&lt;/p&gt;
&lt;h3 id="四种存储后端的统一"&gt;四种存储后端的统一&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：localStorage、Redis、D1、Upstash 的数据模型与能力差异大，逐处 if/else 会迅速腐化。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：抽象出统一的存储层接口（收藏、播放记录、用户），各后端独立实现，部署时通过 &lt;code&gt;NEXT_PUBLIC_STORAGE_TYPE&lt;/code&gt; 一个环境变量切换。&lt;/p&gt;
&lt;h3 id="跨平台播放兼容性"&gt;跨平台播放兼容性&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：浏览器、移动端 WebView、电视大屏对 HLS 与编解码支持参差。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：HLS.js 统一处理 m3u8 拉流与分片调度，ArtPlayer 抹平各端播放器 UI 差异，PWA 与响应式布局覆盖剩余的端侧差异。&lt;/p&gt;
&lt;h2 id="技术栈细节"&gt;技术栈细节&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;前端&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next.js 14 App Router + TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS 3 响应式主题&lt;/li&gt;
&lt;li&gt;ArtPlayer + HLS.js 播放内核&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;存储&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;localStorage：零依赖单机模式&lt;/li&gt;
&lt;li&gt;Redis（Docker 自建）/ Upstash（Serverless）：多账户同步&lt;/li&gt;
&lt;li&gt;Cloudflare D1：Pages 部署的配套数据库&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;工程质量&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ESLint + Prettier + Husky 统一规范&lt;/li&gt;
&lt;li&gt;Jest 单元测试&lt;/li&gt;
&lt;li&gt;GitHub Actions 自动构建，Docker 镜像多架构发布&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="成果"&gt;成果&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;聚合&lt;/strong&gt;：一次搜索覆盖数十个资源站，找片效率数量级提升&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同步&lt;/strong&gt;：收藏与进度跨设备无缝衔接，换设备不用重找进度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;成本&lt;/strong&gt;：Vercel / Cloudflare 免费额度可跑，Docker 版单容器即可&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;体验&lt;/strong&gt;：PWA 安装到主屏，移动端接近原生 App&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="后续计划"&gt;后续计划&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 弹幕功能&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 更多存储后端&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 播放画质偏好记忆&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 资源站健康度监测面板&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;项目状态&lt;/strong&gt;：✅ 生产运行中&lt;br&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;：
&lt;br&gt;
&lt;strong&gt;Demo&lt;/strong&gt;：
&lt;/p&gt;</description></item></channel></rss>