NeuralOS
GuideIntermediate

不可违反的守卫 · 在每次改动碰到你的用户之前审查它的 CI

用 AI 做的每个项目里都有那么一个时刻,你不再是一个人。不再是你在自己电脑上测试:另一边有真实的用户,你上传的每一次改动都可能碰到他们。恐惧就在那里诞生——因为处于构建模式的 AI,专注的是让应用「能用」,而不是去抓那把溜进去的密钥、你开的那个数据库漏洞,或那个你没注意就弄坏的文件。这份资源给你搭起一个守卫:一个带 7 个检查员的 CI(持续集成),在每一次改动到达生产环境之前审查它,只要有一个失败,就把改动拦下,直到你修好。这不是理论:是一个真实、已验证的仓库,你复制进 4 个文件,调整 3 个数据,用一次 push 激活。它几乎不花钱,搭一次就永久守护你。别把它和保护你的应用在互联网上(那是另一份资源)搞混:这是你的代码在为世界存在之前必经的那道自动大门。

Jul 19, 202614 min
这是给谁的?
给任何用 AI 来构建、并且已经有(或即将有)真实用户的人——你不需要是程序员。如果你的项目跑在 GitHub 上,并连接了数据库(Supabase),这个守卫是你能做的最好决定之一。你只需复制 4 个文件安装一次,从那以后每一次改动都会先经过 7 个自动检查员,才会碰到任何人。你只要在看到绿色对勾时批准就好。

那个时刻 · 需求何时出现

一开始你是一个人在构建。改点东西,刷新屏幕,看到能用,就完事了。没有风险:唯一会因为出错而受苦的人就是你,在自己的机器上,两分钟就能修好。那个阶段是天堂——也是个陷阱,因为你会习惯于「只要在我屏幕上能用,那就没问题」。

那个时刻从别人开始依赖你的应用那天起就变了。第一个注册的用户。已经在付费的客户。也在动代码的同事。从那以后,你上传的每一次改动就不再只影响你自己:它可能把真实的人的应用弄崩,或者更糟,泄露他们的数据。而问题就在这里——你已经没法一个一个看完所有改动了。你向 AI 提个需求,它改了 8 个文件,你读了 2 个,批准,上传。在你没读的那 6 个里,可能就藏着灾难。

这样想象一下
想想一个机场。当你一个人构建时,你就是在自己家里走来走去:没有安检,也不需要。但等到你的代码要「起飞」飞向真实用户的那天,你就需要在登机口设一道安检。这个资源里的守卫就是那道安检:没有人不经检查就能通过,而且不管你是不是赶时间,不管是不是「肯定没问题」——机器照样检查,永远,不知疲倦也不会分心。

那份痛 · 它从哪来,为什么这么疼

这份痛一开始并不戏剧化。它不是黑客电影。它更像是一连串的小事故,累加起来让你付出昂贵的代价。而它们全都来自同一个地方:处于构建模式的 AI 是乐观的。它想的是让新功能跑起来,而不是这个改动可能以一千种方式弄坏别的东西。这是它的天性——当你兴奋地构建时,也是你的天性。

最昂贵的事故是密钥泄露。你让 AI 连接某个服务,为了「快点跑起来」,它把你的 API 密钥直接贴进了一个文件里。你没注意到,批准了,上传到 GitHub。那把密钥现在成了公开的。有机器人 24 小时扫描 GitHub,找的就是这种东西——它们可能几分钟内就发现它,开始花你的钱,或进入你的系统。这不是什么高深的攻击:是一个被别人的机器从地上捡走的疏忽,就像有人捡走了你没注意到掉在地上的钱包。

第二个是数据库里的漏洞。一个无心的改动,让你的某张用户表变得任何人都能访问,或创建了一个本不该有那种权限的函数。它看不见。应用照旧一模一样地运行。但你刚刚留了一扇开着的窗户,没有人会去关它,直到有人发现它——而到那时已经太晚了。

第三个是最常见也最不光鲜的:你弄坏了原本能用的东西。你修好了按钮 A,却没注意到把按钮 B 断开了。你快速测试时只碰了 A,所以没看到。用 B 的那个用户发现应用坏了。在编程里这有个名字——回归(regression)——它是日常真实痛苦的 80%。

实话 · 这是事故,不是末日
我不是要卖恐惧给你。这些故障里的大多数,只要及时抓住,几分钟就能修好。问题不是它们是无法解决的灾难——而是它们悄无声息地溜进去,然后在你最没料到的时候爆发:一个周五的深夜,面对一个愤怒的客户,而你已经不记得自己改了什么。守卫不会阻止你犯错(我们都会犯错)。它阻止的是这些错误到达你的用户手里。它在门口就抓住它们,那时修好还是零成本。

那如果你不这么做会怎样?什么都不会……在一段时间内。这就是陷阱。它在没有守卫的情况下运转好几周,你放松了警惕,而恰恰在项目开始真正重要起来的时候——当已经有用户、有钱、有声誉悬在其中时——那个本可以用 30 秒避免的事故就来了。守卫是一份廉价的保险,防的是某个非常昂贵的日子。

7 个检查员 · 每一个查什么

守卫不是一个魔法方块:它是 7 项具体的检查,每一次改动都会自动运行。如果 7 项全部通过,你会看到一个绿色对勾,改动才能继续。如果哪怕只有 1 项失败,它就变红,改动会被卡住,直到你修好为止。就这么简单,就这么严格。我们按它们运行的顺序,一个一个来看。

这样想象一下
这是安检口排成一排的 7 个检查员。第一个检查你口袋里没带危险物品(密钥)。第二个——头儿——检查你没在金库里留一扇开着的门(数据库)。其余的检查你的行李箱做工是否合格、有没有东西是坏的、一切是否合得上。只要有一个检查员说「不行」,你就登不了机。没有例外,没有「可我赶时间」。

1 · Gitleaks —— 你是不是不小心塞进了一把密钥? 它扫描整个改动,寻找看起来像凭证的东西:API 密钥、密码、令牌。如果发现什么闻起来像密钥,它就当场停下。它是那个把你从最昂贵事故中救出来的检查员,正因如此它在最最靠前的位置运行——甚至在安装任何东西之前,就在干净的 git 树上运行,好让那把密钥连一步都不许再往公开仓库里迈。

2 · 安全闸(Supabase advisors)—— 这个改动是不是在数据库里开了个漏洞? 它是检查员头儿,正因如此它在所有检查你代码的检查员中第一个运行。它直接问 Supabase:有没有哪张用户表少了它的锁(RLS)?有没有人创建了带危险权限的函数?有没有授予了本不该给的访问权?如果答案是有,它就拦下。这就是那个保护你用户数据、防止悄无声息疏忽的检查员。

3 · 类型检查(Type-check)—— 类型对得上吗? 在现代编程里,每份数据都有一个「类型」(这是数字,这是文本,这是日期)。这个检查员确认你没有,比方说,把文本和日期加在一起。它在应用甚至还没启动之前就抓住了一大类 bug——那些否则会在最糟的时刻当着用户的面冒出来的错误。

4 · Lint —— 代码干净吗? linter 是坏习惯检查员:声明了却从不使用的变量、死代码、已知会引发问题的写法。这不是为讲究而讲究——脏代码正是 bug 藏身的地方。linter 强制你把屋子收拾整齐,好让真正的脏东西显出来。

5 · 格式(Format)—— 格式一致吗? 让所有代码看起来一样:一样的空格、一样的引号、一样的风格。听起来像强迫症,但它是一种共同语言。当多个人(或多个 AI 会话)在没有约定格式的情况下动同一个项目时,每一次改动都会把你做的事和一堆挪动的引号、重排的缩进混在一起——你就再也分不清想法和噪音了。这个检查员一劳永逸地给所有人强加同一种方言,这样谁都不必再为此争论。

6 · 测试(Tests)—— 原本能用的现在还能用吗? 这就是那个抓回归的检查员,也就是上面的第 3 号痛。它们是自动化的测试,验证关键功能仍然给出正确的结果。你修了按钮 A;测试确认 B、C、D 仍然照常运转。这个检查员让你能放心地做大改动,因为你知道,如果你弄坏了什么,它会立刻提醒你。

7 · 构建(Build)—— 真的能编译吗? 最后一个检查员从零把应用组装起来,就像它要发布一样。因为「在你电脑上能用」是一回事,「能从头开始干净地构建出来」是另一回事。如果构建在这里、在门口失败,那也远远好过在生产环境失败、让用户盯着一片空白的屏幕。

顺序很重要 · 头儿先来
注意安全闸第一个运行(在类型检查、lint、格式、测试和构建之前)。这是故意的:你用户数据的安全是最重要的,所以它在花时间做别的之前先被检查。如果数据库里有个漏洞,代码再漂亮也没用——改动直接被拦下。优先级按危害排序,而不是按舒适排序。

成本 · 为什么这几乎是免费的

人们会以为企业级的守卫会花钱。不会。这个花的是 ~$0,每次检查增加大约 ~15 秒。诚实拆解:Supabase 的 advisors 是免费的。GitHub Actions(运行这些检查员的引擎)在私有仓库给你每月 2.000 分钟免费额度——而在公开仓库里是无限且免费的。一次 7 项检查只需几秒钟,所以用 2.000 分钟你每月能做几千次检查,一分钱都不用付。

餐巾纸上的算账
如果你每天改 10 次,一个月大约 300 次。每次 ~15 秒,你从免费的 2.000 分钟里花掉 ~75 分钟。还剩 1.925 分钟。翻译一下:对一个正常项目来说,这永远是免费的。而作为交换,你省下了第一次昂贵的事故——光是不泄露一把 API 密钥,就已经把它的钱赚回来一千倍了。作为构建者,你这辈子很少有决定的成本收益比会这么厚颜无耻地偏向你这边。

仓库 · 你要复制的东西

你不用发明任何东西。整个守卫都打包在一个公开、已验证、可直接复制的仓库里。是 4 个搬进你项目的文件,外加一份西班牙语的分步安装指南。它用纯 JavaScript 写成,不依赖任何奇怪的东西。

MentexDev/NeuralOS-CI-Blindaje
REPO

一个可复用的 CI 模板,内含 7 个检查员:GitHub Actions 工作流(backend-ci.template.yml)、Gitleaks 配置(gitleaks.toml.template)、Supabase 安全闸脚本(scripts/supabase-advisors-gate.mjs)及其白名单(scripts/supabase-advisors-allowlist.json)、西班牙语指南(GUIA-agregar-ci-a-un-proyecto.md),以及标准 BACKEND_SUPABASE_STANDARDS.md——安全闸强制执行的「10 条不可违反的规则」。你复制,调整 3 个数据,用一次 push 就激活。

JavaScriptView on GitHub
你要复制到项目里的 4 个文件
`backend-ci.template.yml` → 内含 7 个检查员的工作流(放进你的 .github/workflows/ 文件夹)。
`gitleaks.toml.template` → 密钥猎手的配置。
`scripts/supabase-advisors-gate.mjs` → 向 Supabase 询问安全漏洞的那段脚本。
`scripts/supabase-advisors-allowlist.json` → 已批准的例外清单(一开始是空的)。

安装协议 · 只装一次,永久生效

好处来了:你只装一次,它就永久守护你。没有日常维护,不用记得去运行它。它住在你的仓库里,每次改动时自己触发。安装是 6 个步骤,下面的主提示词会把它们贴给你的 AI,让它陪你一起做。先看完整的地图,理解将会发生什么。

