Полный архив Флибусты — это сотни гигабайт zip-файлов, и не у всех есть желание (или диск) хранить их целиком. Flibusta-at-home умеет работать с неполным архивом: если читатель открывает книгу, которой нет ни в одном локальном zip, библиотека скачивает её с Флибусты в этот момент, показывает читателю и оставляет у себя. Эта статья — о том, как это устроено, чем приходится платить и какие «частичные» конфигурации имеют смысл.

Как это работает

При открытии или скачивании книги библиотека:

  1. ищет в таблице индекса архивов zip-файл, диапазон идентификаторов которого покрывает id книги (отдельно для fb2 и для остальных форматов);
  2. если файл найден — извлекает книгу из него; если книга внутри упакована в собственный zip, распаковывает её один раз в /cache/local;
  3. если ни один архив не подходит и режим включён — скачивает книгу по адресу FLIBUSTA_URL/b/<id>/<формат> во временный файл, проверяет размер и код ответа, для fb2 при необходимости извлекает из zip, и сохраняет как /cache/local/<id>.<формат>;
  4. в следующий раз книга берётся уже из /cache/local, без обращения к Флибусте.

На время скачивания ставится блокировка на конкретную книгу, так что два читателя, открывшие одну и ту же книгу одновременно, не скачают её дважды. Таймаут запроса — 60 секунд; если зеркало не ответило или вернуло ошибку, читатель увидит сообщение, что книга недоступна, а в лог контейнера (docker logs flibusta-fpm) попадёт строка fetchMissingBook: failed to download … с HTTP-кодом.

Режим управляется переменной FLIBUSTA_ENABLE_MISSING_BOOK_DOWNLOAD (по умолчанию включён; выключается только значением false), адрес зеркала — FLIBUSTA_URL. Подробности — в справочнике переменных.

Скачивание на лету — единственный случай, когда библиотека ходит в интернет по инициативе читателя. Всё остальное (дампы, обложки, ежедневные обновления) запускает администратор или cron.

Последствия, о которых нужно знать

Зависимость от интернета и от доступности Флибусты. Библиотека с неполным архивом полноценно работает, только пока у сервера есть доступ к FLIBUSTA_URL. Основной сценарий Flibusta-at-home — «библиотека, которая не пропадёт» — в этом режиме выполняется лишь для тех книг, что уже лежат локально. Если Флибуста заблокирована у вашего провайдера, лежит, сменила домен или ограничила отдачу, читатель, открывший книгу, которой нет на диске, получит ошибку.

Задержка. Первое открытие книги занимает столько, сколько нужно, чтобы скачать её с Флибусты — от секунды до десятка. Повторные открытия мгновенны.

Рост /cache/local. Скачанные книги никуда не деваются и не вытесняются: это не кэш с лимитом, а хранилище. Удалять оттуда файлы можно руками (<id>.fb2, <id>.epub и т.п.) — библиотека при следующем открытии скачает книгу заново. Периодически поглядывайте на размер этой директории, особенно если у вас много читателей.

Каждый читатель — это запрос к Флибусте. Библиотека не маскирует источник; с точки зрения зеркала это обычные скачивания с вашего адреса. Для нескольких человек это незаметно, но не стоит превращать домашнюю библиотеку в публичный прокси.

Невидимость для читателя. Списки книг, поиск, страницы авторов и серий строятся по базе данных, а не по наличию файлов. Читатель не видит, какие книги есть локально, а какие будут скачаны, — для него библиотека выглядит полной. Это удобно, но означает, что «книга недоступна» он узнает только в момент открытия.

Частичные конфигурации, которые имеют смысл

Только fb2

Самый популярный вариант. Архивы f.fb2-* — это основная масса художественной литературы на русском в одном формате, который библиотека умеет и показывать в браузере, и конвертировать во что угодно для читалок. Архивы f.usr-* (pdf, djvu, epub, docx и прочее — в основном нехудожественная литература, сканы, журналы) занимают заметную долю объёма и нужны реже. Держите на диске только fb2, а редкие pdf и djvu пусть скачиваются по запросу.

Только свежие архивы

Flibusta раздаёт архив «дельтами» — файлами за периоды по диапазонам идентификаторов. Можно держать только последние N дельт (то, что читают чаще) и ежедневные обновления, а «классику» из старых архивов докачивать на лету. Хорошо сочетается с кнопкой «Добавить книги из торрента» в «Сервисе»: она скачивает только отсутствующие файлы, так что архив можно наращивать постепенно.

Пустой архив

Полностью рабочий вариант: директория /flibusta есть, но пуста. Библиотека превращается в удобный интерфейс к Флибусте с поиском, полкой, настройками, OPDS и конвертацией форматов, а книги подтягиваются по мере чтения и остаются в /cache/local. Так можно начать сразу после установки, не дожидаясь торрентов, а архивы докачивать потом. При переносе торрентов в /flibusta не забудьте «Сканирование ZIP».

Постепенная миграция

Обратный сценарий: у вас уже стоит режим «на лету» и накопилась куча файлов в /cache/local, а потом вы скачали полные архивы. Ничего чистить не обязательно: файл в /cache/local проверяется первым и продолжит использоваться. Но если хочется освободить место — удалите из /cache/local файлы <id>.<формат>, чьи id теперь покрыты архивами (диапазоны видны в таблице book_zip, см. статью о скриптах).

Если Флибуста недоступна напрямую

FLIBUSTA_URL — обычный адрес, так что зеркало можно сменить на любое работающее. Если прямого доступа нет, но есть прокси, контейнеру можно задать стандартные переменные https_proxy / all_proxy (например, socks5h://host:port) в environment — их понимают и curl, которым библиотека скачивает книги, и wget в сервисных скриптах. После этого через прокси пойдут все обращения контейнера к Флибусте: дампы, обложки, обновления и книги. Проверьте результат в логе контейнера — там видно, с каким кодом завершилось скачивание.

Когда режим лучше выключить

  • Библиотека стоит там, где интернета нет или он лимитирован, и вы не хотите, чтобы открытие книги неожиданно ходило наружу.
  • Вы принципиально держите полный архив и хотите, чтобы отсутствующая книга была видна как ошибка (например, чтобы заметить пропущенный торрент), а не тихо скачивалась.
  • Библиотекой пользуется много людей, и вы не хотите генерировать трафик на Флибусту от их имени.

В этих случаях — FLIBUSTA_ENABLE_MISSING_BOOK_DOWNLOAD=false, и библиотека становится полностью автономной: кроме явных действий администратора в «Сервисе», в интернет она не ходит.