Files
ChuBlog/docs/decisions/0001-git-only-publishing.md

22 lines
2.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADR-001:SSH Git 是当前唯一文章写入口
## 状态与日期
已接受,2026-10-15。以用户后续补充需求为准,调整 PLAN.md 的后台先行方案。
## 决定
当前只做 Rust/Axum 后端。网站账户注册后为 reader;公钥登记和管理员发布授权分别完成。OpenSSH 使用固定 `AuthorizedKeysCommand` 动态读取独立授权文件,为每把允许的公钥返回绑定站内用户名的强制命令。OS 只有一个无交互权限的 git 账户,网站用户不能自行决定命令或仓库路径。
接收仓库与正式内容仓库分属不同进程身份。pre-receive 在 Git quarantine 内验证全部候选文件、单提交历史和改动命名空间;API 再验证并导入独立正式仓库,从该 Git 生成已发布快照。ChuSQL 只保存可重建的公开文章元数据与标签,HTTP 读取不依赖数据库。
账户口令哈希保存于 API 私有文件,发布权限/公钥保存于独立只读给 SSH 的 JSON 文件;授权原子替换,SSH 每次认证与接收均重新检查。密码不进入 ChuSQL、文章 Git 或 SSH 容器。该选择避免让实验数据库承担不可重建身份数据,也避免把密码哈希暴露给 SSH 进程。
## 取舍
暂不提供在线文章编辑入口,避免两条路径同时修改内容。先用 slug 前缀做权限边界,不引入复杂角色体系。单次只接收一个线性提交,便于验证历史,不允许将危险中间提交夹带进仓库。所有授权发布者共享读取仓库历史,草稿不对作者之间隔离。
文件账户存储适合单实例、最多 1000 个用户的本轮实现。用户文件与权限文件需要一起备份;不支持多副本账号写入。注册中途失败可能留下没有凭据的 reader 授权条目,但不能登录或发布,重试注册可覆盖。发布授权变更仅涉及单份权限文件,不存在哈希与权限双写导致的旧发布权残留。
未来引入前端、在线编辑、多实例或更强审核时应单独记录新决策,并继续保留唯一发布协调点。