运营一个系统 Supabase 自托管 赋予您对数据和成本的绝对控制权。然而,总有一天,您当前的 VPS 可能会超载,或者您找到另一个性能更好、价格更优惠的 VPS 提供商。那就是您需要考虑 迁移(Di-dời) 您系统到新家的时刻。.

很多人担心这次迁移会很复杂,容易导致数据丢失或破坏已稳定运行的配置。特别是当您已经有大量用户数据(Users)、数据库和存储时。另外还有对转换过程中停机时间(服务中断)过长的担忧。.

别担心!这篇文章将是详细的指南,指导您一步步安全地将 Supabase Docker 从旧 VPS 迁移到新 VPS。特别是,我们将使用方法 VPS-到-VPS 传输 来确保最快的速度,并设置 Nginx Proxy Manager 来管理域名以及为您的仪表板(Studio)提供安全。.

步骤 1:了解 Supabase 自托管的“心脏”

在动手之前,您需要了解 Supabase 的文件结构,以便知道需要复制什么以及可以跳过什么。当您使用 Docker 安装 Supabase 时,您会在目录中看到 /opt/supabase 有很多子文件夹,如 apps, packages, examples

Supabase Docker 文件夹结构
只有“docker”文件夹真正重要

事实是: 99% 最重要的是东西都打包在文件夹中 docker. 。其余文件夹大多是 Supabase 项目源代码(Next.js 应用、库等),Docker 容器 并不直接使用 来运行。Docker 基于已构建的“镜像”运行(例如: supabase/studio:latest, supabase/postgres:15),因此复制源代码是不必要的。.

在文件夹 docker, 我们有 3 个“不可侵犯”的组件:

  • docker-compose.yml: 这是系统的设计。它规定了将运行哪些服务(Database、Auth、Storage、Realtime…),哪些端口打开,以及哪些卷被挂载。.
  • .env: 这是存储您所有秘密的地方。数据库密码(POSTGRES_PASSWORD)、JWT Secret(用于创建令牌)、API 密钥(Anon Key、Service Role Key)。丢失此文件就相当于失去了对系统的控制权。.
  • volumes/:最重要的是 volumes/db/data. 。这是 PostgreSQL 实时数据的存储位置。如果您只复制配置文件而忘记这个文件夹,您将得到一个全新的 Supabase,但是…空的。.

步骤 2:准备“新家”(目标 VPS)

您需要准备一个干净的新 VPS(全新安装)。推荐操作系统是 Ubuntu 20.04 LTS 广告管理器 22.04 LTS 以确保稳定性和与 Docker 的最佳兼容性。.

首先,请 SSH 登录到新 VPS 并更新系统:

sudo apt update && sudo apt upgrade -y

接下来,安装 Docker 和 Docker Compose 插件。最快速和最标准的方法是使用 Docker 官方的自动安装脚本:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

安装完成后,请检查 Docker 是否已运行:

sudo docker --version
sudo docker compose version

如果看到完整的版本信息,说明您已准备好接收数据。.

步骤 3:传输数据(通过 Rsync “发射”数据)

而不是传统方式: 将 10GB 数据下载到个人电脑(网络慢) -> 将 10GB 数据上传到新 VPS(网络慢), 我们将使用 Rsync 在两个 VPS 之间直接传输数据。速度极快,因为充分利用了数据中心的带宽。.

Rsync 终端传输命令
Rsync 确保数据传输安全,支持断网后恢复

为什么使用 Rsync 而不是 SCP?

  • 恢复 (Resume): 如果正在复制 90% 时网络断开,再次运行 Rsync 命令,它将从 90% 继续。SCP 将从头开始。.
  • 保留属性: Rsync 保留文件的权限 (permissions)、时间戳 (timestamps),这对数据库文件非常重要。.
  • 压缩数据: 标志 -z 有助于在传输时压缩数据,节省带宽。.

执行:

1. 在新 VPS 上: 请先创建父目录,以避免复制错误的路径:

# 创建目录 /opt/supabase
mkdir -p /opt/supabase

