Grimmory: Установка современной цифровой библиотеки на сервер

Grimmory: Установка современной цифровой библиотеки на сервер

Grimmory — это независимый community-форк проекта Booklore и одно из самых мощных self-hosted решений для организации домашней библиотеки. В отличие от многих аналогов, Grimmory создан для тех, кто относится к чтению серьёзно: умные полки с фильтрами, встроенная читалка с аннотациями, синхронизация прогресса с Kobo/KOReader, автоматический импорт через BookDrop и загрузка метаданных из Google Books, Open Library и Amazon.

В этом руководстве мы пошагово развернём Grimmory на чистом VPS с Ubuntu 24.04, используя официальный Docker-образ и MariaDB. Инструкция адаптирована для работы от пользователя root и не требует настройки домена или SSL на начальном этапе — идеально для быстрого старта и тестирования.

Требования

  • VPS с Ubuntu 24.04 LTS
  • Минимум 2 ГБ RAM (Java/Spring Boot + MariaDB требуют ресурсов)
  • Открытый порт 6060 в фаерволе провайдера/хостинга
  • Установленный Docker и Docker Compose

Шаг 1. Подготовка системы и установка Docker

Подключаемся к серверу по SSH и обновляем систему:

apt update && apt upgrade -y
apt install -y ca-certificates curl gnupg lsb-release nano wget

Устанавливаем официальный Docker Engine и плагин Compose:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

systemctl enable --now docker

Проверяем установку:

docker compose version
# Ожидаемый вывод: Docker Compose version v2.x.x

Шаг 2. Создание структуры директорий

Создаём изолированное пространство для Grimmory. Поскольку мы работаем от root, все файлы будут принадлежать UID/GID 0.

mkdir -p /opt/grimmory/{data,books,bookdrop,mariadb/config}
cd /opt/grimmory

💡 Назначение папок:
data — внутренние данные приложения, иконки, кэш обложек.
books — ваша основная библиотека. Сюда монтируются ваши книги.
bookdrop — папка автоматического импорта. Файлы, попавшие сюда, автоматически парсятся и предлагаются к добавлению.
mariadb/config — конфигурация и данные базы данных.

Шаг 3. Настройка переменных окружения (.env)

Создаём файл .env для безопасного хранения паролей и настроек:

nano /opt/grimmory/.env

Заполняем его следующим содержимым (обязательно смените пароли!):

# Application
APP_USER_ID=0
APP_GROUP_ID=0
TZ=Europe/Moscow

# Database
DATABASE_URL=jdbc:mariadb://mariadb:3306/grimmory
DB_USER=grimmory
DB_PASSWORD=Your_Secure_Grimmory_Password!

# Storage: LOCAL (default) or NETWORK
DISK_TYPE=LOCAL

# API Docs (optional)
API_DOCS_ENABLED=false

# MariaDB
DB_USER_ID=0
DB_GROUP_ID=0
MYSQL_ROOT_PASSWORD=Your_Secure_MariaDB_Root_Password!
MYSQL_DATABASE=grimmory

⚠️ Важно для пользователей root: Обратите внимание на APP_USER_ID=0 и APP_GROUP_ID=0. Это гарантирует, что контейнер будет иметь полный доступ к смонтированным томам без ошибок Permission denied, которые часто возникают при стандартных значениях 1000.

Шаг 4. Создание docker-compose.yml

Создаём compose-файл на основе официальной документации:

