• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

自建anki sync server同步服务器(centos7+python3)

自建AnkiServer原因

默认的Anki服务器由于在国外,同步很慢,甚至偶尔还连不上,并且据说这是一个个人项目,数据在别人手里也不可靠,说不定哪天丢了也有可能,所以我们自己搭建自己的服务器,牢靠一些。但有个缺点就是iOS版的Anki不支持自定义服务器,因为iOS版是官方出品

本文环境

  • centos7

  • python3.6.6

  • anki 2.1

anki的版本说明

Anki 有 2.0 和 2.1 两个主要版本,它们的区别类似于 Python 2 和 Python 3,有较大的不同,部分插件也不兼容,所以建议使用较新的 Anki 2.1 版本,本教程介绍 2.1 版本下的同步服务器的搭建。

anki sync server 的安装

建议用root用户,因为可能会涉及一些权限问题,普通用户会出现安装不成功。安装 anki server 也可以用pip,但是为什么不用pip?  因为可能会有莫名奇妙的错误!!

1、clone 仓库

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

2、安装anki或anki-bundled相关的库

安装依赖

pip install webob
pip install decorator

安装anki

方法一:因为Anki本身也是python写的,它也是开源的,它的github地址是:https://github.com/dae/anki, 所以你可以从这个地址里clone到anki-bundled里。

方法二:

cd  anki-sync-server
git submodule update --init
cd anki-bundled
pip install -r requirements.txt

注意:

1,AnkiServer是AnkiServer,Anki是Anki,这不是同一个东西,AnkiServer依赖于Anki,所以下载AnkiServer后,还必须下载Anki,Anki下载后要放在anki-sync-server目录下的一个叫anki-bundled的目录里。

2,clone完anki-sync-server后,anki-bundled是空的。因为它是一个anki的链接,属于另一个版本库,你可以在github上点点试试,它已经跳转到anki项目里了

创建anki登录账户

用户的管理主要是通过 ankisyncctl.py 脚本实现的。如果你系统有多个python环境,那么在使用前注意修改 ankisyncctl.py 第一行的python环境。

先看下脚本的功能

$ sudo ./ankisyncctl.py 
usage: ./ankisyncctl.py <command> [<args>]
Commands:
  adduser <username> - add a new user
  deluser <username> - delete a user
  lsuser             - list users
  passwd <username>  - change password of a user

创建用户(它会让你输入密码):

$ sudo ./ankisyncctl.py adduser laojia@xiewo.net

注意:

1,只能通过ankisyncctl.py脚本创建用户

2,没有修改用户名功能,如果你要修改用户名,那么你要先删除,再重新添加。

修改 ankisyncd.conf 文件

anki-sync-server下面有个配置文件ankisyncd.conf,配置文件中保存了主要的配置,主要改端口,默认端口一般也就能用。

[sync_app]
host = 127.0.0.1
port = 27701
data_root = ./collections
base_url = /sync/
base_media_url = /msync/
auth_db_path = ./auth.db
# optional, for session persistence between restarts
session_db_path = ./session.db

你需要在服务器中设置防火墙放行 27701/tcp 端口,或者使用 nginx 进行代理转发。

启动服务器

执行以下命令启动anki-sync-server,它的服务名称叫ankisyncd。

注意,以下命令必须在anki-sync-server文件夹下执行,因为它要找该文件夹下的ankisyncd文件夹的:

cd  anki-sync-server
python -m ankisyncd

如果启动正常,它应该会有类似以下的提示:

[2019-03-14 06:28:17,456]:INFO:ankisyncd:Loaded config from ./anki-sync-server/ankisyncd.conf
[2019-03-14 06:28:17,461]:INFO:ankisyncd:Serving HTTP on 0.0.0.0 port 27701...

服务启动脚本

#!/bin/bash
ankiPath="/laojia/anki/anki-sync-server"
pythonPath="/usr/local/python3"
getid=`ps -ef|grep ankisyncd |grep -v grep  |head -1|awk '{print $2}'`
cd $ankiPath
case $1 in 
   start)
       if [ $getid ]; then
          echo "it's still runing , the anki project pid is $getid"
       else
          nohup $pythonPath -m ankisyncd >> ../ankisyncd.log 2>&1 &
          sleep 2
          echo "start anki project ...."
          sleep 2
          getpid=`ps -ef|grep ankisyncd |grep -v grep  |head -1|awk '{print $2}'`
          echo "started! anki project pid is: $getpid "
       fi 
   ;;
   stop)
       if [ $getid ]; then
          kill -9  $getid
          echo "the current anki project pid is:  $getid"
          sleep 2
          echo "anki project was killed !" 
       else
          echo "anki project  was not running!"
       fi
   ;;
   restart)
        $0 stop
        $0 start
        ;;
   *)
      echo -e  "参数错误!\nsh scripts.sh start|stop|restart"
   ;;
esac

做成 systemd 服务,开机启动

/etc/systemd/system 下新建 anki.service

[Unit]
Description=anki Server Service
Before=multi-user.target
Before=shutdown.target
After=local-fs.target
After=remote-fs.target
After=network-online.target
After=systemd-journald-dev-log.socket
Wants=network-online.target
Conflicts=shutdown.target
[Service]
Type=forking
Restart=no
TimeoutSec=5min
KillMode=process
ExecStart=/woqu/anki/anki.sh start
ExecStop=/woqu/anki/anki.sh stop
[Install]
WantedBy=multi-user.target

设置开机启动

systemctl start anki
systemctl status anki
systemctl enable anki

电脑端设置

以下配置在mac和win测试通过(版本为2.1.11),由于我没有Linux桌面版Linux系统,所以未在Linux上测试,不过原理都是一样的。

  • 打开Anki,点击顶部菜单栏的Tools→Add-ons会打开插件窗口

  • 然后再点击插件窗口的View files按钮,会打开插件安装目录。

  • 在该目录下新建一个文件夹ankisyncd,然后在里面新建一个文件,命名为__init__.py,

  • 打开__init__.py,把以下命令粘贴进去,然后把其中的12.34.56.78修改成你服务器的ip,如果你修改过ankisyncd.conf里的“port”(即端口),这里的端口也要与ankisyncd.conf中的“port”对应,然后保存:

import anki.sync, anki.hooks, aqt
addr = "http://12.34.56.78: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)

最后重启anki,即把anki软件关掉,再重新打开。

点击Sync(即“同步”)测试,如果正常,它会提示你输入账号密码,这个账号密码就是你前边用./ankisyncctl.py adduser添加的账号和密码了。

安卓端

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

同步地址http://12.34.45.78:27701   (把ip改成你的服务器ip)

媒体文件同步地址:填http://12.34.45.78:27701/msync   (改成你的服务器ip)

即媒体文件同步地址是在同步地址后面添加  /msync(其实这个名字是在服务器的配置文件  ankisyncd.conf  中的  base_media_url  选项指定的)。

设置好之后,点击同步按钮,正常的话会让你输入账号密码,输入与电脑端相同的账号密码,即可进行同步

iOS端

App不支持,无解,砸手机吧

其他信息

anki知乎专栏:https://zhuanlan.zhihu.com/-anki

插件编写文档https://apps.ankiweb.net/docs/addons.html

参考文档:

https://www.xiebruce.top/881.html

https://apps.ankiweb.net/docs/addons.html

https://frank.xin/2019/03/25/ankisync2/

http://genedan.com/no-127-ankisyncd-a-custom-sync-server-for-anki-2-1/

常见问题:

pc客户端登录,账号密码错误:

用了最新的PC客户端 2.1.38 不行,换回 2.1.11 ok



0
0
下一篇:解决 Ueditor 中 pre 中的空格会转换成 &nbsp

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。