Привет! Наверное, у каждого рано или поздно возникает вопрос: как упорядочить хаос с купленными (да, мы же против пиратства?) книгами в форматах PDF, DJVU и других, так чтобы:
получить к ним доступ как с мобильного устройства, так и с любимого ПК или Mac;
сохранять прогресс чтения между устройствами;
не терять книги в куче папок.
Хочу поделиться решением, которое помогло мне организовать библиотеку.
Немного предыстории
Несколько лет назад ко мне обратился коллега с просьбой помочь собрать домашний NAS. Он хотел не просто хранилище, а универсальное решение, в том числе — для организации библиотеки. Мы настроили DLNA, RAID и другое, но подходящего решения именно для книг тогда не нашли. Calibre был на слуху, но его интерфейс показался неудобным, и коллега ограничился SMB-шарой.
Недавно я для себя также решил - пора избавиться от хаоса, навести порядок и упростить себе жизнь.
Требования к решению
Задача: организовать электронную библиотеку, доступную по сети.
Желаемый функционал:
Сохранение прогресса чтения;
Разграничение прав доступа;
Работа как со смартфонов, так и через веб-интерфейс;
Поддержка PDF и EPUB (DJVU можно сконвертировать);
Наличие готового Docker-образа для быстрого развертывания.
Неожиданное открытие: OPDS и OPDS-PS
Оказывается, есть протокол OPDS (Open Publication Distribution System).
OPDS — это открытый стандарт каталогов публикаций, который позволяет приложениям подключаться к онлайн-библиотекам и получать доступ к книгам в удобном виде. Наверное, для тебя, уважаемый читатель, опытный пользователь различных читалок, это не новость, а для меня, увы, стало открытием совсем недавно.
Но на этом всё не заканчивается — существует также расширение этого стандарта под названием OPDS-PS (Publication Streaming). Это современное развитие OPDS, ориентированное на потоковую работу с книгами: оно позволяет читать контент напрямую из библиотеки (без необходимости скачивать книгу целиком), быстро подгружать обложки, метаданные, и — что особенно важно — сохранять прогресс чтения.
То есть, если приложение или читалка поддерживает OPDS-PS, можно не только открывать книгу из онлайн-каталога, но и знать, где вы остановились — и продолжить с того же места на любом устройстве. Это огромный шаг вперёд по сравнению с классическим OPDS, который предоставляет только доступ к книгам, но не "помнит" о ваших действиях.
Что это всё нам говорит? Мы можем теоретически подключать читалки (под «читалкой» я имею в виду устройство типа e-ink reader), использовать такие приложения как KOReader, Marvin, Moon+ Reader и т.п., и получить доступ к своим библиотекам напрямую. К сожалению, у меня сейчас нет подходящего устройства, чтобы проверить это на практике, но потенциально это огромная находка.
Поддержка OPDS и OPDS-PS открывает новые возможности даже для обычных приложений-читалок — они могут работать не просто как просмотрщики файлов, а как полноценные клиенты к личной или публичной онлайн-библиотеке, с возможностью синхронизировать книги, обложки, метаданные и, при должной настройке, прогресс чтения между устройствами.
Результат поиска
После долгого изучения я остановился на двух вариантах: Calibre-Web и Kavita. Также заслуживает внимания Komga, но о нём — в другой раз.
Kavita - лёгкий и мощный сервер для чтения

Kavita — это медиа-сервер для чтения комиксов, манги, вебтунов и электронных книг. Он ориентирован на удобство, производительность и богатый набор функций, обеспечивая локальное хранение и чтение коллекций без зависимости от сторонних облачных сервисов.
Преимущества:
Поддержка форматов: CBR, CBZ, EPUB, PDF, MOBI, AZW3 и других;
Удобный веб-интерфейс — одинаково хорошо работает на компьютере и смартфоне;
Поддержка многопользовательского режима с разграничением прав;
Сохранение прогресса чтения и встроенный ридер;
Умная организация библиотеки: категории, теги, метаданные;
Готовый Docker-образ, быстрая установка;
Поддержка OPDS (но не OPDS-PS, см. нюансы ниже).
Процесс установки прост за счет того, что уже есть готовый Docker образ.
Вот docker-compose.yml (рекомендую комментарии удалить во избежания ошибок при запуске)
services:
kavita:
image: jvmilazz0/kavita:latest # Using the stable branch from the official dockerhub repo.
container_name: kavita
volumes:
- /opt/books:/books #Путь к вашим книгам, их может быть несколько
- /opt/kavita-conf:/kavita/config # Путь к конфигурации
environment:
- TZ=Europe/Moscow
ports:
- "5000:5000"
restart: unless-stopped
Совет: заранее создайте каталоги /opt/books
и /opt/kavita-conf
. Без них контейнер может не стартовать.
После запуска откройте в браузере http://ваш_IP:5000
— вы попадёте на страницу первого входа.

