Calibre: домашняя онлайн-библиотека в браузере и Moon+ Reader

Автор: | 17/12/2019

Calibre пользуюсь много лет, но всегда desktop-версией.

На днях увидел Calibre Web – та же библиотека, работающая с той же базой, но доступна через браузер.

Домашняя страница проекта в Github – тут>>>.

Идея состоит в том, что бы по возможности уйти от хранения книг в Google Books, так как там нет нормальной возможности добавлять своё описание к книге, сортировать по категориям и прочее.

Хранить библиотеку будем в Nextcloud (см. Nextcloud: запуск в Docker Compose на Debian с SSL от Let’s Encrypt), а читать можно через Moon+ Reader, который умеет синхронизировать место прочтения при работе через WebDAV.

В этом посте выполним:

  • в Docker запустим Calibre Web – web-интерфейс для библиотеки
  • в неё смонтируем папку из Nextcloud с библиотекой Calibre
  • и с телефона через WebDAV к нашему Nextcloud подключим читалку Moon+ Reader

NGINX, Let’s Encrypt

Настраиваем NGINX + Let’s Encrypt, см описание в Bitwarden: менеджер паролей организации — установка self-hosted версии на AWS EC2.

Запуск Calibre Web

Будем подключать уже существующую библиотеку, которая синхронизируется между машинами через Nexcloud:

[simterm]

$ ll /data/nextcloud/app/data/setevoy/files/Books/CALIBRE/ | head
total 1212
drwxr-xr-x  3 www-data www-data   4096 Dec 13 07:53 A. A. Orlov
drwxr-xr-x  7 www-data www-data   4096 Dec 13 07:53 A. Avramienko
drwxr-xr-x  3 www-data www-data   4096 Dec 13 07:55 A. Bielash
drwxr-xr-x  3 www-data www-data   4096 Dec 13 07:53 A. B_iuli
drwxr-xr-x  3 www-data www-data   4096 Dec 13 07:55 Adol_f Gitlier
drwxr-xr-x  3 www-data www-data   4096 Dec 13 07:55 A. Fomienko, G. Nosovskii
drwxr-xr-x  4 www-data www-data   4096 Dec 13 07:55 A. Kamienistyi
drwxr-xr-x  3 www-data www-data   4096 Dec 13 07:55 A. Karr
drwxr-xr-x  3 www-data www-data   4096 Dec 13 07:55 Al_bier Kamiu
...

[/simterm]

Запускаем докер, монтируем библиотеку в /books:

[simterm]

$ docker run -ti --name books -p 8083:8083 -v /data/nextcloud/app/data/setevoy/files/Books/CALIBRE/:/books technosoft2000/calibre-web

[/simterm]

Проверяем файл metadata.db:

[simterm]

$ docker exec -ti books ls -l /books/metadata.db
-rw-r--r-- 1 xfs xfs 752640 Dec 13 07:51 /books/metadata.db

[/simterm]

Открываем в браузере, указываем путь к каталогу с библиотекой (в которой должен располагаться файл metadata.db, используемый Calibre для хранения информации о книгах в библиотеке):

Логинимся с дефолтными admin:admin123:

И открываем нашу библиотеку:

А Категории тут – это теги из Calibre:

Ну и всё, как в обычной Calibre – можем редактировать, и читать книги:

И браузерная читалка:

Но не без недостатков. Например – нельзя переключиться на страницу по номеру, или даже просто пролистать вперёд-назад, только листать по одной странице.

Failed to create path /books/ (Permission denied)

При загрузке файла сейчас – будет выдано сообщение об ошибке:

Failed to create path /books/Mark Menson/Tonkoe iskusstvo pofigizma_ Paradoksal’nyi sposob zhit’ schastlivo (Permission denied).

Достаточно ожидаемая ошибка, учитывая факт того, что каталог /data/nextcloud/app/data/setevoy/files/Books/CALIBRE/ используется и контейнером с Nextcloud, и контейнером с Calibre.

Проверяем под каким пользователем запущено приложение в контейнере Calibre:

[simterm]

$ docker exec -ti books ps | grep cali
68 calibre   0:08 /usr/bin/python /calibre-web/app/cps.py

[/simterm]

И его ID:

[simterm]

