将闲置ECS改造成Anki服务器

早前写了篇将本地机子转化为hugo本地服务器的心得:《如何快速导入Mac制作的anki牌组》 ,但此乃权宜之计,尽管可以提升速率,但代价是牺牲了效率,「治标不治本」。假想建一个能像anki稳定的端对端的同步服务器,方便又快捷,该多好。

Anki的官方服务器坐标在德国,由于周知的缘故,下行速度不太理想,不说大容积的牌组,就是数量可观的小容积文件,也够Anki喝一壶的了。且据网友反馈,anki是不提供超过250MB的牌组的同步服务,然而anki很多影音牌组都是以G来论的。

如此,将同步服务器放置在本地或者大带宽的内网就成为一个刚需。这个想法在我的脑海里盘旋了许久,终于按耐不住,将自己一个闲置已久的阿里云ECS改造成能响应PC端及手机端的anki同步服务器。

如果你的pc anki版本在2.0上下,优先参照这篇

  • AnkiServer 是一个 Python 包,使用 easy_install 安装。还未安装 easy_install 的可以参考linux下easy_install的安装与使用详解 安装。
  • production.ini 内的是服务器内网IP,客户端连接的是外网IP
  • 全程在root下操作

服务器配置

首先确保用你的root帐户登录服务器,工具可用iterm2、putty等常见的SSH工具。为了防止登录后闲置时间过长被强制退出,建议加上如下命令:

$ ssh -o ServerAliveInterval=60 root@yourhostip

输入密码后,进入root根目录。开始下载 AnkiServer:

$ easy_install AnkiServer

安装成功测试命令

$ ankiserverctl.py

注意看安装目录,下一步要复制的文件在安装目录下。一般路径为:

/usr/lib/python2.7/site-packages/AnkiServer-2.0.6-py2.7.egg/examples/

将文件example.ini复制到 root 根目录下,并改名为production.ini

上面可以总结为一句话命令:

$ cp /usr/lib/python2.7/dist-packages/AnkiServer-2.0.6-py2.7.egg/examples/example.ini production.ini

接着,修改 production.ini 文件内容:

$ vi production.ini
配置图示
配置图示

保存后,开始添加用户,这里添加的用户是将来在Anki客户端登录时使用的用户,使用以下指令添加用户,然后输入对应的密码。

$ ankiserverctl.py adduser username  #usename替换为你的用户名,如trump
$ ankiserverctl.py lsuser            #列出当前所有的用户列表,其它有用的命令有deluser、passwd

测试服务器

$ ankiserverctl.py debug

上图显示当前服务器调试正常,按Ctrl+C结束调试,然后启动服务。

$ ankiserverctl.py start

最后,外网测试能否连上端口,输入外网IP 及 27701 端口号,查看端口是否开放。
在线工具端口扫描

客户端配置

PC端

打开 Anki -> 菜单栏 ->工具 -> 插件 -> 打开插件文件夹

新建名为 mysyncserver.py 的文件并输入以下内容。

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

登陆失败的话,把上边最后的/号去掉。

修改 yourpublicIP为主机外网 IP,即公网IP。

然后,保存,重启 Anki。照常登录,此处登录名和密码是刚刚 ankiserverctl.py adduser username 中的用户名和密码。然后同步就可以了

Android端

设置->高级设置 ->自定义同步服务器,内容为:

使用自定义同步服务器-->打勾
同步地址:
http://yourhost:27701 //yourhost一般为服务器公网ip或域名
媒体文件同步地址
http://yourhost:27701/msync //http开头,而非https

网址要注意ankiserver预设是使用http而不是https

然后用新建的帐户名和密码登录就可以同步了。

如果你的pc anki版本在2.1之上,那么请参照这篇

首先删除旧的 AnkiSyncServer:

[root@host anki]# pip uninstall ankiserver

我们要安装的是ankisyncd,这是基于python3的版本。比起ASS BUG修了不少。

把仓库复制下来:

[root@host anki]# git clone https://github.com/tsudoko/anki-sync-server.git

然后安装依赖(注:可能需要用yum安装python36和python36-pip)

[root@host anki-sync-server]# git submodule update --init
[root@host anki-sync-server]# cd anki-bundled/
[root@host anki-bundled]# pip3 install -r requirements.txt

接下来,执行

[root@host anki-bundled]# pip3 install webob

然后按需修改配置文件:

配置图示
配置图示

没问题的话就可以创建新用户了,创建完毕后可以用lsuser命令察看结果:

[root@host anki-sync-server]# python3 ./ankisyncctl.py adduser

然后开始运行了anki_sync_server主程序了

[root@host anki-sync-server]# python3 -m ankisyncd

最后,在 Addons21 文件夹写入插件,从而接管Anki的同步服务器设置:

\Anki2\addons21\ankisyncd__init__.py

import anki.sync, anki.hooks, aqt
addr = 'http://your\_host\_ip:27701/' #替换成你服务器的公网ip,不要改端口
anki.sync.SYNC_BASE = "%s" + addr

def resetHostNum():
    aqt.mw.pm.profile['hostNum'] = None

anki.hooks.addHook("profileLoaded", resetHostNum)

后台运行

安装screen

yum install screen

新建一个screen会话:screen -S anki

执行 python3 -m ankisyncd

Ctrl+A+D 退出会话(该会话仍会运行于后台)

若想恢复会话,可用screen -rscreen -x [会话id]来恢复上一次离线的会话。

后者的[会话id]可通过screen -ls查看。

以上。