Что стоит учитывать:
Отсутствие верификации пароля, будьте внимательны;
Загрузка книг через WebUI невозможна, только через файловую систему;
Файлы должны быть в подкаталогах — иначе не попадут в библиотеку, подробнее в wiki;
Обложки подтягиваются автоматически — это удобно.
Для добавления библиотек перейдите в настройки → Libraries → Add Library. Тип библиотеки (комиксы, книги и т.д.) влияет на то, как обрабатываются названия файлов.

Подождите 5-10 минут (зависит от объёма вашей библиотеки) и можете пользоваться своей библиотекой.

Если же вам нужно подключиться к вашей библиотеке удаленно, с android устройств и читалок, в настройках есть удобный пункт в группе Accounts - API Key / OPDS. Здесь вы можете сразу получить OPDS url и API Key (для совместимых приложений) для ваших клиентов. Так же есть ссылка на wiki со списком поддерживаемых OPDS клиентов.
Calibre-Web - классика для библиофилов

Calibre-Web — это надстройка над популярным Calibre, ориентированная именно на книги. У него мощная ролевая модель, гибкая настройка и поддержка множества функций для серьёзной работы с библиотекой.
Преимущества:
Современный интерфейс (Bootstrap 3, HTML5);
Полная веб-настройка без консоли;
Продвинутые права доступа и роли;
Поддержка OPDS;
Интеграция с ридерами Kobo;
Загрузка книг, коллекции, поиск;
Поддержка отправки книг на устройства;
Аутентификация: LDAP, Google, GitHub, proxy authentication support;
Авторизация без пароля через magic link.
Процесс установки так же прост за счет того, что уже есть готовый Docker образ.
Вот docker-compose.yml (рекомендую комментарии удалить во избежания ошибок при запуске)
services:
calibre-web:
image: lscr.io/linuxserver/calibre-web:latest
container_name: calibre-web
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Moscow
- DOCKER_MODS=linuxserver/mods:universal-calibre #optional
- OAUTHLIB_RELAX_TOKEN_SCOPE=1 #optional
volumes:
- /opt/calibre-web/data:/config # Директория с конфигурацией
- /opt/books-calibre:/books #Директория с вашими книгами
ports:
- 8083:8083
restart: unless-stopped
Совет: заранее создайте каталоги /opt/calibre-web/data и /opt/books-calibre. Без них контейнер может не стартовать.
После запуска откройте в браузере http://ваш_IP:5000
— вы попадёте на страницу первого входа.
В каталог /opt/books-calibre
необходимо положить файл metadata.db
— его можно взять с GitHub проекта. Располагается файл здесь: https://github.com/janeczku/calibre-web/raw/master/library. Это так же описано в официальной документации.
Первичная настройка:
Выставьте корректные права:
chown 1000:1000 /opt/books-calibre/metadata.db
chmod 664 /opt/books-calibre/metadata.db
chown 1000:1000 /opt/books-calibre
Если отображается ошибка
Oops! Database Error: attempt to write a readonly database.
выставьте права на metadata.db 777:
chmod 777 /opt/books-calibre/metadata.db
В отличии от Kavita Calibre-Web нет возможности сразу же поменять пароль и использовать вшитый пароль, его вы можете подсмотреть на странице в docker hub.

После авторизации будет предложено добавить директорию с книгами, куда добавили файл metadata.db.

Чтобы разрешить загрузку книг:
Перейдите в Admin → Edit Basic Configuration → Feature Configuration → Enable Uploads.

Не забываем про кнопку "Save".
Переходим в раздел Books и у нас появляется кнопка Upload.

Загружаем, наконец, нашу первую книгу.

Что выбрать?
Kavita:
Встроенный ридер с сохранением прогресса;
Минимум ручных действий — просто размещаем книгу в папку;
Нет загрузки книг из интерфейса;
Нет полноценной ролевой модели.
Calibre-Web:
Расширенные права доступа, идеально для корпоративных сетей (AD/LDAP);
Возможность загрузки книг через WebUI;
Прогресс чтения не сохраняется;
Установка требует больше внимания.
OPDS и чтение на устройствах
Поддержка OPDS есть в обоих решениях.
OPDS-PS поддерживает только одно приложение, которое смог найти - KOReader, но его нет в официальных магазинах.
Через браузер Kavita можно комфортно читать, даже без отдельного приложения.
Из доступных в Android магазине есть Librera, Moon+ Reader, FBReader с поддержкой OPDS и у нас есть возможность получить доступ к библиотеке, посмотреть обложки и скачать книгу на устройство
К сожалению у меня на руках только Android девайсы и проверить на других устройствах нет возможности.
Мой выбор
Я выбрал Kavita - мне важно, чтобы прогресс чтения сохранялся, и чтобы я мог просто добавлять файлы, не настраивая ничего лишнего. Для более сложных сценариев - например, интеграции с ActiveDirectory - стоит смотреть в сторону Calibre-Web.