2. 在旧 VPS 上: 运行以下 Rsync 命令。该命令将要求输入新 VPS 的 root 密码。.

# 从旧 VPS 运行此命令
# IP_VPS_MOI: 替换为新服务器的 IP(例如:116.118.x.x)

rsync -avzP /opt/supabase/docker/ root@IP_VPS_MOI:/opt/supabase/docker/

注意源路径末尾的 / 非常重要。如果写错,文件夹 docker 可能会嵌套(例如 docker/docker)。上面的命令是最标准的。.

步骤 4:在新家启动 Supabase

Rsync 进度条完成后(达到 100%),恭喜您,旧系统的整个灵魂已迁移到新家。现在请唤醒它。.

新 VPS:

cd /opt/supabase/docker

# (可选)检查 .env 文件是否需要编辑
cat .env

# 启动容器
docker compose up -d

第一次运行需要几分钟让 Docker 下载镜像。请耐心等待。完成后,检查日志以确保没有错误:

docker compose logs -f

步骤 5:配置 Nginx Proxy Manager & SSL

Supabase 默认只开放本地端口(如 8000、3000)或内部端口。要让用户通过漂亮域名(https://api.your-domain.com) 访问并启用 SSL 安全,您需要一个反向代理。. Nginx Proxy Manager (NPM) 是一个绝佳选择,因为它有直观的界面。.

Nginx Proxy Manager 仪表板界面
为 API 和 Studio 配置 2 个独立的 Proxy Host

您需要创建 2 个 Proxy Hosts

1. API 网关(最重要的)

  • Domain Names: api.your-domain.com (或您的 API 域名)
  • Forward Hostname / IP: 172.17.0.1 (这是 Docker 的默认网关 IP,有助于 NPM 反向指向同一主机上的容器)。.
  • Forward Port: 8008 (这是 Supabase 中的 Kong/API Gateway 的端口)。.
  • Websockets 支持: 必须开启(Supabase Realtime 使用这个)。.
  • SSL 选项卡: 请求新的 Let’s Encrypt 证书,强制 SSL,HTTP/2 支持。.

2. Studio 仪表板(管理界面)

  • Domain Names: studio.your-domain.com
  • Forward Hostname / IP: 172.17.0.1
  • Forward Port: 3003 (Studio 的默认端口)。.
  • Websockets 支持: 开启。.
  • SSL 选项卡: 配置类似于上面。.

配置 NPM 完成后,最后一步是进入您的域名管理页面(DNS),将上述 2 个子域名指向 新 VPS 的 IP. 。等待大约 5-10 分钟让 DNS 更新。.

步骤 6:高级安全(访问列表)

Supabase 自托管社区版的一个重大漏洞是 Studio 仪表板没有登录页面. 。任何知道路径的人 studio.your-domain.com 都可以进入查看和修改您的数据。这极度危险。.

但是使用 Nginx Proxy Manager,我们可以轻松修补这个漏洞,使用功能 访问列表 (限制访问)。.

使用访问列表保护 Studio
为 Studio 添加密码保护层

实施方法:

  1. 在 NPM 中,进入选项卡 访问列表, 点击 添加访问列表.
  2. 名称设置为 仅管理员.
  3. 在选项卡 授权, 请添加只有您知道的用户名和密码。.
  4. (高级提示) 在选项卡 访问, 您可以填写公司/家庭的静态 IP 并选择 操作:允许. 。然后启用选项 满足任意.
    • 意思是:如果正确输入“家庭”IP,直接进入无需询问。.
    • 如果陌生 IP(去咖啡店),系统会弹出密码询问窗口。.
  5. 保存(Save)。.
  6. 返回 Proxy Hosts, 修改行 studio.your-domain.com. 。在 Details 标签页,项目 访问列表, 选择 仅管理员.

结论

将服务器迁移并不像你想象的那么可怕,如果我们清楚了解 Docker 的本质并知道如何使用 Rsync 等工具。通过上面的指南,你不仅能成功迁移,还能提升 Supabase 的系统安全性。.

请记得定期备份数据(cronjob 备份文件夹 docker) 以防万一。祝大家成功!

DPS.MEDIA