安装的 6 个步骤
复制 4 个文件从仓库到你的项目(把工作流复制进 .github/workflows/ 时去掉 .template 后缀)。
调整 3 个数据,在文件里用 <<<CAMBIAR>>> 标出的:你的项目文件夹、路径,以及你的包名。
添加 1 个脚本到你的 package.json,好让安全闸能被执行。
复制 PROJECT_REF,来自你的 Supabase 项目(在你项目的配置里能找到)。
在 GitHub 里创建 2 个 secret(Settings → Secrets):SUPABASE_PROJECT_REFSUPABASE_ACCESS_TOKEN。它们绝不放进代码里——而是保存在 GitHub 的保险库里。
在 Supabase 里启用 Leaked Password Protection(Auth → Settings)并执行 push。在这次 push 里你会看到 7 个检查运行——盯住绿色。
json
// Paso 3: el script que añades a tu package.json (en la sección "scripts")
{
  "scripts": {
    "db:advisors:gate": "node scripts/supabase-advisors-gate.mjs"
  }
}
bash
# Los 2 secrets del paso 5 se crean en GitHub, NO en el código:
# Repositorio → Settings → Secrets and variables → Actions → New secret
#
#   SUPABASE_PROJECT_REF   → el ref de tu proyecto (cambia por proyecto)
#   SUPABASE_ACCESS_TOKEN  → tu token de cuenta (el mismo para todos tus proyectos)
#
# El gate está hecho para saltarse solo (con aviso) si estos secrets faltan,
# así que nunca rompe un proyecto que aún no los tiene configurados.
密钥的黄金法则
这 2 个 Supabase 数据保存在 GitHub 的 Secrets 里,绝不放在项目的某个文件中。这正是整个精髓所在:那个抓密钥泄露的守卫,自己不能泄露密钥。access token 是你账户的(对你所有项目都通用);PROJECT_REF 每个项目都不同。如果你哪天在某个 .yml.js 文件里看到这两样东西中的一样,那就是哪里做错了——把它从那里拿出来。

主提示词 · 贴给你的 AI,让它替你安装

这是你唯一需要的提示词。你在项目里面,把它贴给你的代码代理(Claude Code、Cursor,或你用的任何一个),它会带着你走完 6 个步骤,替你调整那 3 个数据,并给你解释每一步动作。发送之前,先把 [中括号] 填上你自己的内容。

主提示词 · 在我的项目里安装 CI 守卫文本
我想在这个项目里搭一个持续集成(CI)守卫,让它在每次改动到达生产环境之前先检查一遍。模板在公开仓库 github.com/MentexDev/NeuralOS-CI-Blindaje 里,它带了 7 个检查员:Gitleaks(密钥)、Supabase advisors 安全闸(它在所有检查代码的检查员中第一个运行)、类型检查、lint、格式、测试和构建。如果有 1 个失败,改动就被拦下。

我项目的背景:
- 数据库:Supabase。
- 包管理器:[npm / pnpm / yarn]。
- 我的包名(package.json 的 "name"):[名称]。

请一步一步地引导我,不需要我懂编程,并按这个顺序:

1. 把模板的 4 个文件(backend-ci.template.yml、gitleaks.toml.template、scripts/supabase-advisors-gate.mjs 和 scripts/supabase-advisors-allowlist.json)拿过来,放到它们该在的地方。工作流要放进 .github/workflows/,并且去掉 .template 后缀。

2. 在文件里找出 3 个 <<<CAMBIAR>>> 标记,把它们替换成我项目的真实数据(文件夹、路径、包名)。让我看清楚你在每一个里改了什么。

3. 往我的 package.json 里添加脚本 "db:advisors:gate": "node scripts/supabase-advisors-gate.mjs",不要删掉我已有的脚本。

4. 精确告诉我在 Supabase 的哪里找到我的 PROJECT_REF,以及我怎么生成我账户的 ACCESS_TOKEN。

5. 一步一步告诉我怎么在 GitHub 里创建那 2 个 secret(SUPABASE_PROJECT_REF 和 SUPABASE_ACCESS_TOKEN)。提醒我它们绝不能放进项目的某个文件里,只能放在 GitHub 的 Secrets 里。

6. 提醒我在 Supabase 里启用 "Leaked Password Protection"(Auth → Settings)。

最后:
- 给我用来 commit 和 push 这些文件的确切命令,并告诉我在 GitHub 的 checks 标签页里应该看到什么(7 个检查员在运行,以及哪一个先运行)。
- 如果按我项目现在的样子,某个检查员会变红(比如,我没有测试,或我的代码有类型错误),请提前告诉我,并告诉我怎么用最简单的方式诚实地把它弄成绿色,而不是关掉那个检查员。
为了「通过」守卫,你绝对不该做的事
当一个检查员变红时,你会忍不住想把它关掉好让它「一下过去」。别这么做。关掉一个检查员来跳过检查,就像蒙住机场安检员的眼睛:问题不会消失,你只是不再看见它。如果一个检查员失败了,就去修它指出的东西——它就是为此而存在的。一个你嫌它碍事就关掉的守卫不是守卫,是个摆设。

这个习惯 · 它在你的日常里住在哪

