Полный архив Флибусты — это сотни гигабайт zip-файлов, и не у всех есть желание (или диск) хранить их целиком. Flibusta-at-home умеет работать с неполным архивом: если читатель открывает книгу, которой нет ни в одном локальном zip, библиотека скачивает её с Флибусты в этот момент, показывает читателю и оставляет у себя. Эта статья — о том, как это устроено, чем приходится платить и какие «частичные» конфигурации имеют смысл.
Как это работает
При открытии или скачивании книги библиотека:
- ищет в таблице индекса архивов zip-файл, диапазон идентификаторов которого покрывает id книги (отдельно для fb2 и для остальных форматов);
- если файл найден — извлекает книгу из него; если книга внутри упакована
в собственный zip, распаковывает её один раз в
/cache/local; - если ни один архив не подходит и режим включён — скачивает книгу по адресу
FLIBUSTA_URL/b/<id>/<формат>во временный файл, проверяет размер и код ответа, для fb2 при необходимости извлекает из zip, и сохраняет как/cache/local/<id>.<формат>; - в следующий раз книга берётся уже из
/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, и
библиотека становится полностью автономной: кроме явных действий
администратора в «Сервисе», в интернет она не ходит.