nano /opt/grimmory/docker-compose.yml
services:
  grimmory:
    image: grimmory/grimmory:latest
    container_name: grimmory
    environment:
      - USER_ID=${APP_USER_ID}
      - GROUP_ID=${APP_GROUP_ID}
      - TZ=${TZ}
      - DATABASE_URL=${DATABASE_URL}
      - DATABASE_USERNAME=${DB_USER}
      - DATABASE_PASSWORD=${DB_PASSWORD}
      - API_DOCS_ENABLED=${API_DOCS_ENABLED}
      - DISK_TYPE=${DISK_TYPE}
    depends_on:
      mariadb:
        condition: service_healthy
    ports:
      - "6060:6060"
    volumes:
      - ./data:/app/data
      - ./books:/books
      - ./bookdrop:/bookdrop
    healthcheck:
      test: wget -q -O - http://localhost:6060/api/v1/healthcheck
      interval: 60s
      retries: 5
      start_period: 60s
      timeout: 10s
    restart: unless-stopped

  mariadb:
    image: lscr.io/linuxserver/mariadb:11.4.5
    container_name: grimmory-mariadb
    environment:
      - PUID=${DB_USER_ID}
      - PGID=${DB_GROUP_ID}
      - TZ=${TZ}
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASSWORD}
    volumes:
      - ./mariadb/config:/config
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 5s
      retries: 10

Шаг 5. Запуск и первый вход

Запускаем стек:

cd /opt/grimmory
docker compose up -d

⏳ Терпение! Первый запуск занимает время

Grimmory написан на Java/Spring Boot. При первом старте выполняется 138 миграций Flyway. Контейнер может находиться в статусе starting или unhealthy до 2–3 минут. Не паникуйте, если интерфейс не открывается сразу.

Отслеживайте прогресс:

docker compose logs -f grimmory

Ждите строку: Started BookloreApplication in XXX seconds. Только после этого переходите в браузер.

Открытие порта

Если используете UFW:

ufw allow 6060/tcp

Перейдите по адресу http://<IP_ВАШЕГО_СЕРВЕРА>:6060 и создайте учётную запись администратора.

Шаг 6. Создание библиотеки (Критически важный момент!)

Это тот этап, где многие ошибаются. Чтобы книги автоматически обнаруживались:

  1. Нажмите «Создать библиотеку».
  2. В поле Путь (Path) укажите строго: /books (это путь внутри контейнера, а не на хосте!).
  3. ОБЯЗАТЕЛЬНО включите опцию «Отслеживать изменения» (Monitor for changes / Watch folder). Без этого флажка новые файлы не будут подхватываться автоматически, даже если они лежат в правильной папке.
  4. Сохраните.

Шаг 7. Тестирование: BookDrop и загрузка книг

Автоматический импорт через BookDrop

Скачаем легальную тестовую книгу прямо в папку автоимпорта:

wget -O /opt/grimmory/bookdrop/frankenstein.epub "https://www.gutenberg.org/ebooks/84.epub3.images"

Grimmory автоматически:

  1. Обнаружит новый файл.
  2. Загрузит метаданные и обложку из Google Books / Open Library.
  3. Поместит книгу в очередь на ревью в интерфейсе.

Ручное копирование

Вы также можете копировать файлы напрямую в /opt/grimmory/books. Благодаря включённому мониторингу они появятся в библиотеке автоматически.

Поддерживаемые форматы

КатегорияФорматы
Электронные книгиEPUB, MOBI, AZW, AZW3, FB2
ДокументыPDF
КомиксыCBZ, CBR, CB7
АудиокнигиM4B, M4A, MP3, OPUS

Полезные команды для администрирования

# Просмотр логов в реальном времени
docker compose logs -f grimmory

# Перезапуск после изменений в .env
docker compose down && docker compose up -d

# Обновление до последней версии
docker compose pull && docker compose up -d

# Полный сброс (удаление всех данных!)
docker compose down && rm -rf data/* mariadb/config/* books/* bookdrop/*

Заключение

Grimmory — зрелая, активно развивающаяся альтернатива Calibre-web и Kavita. Использование официального Docker-образа с MariaDB обеспечивает стабильность, а функция BookDrop делает процесс наполнения библиотеки максимально удобным.


Статья подготовлена на основе личного опыта развёртывания на VPS Ubuntu 24.04 и официальной документации проекта grimmory-tools/grimmory.