QNAPのARMプロセッサ搭載NASに calibre-webをインストールする

QNAPの古いNAS に Entware を利用してcalibre-web をインストールしてみた。

以前「QNAPのNASで Calibre-web を動作させる」でQNAPのIntelのプロセッサを搭載したNASの Docker を使って calibre-web をインストールしたが、独立したNASで 書籍ファイルの管理をしたいと思った。細かなところで手間取ったので備忘録として残しておく。

手元で余っているNASは、古い ARM のプロセッサを搭載したNAS (QNAP TS-112) しかない。Dockerは使えないので、Entware ( https://github.com/Entware/Entware ) を使って calibre-web をインストールした。

環境

利用したNAS

かなり古いMarvell 1.2 GHzを搭載した QNAPのNASを利用した。

モデル: TS-112
ファームウェアバージョン: 4.3.3.1098

クライアント

Windows 10 Pro (バージョン 1903)

ssh でNASに接続できるとする。

EntwareのNASへのインストール

QNAPのNAS用のEntware をダウンロードするために、qnapclub.eu をアプリレポジトリに登録する。次のサイトの手順に従って登録する。

https://www.qnapclub.eu/en の Follow our guide to install QPKG  ( https://www.qnapclub.eu/en/howto/1) に従う。

リポジトリの追加

NASのAppCenterの歯車アイコンをクリックして設定のパネルを表示する。

アプリリポジトリのタブを選択して次のURLをWebサイトのURL に指定する。必要に応じて名前も指定する。ここでは、qnapclub.eu を名前とした。

https://www.qnapclub.eu/en/repo.xml

インストール

リポジトリとして、QNAP store ではなく、qnapclub.eu を選択する。少し時間がかかったが、しばらくするとインストール可能なアプリなどが表示された。

Entware-std 1.00をインストールする。

Entware-3x や Entware-ng はEntware-stdに統合され、もう保守されないとのことなので、Entware-std が良いとこと。

calibre-web インストールのための準備

SSHでNASに接続

コマンドラインでインストール作業を行うので、ssh で NASに接続する。

パソコンなどから ssh を利用して次のようにして NAS に接続する。

ssh admin@<NASのアドレス>

(たとえば、ssh admin@192.168.1.10)

gitのインストール

calibre-web からzip ファイルをダウンロードしても良いが、今後の更新も考慮に入れて git clone ができるようにする。

次のコマンドを実行する。

opkg update
opkg install git-http
opkg install ca-bundle

ちなみに、git をインストールするために opkg install git としたところ git でhttps のリポジトリをアクセスしようとすると次のようなエラーとなったので、git-http をインストールする必要がある。

[~/calibre-web] # git clone https://github.com/janeczku/calibre-web.git</code><code>
Cloning into 'calibre-web'...</code><code>
fatal: unable to find remote helper for 'https'

pipのインストール

つぎに、calibre-web のインストールに使うpipをインストールする。

opkg install python-pip pip install --upgrade pip setuptools

次のようなメッセージが出てインストールされた。

[~] # opkg install python-pip
Installing python-pip (18.1-2) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-pip_18.1-2_armv5-3.2.ipk
Installing python-base (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-base_2.7.16-9_armv5-3.2.ipk
Installing libffi (3.2.1-3) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/libffi_3.2.1-3_armv5-3.2.ipk
Installing libbz2 (1.0.8-1) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/libbz2_1.0.8-1_armv5-3.2.ipk
Installing libtirpc (1.1.4-2) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/libtirpc_1.1.4-2_armv5-3.2.ipk
Installing python-light (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-light_2.7.16-9_armv5-3.2.ipk
Installing python-ctypes (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-ctypes_2.7.16-9_armv5-3.2.ipk
Installing python-pydoc (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-pydoc_2.7.16-9_armv5-3.2.ipk
Installing python-multiprocessing (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-multiprocessing_2.7.16-9_armv5-3.2.ipk
Installing python-codecs (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-codecs_2.7.16-9_armv5-3.2.ipk
Installing libsqlite3 (3290000-1) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/libsqlite3_3290000-1_armv5-3.2.ipk
Installing python-sqlite3 (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-sqlite3_2.7.16-9_armv5-3.2.ipk
Installing python-logging (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-logging_2.7.16-9_armv5-3.2.ipk
Installing libgdbm (1.18.1-1) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/libgdbm_1.18.1-1_armv5-3.2.ipk
Installing python-gdbm (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-gdbm_2.7.16-9_armv5-3.2.ipk
Installing python-email (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-email_2.7.16-9_armv5-3.2.ipk
Installing python-distutils (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-distutils_2.7.16-9_armv5-3.2.ipk
Installing python-openssl (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-openssl_2.7.16-9_armv5-3.2.ipk
Installing libexpat (2.2.7-1) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/libexpat_2.2.7-1_armv5-3.2.ipk
Installing python-xml (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-xml_2.7.16-9_armv5-3.2.ipk
Installing python-compiler (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-compiler_2.7.16-9_armv5-3.2.ipk
Installing libxml2 (2.9.9-2) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/libxml2_2.9.9-2_armv5-3.2.ipk
Installing libdb47 (4.7.25.4.NC-5) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/libdb47_4.7.25.4.NC-5_armv5-3.2.ipk
Installing python-db (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-db_2.7.16-9_armv5-3.2.ipk
Installing python-decimal (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-decimal_2.7.16-9_armv5-3.2.ipk
Installing python-unittest (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-unittest_2.7.16-9_armv5-3.2.ipk
Installing libncursesw (6.1-5) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/libncursesw_6.1-5_armv5-3.2.ipk
Installing libncurses (6.1-5) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/libncurses_6.1-5_armv5-3.2.ipk
Installing python-ncurses (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-ncurses_2.7.16-9_armv5-3.2.ipk
Installing python (2.7.16-9) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python_2.7.16-9_armv5-3.2.ipk
Installing python-setuptools (40.6.2-3) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-setuptools_40.6.2-3_armv5-3.2.ipk
Installing python-pip-conf (0.1-1) to root...
Downloading http://bin.entware.net/armv5sf-k3.2/python-pip-conf_0.1-1_armv5-3.2.ipk
Configuring python-base.
Configuring libffi.
Configuring libbz2.
Configuring libtirpc.
Configuring python-light.
Configuring python-ctypes.
Configuring python-pydoc.
Configuring python-multiprocessing.
Configuring python-codecs.
Configuring libsqlite3.
Configuring python-sqlite3.
Configuring python-logging.
Configuring libgdbm.
Configuring python-gdbm.
Configuring python-email.
Configuring python-distutils.
Configuring python-openssl.
Configuring libexpat.
Configuring python-xml.
Configuring python-compiler.
Configuring libxml2.
Configuring libdb47.
Configuring python-db.
Configuring python-decimal.
Configuring python-unittest.
Configuring libncursesw.
Configuring libncurses.
Configuring python-ncurses.
Configuring python.
Configuring python-setuptools.
Configuring python-pip-conf.
Configuring python-pip.
[~] #

pipと setuptools の更新

次のコマンドを実行して、pipと setuptools を更新しておく。

pip install --upgrade pip setuptools

次のようなメッセージで終了した。

[~] # pip install --upgrade pip setuptools
Collecting pip
Downloading https://files.pythonhosted.org/packages/00/b6/9cfa56b4081ad13874b0c6f96af8ce16cfbc1cb06bedf8e9164ce5551ec1/pip-19.3.1-py2.py3-none-any.whl (1.4MB)
100% |████████████████████████████████| 1.4MB 569kB/s
Collecting setuptools
Downloading https://files.pythonhosted.org/packages/54/28/c45d8b54c1339f9644b87663945e54a8503cfef59cf0f65b3ff5dd17cf64/setuptools-42.0.2-py2.py3-none-any.whl (583kB)
100% |████████████████████████████████| 583kB 1.1MB/s
Installing collected packages: pip, setuptools
Found existing installation: pip 18.1
Uninstalling pip-18.1:
Successfully uninstalled pip-18.1
Found existing installation: setuptools 40.6.2
Uninstalling setuptools-40.6.2:
Successfully uninstalled setuptools-40.6.2
Successfully installed pip-19.3.1 setuptools-42.0.2

calibre-webのインストール

github からダウンロードするために、空きスペースのある領域をワーキングディレクトリにする。

ssh で admin でログインした際には /root がホームディレクトリになっていたが、/ がマウントされている/dev/ramドライブの空きが15.7Mしかなく、空きスペース不足でダウンロードできなかった。

calibre-web の git clone

共有フォルダーの Public (/share/HDA_DATA/Public/)でcalibre-webをgit cloneしてダウンロードした。

[/share/HDA_DATA/Public] # git clone https://github.com/janeczku/calibre-web
Cloning into 'calibre-web'...
remote: Enumerating objects: 14644, done.
remote: Total 14644 (delta 0), reused 0 (delta 0), pack-reused 14644
Receiving objects: 100% (14644/14644), 47.59 MiB | 1.84 MiB/s, done.
Resolving deltas: 100% (8959/8959), done.
Checking out files: 100% (589/589), done.

calibre-web の中をリスティングすると以下の通り。

[/share/HDA_DATA/Public] # cd calibre-web
[/share/HDA_DATA/Public/calibre-web] # ls
LICENSE                    babel.cfg                  messages.pot               setup.cfg
MANIFEST.in                cps/                       optional-requirements.txt  setup.py
README.md                  cps.py*                    requirements.txt           test

以下は、https://github.com/janeczku/calibre-web の README.md のQuick start記述にしたがってインストールを行う。

必要なライブラリなどをインストール

依存しているライブラリなどをインストールする。

pip install --target vendor -r requirements.txt

以下のメッセージを出力して終了した。

[/share/HDA_DATA/Public/calibre-web] # pip install --target vendor -r requirements.txt
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Collecting Babel>=1.3
Downloading https://files.pythonhosted.org/packages/2c/60/f2af68eb046c5de5b1fe6dd4743bf42c074f7141fe7b2737d3061533b093/Babel-2.7.0-py2.py3-none-any.whl (8.4MB)
|████████████████████████████████| 8.4MB 70kB/s
Collecting Flask-Babel>=0.11.1
Downloading https://files.pythonhosted.org/packages/82/b0/986b29938d4e8be7deb552ebfd1ef16c311276a59bcae10dec567a5b3d20/Flask-Babel-0.12.2.tar.gz (44kB)
|████████████████████████████████| 51kB 1.0MB/s
Collecting Flask-Login>=0.3.2
Downloading https://files.pythonhosted.org/packages/c1/ff/bd9a4d2d81bf0c07d9e53e8cd3d675c56553719bbefd372df69bf1b3c1e4/Flask-Login-0.4.1.tar.gz
Collecting Flask-Principal>=0.3.2
Downloading https://files.pythonhosted.org/packages/14/c7/2531aca6ab7baa3774fde2dfc9c9dd6d5a42576a1013a93701bfdc402fdd/Flask-Principal-0.4.0.tar.gz
Collecting singledispatch>=3.4.0.0
Downloading https://files.pythonhosted.org/packages/c5/10/369f50bcd4621b263927b0a1519987a04383d4a98fb10438042ad410cf88/singledispatch-3.4.0.3-py2.py3-none-any.whl
Collecting backports_abc>=0.4
Downloading https://files.pythonhosted.org/packages/7d/56/6f3ac1b816d0cd8994e83d0c4e55bc64567532f7dc543378bd87f81cebc7/backports_abc-0.5-py2.py3-none-any.whl
Collecting Flask>=1.0.2
Downloading https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl (94kB)
|████████████████████████████████| 102kB 601kB/s
Collecting iso-639>=0.4.5
Downloading https://files.pythonhosted.org/packages/5a/8d/27969852f4e664525c3d070e44b2b719bc195f4d18c311c52e57bb93614e/iso-639-0.4.5.tar.gz (167kB)
|████████████████████████████████| 174kB 2.1MB/s
Collecting PyPDF2==1.26.0
Downloading https://files.pythonhosted.org/packages/b4/01/68fcc0d43daf4c6bdbc6b33cc3f77bda531c86b174cac56ef0ffdb96faab/PyPDF2-1.26.0.tar.gz (77kB)
|████████████████████████████████| 81kB 1.3MB/s
Collecting pytz>=2016.10
Downloading https://files.pythonhosted.org/packages/e7/f9/f0b53f88060247251bf481fa6ea62cd0d25bf1b11a87888e53ce5b7c8ad2/pytz-2019.3-py2.py3-none-any.whl (509kB)
|████████████████████████████████| 512kB 758kB/s
Collecting requests>=2.11.1
Downloading https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl (57kB)
|████████████████████████████████| 61kB 264kB/s
Collecting SQLAlchemy>=1.1.0
Downloading https://files.pythonhosted.org/packages/17/7f/35879c73859368ad19a952b69ee780aa97fc30350dabd45fb948d6a4e3ea/SQLAlchemy-1.3.12.tar.gz (6.0MB)
|████████████████████████████████| 6.0MB 310kB/s
Collecting tornado>=4.1
Downloading https://files.pythonhosted.org/packages/e6/78/6e7b5af12c12bdf38ca9bfe863fcaf53dc10430a312d0324e76c1e5ca426/tornado-5.1.1.tar.gz (516kB)
|████████████████████████████████| 522kB 2.1MB/s
Collecting Wand>=0.4.4
Downloading https://files.pythonhosted.org/packages/ad/4a/6d4897ce1c6640c0669829d34cdf956e0829281b3f94c71effdb23bdde3c/Wand-0.5.8-py2.py3-none-any.whl (129kB)
|████████████████████████████████| 133kB 289kB/s
Collecting unidecode>=0.04.19
Downloading https://files.pythonhosted.org/packages/d0/42/d9edfed04228bacea2d824904cae367ee9efd05e6cce7ceaaedd0b0ad964/Unidecode-1.1.1-py2.py3-none-any.whl (238kB)
|████████████████████████████████| 245kB 2.1MB/s
Collecting Jinja2>=2.5
Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
|████████████████████████████████| 133kB 1.7MB/s
Collecting blinker
Downloading https://files.pythonhosted.org/packages/1b/51/e2a9f3b757eb802f61dc1f2b09c8c99f6eb01cf06416c0671253536517b6/blinker-1.4.tar.gz (111kB)
|████████████████████████████████| 112kB 905kB/s
Collecting six
Downloading https://files.pythonhosted.org/packages/65/26/32b8464df2a97e6dd1b656ed26b2c194606c16fe163c695a992b36c11cdf/six-1.13.0-py2.py3-none-any.whl
Collecting click>=5.1
Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
|████████████████████████████████| 81kB 1.3MB/s
Collecting itsdangerous>=0.24
Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting Werkzeug>=0.15
Downloading https://files.pythonhosted.org/packages/ce/42/3aeda98f96e85fd26180534d36570e4d18108d62ae36f87694b476b83d6f/Werkzeug-0.16.0-py2.py3-none-any.whl (327kB)
|████████████████████████████████| 327kB 1.8MB/s
Collecting certifi>=2017.4.17
Downloading https://files.pythonhosted.org/packages/b9/63/df50cac98ea0d5b006c55a399c3bf1db9da7b5a24de7890bc9cfd5dd9e99/certifi-2019.11.28-py2.py3-none-any.whl (156kB)
|████████████████████████████████| 163kB 1.2MB/s
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1
Downloading https://files.pythonhosted.org/packages/b4/40/a9837291310ee1ccc242ceb6ebfd9eb21539649f193a7c8c86ba15b98539/urllib3-1.25.7-py2.py3-none-any.whl (125kB)
|████████████████████████████████| 133kB 2.1MB/s
Collecting idna<2.9,>=2.5
Downloading https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl (58kB)
|████████████████████████████████| 61kB 880kB/s
Collecting chardet<3.1.0,>=3.0.2
Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
|████████████████████████████████| 143kB 1.1MB/s
Collecting futures
Downloading https://files.pythonhosted.org/packages/d8/a6/f46ae3f1da0cd4361c344888f59ec2f5785e69c872e175a748ef6071cdb5/futures-3.3.0-py2-none-any.whl
Collecting MarkupSafe>=0.23
Downloading https://files.pythonhosted.org/packages/b9/2e/64db92e53b86efccfaea71321f597fa2e1b2bd3853d8ce658568f7a13094/MarkupSafe-1.1.1.tar.gz
Installing collected packages: pytz, Babel, MarkupSafe, Jinja2, click, itsdangerous, Werkzeug, Flask, Flask-Babel, Flask-Login, blinker, Flask-Principal, six, singledispatch, backports-abc, iso-639, PyPDF2, certifi, urllib3, idna, chardet, requests, SQLAlchemy, futures, tornado, Wand, unidecode
Running setup.py install for MarkupSafe ... done
Running setup.py install for Flask-Babel ... done
Running setup.py install for Flask-Login ... done
Running setup.py install for blinker ... done
Running setup.py install for Flask-Principal ... done
Running setup.py install for iso-639 ... done
Running setup.py install for PyPDF2 ... done
Running setup.py install for SQLAlchemy ... done
Running setup.py install for tornado ... done
Successfully installed Babel-2.7.0 Flask-1.1.1 Flask-Babel-0.12.2 Flask-Login-0.4.1 Flask-Principal-0.4.0 Jinja2-2.10.3 MarkupSafe-1.1.1 PyPDF2-1.26.0 SQLAlchemy-1.3.12 Wand-0.5.8 Werkzeug-0.16.0 backports-abc-0.5 blinker-1.4 certifi-2019.11.28 chardet-3.0.4 click-7.0 futures-3.3.0 idna-2.8 iso-639-0.4.5 itsdangerous-1.1.0 pytz-2019.3 requests-2.22.0 singledispatch-3.4.0.3 six-1.13.0 tornado-5.1.1 unidecode-1.1.1 urllib3-1.25.7
[/share/HDA_DATA/Public/calibre-web] #

Calibre-web serverの起動

python cps.py を実行することでサーバーが起動する。

[/share/HDA_DATA/Public/calibre-web] # python cps.py

ここでは設定していないが、常時起動するためには、NASの起動時に実行されるように設定する必要がある。

Calibre-webへのアクセス

ブラウザからNASの Calibre-web にアクセスする。ポート番号は8083。

http://<NASのアドレス>:8083

Calibre libraryの設定

Location of Calibre database に Calibre データベースのあるパスを設定して「Submit」をクリックする。

たとえば、 NASの共有フォルダePubのcalibre にデータベースがある場合には、「/share/HDA_DATA/ePub/calibre」を設定する。

Calibre-web サーバーへのログイン

Quick startに記載されている次のデフォルトログイン情報でログインする。

Username: admin
Password: admin123

ログイン後の画面の例は次の通り。

この後、admin以外のユーザの設定などが必要であるが、以前の備忘録と重複するので省略する。