[Linux]搭建Anki同步伺服器(針對Anki2.1)

  • 2020 年 3 月 10 日
  • 筆記

原創文章

文章目錄

  • @[toc]

  • 0 環境
  • 1 首先安裝`anki2.1`
  • 2. 配置安裝
    • 2.1 配置虛擬環境virtualenv
    • 2.2 安裝 ankisyncd
    • 2.3 設置和運行伺服器
  • 3. Anki客戶端設置
    • 3.1. 客戶端Anki2.1
    • 3.2. 客戶端Anki2.0
    • 3.3. 手機端
  • 4. 參考文獻

搭建Anki同步伺服器(針對Anki2.1)

針對Anki2.0的版本:https://blog.csdn.net/humanking7/article/details/89299138

0 環境

  • Ubuntu 16.04
  • PC: anki 2.0.52anki 2.1.12
  • Android: ankiDroid 2.8.4`

1 首先安裝anki2.1

先去下載官網下載安裝包https://apps.ankiweb.net/#download

$ tar xjf anki-2.1.14-amd64.tar.bz2  $ cd anki-2.1.14-linux-amd64  $ sudo make install    # 如果要卸載  $ sudo make uninstall

2. 配置安裝

2.1 配置虛擬環境virtualenv

先安裝pipvirtualenv

# 安裝 pip  $ apt install python3-pip    # 更新pip  $ pip3 install virtualenv    # 安裝 virtualenv  $ pip3 install virtualenv

在準備安裝伺服器的目錄下創建 Python 虛擬環境:

$ cd [你想要安裝伺服器的目錄]  $ virtualenv ankienv

注意將[你想要安裝伺服器的目錄] 替換為你實際的目錄的路徑,路徑不需要加方括弧。

然後進入新創建的虛擬環境:

$ . ankienv/bin/activate

注意以上命令英文的句號後面有一個空格。

如果想要退出環境,輸入命令deactivate

輸入完成後,命令行前會多出 (ankienv) 表示當前的 Python 環境,之後與 Pythonpip 有關的所有操作都要在這個環境中進行。

例子:

root@x60s:~/code_soft/ankiSyncService# . ankienv/bin/activate  (ankienv) root@x60s:~/code_soft/ankiSyncService#      # 該目錄下多了一個環境相關的文件  (ankienv) root@x60s:~/code_soft/ankiSyncService# ls  ankienv  (ankienv) root@x60s:~/code_soft/ankiSyncService# ls ankienv/  bin  include  lib

2.2 安裝 ankisyncd

使用 gitclone 伺服器程式碼:

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

進入程式碼目錄並安裝 git 子模組:

$ cd anki-sync-server  $ git submodule update --init

我在執行這一步的時候報錯 pyaudio 安裝失敗,解決方法是直接把 requirements.txt 文件中 pyaudio 刪掉,再重新執行上面的 pip 命令。根據官方文檔的說明這個模組不影響伺服器同步功能的使用。

繼續安裝 Python 模組,安裝完後進入 anki-sync-server 目錄:

$ pip3 install webob  $ cd ..

最後,還可以修改伺服器配置文件:anki-sync-server 目錄下的 ankisyncd.conf。對我來說無需更改任何配置。

[sync_app]  # change to 127.0.0.1 if you don't want the server to be accessible from the internet  host = 0.0.0.0  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    # optional, for overriding the default managers and wrappers  # # must inherit from ankisyncd.persistence.PersistenceManger, e.g,  # persistence_manager = great_stuff.postgres.PostgresPersistenceManager  # # must inherit from ankisyncd.session.SimpleSessionManager, e.g,  # session_manager = great_stuff.postgres.PostgresSessionManager  # # must inherit from ankisyncd.user.SimpleUserManager, e.g,  # user_manager = great_stuff.postgres.PostgresUserManager  # # must inherit from ankisyncd.collections.CollectionWrapper, e.g,  # collection_wrapper = great_stuff.postgres.PostgresCollectionWrapper

配置文件里包括 host 對應伺服器監聽地址,默認 0.0.0.0 表示接收所有 IP 的請求,如果改成 127.0.0.1 則無法接收外網或內網上的請求,也就是只能通過伺服器本機訪問,改成伺服器內網 IP 則只接收內網的請求。port 表示監聽埠,如果修改這個參數則客戶端連接埠也要對應修改與其相同。data_root 應該是同步數據的保存目錄。

其實基本不需要自己折騰,如果沒有埠和IP的特殊需求,就不需要改了

到此伺服器已經安裝完成了。

2.3 設置和運行伺服器

設置的相關命令:

# 在 anki-sync-server 目錄下  $ ./ankisyncctl.py -h  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

增加用戶:

$ ./ankisyncctl.py adduser <username>

將命令中的 <username> 替換為實際的用戶名。之後輸入密碼,按回車確定。

啟動伺服器:

$ python -m ankisyncd

執行這條命令的時候會一直佔用命令行終端,否則表示伺服器已停止運行。

如果是通過 ssh 連接到 Linux 伺服器在伺服器上運行,斷開 ssh 連接會自動停止伺服器運行,這就需要下面的命令防止進程停止:

$ nohup python -m ankisyncd &

當然也可以用 screentmux 之類的伺服器上常用的工具解決這個問題。

話雖然如此,但是每次運行起來特別噁心,還需要進入環境,自己去運行,所以寫一個腳本非常方便

#!/bin/bash    # 進入環境目錄  cd /root/code_soft/ankiSyncService    # 激活環境  echo "激活 virtualenv 環境"  . ankienv/bin/activate      # 進入anki-sync目錄  cd /root/code_soft/ankiSyncService/anki-sync-server    # 運行anki-sync  echo "運行 ankisyncd "  nohup python -m ankisyncd &          echo -e "n"  echo "查找anki-sync的PID:"  echo "ps -ef | grep anki"  echo -e "n"  echo "如果想結束anki-sync運行,使用命令:"  echo "kill -9 PID"

不過到了最後,我發現還是別亂用virtualenv,因為感覺我完全用不到,徒增煩惱

3. Anki客戶端設置

3.1. 客戶端Anki2.1

Add-on文件夾下創建文件夾 ankisyncd,並在其中創建並編輯文件 __init__.py,裡面不要有漢字,保存為utf-8格式:

# just for sync -- add by Qfx    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 對應伺服器配置的埠。

3.2. 客戶端Anki2.0

見上文搭建Anki同步伺服器(針對Anki2.0)

3.3. 手機端

4. 參考文獻


OK! 以上,Enjoy~