知乎上两年前的那个 搭建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 可以尝试关闭所有防火墙
- 尝试通过浏览器打开链接 http://127.0.0.1:27701 (将
127.0.0.1
换成服务器 IP 或域名),如果网页显示Anki Sync Server
说明可以访问到服务器
参考
- No. 127: ankisyncd – A Custom Sync Server for Anki 2.1 | Gene Dan's Blog
- tsudoko/anki-sync-server: Self-hosted Anki sync server
在写完这篇文章后,我发现有几篇博客已经有相关的记录了,这里也贴上链接吧。
最后是我自己的博客原文链接