
在之前的分享中我还点赞过 Supabase 云服务免费版本的慷慨,但在使用 Supabase 作为微信小程序后端服务时,发现从国内访问云服务存在显著的延迟问题:
即使尝试使用腾讯云 EdgeOne 加速服务,效果仍不理想。基于性能考量,我决定进行自部署。
参考官方文档:https://supabase.com/docs/guides/self-hosting/docker[1]
# Get the code
git clone --depth 1 https://github.com/supabase/supabase
# Make your new supabase project directory
mkdir supabase-project
# Tree should look like this
# .
# ├── supabase
# └── supabase-project
# Copy the compose files over to your project
cp -rf supabase/docker/* supabase-project
# Copy the fake env vars
cp supabase/docker/.env.example supabase-project/.env
# Switch to your project directory
cd supabase-project
# Pull the latest images
docker compose pull
# Start the services (in detached mode)
docker compose up -d
问题:免费版云服务无法获取 IPv4 数据库连接信息
解决方案:
supabase db dump > init.sql

自定义迁移工具:
图片预览问题排查:
如果控制台图片无法预览,请检查 .env 文件中的 SUPABASE_PUBLIC_URL 参数配置。
本地部署的版本没有 Edge Functions 的控制操作面板,我初次还以为自部署不支持 Functions,后来在官网功能在自部署版本中仍支持,但需要通过文件系统管理;
部署步骤:
将本地调试的 functions 目录拷入部署目录中 volumes/functions,你就可以在客户端进行调用,就这么简单😊
await supabase.functions.invoke('functions-name', {})
对于之前在Edge Functions中的 Secrets 参数,需要配置在docker-compose.yml中
functions:
container_name:supabase-edge-functions
image:supabase/edge-runtime:v1.69.6
restart:unless-stopped
volumes:
-./volumes/functions:/home/deno/functions:Z
depends_on:
analytics:
condition:service_healthy
environment:
JWT_SECRET:${JWT_SECRET}
SUPABASE_URL:http://kong:8000
SUPABASE_ANON_KEY:${ANON_KEY}
SUPABASE_SERVICE_ROLE_KEY:${SERVICE_ROLE_KEY}
SUPABASE_DB_URL:postgresql://postgres:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
# TODO: Allow configuring VERIFY_JWT per function. This PR might help: https://github.com/supabase/cli/pull/786
VERIFY_JWT:"${FUNCTIONS_VERIFY_JWT}"
# Secrets 参数 START
FOO_BAR:value
# Secrets 参数 END
command:
[
"start",
"--main-service",
"/home/deno/functions/main"
]
⚠️ 特别说明:
自部署版本中有很多功能不会像云服务在Supabase Studio那么方便,大部分需要设置和更新.env的参数,例如:
Settings->Data api ->Exposed schemas中设置,在自部署版本中就需要在.env中更新############
# API - Configuration for PostgREST.
############
PGRST_DB_SCHEMAS=public,storage,graphql_public,expose_schema_name
备份并编辑docker-compose.yml中的版本镜像版本
# 备份
cp docker-compose.yml "docker-compose.yml.bak.$(date +%Y%m%d%H%M%S)" && echo "备份完成"
# 更新镜像
docker compose pull
# 重启服务
docker compose down
docker compose up -d
自部署后实测数据:
自部署版本虽然需要更多运维工作,但对于国内访问Supabase云服务的场景性能提升是显著的。希望这些经验能帮助遇到类似问题的同学顺利迁移,有问题或者经验也欢迎在评论区交流讨论。
参考资料
[1]
https://supabase.com/docs/guides/self-hosting/docker: https://supabase.com/docs/guides/self-hosting/docker
[2]
迁移代码: https://code.juejin.cn/api/raw/7555439299173941267?id=7555439299173957651