说实话,Supabase 是个好东西,但它的官方 SaaS 版(supabase.co)对于国内开发者来说,有两个设定非常搞心态,直接劝退了不少人:
这是最让人头疼的。如果你搞了个个人项目,这周忙别的没顾上写代码,下周一满怀激情打开 Cursor 准备开工,结果发现数据库被官方“挂起”了。你得去控制台点“Restore”,然后盯着那个转圈的 Loading 等它冷启动。这种打断思路的感觉真的很难受。
国内直连官方云(通常是美西或新加坡节点),Ping 值往往在 200ms~400ms。
Request Timeout 或 Socket Hang Up。这就导致你明明指令是对的,AI 却告诉你“无法读取数据库”。所以,对于国内开发者,“买台服务器自建”不仅是为了数据在自己手里,更是为了不掉线、不暂停、极速响应。
但这玩意儿自建有个大坑:当你兴冲冲搭好服务,想用 Cursor 的 MCP 功能去连库时,发现死活连不上,报错永远是 Tenant or user not found。
这篇笔记就是为了解决这个问题,记录我从“自建部署”到“Cursor 完美直连”的全过程。
一、 搞清楚架构:别把工具装反了
很多人卡在第一步,是因为没搞懂 MCP 到底该装哪儿。
这里的逻辑是: Cursor 会在你电脑上临时起一个 Docker 容器(作为 MCP 客户端/驱动),这个本地容器通过 TCP 协议,去连你 VPS 上的 Supabase 端口。
所以,你不需要在服务器上折腾 Python 环境或 Node 环境,只要保证你电脑能 ping 通服务器端口就行。
二、 服务端部署(几个关键修改)
假设你已经有了一台 Linux 服务器(推荐香港 CN2 或者国内机器,图的就是个快),装好了 Docker。
官方的部署其实很简单,但默认配置是不能用的,必须改。
1. 拉取代码
# 在服务器上执行
git clone --depth 1 https://github.com/supabase/supabase.git
cd supabase/docker
cp .env.example .env2. 修改 .env(这里全是坑)
打开 .env,这三个地方必须改,漏一个后面就得重来。
POSTGRES_PASSWORD:别用默认的,设个复杂的。
官方默认这是个占位符。但在自建版里,Supavisor(连接池)全靠这个 ID 来区分流量。如果不改,外部连接根本路由不进去。
# 把它改成你自己喜欢的名字,比如 myproject
POOLER_TENANT_ID=myproject如果你的服务器有 IP 或域名,建议把 API_EXTERNAL_URL 改成 http://你的IP:8000,否则 OAuth 登录跳回 localhost 就尴尬了。
3. 启动
docker compose pull
docker compose up -d等几分钟,用 docker compose ps 看一下,确保 supabase-pooler 是 Healthy 状态。
三、 连接测试(先别急着上 AI)
在把数据库交给 AI 之前,你必须确信人能连上。
Supabase 自建版对外暴露的不是 5432 直连端口,而是 Supavisor 连接池端口(通常是 6543 或 5432,看你 docker-compose 怎么映射)。
这里有个反直觉的规则:用户名写法。
因为走了连接池,你不能只填 postgres。你必须告诉连接池你是哪个租户。
格式: [数据库用户].[租户ID]
1.2.3.4myproject (刚才在 .env 改的)postgres.myproject本地终端测试(用 psql 或 Navicat):
psql "postgresql://postgres.myproject:你的密码@1.2.3.4:6543/postgres"如果你看到 postgres=> 提示符,恭喜,网络通了。如果报错 Tenant or user not found,回去检查 .env 改完重启没。
四、 Cursor MCP 配置
现在网络通了,我们可以让 AI 介入了。
这里我们不需要自己在本地装什么 Python 脚本,直接利用 Cursor 的 docker run 能力,跑一个现成的 MCP 镜像。
1. 准备工作
确保你写代码的电脑(Mac/Windows)上,Docker Desktop(或 OrbStack)是开着的。
2. 修改 Cursor 配置
打开 Cursor 设置 -> MCP -> Add New MCP Server。
别用界面填,直接点 Open config file,把下面这段粘进去:
{
"mcpServers": {
"my-vps-db": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "DATABASE_URI",
"crystaldba/postgres-mcp",
"--access-mode=unrestricted"
],
"env": {
"DATABASE_URI": "postgresql://postgres.myproject:你的密码@1.2.3.4:6543/postgres"
}
}
}
}这一段配置做了三件事:
-rm:用完即焚。Cursor 关了容器就删,不占你电脑空间。crystaldba/postgres-mcp:这是个很好用的开源镜像,专门做 Postgres 的 MCP 适配。-access-mode=unrestricted:这一行必须加。 默认这玩意是只读的,不加这个,你让 AI 建表它会告诉你权限不足。五、 实战效果
配置保存后,Cursor 的 MCP 灯变绿。按 Cmd+I 打开 Composer,这时候你就可以像使唤小弟一样操作数据库了。
比如:
“连接 my-vps-db,帮我建一张 orders 表,字段要有 id, order_no, amount。建完之后,写个脚本生成 50 条看起来很真实的测试数据插进去。”
你会发现速度飞快。因为是直连 VPS,延迟通常只有几十毫秒,AI 生成 SQL -> 执行 -> 返回结果,整个过程极其丝滑。
再也不用担心“Timeout”报错,也不用担心下周回来项目被 Pause 了。
六、 最后几句安全忠告
自建虽然爽,但安全就是你自己的事了。既然你把“写”权限给了 AI,为了防止翻车:
尽量在数据库里新建一个 ai_dev 用户,只给 public schema 的权限。别把 postgres 超级管理员账号写在 Cursor 配置里。
去阿里云/腾讯云的安全组,把 6543 端口限制一下,只允许你自己的 IP 访问。不要对全网(0.0.0.0/0)开放,不然你的数据库很快就会被扫描爆破。
mcp.json 里是明文密码,这文件千万别误提交到 Git 仓库里。
搞定收工。现在你可以享受一个既在掌控之中、又能被 AI 随意调遣的数据库了。