自建 Anki 数据同步服务

使用 Docker 自行部署 Anki 同步应用,替代官方服务

Author Avatar

jos

  ·  2 min read

对于很多 Anki 用户来说,为了保存和同步抽卡数据以及进度,会使用 Anki 自带的同步服务。服务虽然是免费的,但可能对于部分用户来说速度并不理想,同时也会担心私人数据的隐私问题,比如 FSRS 的作者就提到1

Under Anki’s privacy policy allowing research use of review data, he provided raw data from 20,000 user collections containing a staggering 1.4 billion review logs – the largest dataset of its kind in the spaced repetition field.

解决的一个方式就是在自己自建同步服务,将数据掌控权完全控制在自己手上。以前是用第三方的项目兼容 Anki 同步 API 来实现,不过从去年开始官方也放出来了自己的同步后台服务,今年又修订了其 Docker 实例不能设置存储卷的问题,可以说是非常方便了。这里就简单记录一下搭建的过程。

编译 Docker image #

Dockerfile #

直接从 官方 GitHub 仓库 下载 Dockerfile ,我这里用的是 Distroless ,小巧轻便:

curl -o Dockerfile https://raw.githubusercontent.com/ankitects/anki/refs/heads/main/docs/syncserver/Dockerfile.distroless

Docker Compose #

创建 docker-compose.yml ,文件内容:

---
services:
    anki-sync-server:
        build:
            context: .
            dockerfile: Dockerfile
            args:
                ANKI_VERSION: ${ANKI_VERSION:-25.02.5}
        container_name: anki-sync-server
        image: anki-sync-server
        ports:
            - 8888:8080
        environment:
            - SYNC_USER1=admin:random_text # 第一个用户的用户名和密码
            - SYNC_USER2=kid:profile_pwd # 第二个用户的用户名和密码
        volumes:
            - ./data:/anki_data

编译 Docker image 并运行 #

mkdir data # 创建数据存储目录
docker-compose build --build-arg ANKI_VERSION=25.02.5 --no-cache # 编译,后续版本更新可以通过修改 build-tag 重新编译
docker-compose up -d

这样进程就能起来了,主机的对应端口(8888) 会被监听处理请求。 如果需要在外网访问,比如手机使用同步,那么可以通过 Tailscale 连接内网,或者通过配置 DNS record 的方式直接将服务暴露到外网使用。

更新 Anki 应用设置 #

不管是桌面版还是手机应用,修改方式都是在 Preferences -> Syncing -> Self-hosted sync server 中填入自建服务的地址

更新后点击同步,输入在 Docker Compose yaml 中设置的用户名和密码信息开始同步,第一次操作时因为服务器没有任何用户数据,应用会给出提示,选择上传本地数据即可。

删除官网 Anki 用户账号 #

确认一切完成后,可以考虑删除掉官网的账号,避免浪费宝贵的互联网资源。毕竟作者常年免费提供一个这么棒的工具,不用的话就不要一直占着了。 打开 https://ankiweb.net/account/settings ,点击右上角的 Remove account, 按提示输入密码和 remove 关键字,确认后等待完成。

全部完成,以后一切如常,使用上没有任何感知,只是记住跟着应用升级编译后台服务部署就好。

See also #