diff --git a/docs/021任务.md b/docs/021任务.md new file mode 100644 index 0000000..92ec42d --- /dev/null +++ b/docs/021任务.md @@ -0,0 +1,156 @@ +# 0.2.1 发布任务 — 目标与现状 + +> 最后更新:2026-10-27 07:05 +> 分支:`dev-0.2`(已推送,与 `origin/dev-0.2` 同步于 `b29be62`) +> 状态:**代码与打包全部就绪;生产切换尚未执行(停在"镜像已构建,待起栈+迁移+切域名")** + +--- + +## 一、任务目标(用户原始要求) + +1. 域名 `iboard.honor3.com` 已指向 3000 端口、HTTPS 证书已配好 → 客户端全面切到该域名。 +2. **Windows 外壳 + 离线编辑功能正式合并到 `dev-0.2`**,完整版本号 **0.2.1**。 +3. 确保 **Android** 功能正常(通过 CI 编译验证,不在本地装 Android 工具链)。 +4. 确保 **CI/CD** 正常。 +5. Windows **本地打包正常**即可。 +6. `dev-0.2` 更新完成后 **通过 `master` 分支发布**。 +7. 追加要求:**不要再有 13002 这类独立端口**,所有版本合并成一套。 + +--- + +## 二、已完成 + +### 2.1 分支合并 + +| 内容 | 结果 | +| --- | --- | +| `dev-0.2.1`(离线编辑 + 项目编号 + PG/PowerSync)→ `dev-0.2` | 已合并 `e689e44` | +| `dev-windows-0.1`(Windows 外壳:托盘/悬浮球/吸附/自启动)→ `dev-0.2` | 已按路径迁入 `eef2969` | +| `dev-0.2` → `android-1.0`(触发 APK 构建) | 已合并 `4958359` | +| 冲突处理 | `projects.js`/`tasks.js`/`api/task.js` 手工合并,**两边功能都保留**(`autoArchive` 归档 + `code` 编号) | +| 归档功能补齐到本地库 | `src/api/task.js` 新增 `archive`/`unarchive`/`archivedList`;`schema.js` 加 `archived/archivedAt/archiveSource/autoArchive`;`sync-config.yaml` 与 upload 处理器同步 | +| Prisma 客户端补齐 | dev-0.2 原来缺任务模块 6 个模型,已重新 generate `fc23919` | + +### 2.2 版本与域名 + +- 版本统一 **0.2.1**:`package.json` / `src-tauri/tauri.conf.json` / `Cargo.toml` / `Cargo.lock`(`scripts/ci/check-version.mjs` 通过) +- 域名切 `https://iboard.honor3.com`: + - `src/api/client.js` 注释、`.env.shell`、`scripts/wsl/build-apk.sh`、`.gitea/workflows/android-build.yml`、`.gitea/workflows/docker-build.yml`、`Dockerfile`(`OTA_PUBLIC_BASE`)、`tauri.conf.json`(OTA endpoint + CSP) +- 旧域名 `bh.vps.honor3.com:3001` 仅保留在 CSP 白名单里做滚动兼容 + +### 2.3 单端口架构(去掉 13002) + +| 改动 | 位置 | +| --- | --- | +| Express 增加 `/sync`、`/socket` 同域反代到内网 powersync | `server/powersync-proxy.js` + `server/index.js`(挂在 `express.json()` 之前,支持长连接) | +| 生产编排:app(3001 对外) + pg(内网) + powersync(内网) | `deploy/prod/docker-compose.yml` | +| 生产部署脚本(幂等:迁移 → publication → 起栈 → 健康检查) | `scripts/deploy/prod.sh` | +| PG 初始化(powersync_storage 用户) | `deploy/prod/initdb/01-powersync-storage.sh` | +| 逻辑复制 publication(**建表后**执行) | `deploy/prod/sql/publication.sql` | +| 部署文档 | `deploy/prod/README.md`、`.env.example` | +| CI 部署段改为调用宿主脚本,未配 PG secrets 时自动跳过 | `.gitea/workflows/docker-build.yml` | + +### 2.4 Windows 本地打包 — 通过 ✅ + +`npm run build:win` 全流程成功(本机需 Node 20.19+;已用便携 Node 20.18.1 之外的 Node 24 验证过 vite 构建): + +| 产物 | 路径 | 大小 | +| --- | --- | --- | +| 安装包 | `artifacts/windows/iBoard_0.2.1_x64-setup.exe` | 6.9 MB | +| 便携版 zip | `artifacts/windows/iBoard_0.2.1_x64-portable.zip` | 7.9 MB | + +外壳能力(继承 dev-windows-0.1):托盘、悬浮球吸附、自动隐藏、单实例、自启动、窗口尺寸单值配置 +(`%APPDATA%\com.iboard.app\shell-config.json` 的 `window_width`,高度按 405:720 锁定推导)。 + +离线能力(继承 0.2.1):GET 响应本地缓存、同步凭证持久化(离线不清库)、左上角「离线」徽标。 + +### 2.5 Android CI — 通过 ✅ + +- 触发:`android-1.0` 分支 push(`4ded8e3`) +- 结果:**16 个步骤全部 success**,`Build release APK` + `Publish APK to Gitea packages` 成功 +- 产物:`app-universal-release.apk`(20 MB),versionName = **0.2.1** + 已发布到 `http://git.honor3.com/api/packages/Fullstack/generic/iboard/1.0-4ded8e30/` +- 首次失败原因:runner 宿主机(baihu)磁盘 **95%** → `No space left on device`; + 清理悬空镜像 + 构建缓存后释放 11.5 GB,重跑通过。**磁盘现已 60%(39 GB 可用)** + +### 2.6 CI/CD 现状 + +| Workflow | 触发 | 状态 | +| --- | --- | --- | +| `docker-build.yml` | `master` push | 改造完成,未在 master 上验证(部署段会因缺 secrets 跳过) | +| `android-build.yml` | `android-*` push | **已验证通过** | +| `ota-build.yml` / `sync-registry.yml` | 参照原逻辑 | 未改动 | + +--- + +## 三、当前卡点(生产切换未执行) + +生产镜像 **已构建成功**:`iboard:latest` = `db6b27b851b8`(924 MB,2026-10-26 22:53) + +baihu 上当前跑着两套: + +| 容器 | 用途 | 端口 | +| --- | --- | --- | +| `iboard`(旧) | **现网生产**,MySQL(宿主 3306) | 3001 | +| `iboard-021-app-1` 等 4 个 | 0.2.1 验证栈 | 13001 / 13002 / 13443 | +| (未启动)`iboard-prod` | **新生产栈**(PG + PowerSync + app) | 3001(计划) | + +`/app/iboard-prod` 已上传源码、`deploy/prod/.env` 已生成(6 个密钥,600 权限)。 + +**剩余步骤(约 4 步)**: + +1. 起新栈(先用 `HOST_PORT=13011` 灰度,不动现网) +2. 数据迁移:现网 MySQL → 新 PG(`scripts/etl-mariadb-to-pg.mjs`,只读源库) +3. 验证:健康检查、登录、任务列表、离线编辑(断网后仍可读)、同步回流 +4. 切换:停 `iboard` 旧容器 → 新栈改绑 3001 → 域名 `iboard.honor3.com` 生效 → 下线验证栈(13001/13002/13443) + +然后 `dev-0.2` → `master` 合并推送,触发 CI 发布。 + +--- + +## 四、需要确认的信息(阻塞项) + +1. **Gitea Actions Secrets 是否要配 PG 密钥?** + 需配:`PG_PASSWORD`、`PS_STORAGE_PASSWORD`、`JWT_SECRET`、`POWERSYNC_JWT_SECRET`、`POWERSYNC_JWT_KEY_B64`。 + 不配的话:master 的 CI 只构建镜像不部署,生产靠手工执行 `scripts/deploy/prod.sh`(当前默认路径)。 + +2. **生产数据迁移的时间窗口**:迁移需短暂停写(现网 MySQL 只读快照)。是否可以挑一个低峰时间、期间 (~10 分钟) 站点只读? + +3. **现网 MySQL 里的米家凭证/缓存**:`/app/iboard/cache`(`auth.txt` 等)是否要一并搬到新栈的 `deploy/prod/data/cache`? + +4. **用户密码**:迁移只搬数据,`JWT_SECRET` 若换新,所有人需重新登录;是否沿用现网 `JWT_SECRET`(`iboard`)以保持登录态?**建议换新**(当前值过弱)。 + +5. **域名端口说明**:`iboard.honor3.com` 实际反代到 baihu **3001**(NPM 配置:`114.134.187.170:3001`,SSL 强制)。 + 你提到"已转向 3000 端口"——请确认指的是 `honor3.com` 根域(→ homepage)而非 `iboard` 子域, + 否则需要调整 NPM 的 forward_port。 + +--- + +## 五、关键路径与命令速查 + +```bash +# 仓库 +C:\Users\Rabbit\Documents\workbetch\iboard # dev-0.2 主工作区 +C:\Users\Rabbit\Documents\workbetch\iboard-dev-0.2.1 # 研究分支 worktree +C:\Users\Rabbit\Documents\workbetch\iboard-dev-windows # Windows 外壳 worktree + +# 服务器 +ssh root@baihu # 生产 + CI runner(baihu 上跑 act_runner,注册名 baishe) +ssh root@baishe # 反代(NPM)、Gitea、homepage + +# 生产目录 +/app/iboard-prod/deploy/prod/{docker-compose.yml,.env,data/,powersync/,sql/,initdb/} + +# 常用 +docker compose -f /app/iboard-prod/deploy/prod/docker-compose.yml --env-file /app/iboard-prod/deploy/prod/.env ps +bash /app/iboard-prod/scripts/deploy/prod.sh +curl -s https://iboard.honor3.com/api/health +``` + +## 六、已知遗留 + +- `dev-0.2.1` / `dev-windows-0.1` 两个 worktree 分支内容已全部并入 `dev-0.2`,可择机删除。 +- `tmp-offline-edit` 分支 = `1cd5b85`,历史遗留,可删。 +- 临时测试脚本 `scripts/_browser-test.mjs`、`scripts/_shell-offline-test.mjs` 含真实口令,**不要入库**。 +- 0.2.1 验证库里可能残留测试任务(`浏览器验证任务` / `IBOARD-8`),迁移后建议清理。 +- `node_modules` 曾在多种 Node 版本间切换,如遇 esbuild 权限报错,清 `node_modules` 重装即可。