Files
soft_quay_web/docs/03-tech-stack.md
T

45 lines
3.3 KiB
Markdown
Raw Normal View History

# 技术栈(Tech Stack)
> "用什么"的统一速查表。未定项必须标为待定,不要让 agent 在代码里自行决定;裁定后更新本文再动代码。
## 一、技术栈一览
| 维度 | 选型 | 状态 | 理由 / 说明 |
| --- | --- | --- | --- |
| 后端语言 | Go | 建议(W-001 立项确认) | 与客户端同栈,可**直接复用同一套 canonical/verify 实现思路与 Schema**,天然字节对齐——这是选 Go 的最强理由。若改选其他语言,必须用 corpus 做严格字节回归 |
| 协议 Schema / corpus | 引用 `soft_quay` 仓库(git submodule 或版本化拷贝 + CI 一致性校验,方式 W-001 裁定) | 待定 | 权威源唯一,不另建;CI 必须证明本仓库消费的副本与客户端一致 |
| 签名算法 | Ed25519 | 已定 | 与客户端内置公钥配对;签名域规则见 [api.md](api.md) |
| 包完整性 | SHA-256 | 已定 | Ingestion 计算整包哈希写入清单 |
| 私钥保管 | KMS / HSM 或独立最小权限签名服务 | 待定(W-003) | 绝不入库、不进 Web 进程环境变量明文;首期用离线测试密钥对 |
| 发布记录存储 | 关系型库(候选 SQLite → PostgreSQL) | 待定(W-201) | 首期里程碑(协议对齐)不需要数据库;Registry 落地时定 |
| 产物托管 | 对象存储 / CDN | 待定(W-004) | 首期用本地静态 HTTP 服务模拟 |
| Web 框架 / UI | 待定 | 待定(W-501) | Phase 5 才启动 UI;先协议后界面 |
| 测试 | 单元测试 + corpus 字节回归 + Schema 校验闸门 | 已定原则 | corpus 断言为 CI 必跑项,期望值禁止自举 |
| CI | 待定(参考 soft_quay 的 Gitea Actions + 本地脚本双轨) | 待定(W-002) | 本地脚本先行,保证无 CI 也能跑同一套闸门 |
## 二、决策记录与演进
- **协议权威源**:`soft_quay/docs/api.md`、`soft_quay/schemas/*.json`、`soft_quay/testdata/catalog/canonical-vectors.json` 是唯一权威;本仓库文档只做发布端视角摘要,冲突时以客户端仓库为准。
- **先协议后 UI**:第一里程碑是"产出被客户端验签通过、被 corpus + Schema 回归通过的 manifest";Web 界面在流水线可信之后才开工。
- **首期本地模拟**:本地生成签名清单 + 本地静态 HTTP 服务即可让客户端跑通闭环,不先建对象存储,避免过早绑定云厂商。
- **签名服务只签受控结构**:清单 / 许可证 / 撤销名单三类;不对任意字节签名,防止被当通用签名 oracle。
- **单公钥时代不做轮换字段**:客户端协议无 key ID;多公钥 / 轮换需先在客户端仓库做协议升级,本仓库不得抢跑。
## 三、构建与运行命令
> 工程骨架由 W-001 建立;根目录 `init.sh` / `init.ps1` 为统一入口,W-001 完成前三个命令为占位符,运行会主动失败。
| 用途 | 命令 |
| --- | --- |
| 统一入口 | `./init.sh`(PowerShell 用 `./init.ps1`)——【W-001 替换真实命令】 |
| 依赖同步 | 【待定】 |
| 测试与 corpus 回归 | 【待定】 |
| 本地静态发布模拟 | 【待定,W-204】 |
## 四、依赖纪律
- 新增第三方依赖前,先说明用途、替代方案和维护成本。
- 加密实现优先使用语言标准库(Go 为 `crypto/ed25519`);不引入自定义或小众加密库。
- 不允许同一职责并存两套实现(如两套 canonicalizer、两套 Schema 校验)。
- 不确定的技术选型先更新本文,再进入代码。