# SmsReceiver Worker(前后端分离版) > 将 SmsReceiver-go 迁移到 Cloudflare Worker + Pages + D1 的 **Worker 化**实现。 > 目标是把「短信接收 API + 管理界面」拆分为独立的 API 服务与静态前端,提升部署弹性、跨域能力与运维简洁度。 ## 开发目的 1. **Worker 化**:摆脱传统服务器进程部署,使用 Cloudflare Worker 作为 API 运行环境。 2. **前后端分离**:前端使用 Pages 静态托管,API 单独在 Worker 上运行,天然解耦。 3. **低运维成本**:无需自建数据库与运行时,D1 提供托管 SQLite 体验。 4. **部署可重复**:通过 wrangler + 配置文件完成快速部署与迁移。 5. **兼容原协议**:保留原 SmsReceiver-go 的字段、签名逻辑与接入方式。 ## 架构概览 ``` [TranspondSms / 客户端] | | HTTP POST (token/sign) v Cloudflare Worker (Hono) | | D1 (SQLite) v 数据持久化 + 管理 API Cloudflare Pages (静态 UI) | | API_BASE 指向 Worker v 管理后台 ``` ## 项目结构 ``` . ├── worker/ # Cloudflare Worker API (Hono + D1) │ ├── src/ # API 代码 │ ├── schema.sql # D1 表结构 │ ├── migrate_sqlite_to_d1.py # 旧 sqlite 数据迁移脚本 │ ├── wrangler.toml # Worker 配置 │ └── package.json └── pages/public/ # Cloudflare Pages 静态管理 UI ├── index.html ├── app.js └── app.css ``` --- # 关键设计说明(详细解读) ## 1. 前后端分离特性 - **API** 与 **UI** 完全解耦。 - UI 仅为静态资源(HTML/JS/CSS),部署到 Pages; - API 只处理数据与鉴权,部署到 Worker; - UI 通过 `API_BASE` 指向后端,无需在同域运行。 **优势**: - UI 部署独立、回滚简单。 - API 可单独扩容/升级。 - 适配多域名、CDN 就近访问。 ## 2. 数据层:D1 (SQLite) - 使用 Cloudflare D1 替代本地 SQLite。 - 表结构与原 Go 版本保持一致:`sms_messages`、`receive_logs`。 - 使用 SQL 语句创建表,便于版本迁移与重建。 ## 3. 兼容原接收协议 API 保持字段一致: - `from` / `content` / `timestamp` / `sign` / `device` / `sim` / `token` 签名逻辑保持与 Go 版一致: ``` stringToSign = `${timestamp}\n${secret}` sign = HMAC-SHA256(stringToSign) -> Base64 -> URL encode ``` ## 4. 认证与登录 - 使用 `ADMIN_USER` + `ADMIN_PASS_HASH` 登录。 - 登录密码使用 HMAC-SHA256 生成 hash(与 SESSION_SECRET 绑定)。 - Cookie 采用 `SameSite=None; Secure`,解决跨域登录。 ## 5. 查询能力 - 支持 `from`、时间区间筛选(start_ts / end_ts)。 - UI 默认显示当前月,并提供“本月 / 上月 / 全部”。 - 移动端适配:表格横向滚动,筛选区可滚动。 --- # 部署指南 ## 1) 部署 Worker API ```bash cd worker npm install ``` 编辑 `wrangler.toml`: - `database_id` - vars: `ADMIN_USER` / `ADMIN_PASS_HASH` / `SESSION_SECRET` / `HMAC_SECRET` 初始化 D1 表结构: ```bash npx wrangler d1 execute smsreceiver --file=schema.sql ``` 本地调试: ```bash npx wrangler dev ``` 发布: ```bash npx wrangler deploy ``` --- ## 2) 部署 Pages UI 将 `pages/public/` 作为静态站点部署到 Cloudflare Pages。 修改 `pages/public/app.js`: ```js const API_BASE = "https://你的-worker域名" ``` 部署完成后即可访问管理后台。 --- ## 3) 密码 hash 生成 当前登录逻辑:`HMAC_SHA256(password, SESSION_SECRET)` 生成方式: ```bash node -e "const c=require('crypto');console.log(c.createHmac('sha256','YOUR_SESSION_SECRET').update('YOUR_PASSWORD').digest('hex'))" ``` 将结果写入 `ADMIN_PASS_HASH`。 --- ## 4) 从旧 SQLite 迁移到 D1 脚本:`worker/migrate_sqlite_to_d1.py` 需要环境变量: - `CF_ACCOUNT_ID` - `CF_API_TOKEN` - `D1_DATABASE_ID` - `SQLITE_PATH`(默认 `sms_receiver_go.db`) 运行: ```bash cd worker python3 migrate_sqlite_to_d1.py ``` --- # 使用指南 ## 1. 客户端上报短信 `POST /api/receive` 字段: - `from`:发件人 - `content`:短信正文 - `timestamp`:Unix 时间戳 - `token`:API Token - `sign`:签名 - `device` / `sim`:设备与卡槽信息(可选) ## 2. 登录管理后台 - 访问 Pages URL - 输入 `ADMIN_USER` / 密码 - 可查看短信列表、详情、日志、筛选记录 ## 3. 管理 API 端点示例 - `POST /api/auth/login` - `POST /api/auth/logout` - `GET /api/auth/me` - `GET /api/messages` - `GET /api/messages/:id` - `GET /api/logs` - `GET /api/stats` - `GET /api/health` --- # 本地开发流程(推荐) 1. 在 `worker/` 中使用 `wrangler dev` 启动本地 API。 2. 在 `pages/public/` 中修改前端并直接用静态服务器预览。 3. API_BASE 指向本地 API 或临时 Worker 域名。 4. 测试完成后分别部署 Worker 与 Pages。 --- # 注意事项 - UI 与 API 部署后跨域必须使用 `SameSite=None; Secure` Cookie。 - D1 为 SQLite 兼容,但限制与云端事务特性不同于本地。 - API Token 与 HMAC 密钥要妥善保管。 --- # License 内部项目使用,按需扩展。