chore: 更新客户端和服务端子仓库指针
This commit is contained in:
+1
-1
Submodule update-client updated: 4ddc5dfdf5...fb6b080ad4
+1
-1
Submodule update-server updated: 0548692db0...4df439b5ce
@@ -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_TOKEN:SimCAECrashReporter.exe 上传崩溃报告用的 Bearer Token。
|
||||
6. CRASH_SYMBOL_TOKEN:CI 上传 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.json:server 地址、app_id、channel、当前版本、主程序名等。`license_key` 可以预先填入;如果为空,用户首次启动 Launcher 时会弹窗粘贴授权密钥。
|
||||
3. 以后让用户启动 Launcher.exe。
|
||||
4. 在管理后台创建应用、License、渠道和发布版本。
|
||||
5. 发布新版本时选择干净的 Release 输出目录,或切换到“压缩发布包”模式上传 zip/tar.gz/tar.bz2/rar 等压缩发布包。
|
||||
2. 设置 app_config.json:app_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. 确认能登记设备、拉取策略、启动业务主程序。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user