Anki 自建同步服务器 ankisyncd

知乎上两年前的那个 搭建Anki服务器 教程已经有些 lag behind 了,对于最新版的 PC 端 Anki 已经不能正常同步了。所以我 Google 找到了一篇博客 ankisyncd – A Custom Sync Server for Anki 2.1 。我使用 tsudoko/anki-sync-server 搭建了 Anki 同步服务器并成功地在 Linux 端 2.1.11 版本的 Anki 和 Android 端的 Ankidroid 上进行了同步。

注意

  • iOS 上 AnkiMobile 不支持自定义同步服务器
  • 同步服务器没有 AnkiWeb 的网页端访问支持
  • ankisyncd 服务器支持 PC 端 Anki 版本 2.1.1 – 2.1.11,其中只有 2.1.9 版本不支持
  • 不足(目前自建服务器都有的问题,AnkiWeb 是否存在不清楚):当同步多媒体文件有较大变动时,在 Ankidroid 上容易导致全量多媒体文件同步。所以如果多媒体文件有很多,在本地检查多媒体文件会非常缓慢(使用原来的 anki-sync-server 会提示冲突,要选择保留本地还是服务器数据,而此服务器一般不会提示,直接同步到客户端)

环境要求

  • Linux(理论上 Windows 应该也可以)
  • Python3(推荐,python2 估计也行,但没测试过也不推荐)
  • pip3(基于 Python3 的 pip,和上一条 Python 版本对应)
  • git(Windows 下注意 git 命令使用环境)

环境安装略。

ankisyncd 安装步骤

配置环境

virtualenv

为避免环境问题导致安装或运行出错,推荐使用 virtualenv ,不想安装也可以跳过这一部份内容。通过以下命令安装 virtualenv:

pip install virtualenv

在准备安装服务器的目录下创建 Python 虚拟环境:

cd [你想要安装服务器的目录]
virtualenv ankienv

注意将 [你想要安装服务器的目录] 替换为你实际的目录的路径,路径不需要加方括号。

然后进入新创建的虚拟环境:

. ankienv/bin/activate

注意以上命令英文的句号后面有一个空格。

输入完成后,命令行前会多出 (ankienv) 表示当前的 Python 环境,之后与 Python 或 pip 有关的所有操作都要在这个环境中进行。

安装 ankisyncd

使用 git 来 clone 服务器代码:

git clone https://github.com/tsudoko/anki-sync-server.git

进入代码目录并安装 git 子模块:

cd anki-sync-server
git submodule update --init

完成后进入 anki-bundled 目录并继续安装 Python 模块环境:

cd anki-bundled
pip install -r requirements.txt

我在执行这一步的时候报错 pyaudio 安装失败,解决方法是直接把 requirements.txt 文件中 pyaudio 删掉,再重新执行上面的 pip 命令。根据官方文档的说明这个模块不影响服务器同步功能的使用。

继续安装 Python 模块,安装完后进入 anki-sync-server 目录:

pip install webob
cd ..

最后,还可以修改服务器配置文件:anki-sync-server 目录下的 ankisyncd.conf。对我来说无需更改任何配置。

配置文件里包括 host 对应服务器监听地址,默认 0.0.0.0 表示接收所有 IP 的请求,如果改成 127.0.0.1 则无法接收外网或内网上的请求,也就是只能通过服务器本机访问,改成服务器内网 IP 则只接收内网的请求。port 表示监听端口,如果修改这个参数则客户端连接端口也要对应修改与其相同。data_root 应该是同步数据的保存目录。

到此服务器已经安装完成了。

运行服务器

如果前面使用了 virtualenv,这一部份的命令仍然需要在 ankienv 环境下运行。运行服务器之前需要先创建用户(继续前面的命令,目前在 anki-sync-server 目录下):

./ankisyncctl.py adduser <username>

将命令中的 <username> 替换为实际的用户名。之后输入密码,按回车确定(Linux 下输入密码不会显示出来)。

最后,启动服务器:

python -m ankisyncd

执行这条命令的时候会一直占用命令行终端,否则表示服务器已停止运行。

如果是通过 ssh 连接到 Linux 服务器在服务器上运行,断开 ssh 连接会自动停止服务器运行,这就需要下面的命令防止断开 ssh 连接后进程停止:

nohup python -m ankisyncd &

当然也可以用 screen 或 tmux 之类的服务器上常用的工具解决这个问题。

Anki 客户端设置

Linux 和 Windows 端 Anki

Anki 2.1

Add-on 文件夹 下创建文件夹 ankisyncd,并在其中创建并编辑文件 __init__.py

import anki.sync, anki.hooks, aqt

addr = "http://127.0.0.1:27701/" # put your server address here
anki.sync.SYNC_BASE = "%s" + addr
def resetHostNum():
    aqt.mw.pm.profile['hostNum'] = None
anki.hooks.addHook("profileLoaded", resetHostNum)

addr = "http://127.0.0.1:27701/" 行中的 127.0.0.1 换成对应服务器的 IP。27701 对应服务器配置的端口。

Anki 2.0

(我也不知道是否支持,但是官方文档上给了相关配置)在 ~/Anki/addons 下创建并编辑文件 ankisyncd.py

import anki.sync

addr = "http://127.0.0.1:27701/" # put your server address here
anki.sync.SYNC_BASE = addr
anki.sync.SYNC_MEDIA_BASE = addr + "msync/"

同理,把 127.0.0.1 换成服务器的 IP 。27701 为服务器端口。

Android 端 Ankidroid

设置 –> 高级设置 –> 自定义同步服务器

  • 同步地址:http://127.0.0.1:27701/
  • 媒体文件同步地址:http://127.0.0.1:27701/msync

把以上地址中的 127.0.0.1 换成服务器的 IP 地址。27701 为端口设置。注意上面两个地址末尾的斜杠有无一定要正确,否则会同步失败

同步失败可能的问题排查

如果服务器能正常运行,而同步无法正确进行,可以尝试以下几个方面的检查:

  • 在命令行 ping [服务器 IP 地址] 如果有持续输出表示可以连接上服务器,如果没有结果说明网络连接有问题
  • 检查服务器防火墙,如果是 VPS 在控制台检查防火墙,添加 TCP 规则 27701 端口,Windows 可以尝试关闭所有防火墙
  • 尝试通过浏览器打开链接 127.0.0.1:27701 (将 127.0.0.1 换成服务器 IP 或域名),如果网页显示 Anki Sync Server说明可以访问到服务器

参考

在写完这篇文章后,我发现有几篇博客已经有相关的记录了,这里也贴上链接吧。

最后是我自己的博客原文链接

您可能还喜欢...