Sync: add ses and networking notes
This commit is contained in:
@@ -82,5 +82,74 @@ fonrey/
|
||||
|
||||
## 7. 外部服务 (External Services)
|
||||
- **监控**:Sentry (已配置用于错误追踪) 。
|
||||
- **对象存储**:Cloudflare R2 (用于房源/客源图片与附件) 。
|
||||
- **地图服务**:待规划 (本期不涉及底层地图建设) 。
|
||||
- **对象存储**:Cloudflare R2 (用于房源/客源图片与附件;同时用于客户端安装包存储与分发) 。
|
||||
- **地图服务**:待规划 (本期不涉及底层地图建设) 。
|
||||
|
||||
---
|
||||
|
||||
## 8. 客户端发布技术栈 (Desktop Client Stack)
|
||||
|
||||
> 本节对应 PRD:`Project/fonrey/PRD/发布管理/客户端发布管理模块PRD.md`
|
||||
> 所有决策均已在 PRD 中完成选型论证,此处为最终结论,直接执行。
|
||||
|
||||
### 8.1 客户端框架
|
||||
|
||||
- **框架**:[Electron](https://www.electronjs.org/)(当前稳定版)
|
||||
- **内核**:Electron 捆绑的 Chromium(版本随 Electron 版本固定,不依赖系统浏览器)
|
||||
- **主进程语言**:Node.js(JavaScript / TypeScript)
|
||||
- **渲染层**:直接加载 Fonrey Web 应用 URL,100% 复用现有 HTMX + Alpine.js + Tailwind CSS 技术栈,**渲染层不新增任何框架**
|
||||
|
||||
### 8.2 自动更新
|
||||
|
||||
- **更新库**:`electron-updater`(`electron-builder` 生态,成熟方案)
|
||||
- **更新包存储**:Cloudflare R2(复用现有存储账号,新增 `releases` bucket)
|
||||
- **更新包分发**:Cloudflare CDN 加速(复用现有 CDN 配置)
|
||||
- **更新检测端点**:Django 后端新增 `/api/client/updates/latest/`(GET,公开接口,无需登录)
|
||||
- **检测时机**:客户端启动时 + 每 4 小时轮询一次
|
||||
- **更新模式**:后台静默下载,下载完成后提示用户重启;服务端可将版本标记为"强制更新",客户端不可跳过
|
||||
|
||||
### 8.3 安装包构建与签名
|
||||
|
||||
- **构建工具**:`electron-builder`(输出 NSIS 安装包 `.exe` + 便携版 `.zip`)
|
||||
- **目标平台**:Windows x64(优先),ARM64 按需支持
|
||||
- **代码签名**:EV 代码签名证书(DigiCert 或 Sectigo),由 CI/CD 在构建时自动签名,消除 Windows SmartScreen 警告
|
||||
- **CI/CD**:待确认平台(GitHub Actions / Jenkins),构建流水线负责:编译 → 签名 → 上传 R2 → 调用发布 API
|
||||
|
||||
### 8.4 Django 后端新增模块
|
||||
|
||||
在现有 `fonrey/apps/` 目录下新增:
|
||||
|
||||
```
|
||||
apps/
|
||||
└── release/ # 客户端发布管理
|
||||
├── models.py # ClientRelease(版本号、类型、状态、下载URL、SHA256、更新日志)
|
||||
├── views.py # 公开更新检测 API + 管理后台 CRUD 视图
|
||||
├── urls.py
|
||||
└── admin.py
|
||||
```
|
||||
|
||||
**`ClientRelease` 模型关键字段**:
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `version` | CharField | SemVer 格式,如 `1.2.3`,唯一索引 |
|
||||
| `platform` | CharField | 平台标识,如 `win32` |
|
||||
| `arch` | CharField | CPU 架构,如 `x64` |
|
||||
| `release_type` | CharField | `normal` / `force`(强制更新) |
|
||||
| `status` | CharField | `draft` / `published` / `archived` |
|
||||
| `download_url` | URLField | EXE 安装包 Cloudflare R2 URL |
|
||||
| `portable_url` | URLField | ZIP 便携版 URL(可选) |
|
||||
| `checksum_sha256` | CharField | 安装包 SHA256 校验值 |
|
||||
| `min_required_version` | CharField | 低于此版本的客户端强制升级(可选) |
|
||||
| `release_notes` | TextField | Markdown 格式更新日志 |
|
||||
| `published_at` | DateTimeField | 发布时间 |
|
||||
|
||||
**`ClientRelease` 属于 `shared_apps`(公共 Schema)**,不属于租户隔离范围,所有租户共享同一套客户端版本。
|
||||
|
||||
### 8.5 客户端关键约定
|
||||
|
||||
- **❌ Do NOT** 在 Electron 渲染进程中使用 `nodeIntegration: true`,保持 Web 沙箱安全
|
||||
- **❌ Do NOT** 在客户端内嵌任何业务逻辑或本地数据库,所有业务数据由服务端提供
|
||||
- **❌ Do NOT** 在客户端内新开多个 `BrowserWindow` 加载内部页面,所有导航在单窗口 SPA 内完成(外部链接除外,需在系统浏览器打开)
|
||||
- 客户端版本号必须与服务端 `ClientRelease.version` 严格一致,通过 `package.json` 的 `version` 字段统一管理
|
||||
- 更新包下载完成后,必须校验 SHA256 与服务端返回值一致后才能执行安装,防止下载损坏或中间人攻击
|
||||
Reference in New Issue
Block a user