目录
使用Logseq做我的主力笔记软件已经好几年了,笔记的同步问题却一直困扰着我。我需要在Windows PC与Android手机之间同步笔记,可我只是轻度使用,手机版用得更少,付费用官方同步服务感觉有点浪费了。因为Logseq笔记都是直接保存成本地Markdown文件,所以一直以来我都是用Syncthing同步,不过整体使用体验只能说一般般,偶尔会有同步冲突,而且打开Logseq之前还要先打开Syncthing,有点繁琐,想快速记一点想法都很容易打断思路。
作为一个自托管服务爱好者,一直以来我都希望可以自建同步服务端,这一愿望终于在Logseq新推出的以SQLite为作为数据存储格式的DB版后得以实现。由于我一直在Discord上关注这方面的进展,所以已经第一时间部署了同步服务,下面就简单分享一下部署流程。

需要注意的是以下自建同步服务只适用于Logseq DB版,原来的Markdown文件版(现在叫Logseq OG)不适用。目前Logseq DB版本已经正式开启Beta测试,可以直接在官网下载DB版了,以及可以访问网页版app.logseq.com(之前的test.logseq.com也依然可用,只不过现在更接近于nightly开发版了,更新更快但更不稳定)。另外下面的流程适用于在VPS上使用Docker来部署的情况,需要提前安装Docker,以及需要有自己的域名及添加对应的DNS记录。使用的镜像是ghcr.io/yshalsager/logseq-selfhost-sync,并且会用caddy-docker-proxy来做反向代理(目前最方便的实现自动https访问的解决方案之一)。
部署caddy-docker-proxy #
可参考文档。新建一个文件夹caddy,用于存放caddy相关配置,然后创建compose.yaml文件。
mkdir caddy
cd caddy
touch compose.yaml
compose.yaml文件内容如下:
services:
caddy:
image: lucaslorentz/caddy-docker-proxy:ci-alpine
ports:
- 80:80
- 443:443/tcp
- 443:443/udp
environment:
- CADDY_INGRESS_NETWORKS=caddy
networks:
- caddy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- caddy_data:/data
restart: unless-stopped
networks:
caddy:
external: true
volumes:
caddy_data: {}
然后创建上述名叫caddy的网络:
docker network create caddy --ipv6
最后运行docker compose up -d即可。
部署Logseq db-sync #
首先还是创建一个文件夹,用于存放同步服务的相关配置,以及创建.env以及compose.yaml两个文件。
mkdir logseq
cd logseq
touch .env
touch compose.yaml
.env内容如下,基本只用改DB_SYNC_BASE_URL以及DB_SYNC_ADMIN_TOKEN这两个值:
# Node adapter runtime settings
DB_SYNC_PORT=8787
DB_SYNC_BASE_URL=https://logseq-sync.example.com # 用来访问同步服务的地址
DB_SYNC_DATA_DIR=/app/data
DB_SYNC_STORAGE_DRIVER=sqlite
DB_SYNC_ASSETS_DRIVER=filesystem
DB_SYNC_LOG_LEVEL=info
# Logseq Cognito values used for JWT validation
COGNITO_ISSUER=https://cognito-idp.us-east-1.amazonaws.com/us-east-1_dtagLnju8
COGNITO_CLIENT_ID=69cs1lgme7p8kbgld8n5kseii6
COGNITO_JWKS_URL=https://cognito-idp.us-east-1.amazonaws.com/us-east-1_dtagLnju8/.well-known/jwks.json
# Optional hardening for maintenance/admin endpoints
DB_SYNC_ADMIN_TOKEN=<一串随机字符>
compose.yaml文件内容如下:
services:
sync:
image: ghcr.io/yshalsager/logseq-selfhost-sync:latest
container_name: logseq-sync
restart: unless-stopped
env_file: .env
networks:
- caddy
volumes:
- sync_data:/app/data
read_only: true
tmpfs:
- /tmp
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
labels:
caddy: logseq-sync.example.com # 改为与前面的.env配置中相同的地址
caddy.reverse_proxy: "{{upstreams 8787}}"
volumes:
sync_data:
networks:
caddy:
external: true
然后运行docker compose up -d,caddy-docker-proxy会自动配置caddy及申请证书,如访问https://logseq-sync.example.com/health返回{"ok":true}则说明部署成功。
值得说明的是当前Logseq需要使用AWS Cognito来实现用户认证,并不支持本地用户管理或者OIDC。前面.env中配置的就是当前官方使用的用户池,至于如何使用自己的用户池,这篇文章有介绍,文章中是直接在宿主机上部署的,没有用Docker,我没有尝试过,不确定是否可以。另外需要注意的是Logseq DB版仍是Beta阶段,代码还会经常更新,因此同步服务端建议定期更新,方法为在logseq目录下运行:docker compose pull && docker compose up -d。
在Logseq客户端中使用 #
强烈建议开启同步之前先备份自己的库。打开Logseq DB客户端或者网页版app.logseq.com,打开“设置”,“高级”,修改同步服务器URL为前面的自定义地址https://logseq-sync.example.com。Android端是点击右上角三个点图标,打开的菜单下面就是自定义同步服务器URL的选项。然后还需要登录,以及设置加密密码,用于服务器端的加密。最后打开“所有图谱”页面,如果以上配置全部没问题的话,本地的图谱会有“使用Logseq Sync(Beta测试)”来开启同步的选项,创建新图谱的时候也会提示是否使用Logseq Sync。
Logseq DB的同步服务端是一个Node.js程序,资源占用还可以接受,在我的1G内存服务器上也能部署,同时有多个客户端连接的时候内存占用不会超过100MB。另外同步速度很快,几乎秒同步,体验非常好。