守卫的美妙之处在于它不要求你有纪律。它不是一个你得像「喝水」或「锻炼」那样记着的习惯。一旦装好,每次你上传改动它就自己触发。你唯一的工作是看颜色:绿色,继续;红色,在往下走之前修好检查员指出的东西。

你亲身经历它的那一刻,正是你把改动上传到 GitHub 时(或者你按分支工作时打开一个「pull request」时——见并行分支那篇资源)。那时 GitHub 会自动派出 7 个检查员。几秒钟内你就有了裁决。如果你和 AI 一起工作,这里就是它那份构建者的乐观遇上一个不会激动的审计员的地方:机器冷静地检查 AI 火热地构建出来的东西。

与 C-A-R 的桥梁
这个守卫是 [C-A-R 协议](/recursos/protocolo-car-construir-sin-bugs)审计阶段的自动化、永久版本。C-A-R 教你在脑子里把构建模式和审计模式分开。守卫在机器上替你做到:每一次改动在为世界所存在之前,都必须经过一个冷静的审计员。构建想的是让它跑起来;守卫想的是它会怎样失败——而且它永远不知疲倦。

最省事的路 · 你做什么,机器做什么

为了让「你哪里动手、哪里不动手」彻底清楚:安装你做一次(用上面的提示词,你的 AI 会陪着你)。之后,一切都是自动的。这是真实的分工。

你(只在安装时做一次)
把主提示词贴给你的 AI,和它一起走完 6 个步骤。
复制你 Supabase 的 PROJECT_REF,并在 GitHub 里创建那 2 个 secret。
在 Supabase 里启用泄露密码保护。
做第一次 push,看着 7 个检查运行。
机器(永久地,在每次改动时)
每次 push 自动派出 7 个检查员。
如果哪怕只有一个失败,就拦下改动,并附上失败的细节。
如果某个项目还没有那些 secret,它会带着提示自己跳过安全闸(不弄坏任何东西)。
当一切通过时,给你显示绿色对勾——这是你可以安全继续的信号。
关于测试的一个诚实细节
如果你的项目还没有测试(自动化测试),第 6 号检查员不会抓到回归,因为没有东西可以验证——而这在起步阶段是没问题的。守卫仍然用其他 6 个检查员保护你(密钥、数据安全、类型、整洁、格式和构建)。测试是你随着时间慢慢加上去的那一块;一旦你有了它们,守卫随时准备好使用。别等到有了完美的测试才去搭剩下的部分。

收尾 · 一个不睡觉的守卫

用 AI 构建又快又上瘾,而这份速度恰恰是它危险的原因:你走得太快,以至于看不清上传的所有东西。守卫不会拖住你——它让你在下面有一张网的情况下快速前进。每一次改动几秒钟内经过 7 个检查员,如果哪里闻起来不对,它会在碰到哪怕一个用户之前就停下。它花零成本,搭一次,给你的是钱通常买不到的东西:安心睡觉,知道不会有坏掉的东西因为疏忽而跑到生产环境。

在 NeuralOS,这个守卫已经是家里的一部分
你刚刚手动搭起来的这一切,在 NeuralOS 里,正是这个平台本身构建方式的一部分:Supabase advisors 安全闸拥有最高优先级,并且只要检测到一条警告就拦下改动,和这份资源里的第 2 号检查员一模一样。「每一次改动在碰到任何人之前都经过一个自动审计员检查」不是未来的承诺——而是这个产品被立起来时真实的纪律。而这份诚实是完整的:这里我们没有卖给你任何东西,我们把同一个守卫给了你,让你用在自己的项目上,配上真实、开放的仓库,好让它属于你。
守卫之前 · 在 AI 弄坏它之前把一切存进 GitHub
守卫住在 GitHub 里,检查每一次改动。如果你的项目还没在那里备份,就从这一篇开始——它是第零步。
C-A-R 协议 · 发布前先审计
守卫是审计的自动版本。这份资源教你背后的心态——把构建者和审计员分开——正是这让一切合得上。
#ci-cd#seguridad#automatizacion#supabase#github-actions#produccion
Ready to build?

Start building in
under 3 minutes

Join 4,200+ builders. No credit card. Build your first app with AI in minutes.