自建 Supabase 云服务与 BeeCount 云同步详解
自建 Supabase 云服务与 BeeCount 云同步详解
本文是 BeeCount 技术系列第 2 篇,主题:如何 10 分钟完成自建 Supabase 云端并在 BeeCount 中启用“可选云同步”。无论你是只想做本地记账的普通用户,还是希望完全掌控数据的自托管玩家,本文都提供分层次的指导。
项目地址:https://github.com/TNT-Likely/BeeCount (欢迎 Star / Issue / PR)
0. 为什么要自建?(可选,而非必须)
BeeCount 的设计理念是:记账首先应当离线可用,其次才是“可选”云同步。因此应用默认即可离线使用,本地数据存储在设备内的 SQLite,不强制账号,也不强制服务器。只有当你满足以下任一需求时,自建才有价值:
| 需求 | 是否适合自建 | 说明 |
|---|---|---|
| 多设备(手机 + 平板)同步 | 同一 Supabase 项目即可同步 | |
| 异地/意外备份 | 设备丢失仍可恢复 | |
| 数据绝对主权与隐私 | 服务端完全由你掌控 | |
| 只在本机记账 | 可直接忽略云同步功能 |
总结:你可以“先用再决定”。不需要在第一次打开 App 就填任何“服务器地址”。
1. 整体架构概览
┌────────────────┐ 上传/下载 ┌────────────────────┐
│ BeeCount App │ <------------------> │ Supabase (Storage) │
│ (本地 SQLite) │ │ + Auth (Email) │
└────────────────┘ └────────────────────┘
▲ │ ▲
│ │ 指纹/差异计算 │ RLS 策略限制
│ └─────────────── 本地校验 ───────────────┘
核心点:
- 仅使用 Supabase Auth + Storage;备份文件是 JSON / (未来可能 gzip)
- 不侵入你本地日常记账流程;上传/下载是显式操作或可选“自动同步”
- 采用“指纹 + 条数 + 时间戳”判断差异,避免不必要全量下载
2. 准备你的 Supabase 项目(约 5 分钟)
2.1 创建项目
- 打开 https://supabase.com → 登录 / 注册
- New Project → 选择离你最近 Region
- 设置数据库密码(只在数据库管理时用;客户端不会用到)
- 等待项目初始化完成
2.2 获取配置参数
进入 Project → Settings → API
Project URL复制为SUPABASE_URLanon public复制为SUPABASE_ANON_KEY
切记:不要在客户端使用
service_role。
3. 创建存储 Bucket 与访问策略
BeeCount 使用 Storage Bucket: beecount-backups 保存每个账本的快照文件。
3.1 创建 Bucket
- Project → Storage → "New bucket"
- 名称:
beecount-backups - 访问权限:建议 Private(更安全);Public 也能用但不推荐
- 创建完成
3.2 对象路径规范
users/{user_id}/ledger_{ledgerId}.json # 或未来:.json.gz
{user_id}为 Supabase Auth 分配的 UUID- 一个用户多个账本 → 多个文件并列
3.3 RLS 策略(Storage Objects)
打开 SQL Editor,针对 storage.objects (或通过 Storage → Policies)添加 4 条策略:
读取
create policy "beecount_select_own"
on storage.objects for select
using (
bucket_id = 'beecount-backups'
and (storage.foldername(name))[1] = 'users'
and (storage.foldername(name))[2] = auth.uid()::text
);
上传
create policy "beecount_insert_own"
on storage.objects for insert
with check (
bucket_id = 'beecount-backups'
and (storage.foldername(name))[1] = 'users'
and (storage.foldername(name))[2] = auth.uid()::text
);
更新(可覆盖已有备份)
create policy "beecount_update_own"
on storage.objects for update
using (
bucket_id = 'beecount-backups'
and (storage.foldername(name))[1] = 'users'
and (storage.foldername(name))[2] = auth.uid()::text
)
with check (
bucket_id = 'beecount-backups'
and (storage.foldername(name))[1] = 'users'
and (storage.foldername(name))[2] = auth.uid()::text
);
删除
create policy "beecount_delete_own"
on storage.objects for delete
using (
bucket_id = 'beecount-backups'
and (storage.foldername(name))[1] = 'users'
and (storage.foldername(name))[2] = auth.uid()::text
);
若选择 Private Bucket,必须有这些策略,否则客户端无法读写。
4. 在 BeeCount 中启用自定义云服务
打开 App → 我的 → 云服务:
- 点击“新增 / 修改 自定义 Supabase”
- 粘贴
SUPABASE_URL与SUPABASE_ANON_KEY - 保存后自动登出(防止旧 session 混用)
- 登录/注册(邮箱)
- “同步”区域点击“上传”执行首次全量上传(每个账本一次)
- 可选:开启“自动同步”
- 随时可以“切回默认”且自定义配置不会丢失,再次进入可一键启用
提示:首次上传完成后,状态将变为“已同步”;若看到“本地较新”再点一次刷新即可。
5. 同步工作原理(简述)
| 步骤 | 动作 | 说明 |
|---|---|---|
| 获取状态 | 计算本地指纹 + 查询远端文件元数据 | 指纹:基于账本记录序列化哈希 |
| 上传 | 序列化当前账本 → 覆盖用户目录下对应文件 | 失败自动提示,不隐式重试 |
| 下载 | 获取文件 → 解析 → 合并本地(去重) | 输出导入/跳过/重复统计 |
| 差异判断 | localCount / cloudCount / fingerprints / 时间 | 多条件组合更准确 |
未来计划(Roadmap 方向):
- 多账本“一键首次全量上传”
- 增量(差量)同步(减少流量)
- 端到端加密(可选)
6. 问题排查(Troubleshooting)
| 问题 | 可能原因 | 解决 |
|---|---|---|
| 登录失败 (PKCE storage) | 使用旧版本或错误的 key | 更新到最新 App;确认使用 anon key |
| 上传 403 | Bucket 未创建或策略缺失 | 按第 3 节检查 bucket + 4 条策略 |
| 上传后仍显示“本地较新” | 对象存储延迟/指纹未刷新 | 等待数秒或点“刷新同步状态” |
| 下载失败 404 | 文件尚未上传 | 先执行一次“上传”初始化 |
| 多设备不一致 | 另一设备未上传最新 | 另一端上传后此端下载/刷新 |
7. 安全与成本
- 仅使用
anon key,永不写死service_role - 私有 Bucket + RLS 策略 = 用户隔离
- 定期在“导出”生成 CSV 线下备份
- Supabase 免费额度(个人记账极低占用)即可长期使用
8. FAQ(精简)
Q: 我可以不自建吗? 可以,完全本地使用;想同步再配置。
Q: 自定义模式后能切回默认吗? 可以,且自定义配置保留。
Q: 首次全量上传会覆盖云端旧数据吗? 会覆盖对应账本文件,但只影响你自己的目录。
Q: 未来会支持差量同步吗? 计划中。
Q: 支持端到端加密吗? 规划中,将以可选方式提供。
9. 与其他方案对比(简要)
| 方案 | 自主可控 | 学习/运维成本 | 数据粒度 | 适合人群 |
|---|---|---|---|---|
| 纯本地 (不自建) | 最低 | 设备级 | 仅需本机 | |
| 自建 Supabase (当前) | 低 | 账本文件 | 想跨设备/备份 | |
| 自建后端 + API 自写 | 高 | 任意 | 重度技术玩家 |
10. 推广 & 参与
如果你觉得 BeeCount 的“可选云同步 + 自主托管”理念有价值:
- 给仓库一个 ️ Star 支持项目持续演进
- 分享给需要记账但不想被数据“绑定”在平台上的朋友
- 提交 Issue:帮助我们发现 bug / 需求
- 提交 PR:实现 Roadmap 或文档改进
Roadmap 草案(择机推进):
- 自定义 Supabase 动态切换(已完成)
- 多账本一键全量上传
- 增量同步(diff)
- 端到端加密(E2EE)
- 更丰富统计与图表
11. 结语
BeeCount 不希望“绑定用户”,而是提供一套从纯离线到完全自托管的自由梯度。你可以今天离线记一笔,明天想同步了再 10 分钟自建;也可以永远不连接任何服务器。掌控感与透明度,正是开源记账应用应当具备的底色。
如果本文对你有帮助,欢迎 Star / 转发;也欢迎在 Issue 中分享你的自建经验。
—— BeeCount 项目组
自建 Supabase 云服务与 BeeCount 云同步详解的更多相关文章
- 阿里云slb和ucloud负载均衡ulb添加ssl证书将http服务https化的配置详解
阿里云和ucloud服务器配置ssl证书将http服务https化的配置详解 项目背景: 苹果App于2017年1月1日将启用App Transport Security安全功能,即强制App通过HT ...
- IDC预测2020云服务逆势增长!云服务器已成上云首选
IDC预测2020云服务逆势增长!云服务器已成上云首选 据IDC最新预测指出,2020年IT基础设施支出今年将增长约4%,达到2370亿美元,驱动力主要来源于云服务. 受疫情的影响,不少企业开源节流, ...
- 服务启动项 Start类型详解
注册表的服务启动项 Start类型详解 HKLM\SYSTEM\CurrentControlSet\services\ 下的服务项.不论有没有在services.msc服务管理控制台中显示,在注册表中 ...
- JAVA消息服务JMS规范及原理详解
JAVA消息服务JMS规范及原理详解 一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...
- Httpd服务进阶知识-HTTP协议详解
Httpd服务进阶知识-HTTP协议详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.WEB开发概述 1>.C/S编程 CS即客户端.服务器编程. 客户端.服务端之间需 ...
- IM云服务领域,融云因何得以登上浪潮之巅?
每一次技术驱动下的商业变革都是以浪潮的形式到来,每一次的涨潮都会带着赶上浪潮的企业登上新的巅峰.随着移动互联网的融合发展,短短几年期间,IM通讯云服务从早期的虚无飘渺到如今已经成为现代企业的标配,引发 ...
- 【转载】JAVA消息服务JMS规范及原理详解
转载:https://www.cnblogs.com/molao-doing/articles/6557305.html 作者: moyun- 一.简介 JMS即Java消息服务(Java Messa ...
- Linux系统学习 二十一、SAMBA服务—相关文件、配置文件详解
3.相关文件 常用文件: /etc/samba/smb.conf #配置文件 /etc/samba/lmhosts #对应NetBIOS名与主机的IP的文件,一般Samba会自 ...
- 替代学习物联网-云服务-02阿里云MQTT
1.支付宝登录,进入物联网平台 https://iot.console.aliyun.com/product 2.新建产品 3.添加设备 4.设备连接参数 5.连接到阿里云
- 替代学习物联网-云服务-01百度云MQTT
1.登录百度智能云 2.进入 物联网接入 https://console.bce.baidu.com/iot2/core/core/list https://iotcore-dev-tool.gz ...
随机推荐
- 使用plsql导出导入表的一种方式
1.导出表 不选择导出全部表.选择的话只导出仅选择的表 2.导出存储过程.视图.函数等 要选中导出的存储过程等 注意文件格式是sql类型的.用以下方式改变,点击输出文件后边的文件夹图标 3.导入 刚才 ...
- 不支持tpm2.0 升级windows11
前提 我计划给我的macbook pro2020装双系统 但是双击启动转换助理 看到只能装windows10,只好手动选择下载好的win11镜像,则提示驱动软件失败TMDDD 那我就先用启动转换助理安 ...
- 树莓派4b安装retropie
RetropieRetropie可以将你的树莓派或者PC变成一台复古游戏机模拟器. 其基于完整的操作系统之上,你可以把它装在Raspbian系统上,或者直接刷入完整的镜像然后再添加更多的软件.Retr ...
- MVCC 快照读, readView,
简介 参考链接 以作记录 https://www.jianshu.com/p/8845ddca3b23
- shell 编程获取文件名后缀为特定字符的函数
简介 linux && windows 我们常常要获取某个特定文件后缀的文件. 使用shell进行获取. 参考链接 https://blog.csdn.net/waitfor920/a ...
- amis 怎样将表格中状态格式化显示1和0为是和否
最近在做一个关于AMIS的,发现好多地方跟原生JS不太一样,也跟vue.angular不一样,做的时候遇到些问题 现将amis 怎样将表格中状态格式化显示1和0为是和否部分代码记录如下: { &quo ...
- Restcloud ETl数据通过时间戳实现增量数据同步
1.新增数据源 2.将表输入节点拖拽到流程图里面 3.表输入节点的配置,配置时间戳,通过时间戳来实现增量数据同步 4.将表输出节点拖拽到流程图 5.表输出节点的配置 6.将节点组件用直线连接起来 7. ...
- Python使用diffusers加载文生图模型教程
还在为搭建AI绘画环境焦头烂额? Hugging Face统计显示,diffusers库下载量已突破1亿次,成为最快增长的AI工具库! 本文将手把手教你: - 3行代码加载Stable Diffusi ...
- SciTech-Mathmatics-Probability+Statistics-Population-Sampling-Types of Sampling Methods (With Examples)
Types of Sampling Methods (With Examples) BY ZACH BOBBITTPOSTED ON SEPTEMBER 24, 2018 Researchers ar ...
- spring-ai 学习系列(1)-调用本地ollama
spring-ai框架为java程序员快速融入AI大潮提供了便利,下面演示如何调用本地deepseek模型 一.安装ollama https://www.ollama.com/ 首页下载安装即可 选择 ...