[分享创造] 写了个自托管的 Chrome 同步服务器,书签密码再也不经过 Google

9 天前
 charlselee59

[分享创造] 写了个自托管的 Chrome 同步服务器,书签密码再也不经过 Google

用 Chrome 的各位,有没有想过一个问题——

你每次加书签、存密码、开个新标签页、装个扩展,这些数据全部原样 POST 到 clients4.google.com。切 Edge 给微软,切 Firefox 给 Mozilla ,切 Brave 还是给 Brave 。你用浏览器这件事,本质上就是往某家公司硬盘里写日记。

这事我琢磨了挺久——说来也巧,我以前干过几年浏览器开发,Chromium 那套东西算是老本行。翻 sync 模块代码的时候就知道,里面藏着一个很有意思的启动参数:--sync-url

于是就有了这个:

https://github.com/loyalpartner/selfsync

Rust 写的,GPL-3.0 ,实现了 Chrome 同步协议,接住 Chrome 的 POST ,解析 protobuf ,存到本地 SQLite 。就这么点事。


跑起来有多简单

docker compose up -d

然后 Chrome 启动加一个参数:

google-chrome-stable --sync-url=http://127.0.0.1:8080

完事。登录你的 Google 账号、开启同步,书签密码历史记录全部进你自己的 .db 文件。Google 那边:知道你登录了,但同步的内容一个字节都拿不到。


几个我自己觉得挺妙的点

1. 多用户自动隔离,零配置。

Chrome 每次同步请求的 protobuf share 字段里会带当前登录的 Google 邮箱。服务器按邮箱分数据空间,家里人共用一台完全不打架。我一开始以为要自己做账号系统,研究完协议发现 Chrome 自己把这事解决了。

2. 密码是端到端加密的,服务器看不到明文。

Chrome 把密码用你账号派生的密钥在本地加密后才上传,selfsync 存的是密文。就算有人把 .db 文件偷走,没密钥也读不出来。这点和 Bitwarden 的思路一样,但你不需要额外装一个密码管理器。

3. 协议是开放的,不是我逆向出来的。

Chromium 源码 components/sync/ 目录下全是 .proto 文件,数据结构写得明明白白:BOOKMARK 、PASSWORD 、HISTORY 、OPEN_TABS 、PREFERENCE 、EXTENSION……几十种类型。selfsync 做的事就是照着这些 proto 把请求拆开再装回去。

4. 整个方案不改变任何使用习惯。

继续用 Chrome ,继续登 Google 账号,继续享受多设备同步。唯一变的是数据流的另一端——从加州机房变成你家那台小破服务器。对同事老婆孩子完全透明,他们根本不会察觉。


一些可能会被问到的

Q:手机端呢?

遗憾的是 Android/iOS 的 Chrome 不支持 --sync-url 启动参数,这是移动端 Chrome 的通用限制。目前只能桌面端先跑起来。有人说过可以用 Kiwi Browser ( Android 上基于 Chromium 的第三方浏览器)试,我还没验证。

Q:和 Floccus / xBrowserSync 有啥区别?

那些是"书签同步"单项替代,底层走 WebDAV / 自定义协议。selfsync 直接接管的是 Chrome 原生同步总线——书签、密码、历史、打开的标签页、扩展、自动填充全部一起走,不用装扩展,不用改使用习惯。层次不一样。

Q:能同步哪些数据?

基本上 Chrome 设置里「同步」开关能勾选的都在:书签、密码、历史记录、打开的标签页、地址和自动填充、扩展、主题、阅读列表、搜索引擎、应用……

Q:服务器性能要求?

一个人用,树莓派都够。SQLite 单文件,同步请求就是普通 HTTP POST ,空闲时基本零开销。我自己是丢在一台 N100 的小机器上跑着。

为什么要做这个

说点背景——我之前干过几年浏览器开发,Chromium 那套东西算是老本行了,sync 模块的代码以前工作里就翻过不少。后来换赛道了,但对这一块一直有感情。

最近迷上玩 NAS ,家里小机器上陆陆续续跑起来一堆自托管服务:相册、网盘、密码管理、RSS 、笔记……一块一块把数据从各家云服务上拿回来了。某天打开 Chrome 设置,看到那个"已同步到你的 Google 账号"的提示,突然意识到——我每天用得最频繁的那个软件,它的数据从来没回过家

而这块,刚好是我熟的。

于是就写了这东西。协议那层因为以前读过源码所以没卡多久,主要时间花在把 Rust 的服务端工程化、多用户隔离、SQLite 存储这些事情上。整体写完比预期轻松,算是把过去的职业经验和现在的爱好连上了。

现在家里、公司、笔记本三台电脑都指向家里那台小服务器,用了一阵子,稳定,完全无感。Google Takeout 下下来的同步数据包是空的——这种爽感有点难形容。

既然自己用着挺好,开源出来,省得同样痛点的老哥再走一遍。


仓库:https://github.com/loyalpartner/selfsync

中文 README:https://github.com/loyalpartner/selfsync/blob/master/README.zh-CN.md

issue 区欢迎任何问题、bug 、想法。代码不多,对 Chrome Sync 协议感兴趣想摸清楚协议形状的也可以直接翻源码,应该比读 Chromium 省事不少。

如果你也在做"把数据拿回家"这件事,咱们评论区聊。

1144 次点击
所在节点    程序员
19 条回复
gzlock
9 天前
如果可以对接 cloudflare 免费的 worker 和存储就更好了
charlselee59
8 天前
@gzlock 折腾 nas 的都可以部署
gzwjs
8 天前
也是我想做的,只是不懂。顺手一星
lel020
8 天前
是针对 chrome 还是所有 chromium 通用?
charlselee59
8 天前
@lel020 通用
charlselee59
8 天前
@lel020 chromium 如果没有集成 google 的账户系统,登陆不了就没法同步
lel020
8 天前
@charlselee59 #6 我想说的针对 chrome 就是指这个, 主要是 edge/brave 之类基于 chromeium 的用不上,
而选择 chrome 的基本上可以等同于选择 google ,再折腾绕开 google 感觉受众会很小,
charlselee59
8 天前
@lel020 edge 没试过, 理论没问题, 只要浏览器能通过 --sync-url 设置同步 url 就行,欢迎 pr
FrankAdler
8 天前
已有的账号+已有的数据怎么转移呢,我看你写的是要重新走登录步骤。
charlselee59
8 天前
@FrankAdler 很简单,按照教程启动后,点击你的头像, 点击 启用同步服务,就能转移已有的数据
charlselee59
8 天前
@FrankAdler 同步成功,点个 star 不迷路哈
jung10949
7 天前
可以编译一个 win 安装包吗
charlselee59
7 天前
@jung10949 可以用 docker 镜像部署
charlselee59
5 天前
@jung10949 已经加到 ci 了, 可以去仓库的 release 下载
jung10949
5 天前
感谢,已经用上 docker 镜像部署上了,好用
momooc
9 小时 5 分钟前
用的 ungoogled-chromium ,没有同步功能是不是用不了这个
8675bc86
8 小时 11 分钟前
相当于可以实现 Chrome 和 Edge 的跨浏览器同步了?
charlselee59
5 小时 51 分钟前
@momooc 是的
wske
4 小时 5 分钟前
好东西,先收藏

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/1206460

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX