
🚀 Vibe Coding 时代的数据底座:Supabase 是加速器,还是累赘?
副标题:当 AI 能在 3 分钟内生成 NestJS + Prisma 后端,我们还需要 Supabase 吗?------从架构视角拆解 "生成代码" 与 "生产就绪" 之间的鸿沟
引言:AI 写代码快了,但生产环境没有变简单
Vibe Coding 的魔法在于:你对着 Cursor 或 Copilot 说一句话,就能得到一个带数据库连接、REST API、Swagger 文档的完整后端服务。但当你的二手车展示站(cbbase.com)开始涌入来自尼日利亚、科威特的真实客户,当 AI 客服系统需要同时处理 500 个 WebSocket 长连接时,你会发现------
AI 生成代码的速度,并不能消除基础设施的复杂度。
Supabase 这个开源 Firebase 替代方案,在 Vibe Coding 语境下扮演的角色正在发生微妙转变:它不再是"帮你写代码的工具",而是"替你扛住运维压力的底座"。本文将从架构视角,拆解 Supabase 的核心能力、Vibe Coding 场景下的真实价值,以及自部署 vs 云托管的决策逻辑。
一、Supabase 架构全景:不只是 PostgreSQL 的包装纸
很多人误以为 Supabase = "托管 PostgreSQL",这低估了它的设计。Supabase 本质上是一个围绕 PostgreSQL 构建的实时后端操作系统,各组件通过标准协议松耦合:
#mermaid-svg-oPemXMJzqhUSEdia{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oPemXMJzqhUSEdia .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oPemXMJzqhUSEdia .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oPemXMJzqhUSEdia .error-icon{fill:#552222;}#mermaid-svg-oPemXMJzqhUSEdia .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oPemXMJzqhUSEdia .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oPemXMJzqhUSEdia .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oPemXMJzqhUSEdia .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oPemXMJzqhUSEdia .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oPemXMJzqhUSEdia .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oPemXMJzqhUSEdia .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oPemXMJzqhUSEdia .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oPemXMJzqhUSEdia .marker.cross{stroke:#333333;}#mermaid-svg-oPemXMJzqhUSEdia svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oPemXMJzqhUSEdia p{margin:0;}#mermaid-svg-oPemXMJzqhUSEdia .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oPemXMJzqhUSEdia .cluster-label text{fill:#333;}#mermaid-svg-oPemXMJzqhUSEdia .cluster-label span{color:#333;}#mermaid-svg-oPemXMJzqhUSEdia .cluster-label span p{background-color:transparent;}#mermaid-svg-oPemXMJzqhUSEdia .label text,#mermaid-svg-oPemXMJzqhUSEdia span{fill:#333;color:#333;}#mermaid-svg-oPemXMJzqhUSEdia .node rect,#mermaid-svg-oPemXMJzqhUSEdia .node circle,#mermaid-svg-oPemXMJzqhUSEdia .node ellipse,#mermaid-svg-oPemXMJzqhUSEdia .node polygon,#mermaid-svg-oPemXMJzqhUSEdia .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oPemXMJzqhUSEdia .rough-node .label text,#mermaid-svg-oPemXMJzqhUSEdia .node .label text,#mermaid-svg-oPemXMJzqhUSEdia .image-shape .label,#mermaid-svg-oPemXMJzqhUSEdia .icon-shape .label{text-anchor:middle;}#mermaid-svg-oPemXMJzqhUSEdia .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-oPemXMJzqhUSEdia .rough-node .label,#mermaid-svg-oPemXMJzqhUSEdia .node .label,#mermaid-svg-oPemXMJzqhUSEdia .image-shape .label,#mermaid-svg-oPemXMJzqhUSEdia .icon-shape .label{text-align:center;}#mermaid-svg-oPemXMJzqhUSEdia .node.clickable{cursor:pointer;}#mermaid-svg-oPemXMJzqhUSEdia .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-oPemXMJzqhUSEdia .arrowheadPath{fill:#333333;}#mermaid-svg-oPemXMJzqhUSEdia .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oPemXMJzqhUSEdia .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oPemXMJzqhUSEdia .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oPemXMJzqhUSEdia .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oPemXMJzqhUSEdia .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oPemXMJzqhUSEdia .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-oPemXMJzqhUSEdia .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oPemXMJzqhUSEdia .cluster text{fill:#333;}#mermaid-svg-oPemXMJzqhUSEdia .cluster span{color:#333;}#mermaid-svg-oPemXMJzqhUSEdia div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oPemXMJzqhUSEdia .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oPemXMJzqhUSEdia rect.text{fill:none;stroke-width:0;}#mermaid-svg-oPemXMJzqhUSEdia .icon-shape,#mermaid-svg-oPemXMJzqhUSEdia .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oPemXMJzqhUSEdia .icon-shape p,#mermaid-svg-oPemXMJzqhUSEdia .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-oPemXMJzqhUSEdia .icon-shape .label rect,#mermaid-svg-oPemXMJzqhUSEdia .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oPemXMJzqhUSEdia .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-oPemXMJzqhUSEdia .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-oPemXMJzqhUSEdia :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 基础设施层
Supabase 核心服务
API 网关层
客户端层
HTTP / WebSocket
HTTP / WebSocket
Service Role
SQL
用户元数据
逻辑复制
大对象
pg / fetch
管理
Web App / React
Mobile / Flutter
AI Agent / Edge
Kong Gateway
路由 / 限流 / JWT 校验
PostgreSQL
主数据库 / RLS
PostgREST
自动 REST API
GoTrue
Auth / OAuth / MFA
Realtime
WebSocket / 逻辑复制
Storage
S3 兼容对象存储
Edge Functions
Deno Serverless
Studio Dashboard
SQL 编辑器 / 监控
PgBouncer
连接池
WAL / PITR
备份恢复
CDN / 图片转换
关键设计哲学
| 组件 | 核心能力 | 为什么这很重要 |
|---|---|---|
| PostgREST | 数据库表直接暴露为 REST API | 省掉 80% 的 CRUD 样板代码 |
| Row Level Security (RLS) | 在数据库层声明权限策略 | 替代分散在后端的 if (role === 'admin') 逻辑 |
| Realtime | 基于 PostgreSQL 逻辑复制的 WebSocket | 无需 Redis / Socket.io 即可实现实时推送 |
| GoTrue | 内置 OAuth、Magic Link、Phone OTP | 自建 Auth 是安全漏洞重灾区 |
| Edge Functions | Deno 运行时,冷启动 < 50ms | 作为 AI 生成代码的"无服务器执行环境" |
二、Vibe Coding 还需要 Supabase 吗?
2.1 AI 生成后端的"甜蜜陷阱"
当你让 AI 生成一个二手车商城后端时,它可能给你这样的结构:
#mermaid-svg-Gd6QofJdrUVgXwmP{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Gd6QofJdrUVgXwmP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Gd6QofJdrUVgXwmP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Gd6QofJdrUVgXwmP .error-icon{fill:#552222;}#mermaid-svg-Gd6QofJdrUVgXwmP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Gd6QofJdrUVgXwmP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Gd6QofJdrUVgXwmP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Gd6QofJdrUVgXwmP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Gd6QofJdrUVgXwmP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Gd6QofJdrUVgXwmP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Gd6QofJdrUVgXwmP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Gd6QofJdrUVgXwmP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Gd6QofJdrUVgXwmP .marker.cross{stroke:#333333;}#mermaid-svg-Gd6QofJdrUVgXwmP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Gd6QofJdrUVgXwmP p{margin:0;}#mermaid-svg-Gd6QofJdrUVgXwmP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Gd6QofJdrUVgXwmP .cluster-label text{fill:#333;}#mermaid-svg-Gd6QofJdrUVgXwmP .cluster-label span{color:#333;}#mermaid-svg-Gd6QofJdrUVgXwmP .cluster-label span p{background-color:transparent;}#mermaid-svg-Gd6QofJdrUVgXwmP .label text,#mermaid-svg-Gd6QofJdrUVgXwmP span{fill:#333;color:#333;}#mermaid-svg-Gd6QofJdrUVgXwmP .node rect,#mermaid-svg-Gd6QofJdrUVgXwmP .node circle,#mermaid-svg-Gd6QofJdrUVgXwmP .node ellipse,#mermaid-svg-Gd6QofJdrUVgXwmP .node polygon,#mermaid-svg-Gd6QofJdrUVgXwmP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Gd6QofJdrUVgXwmP .rough-node .label text,#mermaid-svg-Gd6QofJdrUVgXwmP .node .label text,#mermaid-svg-Gd6QofJdrUVgXwmP .image-shape .label,#mermaid-svg-Gd6QofJdrUVgXwmP .icon-shape .label{text-anchor:middle;}#mermaid-svg-Gd6QofJdrUVgXwmP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Gd6QofJdrUVgXwmP .rough-node .label,#mermaid-svg-Gd6QofJdrUVgXwmP .node .label,#mermaid-svg-Gd6QofJdrUVgXwmP .image-shape .label,#mermaid-svg-Gd6QofJdrUVgXwmP .icon-shape .label{text-align:center;}#mermaid-svg-Gd6QofJdrUVgXwmP .node.clickable{cursor:pointer;}#mermaid-svg-Gd6QofJdrUVgXwmP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Gd6QofJdrUVgXwmP .arrowheadPath{fill:#333333;}#mermaid-svg-Gd6QofJdrUVgXwmP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Gd6QofJdrUVgXwmP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Gd6QofJdrUVgXwmP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Gd6QofJdrUVgXwmP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Gd6QofJdrUVgXwmP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Gd6QofJdrUVgXwmP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Gd6QofJdrUVgXwmP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Gd6QofJdrUVgXwmP .cluster text{fill:#333;}#mermaid-svg-Gd6QofJdrUVgXwmP .cluster span{color:#333;}#mermaid-svg-Gd6QofJdrUVgXwmP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Gd6QofJdrUVgXwmP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Gd6QofJdrUVgXwmP rect.text{fill:none;stroke-width:0;}#mermaid-svg-Gd6QofJdrUVgXwmP .icon-shape,#mermaid-svg-Gd6QofJdrUVgXwmP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Gd6QofJdrUVgXwmP .icon-shape p,#mermaid-svg-Gd6QofJdrUVgXwmP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Gd6QofJdrUVgXwmP .icon-shape .label rect,#mermaid-svg-Gd6QofJdrUVgXwmP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Gd6QofJdrUVgXwmP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Gd6QofJdrUVgXwmP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Gd6QofJdrUVgXwmP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-Gd6QofJdrUVgXwmP .good>*{fill:#90EE90!important;stroke:#228B22!important;stroke-width:2px!important;}#mermaid-svg-Gd6QofJdrUVgXwmP .good span{fill:#90EE90!important;stroke:#228B22!important;stroke-width:2px!important;}#mermaid-svg-Gd6QofJdrUVgXwmP .bad>*{fill:#FFB6C1!important;stroke:#DC143C!important;stroke-width:2px!important;}#mermaid-svg-Gd6QofJdrUVgXwmP .bad span{fill:#FFB6C1!important;stroke:#DC143C!important;stroke-width:2px!important;} AI Prompt
生成二手车商城后端
AI 输出
NestJS + Prisma
开发者感觉
5分钟就有了后端
上线一周后
连接池被打爆
Auth 逻辑有漏洞
实时功能需重构
备份策略为 0
AI 生成的是代码文本 ,不是生产架构。以下隐性成本不会出现在 AI 的输出中:
- 连接池管理:Serverless 环境下 Prisma 连接数会瞬间打满数据库上限
- 安全权限 :
if (user.role === 'admin')散落在 20 个 Controller 里,AI 很难保证一致性 - 实时能力:聊天、客服、协作场景需要 WebSocket,AI 生成的 REST 后端需要额外架构升级
- 运维界面:AI 不会生成带 SQL 编辑器、慢查询分析、自动备份的 Dashboard
2.2 Supabase 在 Vibe Coding 中的角色转变
#mermaid-svg-rfZvge1HyjaxpJza{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rfZvge1HyjaxpJza .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rfZvge1HyjaxpJza .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rfZvge1HyjaxpJza .error-icon{fill:#552222;}#mermaid-svg-rfZvge1HyjaxpJza .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rfZvge1HyjaxpJza .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rfZvge1HyjaxpJza .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rfZvge1HyjaxpJza .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rfZvge1HyjaxpJza .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rfZvge1HyjaxpJza .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rfZvge1HyjaxpJza .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rfZvge1HyjaxpJza .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rfZvge1HyjaxpJza .marker.cross{stroke:#333333;}#mermaid-svg-rfZvge1HyjaxpJza svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rfZvge1HyjaxpJza p{margin:0;}#mermaid-svg-rfZvge1HyjaxpJza .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rfZvge1HyjaxpJza .cluster-label text{fill:#333;}#mermaid-svg-rfZvge1HyjaxpJza .cluster-label span{color:#333;}#mermaid-svg-rfZvge1HyjaxpJza .cluster-label span p{background-color:transparent;}#mermaid-svg-rfZvge1HyjaxpJza .label text,#mermaid-svg-rfZvge1HyjaxpJza span{fill:#333;color:#333;}#mermaid-svg-rfZvge1HyjaxpJza .node rect,#mermaid-svg-rfZvge1HyjaxpJza .node circle,#mermaid-svg-rfZvge1HyjaxpJza .node ellipse,#mermaid-svg-rfZvge1HyjaxpJza .node polygon,#mermaid-svg-rfZvge1HyjaxpJza .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rfZvge1HyjaxpJza .rough-node .label text,#mermaid-svg-rfZvge1HyjaxpJza .node .label text,#mermaid-svg-rfZvge1HyjaxpJza .image-shape .label,#mermaid-svg-rfZvge1HyjaxpJza .icon-shape .label{text-anchor:middle;}#mermaid-svg-rfZvge1HyjaxpJza .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rfZvge1HyjaxpJza .rough-node .label,#mermaid-svg-rfZvge1HyjaxpJza .node .label,#mermaid-svg-rfZvge1HyjaxpJza .image-shape .label,#mermaid-svg-rfZvge1HyjaxpJza .icon-shape .label{text-align:center;}#mermaid-svg-rfZvge1HyjaxpJza .node.clickable{cursor:pointer;}#mermaid-svg-rfZvge1HyjaxpJza .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rfZvge1HyjaxpJza .arrowheadPath{fill:#333333;}#mermaid-svg-rfZvge1HyjaxpJza .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rfZvge1HyjaxpJza .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rfZvge1HyjaxpJza .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rfZvge1HyjaxpJza .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rfZvge1HyjaxpJza .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rfZvge1HyjaxpJza .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rfZvge1HyjaxpJza .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rfZvge1HyjaxpJza .cluster text{fill:#333;}#mermaid-svg-rfZvge1HyjaxpJza .cluster span{color:#333;}#mermaid-svg-rfZvge1HyjaxpJza div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rfZvge1HyjaxpJza .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rfZvge1HyjaxpJza rect.text{fill:none;stroke-width:0;}#mermaid-svg-rfZvge1HyjaxpJza .icon-shape,#mermaid-svg-rfZvge1HyjaxpJza .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rfZvge1HyjaxpJza .icon-shape p,#mermaid-svg-rfZvge1HyjaxpJza .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rfZvge1HyjaxpJza .icon-shape .label rect,#mermaid-svg-rfZvge1HyjaxpJza .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rfZvge1HyjaxpJza .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rfZvge1HyjaxpJza .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rfZvge1HyjaxpJza :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Vibe Coding 时代
生成
生成
调用
执行
自动提供
AI / Cursor
业务逻辑代码
SQL Schema
Supabase 底座
REST / Realtime / Auth
传统开发
手写
部署
开发者
后端代码
自建数据库
在 Vibe Coding 工作流中,AI 负责"写业务逻辑",Supabase 负责"提供可信的基础设施"。两者的分工如下:
| 职责 | AI (Cursor/Copilot) | Supabase |
|---|---|---|
| 数据库 Schema 设计 | ✅ 生成 SQL | ✅ 执行 + 版本管理 |
| CRUD API 开发 | ✅ 生成 NestJS/Express | ✅ 自动暴露 PostgREST |
| 用户认证 | ⚠️ 生成代码(易有漏洞) | ✅ GoTrue 托管 |
| 权限控制 | ⚠️ 生成中间件逻辑 | ✅ RLS 声明式策略 |
| 实时推送 | ❌ 需额外架构 | ✅ Realtime 开箱即用 |
| 连接池 / 备份 | ❌ 不包含 | ✅ PgBouncer + PITR |
| 文件存储 | ⚠️ 生成 OSS 对接代码 | ✅ Storage + CDN |
三、实战场景:你的项目该选哪条路?
3.1 场景矩阵
#mermaid-svg-gDndH7OmPLVUZPox{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-gDndH7OmPLVUZPox .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-gDndH7OmPLVUZPox .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-gDndH7OmPLVUZPox .error-icon{fill:#552222;}#mermaid-svg-gDndH7OmPLVUZPox .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gDndH7OmPLVUZPox .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-gDndH7OmPLVUZPox .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gDndH7OmPLVUZPox .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gDndH7OmPLVUZPox .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-gDndH7OmPLVUZPox .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gDndH7OmPLVUZPox .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gDndH7OmPLVUZPox .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gDndH7OmPLVUZPox .marker.cross{stroke:#333333;}#mermaid-svg-gDndH7OmPLVUZPox svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gDndH7OmPLVUZPox p{margin:0;}#mermaid-svg-gDndH7OmPLVUZPox :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Supabase 云托管 + AI 生成逻辑 Supabase 自部署 + 自定义后端 传统后端 + 自管数据库 Supabase 实时层 + 独立业务服务 实时协作白板 多级分销系统 配件 BOM 管理 二手车商城 AI 客服系统 静态展示站 低实时性需求高实时性需求低业务复杂度高业务复杂度 "业务复杂度 vs 实时性需求:Supabase 适用性矩阵"
3.2 场景拆解
| 你的场景 | 推荐方案 | 核心理由 |
|---|---|---|
| AI 客服系统(WebSocket 实时对话) | Supabase 云托管/自部署 | Realtime 是刚需,自建 WebSocket 集群成本极高 |
| 二手车/配件展示站 | 自部署 + 阿里云 OSS | 图片多、国际访问,Storage 走阿里云 CDN 更便宜 |
| 报表后台 / 数据汇总 | 自部署或独立 RDS | 数据量大,需复杂聚合查询,500MB 免费额度不够 |
| 多级分销 / 分账系统 | 独立 NestJS 后端 + 自管 DB | 业务逻辑极复杂,AI 生成的通用后端难以覆盖 |
| 快速原型 / 给老板 Demo | Supabase 免费版 | 5 分钟搭好,验证需求后再决策 |
四、自部署 vs 云托管:成本、控制与运维的三角博弈
4.1 决策树
#mermaid-svg-X4CKrIjRDqjDfqig{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-X4CKrIjRDqjDfqig .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-X4CKrIjRDqjDfqig .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-X4CKrIjRDqjDfqig .error-icon{fill:#552222;}#mermaid-svg-X4CKrIjRDqjDfqig .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-X4CKrIjRDqjDfqig .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-X4CKrIjRDqjDfqig .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-X4CKrIjRDqjDfqig .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-X4CKrIjRDqjDfqig .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-X4CKrIjRDqjDfqig .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-X4CKrIjRDqjDfqig .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-X4CKrIjRDqjDfqig .marker{fill:#333333;stroke:#333333;}#mermaid-svg-X4CKrIjRDqjDfqig .marker.cross{stroke:#333333;}#mermaid-svg-X4CKrIjRDqjDfqig svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-X4CKrIjRDqjDfqig p{margin:0;}#mermaid-svg-X4CKrIjRDqjDfqig .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-X4CKrIjRDqjDfqig .cluster-label text{fill:#333;}#mermaid-svg-X4CKrIjRDqjDfqig .cluster-label span{color:#333;}#mermaid-svg-X4CKrIjRDqjDfqig .cluster-label span p{background-color:transparent;}#mermaid-svg-X4CKrIjRDqjDfqig .label text,#mermaid-svg-X4CKrIjRDqjDfqig span{fill:#333;color:#333;}#mermaid-svg-X4CKrIjRDqjDfqig .node rect,#mermaid-svg-X4CKrIjRDqjDfqig .node circle,#mermaid-svg-X4CKrIjRDqjDfqig .node ellipse,#mermaid-svg-X4CKrIjRDqjDfqig .node polygon,#mermaid-svg-X4CKrIjRDqjDfqig .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-X4CKrIjRDqjDfqig .rough-node .label text,#mermaid-svg-X4CKrIjRDqjDfqig .node .label text,#mermaid-svg-X4CKrIjRDqjDfqig .image-shape .label,#mermaid-svg-X4CKrIjRDqjDfqig .icon-shape .label{text-anchor:middle;}#mermaid-svg-X4CKrIjRDqjDfqig .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-X4CKrIjRDqjDfqig .rough-node .label,#mermaid-svg-X4CKrIjRDqjDfqig .node .label,#mermaid-svg-X4CKrIjRDqjDfqig .image-shape .label,#mermaid-svg-X4CKrIjRDqjDfqig .icon-shape .label{text-align:center;}#mermaid-svg-X4CKrIjRDqjDfqig .node.clickable{cursor:pointer;}#mermaid-svg-X4CKrIjRDqjDfqig .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-X4CKrIjRDqjDfqig .arrowheadPath{fill:#333333;}#mermaid-svg-X4CKrIjRDqjDfqig .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-X4CKrIjRDqjDfqig .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-X4CKrIjRDqjDfqig .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-X4CKrIjRDqjDfqig .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-X4CKrIjRDqjDfqig .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-X4CKrIjRDqjDfqig .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-X4CKrIjRDqjDfqig .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-X4CKrIjRDqjDfqig .cluster text{fill:#333;}#mermaid-svg-X4CKrIjRDqjDfqig .cluster span{color:#333;}#mermaid-svg-X4CKrIjRDqjDfqig div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-X4CKrIjRDqjDfqig .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-X4CKrIjRDqjDfqig rect.text{fill:none;stroke-width:0;}#mermaid-svg-X4CKrIjRDqjDfqig .icon-shape,#mermaid-svg-X4CKrIjRDqjDfqig .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-X4CKrIjRDqjDfqig .icon-shape p,#mermaid-svg-X4CKrIjRDqjDfqig .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-X4CKrIjRDqjDfqig .icon-shape .label rect,#mermaid-svg-X4CKrIjRDqjDfqig .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-X4CKrIjRDqjDfqig .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-X4CKrIjRDqjDfqig .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-X4CKrIjRDqjDfqig :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
否
是
否
是
开始评估 Supabase
数据量 > 500MB?
有 Docker / 运维能力?
需要快速上线?
Supabase Cloud 免费版
Supabase Cloud Pro
$25/月
需要数据不出境 /
深度成本优化?
自部署 Supabase
阿里云 ECS + OSS
注意:并发 30 /
休眠冷启动 / 无 SLA
8GB DB / 100GB /
无冷启动 / 优先支持
ECS ¥200-400/月
- 自己运维升级
4.2 成本结构对比
#mermaid-svg-OnU5IwoXF4sWg966{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OnU5IwoXF4sWg966 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OnU5IwoXF4sWg966 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OnU5IwoXF4sWg966 .error-icon{fill:#552222;}#mermaid-svg-OnU5IwoXF4sWg966 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OnU5IwoXF4sWg966 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OnU5IwoXF4sWg966 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OnU5IwoXF4sWg966 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OnU5IwoXF4sWg966 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OnU5IwoXF4sWg966 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OnU5IwoXF4sWg966 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OnU5IwoXF4sWg966 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OnU5IwoXF4sWg966 .marker.cross{stroke:#333333;}#mermaid-svg-OnU5IwoXF4sWg966 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OnU5IwoXF4sWg966 p{margin:0;}#mermaid-svg-OnU5IwoXF4sWg966 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OnU5IwoXF4sWg966 .cluster-label text{fill:#333;}#mermaid-svg-OnU5IwoXF4sWg966 .cluster-label span{color:#333;}#mermaid-svg-OnU5IwoXF4sWg966 .cluster-label span p{background-color:transparent;}#mermaid-svg-OnU5IwoXF4sWg966 .label text,#mermaid-svg-OnU5IwoXF4sWg966 span{fill:#333;color:#333;}#mermaid-svg-OnU5IwoXF4sWg966 .node rect,#mermaid-svg-OnU5IwoXF4sWg966 .node circle,#mermaid-svg-OnU5IwoXF4sWg966 .node ellipse,#mermaid-svg-OnU5IwoXF4sWg966 .node polygon,#mermaid-svg-OnU5IwoXF4sWg966 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OnU5IwoXF4sWg966 .rough-node .label text,#mermaid-svg-OnU5IwoXF4sWg966 .node .label text,#mermaid-svg-OnU5IwoXF4sWg966 .image-shape .label,#mermaid-svg-OnU5IwoXF4sWg966 .icon-shape .label{text-anchor:middle;}#mermaid-svg-OnU5IwoXF4sWg966 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OnU5IwoXF4sWg966 .rough-node .label,#mermaid-svg-OnU5IwoXF4sWg966 .node .label,#mermaid-svg-OnU5IwoXF4sWg966 .image-shape .label,#mermaid-svg-OnU5IwoXF4sWg966 .icon-shape .label{text-align:center;}#mermaid-svg-OnU5IwoXF4sWg966 .node.clickable{cursor:pointer;}#mermaid-svg-OnU5IwoXF4sWg966 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OnU5IwoXF4sWg966 .arrowheadPath{fill:#333333;}#mermaid-svg-OnU5IwoXF4sWg966 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OnU5IwoXF4sWg966 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OnU5IwoXF4sWg966 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OnU5IwoXF4sWg966 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OnU5IwoXF4sWg966 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OnU5IwoXF4sWg966 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OnU5IwoXF4sWg966 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OnU5IwoXF4sWg966 .cluster text{fill:#333;}#mermaid-svg-OnU5IwoXF4sWg966 .cluster span{color:#333;}#mermaid-svg-OnU5IwoXF4sWg966 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OnU5IwoXF4sWg966 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OnU5IwoXF4sWg966 rect.text{fill:none;stroke-width:0;}#mermaid-svg-OnU5IwoXF4sWg966 .icon-shape,#mermaid-svg-OnU5IwoXF4sWg966 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OnU5IwoXF4sWg966 .icon-shape p,#mermaid-svg-OnU5IwoXF4sWg966 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OnU5IwoXF4sWg966 .icon-shape .label rect,#mermaid-svg-OnU5IwoXF4sWg966 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OnU5IwoXF4sWg966 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OnU5IwoXF4sWg966 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OnU5IwoXF4sWg966 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 适合
适合
自部署(阿里云)
ECS 2C4G: ¥200-400/月
OSS 存储: 按量
CDN: 按量
运维人力: 隐性成本
全可控 / 数据不出境
Supabase Cloud Pro
$25/月 固定
自动 SSL/CDN
自动备份/监控
无运维人力成本
出口流量额外计费
不想运维
团队无 DBA
数据量大
国际业务
成本敏感
4.3 自部署的真实成本(适合你的技术栈)
基于你的背景(Docker、Node.js、阿里云 OSS),自部署的优势和风险:
优势:
- 官方提供
docker-compose.yml,你熟悉容器化部署 - Storage 后端可替换为阿里云 OSS,存储成本比托管版低 50%+
- 国际站(
cbbase.com)可部署在阿里云海外节点,降低延迟 - 数据完全可控,满足合规要求
风险:
- Supabase 组件迭代极快,升级需手动处理 migrations
- GoTrue 的邮件模板、OAuth 回调配置繁琐
- Realtime 默认配置扛不住高并发,需调优
max_replication_slots - 备份需自己写
pg_dump+ OSS 归档脚本,没有 Point-in-Time Recovery
五、分阶段演进路线图
不要一开始就追求完美架构。Vibe Coding 的核心是先让东西跑起来,再让架构跟上来。
#mermaid-svg-iwctGobEZewKCG65{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-iwctGobEZewKCG65 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-iwctGobEZewKCG65 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-iwctGobEZewKCG65 .error-icon{fill:#552222;}#mermaid-svg-iwctGobEZewKCG65 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iwctGobEZewKCG65 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-iwctGobEZewKCG65 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iwctGobEZewKCG65 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iwctGobEZewKCG65 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-iwctGobEZewKCG65 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iwctGobEZewKCG65 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iwctGobEZewKCG65 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iwctGobEZewKCG65 .marker.cross{stroke:#333333;}#mermaid-svg-iwctGobEZewKCG65 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iwctGobEZewKCG65 p{margin:0;}#mermaid-svg-iwctGobEZewKCG65 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iwctGobEZewKCG65 .cluster-label text{fill:#333;}#mermaid-svg-iwctGobEZewKCG65 .cluster-label span{color:#333;}#mermaid-svg-iwctGobEZewKCG65 .cluster-label span p{background-color:transparent;}#mermaid-svg-iwctGobEZewKCG65 .label text,#mermaid-svg-iwctGobEZewKCG65 span{fill:#333;color:#333;}#mermaid-svg-iwctGobEZewKCG65 .node rect,#mermaid-svg-iwctGobEZewKCG65 .node circle,#mermaid-svg-iwctGobEZewKCG65 .node ellipse,#mermaid-svg-iwctGobEZewKCG65 .node polygon,#mermaid-svg-iwctGobEZewKCG65 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iwctGobEZewKCG65 .rough-node .label text,#mermaid-svg-iwctGobEZewKCG65 .node .label text,#mermaid-svg-iwctGobEZewKCG65 .image-shape .label,#mermaid-svg-iwctGobEZewKCG65 .icon-shape .label{text-anchor:middle;}#mermaid-svg-iwctGobEZewKCG65 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-iwctGobEZewKCG65 .rough-node .label,#mermaid-svg-iwctGobEZewKCG65 .node .label,#mermaid-svg-iwctGobEZewKCG65 .image-shape .label,#mermaid-svg-iwctGobEZewKCG65 .icon-shape .label{text-align:center;}#mermaid-svg-iwctGobEZewKCG65 .node.clickable{cursor:pointer;}#mermaid-svg-iwctGobEZewKCG65 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-iwctGobEZewKCG65 .arrowheadPath{fill:#333333;}#mermaid-svg-iwctGobEZewKCG65 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iwctGobEZewKCG65 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iwctGobEZewKCG65 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iwctGobEZewKCG65 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-iwctGobEZewKCG65 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iwctGobEZewKCG65 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-iwctGobEZewKCG65 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iwctGobEZewKCG65 .cluster text{fill:#333;}#mermaid-svg-iwctGobEZewKCG65 .cluster span{color:#333;}#mermaid-svg-iwctGobEZewKCG65 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iwctGobEZewKCG65 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-iwctGobEZewKCG65 rect.text{fill:none;stroke-width:0;}#mermaid-svg-iwctGobEZewKCG65 .icon-shape,#mermaid-svg-iwctGobEZewKCG65 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iwctGobEZewKCG65 .icon-shape p,#mermaid-svg-iwctGobEZewKCG65 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-iwctGobEZewKCG65 .icon-shape .label rect,#mermaid-svg-iwctGobEZewKCG65 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iwctGobEZewKCG65 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-iwctGobEZewKCG65 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-iwctGobEZewKCG65 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 阶段 3:稳定期(3-6 个月)
数据库独立至 RDS
保留 Supabase Auth/Realtime
或完全自研后端
阶段 2:增长期(1-3 个月)
是
否
数据量 > 500MB?
升级 Pro 或
迁移至自部署
继续免费版
- 优化索引
阶段 1:验证期(0-1 个月)
Supabase Cloud 免费版
AI 生成前端 + RLS 策略
验证核心业务流程
阶段 1:验证期(现在)
- 使用 Supabase Cloud 免费版
- AI 生成前端代码 + RLS 策略 + Edge Functions
- 跑通 AI 客服、车辆展示等核心流程
- 评估真实 QPS 和数据增长
阶段 2:增长期(1-3 个月后)
选项 A:Supabase Cloud Pro($25/月)
- 8GB 数据库、100GB 存储、无冷启动
- 适合:不想运维,团队没有专职 DBA
选项 B:自部署 Supabase + 阿里云
- 数据库跑在 ECS,Storage 接 OSS
- 适合:数据量大、成本敏感、有运维能力(你符合)
- 可以用 AI 生成 Docker Compose 配置和监控脚本
阶段 3:稳定期(业务成熟后)
- Supabase 的 PostgreSQL 可以导出,迁移至阿里云 RDS
- 保留 Supabase 的 Auth/Realtime 作为服务层
- 或完全自研 NestJS 后端,只把 Supabase 当"高级 PostgreSQL"
六、结论:Supabase 是 Vibe Coding 的"基础设施杠杆"
在 Vibe Coding 时代,开发者的注意力从"写代码"转向了"拼乐高"------AI 生成业务逻辑,托管服务提供基础设施。Supabase 的价值不是替代 AI 写代码,而是填补 AI 生成代码与生产就绪之间的鸿沟。
| 维度 | 传统自建后端 | AI 生成后端 | Supabase + AI |
|---|---|---|---|
| 开发速度 | 慢 | 快(代码层面) | 快(架构层面) |
| 生产安全 | 依赖工程师水平 | 依赖 AI 提示词 | RLS + 托管保障 |
| 实时能力 | 需额外架构 | 需重构 | 开箱即用 |
| 运维成本 | 高 | 被低估的高 | 低(云托管) |
| 长期可控 | 高 | 中 | 中高(可导出) |
一句话建议:
先白嫖 Supabase Cloud 免费版跑通业务,验证后再决定是升级付费版还是自部署。你的 Docker + 阿里云技术栈完全支撑自部署,但不要在需求未验证前,就把时间花在调 Kong 网关和 GoTrue 邮件模板上。
Vibe Coding 的敌人不是技术深度,而是过早优化。让 Supabase 替你扛住基础设施的复杂度,你专注于 AI 无法替代的业务逻辑设计------这才是大龄码工转型 AI 工程师的聪明打法。
附录:参考资源
- Supabase 官方文档:https://supabase.com/docs
- Supabase 自部署指南:https://supabase.com/docs/guides/self-hosting
- PostgREST 文档:https://postgrest.org/
- PostgreSQL RLS 策略最佳实践:https://supabase.com/docs/guides/auth/row-level-security
本文基于实际工程经验与 Supabase 开源架构分析撰写,适用于正在从传统全栈开发转向 AI 辅助开发的工程师团队。