用 Docker 快速架设一个 Anki 同步服务器

Anki 是一个辅助记忆软件,{{ 简介}}。最近打算用它来快速记忆一些知识,但是 Anki 的服务器架设在国外,导致同步速度很慢,为了解决这个问题,我参考 文档地址 打算自己架设一个 Anki 同步服务器。

要求:

  • 技术要求:了解终端(命令行工具)、理解 IP 和域名的概念、docker 以及 docker-compose 的基本使用
  • 硬件要求:一台电脑或者一个虚拟机或者一个云服务器(总之要能够满足相关软件要求)
  • 软件要求:docker + docker-compose

启动服务

新建一个 docker-anki-server 目录,在此目录下创建一个 docker-compose.yml 文件,文件内容如下。

 1version: "3"
 2
 3services:
 4  anki-container:
 5    image: kuklinistvan/anki-sync-server:latest
 6    container_name: anki-container
 7
 8    restart: always
 9    ports:
10      - "27701:27701"
11    volumes:
12      - data:/app/data
13volumes:
14  data:

然后在当前路径下的终端执行命令

1docker-compose up -d

执行 docker-compose ps 命令可以看到

1     Name                   Command                  State                Ports          
2-----------------------------------------------------------------------------------------
3anki-container   /bin/sh -c /app/scripts/st ...   Up (healthy)   0.0.0.0:27701->27701/tcp

这就说明服务已经正常启动了,对应的服务地址是 http://<ip>:27701,这个 <ip> 是你物理机(宿主机)的 ip 而非 docker 容器 ip。

域名设置

启动服务之后,就可以通过链接 http://<ip>:27701 访问了。

但是由于安卓版 anki 要求同步地址为 https 协议,因此我又启动了一个代理服务。

我使用的 Caddy 启动服务,这是一款使用 Go 语言开发的 web 服务器,选用 Caddy 的一个重要原因就是它使用 Let’s Encrypt 让你的站点全自动变成 HTTPS,除此之外它的配置简单很容易上手使用。

我的配置就这么简单:

1anki.example.com {
2  tls example@qq.com
3  reverse_proxy 127.0.0.1:27701
4}
  1. 第一行声明一个二级域名 anki.example.com
  2. 第二行告诉 caddy 为网站开启 https 并自动申请证书,后面的 email 参数是告知 CA 申请人的邮箱,
  3. 第三行则是反向代理,此时访问 anki.example.com,实际访问的是 127.0.0.1:27701 的内容

客户端设置

桌面端

如果是桌面端(Windows\MacOS\Linux),需要安装 SyncRedirector 插件。

SyncRedirector 插件要求 Anki 版本低于 2.1.19,推荐使用 2.1.02.1.15 版本。 你可以在 这里 下载 Anki 所有版本的安装包

插件安装之后,在其设置中填写对应的地址即可

1{
2  "msyncUrl": "https://anki.zhangwencai.com/msync",
3  "syncUrl": "https://anki.zhangwencai.com/sync"
4}

安卓端

如果是安卓端 AnkiDroid 则可以直接配置,我的 AnkiDroid 版本是 2.13.1。你可以通过「设置 -> 高级设置 -> 自定义同步服务器」找到配置页面。

安卓下载地址: Anki-Android · github

相关命令

启动服务之后,我们需要新建用户以便在客户端登录时使用。

首先需要进入 docker 容器的终端:

1docker exec -it anki-container /bin/sh

命令格式:

1./ankisyncctl.py <command> [<args>]

可用的命令:

  • 增加一个新用户:./ankisyncctl.py adduser <username>
  • 删除一个用户:./ankisyncctl.py deluser <username>
  • 列出所有用户:./ankisyncctl.py lsuser
  • 修改密码:./ankisyncctl.py passwd <username>
  • 查看帮助:./ankisyncctl.py --help

示例:增加一个用户 userA

1./ankisyncctl.py adduser userA
2Enter password for userA: