Anki同步服务器搭建教程

最近有朋友在使用Anki,默认的同步服务器是ankiweb.net,因为速度很慢,就萌生了自己搭建的想法。我看了一下网上的教程,觉得很简单,就准备拿自己的服务器帮忙搭建,结果遇到了很多坑。搭建过程是不难,就几个步骤而已,问题出在各种版本不兼容上。Anki是志愿者开发的,没有商业化,很多东西做的就很差劲,遇到问题只能自己解决。现在我把搭建过程做个记录,如果有人遇到同样的问题可以参考。

1、为什么搭建Anki服务器,以及如何使用最高效

Anki是多终端的工具,并且由不同的开发者维护。PC版功能最丰富,一般用来制作卡片。手机版携带方便,用来及时复习。用户通常使用PC版制作好卡片,然后同步给手机使用。Ankiweb是志愿者维护的,是软件的默认同步源,就像icloud一样。全球用户都在使用,用户太多,并且我查了一下服务器在德国,加上中国处处受限的外网访问,简直慢得出奇。

因为开源,网友就有了改动的自由,github上有人提供了自己搭建同步服务器的代码。PC版和安卓版也都有办法修改同步源。苹果家的产品是另一群开发者维护的,暂时没有提供自定义同步源功能,所以还不能用。那就暂时抛开苹果吧,其他各平台的能用就行。

现在说一下同步的其他解决方案。默认是使用一个同步源来同步,对于不会搭建服务器的人也有一种同步方法,并且不受苹果的限制。就是自己导出制作好的卡片,然后用坚果云、百度云做备份和同步,然后在手机上再导入。也可以用微信之类的工具发送。这种方法算是妥协吧,有同步总比没有强。当然如果想省事,就用Ankiweb也不是不可以。

如果自己有一点动手能力,最好自己搭建一个同步服务器,在软件里点击几下同步就好了,省得麻烦。自己搭建同步服务器不要求有公网服务器,使用局域网的电脑、软路由、NAS都是可以的,并且我强烈建议使用局域网的解决方案。毕竟我们要的同步不是聊天那种实时同步,而是一天一两次就可以了。每天晚上电脑手机在同一wifi下的时候,同步一下新做的卡片和复习进度,速度快的飞起。

这里的搭建过程在公网服务器、软路由、NAS上是一致的,只是最后在客户端上填写的地址不同而已。我这里使用的是公网服务器。

2、不要使用dsnopek/anki-sync-server

请注意,github上面有两个方案,https://github.com/dsnopek/anki-sync-serverhttps://github.com/tsudoko/anki-sync-server。前者从7年前就不更新了,使用的还是python2写的,虽然有600多star,但是注定要被淘汰的。后者使用python3,看更新日期,几月前还有新的提交。后者支持PC版的anki2.1,因此我更推荐使用后者。

我一开始没注意这些东西,因为网上的教程更多是基于前者的,当时看star更多也就用了前者。这里也指出一些坑。首先安装的时候用easy_installpip install两种,我使用了pip,但是运行的时候python提示找不到anki包。看网上遇到类似问题的人的解释,是因为pip把下载的源文件放错位置了,导致找不到。后来使用easy_install完美运行。

但是安装完以后,PC版没法添加插件。按照教程需要在Anki/addons目录下新建mysyncserver.py文件,填写以下内容。

import anki.sync
anki.sync.SYNC_BASE = 'http://127.0.0.1:27701/'
anki.sync.SYNC_MEDIA_BASE = 'http://127.0.0.1:27701/msync/'

但是我的Anki安装目录没有addons,我自己新建了文件夹添加这个文件也不识别,后来查询才发现PC版的Anki2.1之后改版很明显,这些插件都不能用了。于是放弃第一个搭建方法。如果有人还在使用老版本的Anki,也可以继续使用这种搭建方法。

3、使用tsudoko/anki-sync-server的搭建步骤

按照github的指引就可以了,基本不会遇到问题。

首先git clone一下源码,然后进入目录里面更新依赖文件。

git clone https://github.com/tsudoko/anki-sync-server.git
cd anki-sync-server
git submodule update --init
cd anki-bundled
pip3 install -r requirements.txt
pip3 install webob

注意,pyaudio的模块对于同步不是必须的,并且有可能导致安装过程报错,需要打开requirements.txt把那一行删掉。如果提示没有pip3,就yum install python3-pip安装一下。

然后修改配置文件,当然默认的就可以用,不建议修改。除非想改端口。这里提醒一下,谷歌云和阿里云的端口除了在vps的防火墙放行之外,还要在管理后台的网络规则那里也放行。

接着返回anki-sync-server目录,编辑ankisyncctl.py文件,它的第一行默认是:

#!/usr/bin/env python

将它改成(根据自己的Python版本修改):

#!/usr/bin/env python36

接下来就是添加用户和启动服务了。

python3 ./ankisyncctl.py adduser <用户名>
python3 -m ankisyncd

为了让其在后台持续运行,可以使用screen或者supervisor。我这里参考网上的教程使用了screen。

yum install screen
screen -S anki
python3 -m ankisyncd

然后按Ctrl+A,D退出会话,Anki就会在后台持续运行。使用screen -ls可以查看当前在后台运行的所有会话,使用screen -r xxx可以回到指定的会话。xxx是上一步ls看到的数字。

到这里为止,服务端就算搭建好了。当然过程中会有一些乱七八糟的错误,问题都不大。例如我的提示Anki requires a UTF-8 locale.根据网上的解决方法,输入export LC_ALL="en_US.UTF-8"即可。其他的问题类似,根据提示去搜索解决方法就行了。

4、客户端的配置

安卓端配置非常简答,在高级设置那里指定服务器地址就好了,注意不要添加多余的/。

PC端配置坑是最多的,我搭建服务器没用多长时间,但是配置PC端浪费了几个小时,因为我一致以为是服务端的问题,反反复复装了几遍,不断的查找原因。最后发现是PC端的问题。

PC端目前的最新版本是2.1.22(2020年3月20日),我用这个版本同步提示用户名和密码错误。一开始我只测试了PC端,就这样浪费了很长时间。后来试了安卓一下次就成功了,才意识到是PC端问题。按照tsudoko/anki-sync-server的使用说明,测试了2.1.1-2.1.11的版本,除了2.1.9不能用。后来我下载了几个其他版本,发现2.1.15使用起来最好。可以正常同步,并且支持缩放。我的笔记本是高清屏,windows使用了125%的缩放,2.1.22默认是不支持的,所以文字非常小,2.1.15看起来就舒服多了。

PC端的配置需要添加插件,注意和2.0的anki有很大差别。2.0的插件在anki的安装目录下的addons里面,我一开始在这里配置无法识别。后来使用anki打开插件目录才发现是在C盘的用户文件夹里(C:\Users\Ming\AppData\Roaming\Anki2\addons21),在这里新建一个文件夹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)

IP地址是服务器的地址,如果是局域网就是192.168之类的。默认端口是27701,在服务端的配置文件修改,默认就行。记得服务端一定要放行端口。

编辑好__init__.py文件,重启PC端的anki就好了。点击同步,然后填写服务端当时新建的用户即可顺利同步。这里不需要是邮箱形式,当时新建的是什么就是什么。

好了,到此为止整个流程就走完了。其实搭建过程不麻烦,现在让我再搭,20分钟就可以搞定,当时前前后后用了几个小时。主要的问题是中间有些坑,在不知道问题在哪的情况下浪费了很长时间排错。这就是这种免费软件的问题,免费也就意味着难以保证质量,遇到问题没有支持,只能自己去解决。有时候花点钱是值得的,这就是我更喜欢windows的原因。Linux下有各种替代方案,但是生态混乱。年轻的时候折腾折腾也无妨,以后有钱了还是买一些正版的office吧。最后插一句,OneNote同步也很慢。

 

本文转载自Ming的《搭建Anki同步服务器遇到的问题》,并结合Bruce’s Blog的《CentOS7自建Anki同步服务器(python3)》对不完善或有误的地方做出补充或修改。特此感谢原作者。

You may also like

发表评论

邮箱地址不会被公开。 必填项已用*标注