自建 Supabase + Cursor MCP教程

🕒创建时间2025年12月29日

说实话,Supabase 是个好东西,但它的官方 SaaS 版(supabase.co)对于国内开发者来说,有两个设定非常搞心态,直接劝退了不少人:

1.
免费版的“7天不活跃”自动暂停(Project Paused)

这是最让人头疼的。如果你搞了个个人项目,这周忙别的没顾上写代码,下周一满怀激情打开 Cursor 准备开工,结果发现数据库被官方“挂起”了。你得去控制台点“Restore”,然后盯着那个转圈的 Loading 等它冷启动。这种打断思路的感觉真的很难受。

2.
物理距离导致的“高延迟”与“超时”

国内直连官方云(通常是美西或新加坡节点),Ping 值往往在 200ms~400ms。

对人来说是慢:Dashboard 打开慢,查询慢,勉强能忍。
对 AI 来说是“挂”:这是最致命的。Cursor 的 MCP 连接对响应时间很敏感。当延迟过高或偶尔丢包时,AI 执行 SQL 经常会报 Request TimeoutSocket Hang Up。这就导致你明明指令是对的,AI 却告诉你“无法读取数据库”。

所以,对于国内开发者,“买台服务器自建”不仅是为了数据在自己手里,更是为了不掉线、不暂停、极速响应

但这玩意儿自建有个大坑:当你兴冲冲搭好服务,想用 Cursor 的 MCP 功能去连库时,发现死活连不上,报错永远是 Tenant or user not found

这篇笔记就是为了解决这个问题,记录我从“自建部署”到“Cursor 完美直连”的全过程。

一、 搞清楚架构:别把工具装反了

很多人卡在第一步,是因为没搞懂 MCP 到底该装哪儿。

服务端(你的 VPS):只需要装 Supabase Docker。不需要装任何 AI 插件。
本地(你的电脑):Cursor + Docker Desktop。

这里的逻辑是: Cursor 会在你电脑上临时起一个 Docker 容器(作为 MCP 客户端/驱动),这个本地容器通过 TCP 协议,去连你 VPS 上的 Supabase 端口。

所以,你不需要在服务器上折腾 Python 环境或 Node 环境,只要保证你电脑能 ping 通服务器端口就行。

二、 服务端部署(几个关键修改)

假设你已经有了一台 Linux 服务器(推荐香港 CN2 或者国内机器,图的就是个快),装好了 Docker。

官方的部署其实很简单,但默认配置是不能用的,必须改。

1. 拉取代码

JavaScript
# 在服务器上执行
git clone --depth 1 https://github.com/supabase/supabase.git
cd supabase/docker
cp .env.example .env

2. 修改 .env(这里全是坑)

打开 .env,这三个地方必须改,漏一个后面就得重来。

修改数据库密码:

POSTGRES_PASSWORD:别用默认的,设个复杂的。

🔥 修改 POOLER_TENANT_ID(最重要的一步)Bash

官方默认这是个占位符。但在自建版里,Supavisor(连接池)全靠这个 ID 来区分流量。如果不改,外部连接根本路由不进去。

JavaScript
# 把它改成你自己喜欢的名字,比如 myproject
POOLER_TENANT_ID=myproject
API 外部地址(为了回调正常)

如果你的服务器有 IP 或域名,建议把 API_EXTERNAL_URL 改成 http://你的IP:8000,否则 OAuth 登录跳回 localhost 就尴尬了。

3. 启动

JavaScript
docker compose pull
docker compose up -d

等几分钟,用 docker compose ps 看一下,确保 supabase-pooler 是 Healthy 状态。

三、 连接测试(先别急着上 AI)

在把数据库交给 AI 之前,你必须确信人能连上。

Supabase 自建版对外暴露的不是 5432 直连端口,而是 Supavisor 连接池端口(通常是 6543 或 5432,看你 docker-compose 怎么映射)

这里有个反直觉的规则:用户名写法。

因为走了连接池,你不能只填 postgres。你必须告诉连接池你是哪个租户。

格式: [数据库用户].[租户ID]

VPS IP: 1.2.3.4
租户 ID: myproject (刚才在 .env 改的)
最终用户名: postgres.myproject

本地终端测试(用 psql 或 Navicat):

JavaScript
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,把下面这段粘进去:

JavaScript
{
  "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"
      }
    }
  }
}

这一段配置做了三件事:

1.
-rm:用完即焚。Cursor 关了容器就删,不占你电脑空间。
2.
crystaldba/postgres-mcp:这是个很好用的开源镜像,专门做 Postgres 的 MCP 适配。
3.
-access-mode=unrestricted这一行必须加。 默认这玩意是只读的,不加这个,你让 AI 建表它会告诉你权限不足。

五、 实战效果

配置保存后,Cursor 的 MCP 灯变绿。按 Cmd+I 打开 Composer,这时候你就可以像使唤小弟一样操作数据库了。

比如:

“连接 my-vps-db,帮我建一张 orders 表,字段要有 id, order_no, amount。建完之后,写个脚本生成 50 条看起来很真实的测试数据插进去。”

你会发现速度飞快。因为是直连 VPS,延迟通常只有几十毫秒,AI 生成 SQL -> 执行 -> 返回结果,整个过程极其丝滑。

再也不用担心“Timeout”报错,也不用担心下周回来项目被 Pause 了。

六、 最后几句安全忠告

自建虽然爽,但安全就是你自己的事了。既然你把“写”权限给了 AI,为了防止翻车:

1.
别用 root 裸奔:

尽量在数据库里新建一个 ai_dev 用户,只给 public schema 的权限。别把 postgres 超级管理员账号写在 Cursor 配置里。

2.
IP 白名单(重中之重):

去阿里云/腾讯云的安全组,把 6543 端口限制一下,只允许你自己的 IP 访问。不要对全网(0.0.0.0/0)开放,不然你的数据库很快就会被扫描爆破。

3.
敏感信息:

mcp.json 里是明文密码,这文件千万别误提交到 Git 仓库里。

搞定收工。现在你可以享受一个既在掌控之中、又能被 AI 随意调遣的数据库了。

© 2025 nipao.com