如何在Supabase数据库迁移中使用变量管理敏感配置?
Supabase迁移文件中动态注入环境变量的最佳实践
方法一:利用psql环境变量注入(推荐)
Supabase CLI底层依赖psql,而psql支持直接引用系统环境变量,结合.env文件就能实现本地/线上环境的自动切换:
- 本地创建
.env文件(务必加入.gitignore),写入:
SUPABASE_PROJECT_URL="http://localhost:54321" SUPABASE_SERVICE_ROLE_KEY="你的本地服务角色密钥"
线上部署时,直接在Supabase控制台的「设置→环境变量」中配置这两个值即可。
- 修改SQL函数,用psql的环境变量语法引用:
declare project_url text := :'SUPABASE_PROJECT_URL'; service_role_key text := :'SUPABASE_SERVICE_ROLE_KEY'; -- 需要全权限
- 执行迁移时,本地环境下Supabase CLI会自动加载
.env里的变量;线上部署时则直接读取项目配置的环境变量,完全不用手动修改迁移文件。
方法二:将敏感信息存储为数据库自定义参数
把项目URL和密钥存在数据库的自定义配置参数中,函数运行时动态读取,彻底避免敏感值出现在迁移文件里:
- 新建迁移文件(或直接在本地/线上的SQL编辑器中执行),设置数据库参数:
-- 本地环境执行 ALTER SYSTEM SET custom.supabase_project_url = 'http://localhost:54321'; ALTER SYSTEM SET custom.supabase_service_role_key = '你的本地密钥'; -- 线上环境执行 ALTER SYSTEM SET custom.supabase_project_url = '你的线上项目URL'; ALTER SYSTEM SET custom.supabase_service_role_key = '你的线上服务角色密钥'; -- 重载配置使生效 SELECT pg_reload_conf();
- 修改函数,动态读取这些参数:
declare project_url text := current_setting('custom.supabase_project_url'); service_role_key text := current_setting('custom.supabase_service_role_key');
这种方式的核心是敏感信息仅存储在数据库配置中,本地和线上各自维护自己的参数即可,迁移文件里完全不会出现敏感内容。
方法三:使用迁移预处理脚本
如果前两种方法不适用,可写个简单的shell脚本,在执行迁移前替换模板文件中的变量:
- 创建迁移模板文件(比如
template_function.sql),用占位符标记变量:
declare project_url text := '{{PROJECT_URL}}'; service_role_key text := '{{SERVICE_ROLE_KEY}}';
- 编写shell脚本(比如
run_migration.sh),读取.env变量并生成实际迁移文件:
#!/bin/bash source .env sed "s/{{PROJECT_URL}}/$SUPABASE_PROJECT_URL/g; s/{{SERVICE_ROLE_KEY}}/$SUPABASE_SERVICE_ROLE_KEY/g" template_function.sql > migrations/$(date +%Y%m%d%H%M%S)_add_function.sql # 执行迁移 supabase db push
- 将模板文件和脚本加入版本控制,但生成的迁移文件要加入
.gitignore,仅在本地执行生成,不提交到GitHub。
关键注意事项
- 服务角色密钥绝对不能提交到代码仓库,务必确保
.env文件或数据库参数仅在本地和线上环境配置,不进入版本控制。 - 线上环境配置的环境变量,Supabase会自动在数据库会话中加载,无需额外操作。
内容的提问来源于stack exchange,提问作者supastuck
相关产品推荐
相关产品推荐

