整理文档
This commit is contained in:
1 parent
06a3d8506b
commit
0e347aad9e
26 files changed
+1552
-521
No files matched your search
@@ -6,7 +6,10 @@
|
||||
|
||||
## 决定
|
||||
|
||||
当前只做 Rust/Axum 后端。网站账户注册后为 reader;公钥登记和管理员发布授权分别完成。OpenSSH 使用固定 `AuthorizedKeysCommand` 动态读取独立授权文件,为每把允许的公钥返回绑定站内用户名的强制命令。OS 只有一个无交互权限的 git 账户,网站用户不能自行决定命令或仓库路径。
|
||||
- 当前只做 Rust/Axum 后端。
|
||||
- 网站账户注册后为 reader;公钥登记和管理员发布授权分别完成。
|
||||
- OpenSSH 使用固定 `AuthorizedKeysCommand` 动态读取独立授权文件,为每把允许的公钥返回绑定站内用户名的强制命令。
|
||||
- OS 只有一个无交互权限的 git 账户,网站用户不能自行决定命令或仓库路径。
|
||||
|
||||
接收仓库与正式内容仓库分属不同进程身份。pre-receive 在 Git quarantine 内验证全部候选文件、单提交历史和改动命名空间;API 再验证并导入独立正式仓库,从该 Git 生成已发布快照。ChuSQL 只保存可重建的公开文章元数据与标签,HTTP 读取不依赖数据库。
|
||||
|
||||
|
||||
@@ -8,7 +8,10 @@
|
||||
|
||||
数据库服务与 Rust 驱动作为两个独立 Git 子模块维护。主仓库只提交远程地址、固定版本指针、初始化/构建配置,不提交依赖源码或编译产物。Cargo 引用初始化后的驱动路径,数据库从外部 checkout 构建并暂存到被忽略的 Docker 构建目录。
|
||||
|
||||
子模块默认使用 `https://github.com/TheBadRoger/ChuSQL.git` 与 `https://github.com/TheBadRoger/ChuSQL-RustDriver.git`。初始化脚本在连接、访问或固定提交获取失败时,分别回退到 `https://repo.chunana.cn/ChuNa7a/ChuSQL.git` 与 `https://repo.chunana.cn/ChuNa7a/ChuSQL-RustDriver.git`。所有远程来源均使用 HTTPS,不提供 SSH 来源选项;空仓库留下的半初始化状态也可恢复。回退仍保持固定提交,不自动跟随远程最新分支。
|
||||
- 子模块默认使用 `https://github.com/TheBadRoger/ChuSQL.git` 与 `https://github.com/TheBadRoger/ChuSQL-RustDriver.git`。
|
||||
- 初始化脚本在连接、访问或固定提交获取失败时,分别回退到 `https://repo.chunana.cn/ChuNa7a/ChuSQL.git` 与 `https://repo.chunana.cn/ChuNa7a/ChuSQL-RustDriver.git`。
|
||||
- 所有远程来源均使用 HTTPS,不提供 SSH 来源选项;空仓库留下的半初始化状态也可恢复。
|
||||
- 回退仍保持固定提交,不自动跟随远程最新分支。
|
||||
|
||||
服务器上的 Git 地址覆盖、操作系统账户和 SSH 配置由服务器自己管理,项目不配置 localhost 映射或固定 deploy 用户。Docker 构建前使用同一初始化脚本,继承运行者现有 Git 配置。开发者仍可以显式使用已有文件路径,此时文件协议仅对该次初始化命令启用,不设置全局许可。
|
||||
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
# ADR-003:按作者隔离仓库,以索引登记文章
|
||||
|
||||
## 状态与日期
|
||||
|
||||
已接受,2026-10-16。替代 ADR-001 中共享仓库、slug 前缀隔离与固定正文路径的决定;唯一 Git 写入口、SSH 双重授权和账户存储现状不变。
|
||||
|
||||
## 决定
|
||||
|
||||
- 每位作者拥有 `/srv/ingress/authors/<用户名>.git`,API 在私有数据卷按作者分别保存 Git 缓存。
|
||||
- 客户端仍只使用 `content.git` 别名,SSH 强制命令按服务器公钥绑定的身份选定真实仓库,不接受客户端指定路径。
|
||||
- Git 全局信任范围仅限受控 `/srv/ingress/authors/*` 目录,以支持跨 UID 本地读取,不信任其他目录。
|
||||
- 仓库首次访问时自动创建,作者无须服务器 shell 或手动建裸仓库。
|
||||
- 不同仓库不共享对象库或历史。
|
||||
|
||||
- 根目录 `index.txt` 使用 UTF-8 三列文本,每行 `文章ID posts/文件夹 正文文件名`,空格或 Tab 分隔,无表头,允许空行。
|
||||
- 每作者 ID 唯一、文件夹不重复,正文为指定的 txt/md/markdown 文件,元信息保留 YAML Frontmatter,slug 可省略。
|
||||
- 站内 ID 为 `用户名~文章ID`,两部分均不能含 `~`,避免重名与歧义;目录或正文改名不改变身份。
|
||||
|
||||
- pre-receive 在 Git quarantine 中检查完整候选树、单个线性提交、索引引用、白名单、文件模式、文本和图片内容与配额。
|
||||
- 接收层能够拒绝非法文件,故整次拒绝非法推送,不静默过滤后制造与作者提交不同的服务端分支。
|
||||
- 未登记目录和未选中的正文不导入阅读内容及数据库,但仍受校验和存储配额限制,不能作为隐藏载荷通道。
|
||||
- 只作为资源导入所选正文引用的已验证图片。
|
||||
|
||||
- API 再次验证各作者候选内容,构建私有集合快照及公开阅读快照。
|
||||
- 数据库 `blog_articles` 保存有效登记的作者、本地 ID、正文路径、格式、元信息和源提交;公开检索继续使用 `blog_posts/blog_tags`。
|
||||
- 索引条目移除后撤回正文和图片入口,并在数据库可用时事务重建派生记录。
|
||||
- 数据库失败不阻止已导入文章阅读,恢复后自动对账重建。
|
||||
- 集合版本是作者提交映射的摘要,单个作者 Git 提交仍单独保存。
|
||||
|
||||
## 取舍
|
||||
|
||||
索引是发布登记依据,不是远程代码执行配置。路径和文件名不允许空格、隐藏段或任意嵌套,暂不支持 SVG、HTML、脚本、配置或证书文件。文本中的 PEM 标记直接拒绝,包括代码块;这有意比一般技术博客严格,不能据此保证识别任意编码或伪装的秘密。
|
||||
|
||||
单作者 Git 历史仍保留自己的已删内容,移除索引不会释放历史占用;硬磁盘配额和管理员离线维护仍必要。站点总导入配额可能使通过单作者检查的推送等待处理,Git 接收不等于内容已导入或数据库已同步。当前按完整集合重建派生表,未来账户、互动、审核和站长管理状态必须用独立持久表,不能随着索引重建丢失。
|
||||
|
||||
旧共享仓库需要停机备份、按所有权导出最新文件、建立无共享历史的个人仓库,并重新生成索引。不会自动猜测所有权或清除旧数据;迁移方式见[运维与迁移](../operations.md)。已经分发的旧历史无法收回,旧 URL 的重定向尚未实现。
|
||||
|
||||
站长审核仅列入 TODO;本轮校验通过且状态为 published 的登记文章自动公开。后续应在索引导入与公开发布之间加入审核,审核未通过的修改不能替换原已通过版本。
|
||||
@@ -0,0 +1,11 @@
|
||||
# 架构决策
|
||||
|
||||
[返回项目首页](../../README.md)
|
||||
|
||||
| 决策 | 内容与适用范围 |
|
||||
| --- | --- |
|
||||
| [ADR-001](0001-git-only-publishing.md) | Git 唯一写入口与身份隔离;共享仓库方案已由 ADR-003 替代 |
|
||||
| [ADR-002](0002-external-dependencies.md) | 外部依赖子模块、固定提交与 HTTPS 回退 |
|
||||
| [ADR-003](0003-author-repositories-and-manifest.md) | 作者独立仓库与文章清单 |
|
||||
|
||||
旧决策保留其历史背景;当前作者隔离与文章索引规则以 ADR-003 为准。
|
||||
Reference in new issue
Block a user