Skip to content

自建Logseq同步服务器

目录

使用Logseq做我的主力笔记软件已经好几年了,笔记的同步问题却一直困扰着我。我需要在Windows PC与Android手机之间同步笔记,可我只是轻度使用,手机版用得更少,付费用官方同步服务感觉有点浪费了。因为Logseq笔记都是直接保存成本地Markdown文件,所以一直以来我都是用Syncthing同步,不过整体使用体验只能说一般般,偶尔会有同步冲突,而且打开Logseq之前还要先打开Syncthing,有点繁琐,想快速记一点想法都很容易打断思路。

作为一个自托管服务爱好者,一直以来我都希望可以自建同步服务端,这一愿望终于在Logseq新推出以SQLite为作为数据存储格式的DB版后得以实现。我一直在Discord上关注这方面的进展,所以已经第一时间部署了同步服务,下面就简单分享一下部署流程。

logseq-db.webp

需要注意的是以下自建同步服务只适用于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。另外同步速度很快,几乎秒同步,体验非常好。