这一篇不再讨论“怎么把功能做出来”,而是把注意力放到“怎么把它安全地上线、并且能持续迭代”。
如果你用 Supabase 做微信小程序,工程风险主要集中在三件事:
- 数据库变更有没有版本控制(能不能复现、能不能回滚)
- RLS / 密钥边界有没有做对(有没有越权或裸奔表)
- 微信侧的合规配置有没有补齐(合法域名、真机差异、弱网表现)
第一阶段:基建即代码(Migration 工作流)
如果你希望多人协作、可回滚、可复现,数据库变更就不能只依赖 Dashboard 点点鼠标。更稳的做法是把变更收敛到 Supabase CLI 的 migration。
1. 本地 Docker 沙盒
执行 supabase start 后,CLI 会在本地 Docker 里拉起一套和云端一致的服务(Postgres、PostgREST、Auth、Storage、Realtime 等)。你可以在本地随意改表、重置数据,避免“直接连生产库改表”的风险。
2. Migration:数据库的版本控制
代码有 Git 来追踪历史,数据库呢?就靠 Migration 文件。
你对系统的每一次变更(建表、索引、函数、策略),都应该固化成 migration SQL。
开发过程中建议频繁跑 supabase db reset:清空本地库,按时间顺序重放全部 migration,再灌入 seed 数据。只要 db reset 能跑通,至少说明 migration 链条是可复现的。
第二阶段:上线前的安全与性能检查
1. 密钥查杀:保护好你的大门钥匙
Supabase 项目通常会接触到两类 key:
anon key:会出现在客户端,用于标识项目;权限由 RLS 决定service_role:只允许出现在服务端环境变量里;它会绕过 RLS
上线前必做:全项目全局搜索 service_role 字符串。一旦发现它被硬编码在小程序的业务代码里,立即去控制台重置密钥!
2. 扫荡“裸奔表”(RLS 覆盖率审计)
一个常见事故是:核心表 RLS 写得很认真,但临时加的一张反馈表、日志表、上传记录表忘了开 RLS,结果变成匿名可写。
在 SQL Editor 中运行这段审计脚本,抓出所有忘了开防护盾的危险表:
SELECT tablename FROM pg_tables
WHERE schemaname = 'public' AND rowsecurity = false;
如果列表不为空,马上回去补齐 RLS 策略。
3. 性能排雷:消灭 select=* 与 N+1
列表查询尽量避免 .select('*'),尤其是包含长文本、大 JSON 字段的表。更稳的做法是明确选字段:.select('id, title, author_id')。
如果需要拿到关联表字段,尽量利用 PostgREST 的嵌套 select,一次请求解决关联数据,避免 N+1。
第三阶段:跨过微信合规的最后门槛
后端一切就绪,微信小程序端的部署合规同样容不得半点马虎。
1. 域名白名单矩阵
微信公众平台对服务器域名要求很严格,它必须提前知道你要访问哪些外网。你必须在「开发设置 -> 服务器域名」中把 Supabase 的域名(通常是 *.supabase.co)填满四个格子:
- request 合法域名:用于常规的增删改查。
- socket 合法域名:把
https换成wss,为了 Realtime 的 WebSocket 通信。 - uploadFile 合法域名:为了我们的 Storage 草图上传。
- downloadFile 合法域名:用于下载或预览图片。
2. 拥抱不完美的现实:弱网与监控
不要假设用户的网络都像你的开发机 Wi-Fi 一样丝滑。 在微信开发者工具中开启 “弱网模拟”,测试你的应用。重点检查:
- 草图上传中断了,有没有重试按钮?
- 切入后台聊微信再回来,WebSocket 断开后,你的重连代码(指数退避算法)是否成功恢复了频道连接并拉取了漏掉的消息?
最后,建议至少有一个最小的错误上报入口:请求失败、前端异常、关键业务事件(登录/提交/上传)。这不要求你一上来就接完整的监控平台,但要让“线上问题”可被定位,而不是只存在于用户的聊天记录里。
上线 Checklist(最小版)
- Migration:本地
supabase db reset可复现,生产变更只走 migration - Secrets:客户端仅有
anon key,service_role只在服务端环境变量 - RLS:业务表均启用 RLS,策略覆盖 SELECT/INSERT/UPDATE/DELETE
- 性能:列表查询不
select('*'),关联查询避免 N+1,关键字段有索引 - 微信合规:四类合法域名填全,真机验证登录/提交/上传/分享