AegisDB
EnglishGitHub
关于

一个把数据库操作收进一条判定链的网关

面向这样一类团队:数据库不止一台、动手的人不止一个、出了事要说得清是谁按什么规则跑了什么。

几条贯穿始终的取舍

下面四条都能在代码或者架构决策记录里找到出处 —— 每条后面那一行就是。

失败朝严

一道闸自己出了问题,结果倒向更严的那一侧:规则表读不出来、一个角色都没有,结论都是拒绝加最高风险。代码给这条原则编了号,ED3。它不是无条件的 —— 两条例外在安全页。

gateway/risk.go:946 · bootstrap/script_scan_engine_test.go:13 · 例外见安全页

一条通道

六条入口落到同一条判定链与同一条审计链,开放接口也不例外。这条原则是被事故教出来的:异步执行通道曾经让在终端里被拦下的人,改成后台任务就跑掉。

service/async_exec.go:48 · handler/openapi.go:19 · ADR 0006 / ADR 0012

规则可解释

判定回传的是机器可读的规则引用,不是一句「被拒绝了」:命中哪一条、属于哪一档、出自哪里。那 87 条规范审查规则同理:引自公司规范的每一条都标着出处段落。

review/builtin.go:13-33 · review/review.go:307 · model/rule_ref.go:103

人负责执行

系统判定、系统记录,但按下执行的始终是一个具体的人 —— 三条路形状不同,不能压成一句。终端工单:批准只是授权,得有人回到审批页自己按执行,每一道闸按实际按按钮的那个人重算(ADR 0010)。发布单:执行归流水线的执行阶段,没人确认就停在「等确认」,确认后的复判按发起人的角色算 —— 正好相反。执行窗口单与导出单根本没有可执行的命令。

ADR 0010 · service/approval_execute.go:68 · service/pipeline.go:752

技术栈

控制台前端React 19 · TypeScript 5.7 · Vite 6 · Zustand 5 · TanStack Query 5 · React Router 7 · react-i18next 15 · xterm.js 5.5 · lucide-react
后端Go 1.25 · Gin v1.10.0 · GORM v1.25.12 · gorilla/websocket v1.5.3
密码学bcrypt · AES-256-GCM · HMAC-SHA256 · TOTP
网关自身的存储PostgreSQL 16 —— 开发与生产同一种
网关连接的目标库MySQL / PolarDB / TiDB / MariaDB · PostgreSQL / GaussDB (DWS) · Oracle
  • 前端写的是主版本,依赖声明的是范围;后端那三个反过来,go.mod 钉的就是确切版本。
  • 密码学只列算法名,每一项的参数、取值与失败行为在安全页逐条列着。
  • 网关自身的存储和它去连的目标库是两件事:前者只有 PostgreSQL 16 一种,开发与生产同一档(ADR 0018);后者是上面那 7 种。

这个仓库有多大

下面几个数是对着 main 分支实测的,不是从 README 抄的 —— 那几条已经落后于代码。

后端测试311 个测试文件、993 个测试函数,其中 183 个在 internal/bootstrap 下,走 httptest 的黑盒回归
控制台前端测试291 例单测(36 个文件)、116 例端到端(10 个文件)
架构决策记录17 份,在 docs/adr/ 下
  • 控制台前端只有 Playwright 一家:单测与端到端是同一个 runner 的两份 config。
  • 仓库里没有 .github 目录,没有任何持续集成配置 —— 那些闸只在有人本地跑测试的时候生效。所以这一页说「由测试守着」,不说「由 CI 守着」。

许可证:这一页还答不上来

这一页原来宣布了一个开源协议,而那句话没有出处。核下去:db-gateway 里没有 LICENSE 文件,README 没有许可证段落,git 历史里也查不到被删掉的。一个没有 LICENSE 文件的仓库,法律上不是「可以自由使用」,所以这一页宁可空着。

参与进来

仓库在 GitHub 上。工单与 PRD 是跟着代码走的本地 markdown,代码审查的缺陷记在 GitHub Issues,架构决策在 docs/adr/,现在 17 份。要说在前头:仓库里没有 CONTRIBUTING,也没有 issue 模板。

打开仓库