chore: 更新客户端和服务端子仓库指针

This commit is contained in:
2026-07-15 06:41:10 +00:00
parent 2b80c6de9f
commit 17d23f8dab
3 changed files with 64 additions and 46 deletions
+62 -44
View File
@@ -53,7 +53,8 @@ MainApp.exe / MainApp 当前仓库内的示例业务程序
已经实现的能力:
- 首次启动时把 `config/app_config.json` 导入当前 Windows 用户注册表,后续运行配置优先从注册表读取;如果解析后的 JSON 内容变化,下一次启动会自动重新导入,并清理 `config/client_identity.dat``config/version_policy.dat`
- 首次启动时把 `config/app_config.json` 导入当前 Windows 用户注册表,后续普通运行配置优先从注册表读取;如果解析后的 JSON 内容变化,下一次启动会自动重新导入,并清理 `config/client_identity.dat``config/version_policy.dat`
- 服务端 API 地址 `api_base_url` 不再写入 `app_config.json` 或注册表,而是写入 `config/server_config.json` 并通过 `config/server_config.qrc` 编译进 Launcher / Updater。
- 首次设备登记和本地设备身份校验。
- License 校验。
- `license_key` 为空时,`Launcher.exe` 会弹窗让用户粘贴后台创建的 License,并写入注册表。当前实现会先检查配置项;即使本地已有 `config/client_identity.dat`,只要清空 `license_key` 仍会提示用户补填 License。
@@ -125,7 +126,7 @@ Word 文档已经说明:
- 后端工程结构:参考 FastAPI 官方 full-stack 模板、FastAPI Users 等成熟 FastAPI 后台项目的分层方式,拆成 `routes / services / repositories / schemas / core`
- 管理后台前端:使用 GitHub 上的 `pure-admin-thin` / `vue-pure-admin` 生态,技术栈是 `Vue3 + Element Plus + TypeScript + Vite`
- 存储组件:元数据使用 SQLite,版本文件和崩溃文件使用 MinIO 对象存储。
- 当前说明:后端已经完成工程化分层,但还没有整套接入 FastAPI Users 的用户、JWT、RBAC 权限系统;当前管理员鉴权仍是项目自有令牌机制,后续生产化安全加固时可以继续替换或接入成熟认证组件。
- 当前说明:后端已经完成工程化分层,并已加入用户名/密码登录、Argon2 密码哈希、JWT access/refresh token、RBAC 权限检查和管理员用户管理页面。当前实现是轻量用户体系,后续仍可继续接入 FastAPI Users 等更完整的成熟认证组件。
当前后端已经从早期单文件形态拆成分层结构,主要入口和目录:
@@ -334,7 +335,7 @@ SimCAE/
## 十、运行目录权限说明
当前客户端 SDK 把部署配置源放在 `Launcher.exe` 所在目录下的 `config/app_config.json`,启动时同步到当前 Windows 用户注册表;运行时配置值优先读写注册表,路径为 `HKEY_CURRENT_USER\Software\Marsco\UpdateClientSDK\installations\<安装目录SHA256>\config`。如果检测到 `app_config.json` 变化,SDK 会删除 `config/client_identity.dat``config/version_policy.dat`,避免旧授权身份或旧策略继续生效;安装目录不可写时会弹出管理员权限确认框。设备身份、状态、策略、更新事务、备份、暂存文件、下载断点和 Manifest 缓存仍位于 `Launcher.exe` 所在目录下,例如 `config/client_identity.dat``config/local_state.json``config/version_policy.dat``update/``update_temp/`。当 SDK 放在 `SimCAE/bin` 时,这些运行时文件都在 `SimCAE/bin` 下,不会再在 `SimCAE/` 根目录生成顶层 `update/`
当前客户端 SDK 把部署配置源放在 `Launcher.exe` 所在目录下的 `config/app_config.json`,启动时同步到当前 Windows 用户注册表;运行时普通配置值优先读写注册表,路径为 `HKEY_CURRENT_USER\Software\Marsco\UpdateClientSDK\installations\<安装目录SHA256>\config`服务端 API 地址 `api_base_url` 是例外:它位于源码 `config/server_config.json`,通过 `config/server_config.qrc` 编译进程序,不再写入 `app_config.json` 或注册表。如果检测到 `app_config.json` 变化,SDK 会删除 `config/client_identity.dat``config/version_policy.dat`,避免旧授权身份或旧策略继续生效;安装目录不可写时会弹出管理员权限确认框。设备身份、状态、策略、更新事务、备份、暂存文件、下载断点和 Manifest 缓存仍位于 `Launcher.exe` 所在目录下,例如 `config/client_identity.dat``config/local_state.json``config/version_policy.dat``update/``update_temp/`。当 SDK 放在 `SimCAE/bin` 时,这些运行时文件都在 `SimCAE/bin` 下,不会再在 `SimCAE/` 根目录生成顶层 `update/`
如果把软件放在 `C:\Program Files\SimCAE\bin` 并用普通用户启动,普通配置值已经不需要写回 `app_config.json`;但设备身份、状态、策略、更新缓存等文件仍可能需要写安装目录。当前代码对小型状态文件写入已有管理员权限确认;正式要完整安装到 `Program Files` 并自动升级大文件时,后续仍建议补 Windows 服务,或将更多运行时状态迁移到 `ProgramData` / `AppData`
@@ -413,7 +414,8 @@ SimCAE 崩溃报告后端已经完成第一阶段核心接口:接收 SimCAECra
4. 后续运行配置优先从注册表读取,运行时动态值写入注册表。
5. 检测到 JSON 变化后自动清理 `client_identity.dat` 和 `version_policy.dat`。
6. 支持旧 client.ini 自动迁移。
7. 保存 API 地址、App ID、当前版本、渠道、设备 ID、客户端 Token、启动 Token、平台和架构。
7. 保存 App ID、当前版本、渠道、设备 ID、客户端 Token、启动 Token、平台和架构。
8. 使用 `config/server_config.json` + `config/server_config.qrc` 把 API 地址编译进程序,避免写入 `app_config.json` 或注册表。
8. 更新成功后写入 current_version。
9. 文件型本地状态仍使用 QSaveFile 原子写入。
10. 运行时配置不进入发布包。
@@ -661,20 +663,23 @@ Updater 启动时会读取旧事务,并根据状态尝试恢复或回滚。
已实现:
1. 管理员令牌输入、隐藏、显示和保存
2. 修改管理员令牌
3. 创建和选择应用
4. 选择软件根目录发布
5. 切换到“压缩发布包”模式上传压缩包发布,支持 zip、tar.gz、tgz、tar.bz2、tbz2、rar
6. stable、preview、dev 渠道选择
7. 版本列表
8. 设置最新版本
9. 删除版本和云端文件
10. 版本策略读取和保存
11. 升级日志
12. 调试输出
13. 发布文件预览、大小和状态提示
14. 页面美化和响应式布局
1. 用户名和密码登录管理后台
2. 登录成功后由服务端签发 JWT access token 和 refresh token,管理接口使用 `Authorization: Bearer ...` 调用
3. 管理员密码修改
4. RBAC 角色权限校验,目前内置超级管理员、发布管理员、授权管理员、审计人员和崩溃报告管理员
5. 管理员用户管理:创建用户、编辑显示名称和角色、启用/禁用、重置密码,并防止禁用最后一个超级管理员
6. 创建和选择应用
7. 选择软件根目录发布
8. 切换到“压缩发布包”模式上传压缩包发布,支持 zip、tar.gz、tgz、tar.bz2、tbz2、rar
9. stable、preview、dev 渠道选择
10. 版本列表
11. 设置最新版本
12. 删除版本和云端文件
13. 版本策略读取和保存
14. 升级日志
15. 调试输出。
16. 发布文件预览、大小和状态提示。
17. 页面美化和响应式布局。
2.16 一次性短期启动票据
@@ -719,7 +724,7 @@ Updater 启动时会读取旧事务,并根据状态尝试恢复或回滚。
10. 离线更新包:管理后台可生成 MUPD0001/.upd 包,包内包含签名 Manifest、包头签名、文件偏移、大小和 SHA-256。
11. Launcher/Updater 支持导入离线包,离线安装复用现有事务、Bootstrap、校验、健康确认和回滚机制。
12. 下载日志:记录下载授权、客户端完成结果、文件大小、IP、User-Agent 和时间。
13. 管理员审计日志:记录 /admin 写操作、管理员令牌指纹、路径、结果、状态码、IP 和 User-Agent。
13. 管理员审计日志:记录 /admin 写操作、管理员账号、角色、鉴权方式、路径、结果、状态码、IP 和 User-Agent。
2.19 SimCAE Crash Report 后端第一阶段
@@ -808,16 +813,26 @@ RSA 签名已经实现,但仍缺少:
3.7 管理员登录
当前采用单管理员 Token,服务端用 .env 中的 ADMIN_TOKEN 校验,并且已经记录 /admin 写操作审计
当前管理后台已经从单管理员 Token 升级为用户名/密码登录、JWT access/refresh token 和 RBAC 权限检查
尚缺少
已实现
1. admin_users 表。
2. 正式登录接口
3. Token 过期时间
4. 多管理员和角色权限
5. 登录失败审计
6. 会话吊销和 Token 轮换流程
2. admin_refresh_tokens 表
3. 初始管理员自动创建
4. Argon2 密码哈希
5. JWT access token 和 refresh token
6. 角色权限映射,例如 super_admin、release_admin、license_admin、auditor、crash_admin
7. 管理员用户管理接口和页面:列表、创建、编辑角色、启用/禁用、重置密码。
8. 管理后台写操作审计记录管理员用户名、角色、认证方式和操作结果。
`ADMIN_TOKEN` 仍保留为旧脚本兼容令牌、JWT_SECRET 未配置时的默认签名密钥,以及 CRASH_ADMIN_TOKEN 为空时的崩溃报告管理兜底令牌。
仍可继续加强:
1. 登录失败审计和频率限制。
2. 更细粒度的会话管理和 Token 轮换策略。
3. 接入 FastAPI Users 或同类成熟用户认证模块,替换当前轻量用户表。
3.8 数据库结构
@@ -952,12 +967,12 @@ RSA 签名已经实现,但仍缺少:
1. admin_audit_logs 表。
2. 统一中间件记录所有 /admin 写操作。
3. 记录管理员令牌截断 Hash 指纹,不保存令牌明文。
3. 记录管理员账号、角色、鉴权方式和兼容令牌截断 Hash 指纹,不保存令牌明文。
4. 记录操作路径、HTTP 方法、查询目标、成功/失败、状态码、IP、User-Agent 和时间。
5. 鉴权失败及业务失败同样进入审计。
6. 审计日志查询 API 和管理后台列表。
审计中间件不保存请求正文,避免 License 密钥、新管理员令牌等敏感内容进入日志。
审计中间件不保存请求正文,避免 License 密钥、新密码、兼容令牌等敏感内容进入日志。
4.11 代码签名
@@ -1280,10 +1295,10 @@ symbols.zip 就是 CI 或发布流程上传的符号包。它按 product、appVe
1. CLIENT_API_TOKEN:客户端安装包自带的公共门槛,用于首次设备登记等基础访问。
2. license_key:客户授权密钥,证明这个客户/项目有权使用某个 app/channel,并限制设备数和有效期。
3. device_id/client_identity.dat:服务端给某台安装实例签发的设备身份,之后每次更新请求都要带。
4. X-Admin-Token:管理后台请求头里传的管理员令牌;当前服务端用 .env 里的 ADMIN_TOKEN 校验
4. 管理后台 JWT:网页登录成功后使用 `Authorization: Bearer <accessToken>` 调用后台接口
5. CRASH_REPORT_TOKENSimCAECrashReporter.exe 上传崩溃报告用的 Bearer Token。
6. CRASH_SYMBOL_TOKENCI 上传 symbols.zip 用的 Bearer Token。
7. CRASH_ADMIN_TOKEN:查询和下载崩溃原始文件用;如果不配置,就复用当前管理员令牌。
7. CRASH_ADMIN_TOKEN:查询和下载崩溃原始文件用;如果不配置,就复用 ADMIN_TOKEN 作为崩溃报告管理兜底令牌。
简单理解:
@@ -1304,8 +1319,8 @@ SDK 是 Software Development Kit,中文通常叫“软件开发工具包”。
1. 可直接使用的二进制文件,例如 Launcher.exe、Updater.exe、Bootstrap.exe。
2. 必要的运行时文件。对 SimCAE 这种自身已带 Qt 的软件,SDK 默认不再携带 Qt DLL,避免覆盖业务软件原有运行库。
3. 配置模板,例如 app_config.example.json。
4. 接入文档,例如如何配置 app_id、channel、api_base_url、license_key。
3. 配置模板,例如 app_config.example.json 和 server_config.json
4. 接入文档,例如如何配置 app_id、channel、qrc 服务端地址、license_key。
5. 打包脚本,例如 package-client.ps1。
6. 示例项目或 Demo。
7. API/命令行约定,例如主程序必须由 Launcher 启动,MainApp 需要写健康标记。
@@ -1352,6 +1367,8 @@ UpdateClientSDK/
Bootstrap.exe
config/
app_config.json
server_config.json
server_config.qrc
manifest_public_key.pem
scripts/
install-sdk.ps1
@@ -1360,10 +1377,11 @@ UpdateClientSDK/
对接方真正拿到后,通常只需要做这些事:
1. 把 SDK 的 Launcher、Updater、Bootstrap 放到业务软件运行目录。
2. 设置 app_config.jsonserver 地址、app_id、channel、当前版本、主程序名等。`license_key` 可以预先填入;如果为空,用户首次启动 Launcher 时会弹窗粘贴授权密钥。
3. 以后让用户启动 Launcher.exe
4. 在管理后台创建应用、License、渠道和发布版本
5. 发布新版本时选择干净的 Release 输出目录,或切换到“压缩发布包”模式上传 zip/tar.gz/tar.bz2/rar 等压缩发布包
2. 设置 app_config.jsonapp_id、channel、当前版本、主程序名等。`license_key` 可以预先填入;如果为空,用户首次启动 Launcher 时会弹窗粘贴授权密钥。
3. 设置 config/server_config.json:服务端 API 地址。该文件必须在编译 Launcher/Updater 前写好,因为它会被 qrc 编进程序
4. 以后让用户启动 Launcher.exe
5. 在管理后台创建应用、License、渠道和发布版本
6. 发布新版本时选择干净的 Release 输出目录,或切换到“压缩发布包”模式上传 zip/tar.gz/tar.bz2/rar 等压缩发布包。
10.4 当前已有 package-client.ps1 的作用
@@ -1372,7 +1390,7 @@ update-client/scripts/package-client.ps1 已经是 SDK/客户端包雏形。
它目前会做这些事:
1. 从 out/bin 收集已编译好的客户端文件。
2. 检查必填配置,例如 app_id、channel、api_base_url、current_version、client_token、launch_token、license_key、主程序名等。
2. 检查必填配置,例如 app_id、channel、current_version、client_token、launch_token、license_key、主程序名等。
3. 检查 Launcher、Updater、Bootstrap、MainApp 是否存在。
4. 拒绝 PDB、ILK、Debug Qt DLL 等调试产物进入发布包。
5. 检查主程序是否被嵌套放错目录。
@@ -1404,11 +1422,11 @@ update-client/scripts/package-client.ps1 已经是 SDK/客户端包雏形。
- app_id=mycad
- channel=stable
- main_executable=MyCAD.exe
- api_base_url=http://服务器IP:8000
- license_key=服务端生成的授权密钥
6. 用户桌面快捷方式指向 Launcher.exe
7. 管理员以后在后台发布 MyCAD 的新版本
8. 用户启动 Launcher.exe 时自动检查、下载、替换并启动 MyCAD.exe
6. config/server_config.json 里写 `api_base_url=http://服务器IP:8000`,并重新编译 Launcher/Updater
7. 用户桌面快捷方式指向 Launcher.exe
8. 管理员以后在后台发布 MyCAD 的新版本
9. 用户启动 Launcher.exe 时自动检查、下载、替换并启动 MyCAD.exe。
这就是“把客户端升级能力作为 SDK 给其他软件使用”。
@@ -1458,7 +1476,7 @@ Docker 运行时,依赖的是镜像里的 Python、镜像里的依赖、容器
1. 进入 server 目录。
2. 准备 .env。
3. 设置 ADMIN_TOKEN、CLIENT_API_TOKEN、MINIO_ACCESS_KEY、MINIO_SECRET_KEY、MINIO_BUCKET、MINIO_PUBLIC_ENDPOINT、CRASH_REPORT_TOKEN、CRASH_SYMBOL_TOKEN。
3. 设置 ADMIN_USERNAME、ADMIN_PASSWORD、ADMIN_JWT_SECRET、ADMIN_TOKEN、CLIENT_API_TOKEN、MINIO_ACCESS_KEY、MINIO_SECRET_KEY、MINIO_BUCKET、MINIO_PUBLIC_ENDPOINT、CRASH_REPORT_TOKEN、CRASH_SYMBOL_TOKEN。
4. 准备签名私钥 keys/manifest_private_key.pem。
5. 准备 runtime、minio_data 等持久化目录。
6. 执行 docker compose build。
@@ -1535,7 +1553,7 @@ Docker 是给“服务端部署人员”用的。
1. 进入 server 目录。
2. 复制 .env.example 为 .env。
3. 修改 ADMIN_TOKEN、CLIENT_API_TOKEN、MINIO_ACCESS_KEY、MINIO_SECRET_KEY、MINIO_BUCKET、MINIO_PUBLIC_ENDPOINT、CRASH_REPORT_TOKEN、CRASH_SYMBOL_TOKEN。
3. 修改 ADMIN_USERNAME、ADMIN_PASSWORD、ADMIN_JWT_SECRET、ADMIN_TOKEN、CLIENT_API_TOKEN、MINIO_ACCESS_KEY、MINIO_SECRET_KEY、MINIO_BUCKET、MINIO_PUBLIC_ENDPOINT、CRASH_REPORT_TOKEN、CRASH_SYMBOL_TOKEN。
4. 准备 keys/manifest_private_key.pem。
5. 执行 docker compose config,确认配置无误。
6. 执行 docker compose build。
@@ -1560,7 +1578,7 @@ cd update-client
1. 解压 UpdateClientSDK.zip。
2. 把接入方自己的 YourApp.exe 放到 bin 目录同级的最终产品目录中。
3. 把 config/app_config.example.json 复制成 config/app_config.json。
4. 修改 app_id、channel、api_base_url、client_token、license_key、main_executable。
4. 修改 app_id、channel、client_token、license_key、main_executable,并确认 SDK 二进制已用正确的 config/server_config.json 编译
5. 从 Launcher.exe 启动。
6. 确认能登记设备、拉取策略、启动业务主程序。