If you enjoyed this article, you can support the author by becoming a sponsor on Boosty.
Unfortunately this article is no longer relevant, since the developer couldn’t handle the criticism and deleted the repository.
BookLore - a self-hosted library and web reader for your book collection#
If you have a large collection of ebooks, sooner or later you run into a problem - how do you conveniently store, sort, and read these books. Simply keeping files in folders quickly turns into chaos: it’s hard to find the book you want, there are no covers, no descriptions, and there’s no way to track your reading progress.
That’s exactly the problem dedicated library management apps solve. One such solution is BookLore - a modern, open-source web application that lets you build your own server for storing and reading ebooks.
BookLore is a great fit for:
- a home server
- a NAS
- homelab infrastructure
- a personal or family library
The app runs in a browser, so you can access your library from a computer, tablet, or smartphone.
What is BookLore#
BookLore is a Digital Library Server that lets you:
- store books in one place
- automatically fetch metadata
- organize your library by author and genre
- read books right in the browser
- track reading progress
- create book collections
- support multiple users
Essentially, BookLore turns your server into a personal book-reading service, similar to Kindle Library or Google Books, but fully under your own control.
How BookLore differs from other solutions#
There are several popular library management apps out there:
- Calibre-Web
- Kavita
- Audiobookshelf
However, BookLore has a number of distinctive features that make it an interesting option for a home server.
Modern interface#
BookLore offers a modern, minimalist web interface.
Interface advantages:
- convenient navigation
- book cards with covers
- fast library search
- responsive design
- dark theme support
The interface works great both on a computer and on mobile devices.
I fully understand that interface design is subjective, but the look is still pleasant.
Automatic metadata fetching#
After adding books, BookLore can automatically fetch:
- book title
- author
- description
- cover
- genres
This lets you quickly get your library in order even if you have hundreds or thousands of books, though naturally there can be issues with Russian-language editions.
Built-in ebook reader#
One of BookLore’s main advantages is its built-in web reader.
Popular formats are supported:
- EPUB
- CBZ (comics)
This means you can read books right in the browser, without downloading them to your device.
Multi-user support#
BookLore supports multi-user operation.
Each user can:
- have their own reading progress
- add books to favorites
- create collections
- make bookmarks
This makes the app convenient for a family library or a small community.
Simple installation via Docker#
BookLore installs easily using Docker, making it an ideal solution for:
- Proxmox
- Docker servers
- NAS
- a home homelab
Installation takes just a few minutes.
Installing BookLore with Docker Compose#
The easiest way to deploy BookLore is with Docker Compose.
Step 1. Create a working directory#
Let’s create a folder for the app:
mkdir booklore
cd bookloreWe’ll need two files: docker-compose.yml and an environment variables file.
Step 2. Docker Compose and environment variables#
docker-compose.yml
services: # Секция описания сервисов (контейнеров)
booklore: # Имя сервиса BookLore
image: booklore/booklore:latest # Docker-образ BookLore из Docker Hub (тег latest)
# image: ghcr.io/booklore-app/booklore:latest
# Альтернативный образ из GitHub Container Registry (закомментирован)
container_name: booklore # Явное имя контейнера в Docker
environment: # Переменные окружения контейнера
- USER_ID=${APP_USER_ID} # UID пользователя для работы контейнера (права на файлы)
- GROUP_ID=${APP_GROUP_ID} # GID группы для файлов и каталогов
- TZ=${TZ} # Часовой пояс контейнера
- DATABASE_URL=${DATABASE_URL} # URL подключения к базе данных MariaDB
- DATABASE_USERNAME=${DB_USER} # Имя пользователя базы данных
- DATABASE_PASSWORD=${DB_PASSWORD} # Пароль пользователя базы данных
- BOOKLORE_PORT=${BOOKLORE_PORT} # Внутренний порт BookLore
depends_on: # Зависимости сервиса
mariadb: # Зависимость от сервиса mariadb
condition: service_healthy # Запуск только после успешного healthcheck БД
ports:
- "${BOOKLORE_PORT}:${BOOKLORE_PORT}" # Проброс порта: host → container (обычно не нужен при использовании Traefik)
volumes:
- ./data:/app/data # Данные приложения BookLore
- ./books:/books # Каталог с библиотекой книг
- ./bookdrop:/bookdrop # Папка для автоматического импорта книг
healthcheck: # Проверка работоспособности контейнера
test: wget -q -O - http://localhost:${BOOKLORE_PORT}/api/v1/healthcheck
# HTTP-запрос к встроенному healthcheck API BookLore
interval: 60s # Интервал между проверками
retries: 5 # Количество попыток до признания контейнера unhealthy
start_period: 60s # Время ожидания перед началом проверок
timeout: 10s # Таймаут одной проверки
restart: unless-stopped # Автоперезапуск контейнера (кроме ручной остановки)
networks:
proxy: # Подключение к внешней сети proxy (Traefik)
labels: # Метки Docker для интеграции с Traefik
- "traefik.enable=true" # Включаем обработку контейнера Traefik
- "traefik.http.routers.booklore.entrypoints=web" # HTTP-вход (порт 80)
- "traefik.http.routers.booklore.rule=Host(`booklore.domain.ru`)" # Направляем трафик с домена booklore.domain.ru в этот контейнер
- "traefik.http.middlewares.booklore-https-redirect.redirectscheme.scheme=https" # Middleware для редиректа HTTP → HTTPS
- "traefik.http.routers.booklore.middlewares=booklore-https-redirect" # Применяем middleware редиректа к HTTP-маршруту
- "traefik.http.routers.booklore-secure.entrypoints=websecure" # HTTPS-вход (порт 443)
- "traefik.http.routers.booklore-secure.rule=Host(`booklore.domain.ru`)" # HTTPS-маршрут для того же домена
- "traefik.http.routers.booklore-secure.tls=true" # Включаем TLS (HTTPS)
- "traefik.http.routers.booklore-secure.service=booklore" # Привязываем HTTPS-роутер к сервису booklore
- "traefik.http.services.booklore.loadbalancer.server.port=6060" # Внутренний порт BookLore внутри контейнера
- "traefik.docker.network=proxy" # Указываем Traefik, в какой Docker-сети искать контейнер
mariadb: # Сервис базы данных MariaDB
image: lscr.io/linuxserver/mariadb:11.4.5
# Образ MariaDB от LinuxServer.io (стабильный и удобный)
container_name: mariadb # Явное имя контейнера
environment: # Переменные окружения MariaDB
- PUID=${DB_USER_ID} # UID владельца файлов БД
- PGID=${DB_GROUP_ID} # GID владельца файлов БД
- TZ=${TZ} # Часовой пояс
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} # Пароль root-пользователя БД
- MYSQL_DATABASE=${MYSQL_DATABASE} # Имя базы данных, создаваемой при первом запуске
- MYSQL_USER=${DB_USER} # Пользователь БД
- MYSQL_PASSWORD=${DB_PASSWORD} # Пароль пользователя БД
volumes:
- ./mariadb/config:/config # Каталог с данными и конфигурацией MariaDB
restart: unless-stopped # Автоперезапуск контейнера
healthcheck: # Проверка доступности БД
test: [ "CMD", "mariadb-admin", "ping", "-h", "localhost" ]
interval: 5s # Интервал проверки
timeout: 5s # Таймаут проверки
retries: 10 # Количество попыток
networks:
proxy: # Подключение к сети proxy (Traefik)
networks:
proxy: # Определение сети proxy
external: true # Сеть уже существует и не создаётся Composeand the .env variables file
# =========================================================
# 🎯 BookLore - основные настройки приложения
# =========================================================
APP_USER_ID=0
# UID пользователя на хосте, от имени которого
# BookLore будет работать внутри контейнера.
# Нужен для корректных прав доступа к volume.
APP_GROUP_ID=0
# GID группы на хосте.
# Должен совпадать с владельцем каталогов data / books / bookdrop.
TZ=Europe/Moscow
# Часовой пояс контейнеров.
# Используется для логов, планировщиков и временных меток.
BOOKLORE_PORT=6060
# Порт, на котором BookLore слушает внутри контейнера.
# Также используется Traefik как внутренний порт сервиса.
# =========================================================
# 🗄️ Подключение BookLore к базе данных MariaDB
# =========================================================
DATABASE_URL=jdbc:mariadb://mariadb:3306/booklore
# JDBC-строка подключения к MariaDB:
# - mariadb → имя сервиса в docker-compose
# - 3306 → стандартный порт MariaDB
# - booklore → имя базы данных
DB_USER=booklore
# Пользователь базы данных,
# под которым BookLore подключается к MariaDB.
DB_PASSWORD=ChangeMe_BookLoreApp_2025!
# Пароль пользователя базы данных.
# ⚠️ ОБЯЗАТЕЛЬНО сменить в продакшене.
# =========================================================
# 🔧 Настройки контейнера MariaDB (инициализация)
# =========================================================
DB_USER_ID=1000
# UID пользователя, от имени которого
# MariaDB пишет данные в volume.
DB_GROUP_ID=1000
# GID группы для файлов базы данных.
MYSQL_ROOT_PASSWORD=ChangeMe_MariaDBRoot_2025!
# Пароль root-пользователя MariaDB.
# Используется только для администрирования БД.
MYSQL_DATABASE=booklore
# Имя базы данных, которая будет автоматически
# создана при первом запуске контейнера MariaDB.Initial BookLore setup#
After the first launch, you need to go through the initial system setup.
Creating the administrator#
The first time you open the BookLore interface, you’ll be asked to create an administrator account.
You need to provide:
- a username;
- a password;
- an email address (optional).
This user gets full access to the system settings.
Adding a book library#
The next step is connecting a folder with books.
If you’re using the docker compose example above, the path will be: /books.
After adding the directory, BookLore will begin scanning the library.
Scanning and importing books#
During scanning, the app automatically:
- discovers books;
- extracts metadata;
- downloads covers;
- builds the library catalog.
If your library is large, scanning may take some time.
Configuring metadata sources#
In the settings, you can choose the metadata sources used to look up information about books.
This lets you automatically fetch:
- descriptions;
- covers;
- genres;
- additional information about the book.
Organizing collections#
For convenient navigation, you can create book collections.
For example:
- science fiction;
- non-fiction;
- classics;
- comics;
- technical books.
Books can be added to collections manually or using tags.
Adding users#
If several people use the library, you can create additional accounts.
Each user will be able to:
- read books;
- save progress;
- create bookmarks;
- build their own book lists.
Summary#
BookLore is a convenient, modern server for managing an ebook library, well suited for a home server or homelab infrastructure.
Key advantages of BookLore:
- a modern web interface;
- a built-in ebook reader;
- automatic metadata fetching;
- multi-user support;
- simple installation via Docker.
If you have a large collection of ebooks and want convenient access to it from any device, BookLore is a great solution for organizing your own digital library.
A server like this is easy to deploy on home hardware and gives you a full-fledged alternative to cloud reading services.





