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

需要注意的是以下自建同步服务只适用于Logseq DB版,原来的Markdown文件版(现在叫Logseq OG)不适用。目前Logseq DB版已经开启Beta测试,可以直接在官网下载,也可以访问网页版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
nano compose.yaml
compose.yaml文件内容如下,这里用的是nano编辑器,按Ctrl+O保存,Ctrl+X退出。
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 #
首先还是创建一个文件夹,用于存放Logseq同步服务的相关配置,以及创建.env以及compose.yaml两个文件。
mkdir logseq
cd logseq
nano .env
nano compose.yaml
.env内容如下,基本只用改DB_SYNC_BASE_URL以及DB_SYNC_ADMIN_TOKEN这两个值,以下假定你的域名是example.com,你希望通过https://logseq-sync.example.com来访问同步服务:
# 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=<改为一串随机字符,可使用openssl rand -base64 32来生成>
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,如访问https://logseq-sync.example.com/health返回{"ok":true}则说明部署成功。
值得说明的是当前Logseq依赖AWS Cognito来实现用户认证,并不支持本地用户管理或者OIDC。前面.env中配置的就是当前官方使用的用户池,虽然也可以配置自定义用户池,但是目前客户端上的配置都是写死的,要自定义的话还需要自己编译客户端。这篇文章有介绍如何自己编译客户端以及如何不用Docker部署同步服务。如使用官方Cognito配置,注意不要随便公开你的同步服务地址,因为任何人只要有Logseq账户就可以使用你的同步服务。
另外还需要注意的是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账户,以及设置加密密码,加密密码用于将图谱上传到服务端时的端对端加密,与Logseq账户密码是分开的。最后打开“所有图谱”页面,如果以上配置全部没问题的话,本地的图谱会有“使用Logseq Sync(Beta测试)”来开启同步的选项,创建新图谱的时候也会提示是否使用Logseq Sync。
Logseq DB的同步服务端是一个Node.js程序,资源占用还可以接受,在我的1G内存服务器上也能部署,同时有多个客户端连接的时候内存占用一般不会超过100MB。另外同步速度很快,几乎秒同步,体验非常好。