用 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}
- 第一行声明一个二级域名
anki.example.com
- 第二行告诉 caddy 为网站开启 https 并自动申请证书,后面的 email 参数是告知 CA 申请人的邮箱,
- 第三行则是反向代理,此时访问
anki.example.com
,实际访问的是127.0.0.1:27701
的内容
客户端设置
桌面端
如果是桌面端(Windows\MacOS\Linux),需要安装 SyncRedirector 插件。
SyncRedirector 插件要求 Anki 版本低于 2.1.19
,推荐使用 2.1.0
和 2.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: