7.8 Supabase 配置与使用
Tip
告别繁琐的运维,用"点外卖"的方式获取云端数据库。
1. 为什么要学这个?
你想开发一个副业项目,但光是安装和配置 PostgreSQL 数据库,就花了一整晚。 不仅要处理防火墙、端口映射,还要担心怎么做每日备份,怎么防黑客攻击。
好不容易上线了,因为忘了配置连接池。 当群里来了 500 个并发用户时,Vercel 瞬间发起了 500 个连接,直接把你的数据库打挂了。 你辛辛苦苦做的项目,就在流量最高峰的时候瘫痪了。
别让繁琐的运维工作成了你创业路上的拦路虎。用 Supabase,像点外卖一样简单地获取一个自带连接池、自动备份的云端数据库。
2. 核心概念
Supabase 不是一个普通的软件,它是一个 BaaS (Backend as a Service) 平台。
以前 vs 现在
-
以前 (Self-hosted): 你需要买服务器 -> 装 Linux -> 装 Docker -> 拉取 PostgreSQL 镜像 -> 配置 pg_hba.conf -> 安装 PgBouncer (连接池) -> 写脚本做备份。 这就像为了吃顿饭,还得亲自种菜、杀猪、生火。
-
现在 (Supabase): 你注册账号 -> 点击 "Create New Project"。 就像点外卖,30秒后,一个热气腾腾、配置完美的数据库就端到了你面前。
3. 实战配置
在 Serverless 环境(如 Vercel)下使用 Supabase,最核心的只有一件事:分清楚两把钥匙。
场景:Serverless 的连接数爆炸
当你在 Vercel 上部署应用时,每一个用户请求都会启动一个独立的程序实例。
- 来 1 个用户 -> 1 个连接。
- 来 1000 个用户 -> 1000 个连接。
普通的 PostgreSQL 默认最大连接数只有 100 左右。 如果不加控制,第 101 个用户就会报错白屏。
解决方案:使用连接池 (Connection Pool)
Supabase 贴心地为你准备了两套连接地址:
-
直连地址 (Direct URL): 端口
5432。- 给谁用: 给你用(运行 Migration,调整表结构)。
- 特点: 像专属VIP通道,稳,但路窄。
-
连接池地址 (Pooler URL): 端口
6543。- 给谁用: 给 Vercel 用(处理海量用户请求)。
- 特点: 像公交通道,能把成千上万的请求排队打包,塞进数据库,永不堵车。
配置步骤
在 .env 文件中,必须同时配置这两把钥匙:
# 1. 给你用的 (Migration)
DIRECT_URL="postgresql://postgres:[密码]@aws-0-us-east-1.pooler.supabase.com:5432/postgres"
# 2. 给程序用的 (Transaction Mode)
# 注意端口是 6543,且必须要带 ?pgbouncer=true 参数
DATABASE_URL="postgresql://postgres:[密码]@aws-0-us-east-1.pooler.supabase.com:6543/postgres?pgbouncer=true"
4. 避坑指南
| ❌ 错误做法 | ✅ 正确做法 | 💡 代价 |
|---|---|---|
| 只配一个 URL | 双 URL 分离 | 如果只用连接池地址跑 Migration,会报错;如果只用直连地址跑业务,高并发会炸。 |
| 密码含特殊字符 | URL 编码 | 密码里的 @ # 会截断连接字符串,导致解析失败。 |
| 选错区域 | 就近原则 | Vercel 在华盛顿,Supabase 选新加坡。每一次查询都要绕地球半圈,用户体验极差。 |
5. 真实案例
Story
Product Hunt 发布日的惨剧
某独立开发者在 Product Hunt 上发布了自己的新产品。虽然他使用了 Supabase,但他错误地将直连地址 (5432) 填进了 Vercel 的环境变量。
产品突然爆火,一分钟涌入 3000 次点击。
仅仅几秒钟,数据库连接数就全部耗尽,后续所有用户看到的都是冰冷的 500 Internal Server Error。
当他满头大汗地修好配置时,已经过去了 10 分钟。在这最关键的 10 分钟里,他永远失去了对他最感兴趣的那 90% 的首批种子用户。
Vibe 心法:机会总是留给有准备的人。配置连接池只需要 1 分钟,但它能救你一命。
6. 本章小结
- ☁️ 云端托管:别自己运维数据库,用 Supabase 这种成熟的云服务。
- 🚦 连接池:Serverless 环境下,必须使用
6543端口的连接池地址。 - 🔑 各司其职:Migration 用直连,App 运行用连接池,千万别搞混。