将闲置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 -r
或screen -x [会话id]
来恢复上一次离线的会话。
后者的[会话id]可通过screen -ls
查看。
以上。