|
All checks were successful
Android Build & Publish / build-android (push) Successful in 18m36s
|
||
|---|---|---|
| .gitea/workflows | ||
| content/articles | ||
| generated/prisma | ||
| ota-package | ||
| prisma | ||
| public | ||
| scripts | ||
| server | ||
| src | ||
| src-tauri | ||
| styles | ||
| _server.err | ||
| _server.out | ||
| .gitignore | ||
| Dockerfile | ||
| index.html | ||
| package-lock.json | ||
| package.json | ||
| prisma.config.ts | ||
| readme | ||
| reasonix.toml | ||
| server.err.log | ||
| server.out.log | ||
| vite.config.js | ||
# iBoard 用于收集和整理经济数据,但是以策略为主体重新组织。 - 首页主要是放经济文章 - 数据主要是放各种经济数据和图表。 - 策略是放按照经济理论组织的相关数据和图表的对比。 ## 首页 首页显示新闻模块和报警模块的数据,按照时间最新优先,无限滚动,直到数据库中没有数据为止。 ### 新闻模块 增加一个新闻模块,数据来源是每日夜间 3点,通过妙想 MCP 获取国内外最新经济政治新闻,按影响大小排序10条。 存入数据库。 ### 报警模块 World Bank 中的数据只用来对比妙想 MCP 拉取的数据正确性。当同一时间的同一项数据不同时,记录一个报警。 ## 监控 监控分为服务器监控和服务监控两部分。 服务器监控对接 komari,地址:https://komari.honor3.com/ ## 前端 OTA 升级 只升级前端资源 (`dist/`), **不触碰** Tauri 框架/原生层, 不重打 APK. 底层使用 [`tauri-plugin-hotswap`](https://github.com/denniskribl/tauri-plugin-hotswap) (签名/回滚/资源替换全部由插件处理). ### 工作流 ``` 开发者 服务端 npm run build ──┐ scripts/build-ota.mjs │ 生成 iboard-ota.tar.gz + minisign 签名 │ 输出 latest.json (sequence/version/...) ▼ ota-package/ ── 部署到服务器 ──▶ /srv/iboard/ota-package │ ▼ GET /api/ota/check/<seq> 客户端 (Tauri) │ 启动 ─▶ notifyReady() ▼ 我页 ─▶ checkUpdate() ◀──── 200 + manifest (含 url/signature) ─────┘ applyUpdate() ─▶ 下载 tar.gz ─▶ minisign 校验 ─▶ 解压到 AppData/ota-dist location.reload() ─▶ 后续资源从 tauri://localhost 优先命中覆盖包 ``` ### 首次部署 1. **生成签名密钥** (一次性): ```bash # 安装 minisign: Windows (scoop) / macOS (brew) / Linux (apt) node scripts/ota-genkey.mjs # 产物: ota-package/hotswap.{key, pub} ``` 2. **把公钥写入 `src-tauri/tauri.conf.json`** 的 `plugins.hotswap.pubkey` 字段 (脚本会打印). 3. **配置 endpoint** (`src-tauri/tauri.conf.json`): ```json "hotswap": { "endpoint": "https://your-server/api/ota/check/{{current_sequence}}", "pubkey": "RWR...", "require_https": true } ``` 4. **服务端环境变量** `OTA_PACKAGE_DIR` 指向 `ota-package/` 所在目录. ### 发布新版前端 ```bash npm run build # 生成 dist/ node scripts/build-ota.mjs # 打成 tar.gz + 签名 + latest.json # sequence 默认 = Date.now(), 也可 --sequence 43 手动指定 # 也可加 --notes "修复登录按钮" --min-binary 0.1.0 ``` 然后把 `ota-package/` 下两个文件 (`iboard-ota.tar.gz` + `latest.json`) 同步到 服务端 `OTA_PACKAGE_DIR` 指向的目录. sequence 单调递增即可. ### 客户端使用 打开 App 的"我"页, 点 [检查更新] → [立即升级] 即可. 失败会自动回滚到内置 dist. > **注意:** Tauri 2 的 dev 模式 (`tauri dev`) 会代理到 Vite dev server, **OTA 不生效**. > OTA 仅在 release/打包构建中可用, 测试请用 `tauri build` 产物. ### Web 端 Web 浏览器访问 (同源) 时, 服务端返回简化版 manifest, 仅显示"有新版本请刷新". Web 端不会自动下载包, 也不会替换前端代码. ### CI 自动签名 (Gitea Actions) .gitea/workflows/ota-build.yml 是手动触发的 OTA 打包工作流 (每次发版前点一次). **配置 secret** (Gitea 仓库 -> Settings -> Actions -> Secrets): - MINISIGN_PRIVATE_KEY: 完整 .key 文件内容, **整段** (含首行 `untrusted comment: minisign encrypted secret key` 和 base64 行), 整段作为多行 secret 粘贴即可. **使用流程**: 1. 在 Gitea Actions 页面选 OTA Frontend Build & Sign -> Run workflow 2. 填 sequence (可选, 不填用时间戳) 和 otes (可选) 3. CI 跑完会在 artifact 里看到 ota-package/iboard-ota.tar.gz + latest.json + iboard-ota.tar.gz.minisig 4. 下载 artifact, scp 到服务器 OTA_PACKAGE_DIR 目录 5. 客户端"我"页 [检查更新] 即可触发升级 **注意**: - CI 用的私钥必须**与** auri.conf.json 里 plugins.hotswap.pubkey **配对**; 换密钥时需要同时更新 CI secret 和 conf. - 不要把私钥 commit 到 git, 整个 ota-package/hotswap.key 已被 .gitignore 排除.