$ docker exec -ti books id calibre
uid=15000(calibre) gid=15000(calibre) groups=15000(calibre),15000(calibre)

[/simterm]

Тогда как локальная папка:

[simterm]

$ ls -l /data/nextcloud/app/data/setevoy/files/Books/
total 4
drwxr-xr-x 117 www-data www-data 4096 Dec 16 09:32 CALIBRE

[/simterm]

И ID локального юзера www-data:

[simterm]

$ id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)

[/simterm]

Т.е. Calibre использует пользователя calibre с UID 15000, а NGINX на хосте и контейнер с Nextcloud – используют пользователя www-data с UID 33.

Что бы решить эту проблему – добавляем в команду запуска перменные PUID (User ID) и PGID (Group ID), в которых передаёмзначение 33:

$ docker run -ti –name books -p 8083:8083 PGID=33 -e PUID=33  -v /data/nextcloud/app/data/setevoy/files/Books/CALIBRE/:/books technosoft2000/calibre-web

Проверяем процесс в контейнере теперь:

[simterm]

# docker exec -ti calibre-web ps aux                                                                                                                                                        
PID   USER     TIME  COMMAND                                                                                                                                                                                                                   
   1 root      0:00 {start.sh} /bin/bash /init/start.sh                                                                                                                                                                                       
  59 xfs       0:03 /usr/bin/python /calibre-web/app/cps.py

[/simterm]

И проверяем UID пользователя xfs, который запустил /usr/bin/python /calibre-web/app/cps.py:

[simterm]

# docker exec -ti calibre-web id xfs                                                                                                                                                        
uid=33(xfs) gid=33(calibre) groups=33(calibre),33(calibre)

[/simterm]

Проверяем загрузку – работает:

Docker Compose

Что бы обеспечить постоянность хранения настроек – находим, где в контейнере хранятся данные приложения, в частности – его база данных, в которой Calibre хранит настройки веб-сервиса.

Подключаемся в контейнер:

[simterm]

$ docker exec -ti calibre-web bash

[/simterm]

Находим все файл .db:

[simterm]

bash-4.4# find / -name "*.db"
/calibre-web/app/app.db
/calibre-web/app/gdrive.db
...

[/simterm]

На хосте создаём каталоги для Compose файла и для данных:

[simterm]

$ mkdir /opt/calibre-web/
$ mkdir -p /data/calibre/app
$ chown -R calibre:calibre /data/calibre/

[/simterm]

В каталоге /opt/calibre-web/ создаём Docker Compose файл calibre-compose.yml:

version: '3'

services:

  calibre-web:
    user: "root:root"
    image: technosoft2000/calibre-web
    container_name: calibre-web
    environment:
      - PUID=33                                                                                                                                                                                         
      - PGID=33
    ports:
      - 8083:8083
    volumes:
      - /data/nextcloud/app/data/setevoy/files/Books/CALIBRE/:/books
      -  /data/calibre/app:/calibre-web/app/ 
      - /var/run/docker.sock:/tmp/docker.sock:ro
    restart: unless-stopped

Запускаем:

[simterm]

$ docker-compose -f calibre-compose.yml up -d

[/simterm]

Создание unit-файла для systemd описано в посте Linux: systemd сервис для Docker Compose, у меня получился такой /etc/systemd/system/calibre.service:

[Unit]
Description=Calibre library service
Requires=docker.service
After=docker.service

[Service]
Restart=always
WorkingDirectory=/opt/calibre-web
ExecStart=/usr/local/bin/docker-compose -f calibre-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f calibre-compose.yml down

[Install]
WantedBy=multi-user.target

Темы Calibre Web

Из коробки есть поддержка двух цветовых тем – стандартная, светлая:

И тёмная:

Moon+ Reader

Moon+ Reader из недавних находок.

Вроде как умеет синхронизировать позицию прочитанной книги при использовании Dropbox/WebDAV, добавление комментариев, закладки, и всё то, что нужно от читалки.

Устанавливаем, настраиваем WebDAV:

И получаем доступ к библиотеке:

Настройка синхронизации

Что бы Moon+ синхронизировал позицию прочтения – открываем книгу, затем справа вверху три точки > Miscellaneous, и в самом низу включаем Sync reading positions:

Готово.