DevOps и Docker 10 мин чтения 2026-10-22

Персональный медиасервер для аудиокниг и подкастов: развертывание Audiobookshelf на VDS в Docker Compose с мобильной синхронизацией и прогрессом

Подробный разбор развертывания Audiobookshelf v2.37.1 на VDS: от подготовки томов и SQLite-базы до Nginx Reverse Proxy с WebSocket, мобильной синхронизации и автоматического резервного копирования библиотеки.

Инженерная редакция SysKit Проверено инженерами SysKit.ru

Облачные сервисы вроде Audible, Storytel или Литрес приучили нас к удобству: покупка в один клик, автоматическая синхронизация прогресса прослушивания между телефоном и компьютером, разбивка на главы и удобный таймер сна. Однако в современных реалиях подписочная модель несет серьезные риски: уход зарубежных платформ с рынка РФ, блокировка аккаунтов, невозможность оплаты картами МИР и внезапное удаление купленных книг из каталога по требованию правообладателей. Полноценной альтернативой становится персональный медиасервер на собственном VDS, где библиотека файлов принадлежит исключительно вам.

Долгое время любителям аудиокниг приходилось идти на компромиссы: приспосабливать универсальные медиакомбайны вроде Plex или Jellyfin, страдать от отсутствия нормальной поддержки многодисковых изданий, вручную запоминать минуты в стандартных аудиоплеерах и терять позицию при переключении между смартфоном и ноутбуком. Появление Audiobookshelf кардинально изменило расклад сил в сообществе self-hosted: проект с открытым исходным кодом (GPL-3.0) и более чем 14 700 звёздами на GitHub стал золотым стандартом для коллекционеров аудиокниг и любителей подкастов.

1. Архитектура Audiobookshelf: почему это лучший self-hosted медиасервер для аудиокниг

В отличие от универсальных медиасерверов, создававшихся под фильмы и музыку, архитектура Audiobookshelf изначально спроектирована под специфику аудиокниг. Аудиокнига — это сложная сущность: она может состоять из сотен мелких MP3-файлов, одного монолитного файла формата M4B со встроенными главами, сопровождаться текстовыми описаниями, иллюстрациями обложек и информацией о чтецах (дикторах).

Под капотом Audiobookshelf работает легковесный и надежный стек технологий:

  • Бэкенд на Node.js: быстрая асинхронная обработка метаданных, минимальное потребление системных ресурсов (120–180 МБ RAM в режиме ожидания) и мгновенный запуск.
  • База данных SQLite (начиная с версий 2.3.x): монолитная embedded-СУБД, не требующая выделенного контейнера вроде PostgreSQL или MariaDB, обеспечивающая транзакционную надежность и моментальное создание снимков состояния.
  • FFmpeg и FFprobe: встроенный в официальный образ движок перекодирования медиафайлов, извлечения встроенных обложек, проверки битрейта и автоматической нарезки/объединения глав на лету.
  • WebSocket-соединение в реальном времени: непрерывная передача позиции воспроизведения на сервер. Если вы остановили прослушивание на 34-й минуте в смартфоне за рулем автомобиля, через секунду веб-плеер на домашнем компьютере продолжит воспроизведение ровно с этой же секунды.
  • Встроенный сборщик подкастов: сервер умеет отслеживать открытые RSS-ленты, автоматически скачивать новые выпуски и генерировать собственные защищенные фиды для внешних приложений.

💡 Инженерный принцип SysKit

Главное достоинство Audiobookshelf по сравнению с тяжелыми медиасерверами (Plex, Emby) — автономность и нулевая зависимость от централизованных серверов аутентификации. Вся база пользователей, прогресс сессий и закэшированные метаданные хранятся локально на вашем сервере в защищенной SQLite-базе. Даже при полном отсутствии внешнего интернета медиасервер продолжит работать внутри локальной сети или VPN-оверлея.

Для наглядности сравним возможности Audiobookshelf со стандартными решениями для домашних медиаколлекций:

Функциональная возможность Audiobookshelf v2.37.1 Jellyfin 10.9 Plex Media Server
Позиционирование Специализированный сервер для книг и подкастов Универсальный комбайн (видео/музыка) Коммерческий медиасервер
Синхронизация прогресса С точностью до секунды через WebSocket Периодический опрос (polling) Базовая (часто сбоит на аудио)
Парсинг глав M4B Нативно + автопоиск через Audnexus API Только встроенные метки Требуются сторонние плагины
Мобильные клиенты iOS, Android (офлайн-загрузка и Car/CarPlay) Общее приложение Jellyfin Plexamp / платная подписка Pass
Потребление RAM ~150 МБ (идеально для недорогих VDS) 600–1200 МБ (.NET runtime) 800–1500 МБ
Сквозной бэкап Встроенный автобэкап базы и ассетов Ручной дамп каталога данных Ручное копирование appdata

2. Системные требования и выбор VDS: CPU, RAM, быстрый NVMe против HDD

В отличие от видеостриминга (Jellyfin или Plex), где транскодирование 4K-видео на лету способно мгновенно раскалить процессор сервера до 100%, аудиостриминг предъявляет минимальные требования к вычислительным ресурсам. Форматы MP3, M4B (AAC), Opus и FLAC декодируются клиентскими смартфонами на лету без необходимости пережатия на стороне сервера.

Однако при проектировании надежного узла важно учитывать два узких места: скорость дисковой подсистемы при первичном сканировании большой медиатеки и объем дискового пространства под книги.

Компонент Минимальные требования Рекомендуемая конфигурация Влияние на работу сервиса
Процессор (CPU) 1 vCPU (от 2.4 ГГц) 2 vCPU (3.0+ ГГц) FFmpeg при первичном извлечении обложек и генерации глав
Оперативная память (RAM) 1 ГБ RAM + 1 ГБ Swap 2 ГБ RAM + 2 ГБ Swap Кэширование SQLite в памяти и буферы Nginx при отдаче потока
Тип накопителя NVMe SSD (от 20 ГБ) NVMe под OS + блочный диск HDD База данных SQLite крайне чувствительна к IOPS и задержкам диска
Сетевой канал 50 Мбит/с 100–200 Мбит/с без лимита Быстрое скачивание книг в офлайн перед перелетом или поездкой

Почему NVMe критичен для каталога и базы SQLite

Ключевая ошибка при самостоятельном развертывании медиасерверов — попытка запустить всё на самых дешевых тарифах с медленными сетевыми HDD. Сами аудиофайлы (MP3 или M4B) действительно можно безболезненно хранить на недорогих объемных HDD, поскольку битрейт 128–320 кбит/с создает смешную нагрузку в доли мегабайта в секунду.

Но том /config с файлом audiobookshelf.sqlite и том /metadata с тысячами обложек и кэшем стримов требуют максимальной производительности случайного чтения/записи (IOPS). Если положить базу SQLite на медленный жесткий диск или сетевое хранилище NFS, при одновременном прослушивании несколькими пользователями интерфейс начнет подвисать, а фоновое сканирование новых папок парализует работу сервера на часы.

Идеальная архитектура для большой коллекции (от 200–500 ГБ книг) — гибридная: базовый VDS на скоростном NVMe для операционной системы, Docker, базы SQLite и Nginx, к которому монтируется дополнительный емкий том или сетевой блочный диск под массив аудиофайлов.

💡 Выбор хостинга для личного медиасервера

Для надежного развертывания Audiobookshelf инженеры SysKit рекомендуют выбирать российские VDS с быстрым каналом и честными NVMe-дисками. Проверить текущую скорость портов и сетевую доступность вашего сервера можно через утилиту проверки открытых портов или сетевой чекер анализа хостинга.

3. Подготовка Ubuntu 24.04 LTS: Docker Engine, права доступа и файловая структура

Развертывание выполняем на чистом сервере под управлением Ubuntu 24.04 LTS. Перед запуском контейнеров необходимо выполнить базовую подготовку операционной системы: обновить пакеты, создать файл подкачки (Swap) для предотвращения внезапных падений от OOM Killer при тяжелом импорте, установить официальный Docker Engine через актуальный формат репозитория DEB822 и подготовить каталоги с правильными правами доступа.

1. Обновление системы и настройка файла подкачки (Swap)

Даже если на вашем VDS установлено 2 ГБ оперативной памяти, при первом импорте библиотеки в сотни гигабайт FFprobe активно анализирует медиафайлы. Чтобы системный демон Linux OOM Killer не завершил контейнер аварийно, создаем Swap-файл объемом 2 ГБ:

# Обновляем индекс пакетов и систему
sudo apt update && sudo apt upgrade -y

# Создаем swap-файл на 2 ГБ (если он еще не настроен)
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# Добавляем в /etc/fstab для сохранения после перезагрузки
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# Проверяем статус памяти
free -h

2. Установка Docker Engine из официального репозитория DEB822

Не используйте устаревший пакет docker.io из стандартных репозиториев дистрибутива — в нем часто отсутствует актуальный плагин Docker Compose v2. Подключаем официальный репозиторий Docker в современном формате DEB822:

# Базовые утилиты
sudo apt install -y ca-certificates curl gnupg wget htop

# Официальный GPG-ключ Docker
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Подключение репозитория в формате DEB822
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

# Установка компонентов Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Проверяем версию Compose (должна быть v2.x)
docker compose version

3. Формирование файловой структуры и права доступа

Официальная документация Audiobookshelf прямо указывает на важное правило монтирования: каждая точка монтирования обязана быть отдельной изолированной директорией и не должна быть вложена в другую точку монтирования. Нельзя монтировать корень /opt/audiobookshelf в /config, а вложенную папку /opt/audiobookshelf/metadata в /metadata.

Создадим четкую и безопасную структуру каталогов в /opt/audiobookshelf:

# Создаем рабочую директорию проекта
sudo mkdir -p /opt/audiobookshelf/{config,metadata,audiobooks,podcasts}

# Создаем системного пользователя audiobookshelf (UID/GID 1000)
# Если у вас уже есть стандартный пользователь с UID 1000, используйте его
id -u 1000 >/dev/null 2>&1 || sudo useradd -u 1000 -U -d /opt/audiobookshelf -s /bin/false audiobookshelf

# Выставляем права доступа владельца
sudo chown -R 1000:1000 /opt/audiobookshelf
sudo chmod -R 750 /opt/audiobookshelf

⚠️ Нюанс архитектуры Audiobookshelf

В отличие от образов LinuxServer (где традиционно используются переменные PUID и PGID), официальный контейнер ghcr.io/advplyr/audiobookshelf не считывает переменные PUID/PGID! Для запуска от непривилегированного пользователя необходимо использовать нативную директиву Docker Compose user: "1000:1000", что мы и реализуем на следующем шаге.

4. Боевой docker-compose.yml: монтирование томов, переменные окружения и лимиты

Переходим к формированию манифеста docker-compose.yml. В отличие от типовых любительских примеров из интернета, где порт 80 или 13378 пробрасывается напрямую на внешний интерфейс 0.0.0.0 (что открывает веб-интерфейс сервера всему интернету в обход файрвола UFW), мы применим инженерные стандарты SysKit:

  • Локальная привязка порта (127.0.0.1:13378): доступ к сервису возможен исключительно через локальный реверс-прокси Nginx с шифрованием TLS. Файрвол UFW не будет скомпрометирован правилами iptables Docker.
  • Фиксация мажорной версии (v2.37.1): использование тега 2.37.1 вместо плавающего latest гарантирует, что внезапный мажорный апдейт с ломающими миграциями не сломает рабочую библиотеку при ночном перезапуске.
  • Нативные лимиты ресурсов: директивы mem_limit и cpus на уровне сервиса страхуют сервер от истощения оперативной памяти.
  • Защита JWT-сессий: статическая генерация ключа JWT_SECRET_KEY предотвращает разлогинивание всех мобильных приложений при перезапуске контейнера.

Создание конфигурационного файла .env

Сгенерируем случайный криптографический ключ для JWT-токенов с помощью системной утилиты OpenSSL и сохраним его в файле окружения /opt/audiobookshelf/.env:

cd /opt/audiobookshelf

# Генерируем стойкий секретный ключ JWT
JWT_SECRET=$(openssl rand -hex 32)

cat <<EOF > .env
# Часовой пояс сервера для корректных отметок времени бэкапов
TZ=Europe/Moscow

# Секрет для генерации JSON Web Tokens (не менять после первого запуска!)
JWT_SECRET_KEY=${JWT_SECRET}

# Максимальное число попыток авторизации за 10 минут (защита от брутфорса)
RATE_LIMIT_AUTH_MAX=40

# Включение production-режима
NODE_ENV=production
EOF

chmod 600 .env

💡 Почему важно зафиксировать JWT_SECRET_KEY

Если переменная JWT_SECRET_KEY не задана в конфигурации, Audiobookshelf при каждом старте генерирует случайный временный ключ в памяти. В результате после каждого обновления или перезапуска контейнера авторизационные токены всех мобильных устройств становятся недействительными — вам и вашим близким придется заново вводить логин и пароль в приложениях на смартфонах.

Боевой манифест docker-compose.yml

Создаем файл /opt/audiobookshelf/docker-compose.yml:

services:
  audiobookshelf:
    image: ghcr.io/advplyr/audiobookshelf:2.37.1
    container_name: audiobookshelf
    restart: unless-stopped
    user: "1000:1000"
    
    # Публикация строго на loopback-интерфейс
    ports:
      - "127.0.0.1:13378:80"
      
    env_file:
      - .env
      
    volumes:
      # База данных SQLite и миграции (только локальный диск!)
      - ./config:/config
      # Метаданные, обложки, кэш и бэкапы
      - ./metadata:/metadata
      # Медиатека аудиокниг
      - ./audiobooks:/audiobooks
      # Подкасты
      - ./podcasts:/podcasts
      
    # Ограничение ресурсов: предотвращает OOM Killer на небольших VDS
    mem_limit: 1024m
    cpus: 1.5

    healthcheck:
      # В официальном образе присутствует wget, но отсутствует curl
      test: ["CMD-SHELL", "wget -q -O - http://127.0.0.1:80/healthcheck || exit 1"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 15s

Первичный запуск и проверка статуса

Запускаем стек в фоновом режиме и проверяем журнал контейнера:

# Запуск сервиса
docker compose up -d

# Просмотр логов инициализации и применения миграций SQLite
docker compose logs -f audiobookshelf

В журнале должны появиться строки об успешной инициализации базы данных SQLite, запуске HTTP-сервера на внутреннем порту 80 и готовности к приему входящих WebSocket-соединений. Сервер готов к подключению защищенного веб-прокси.

Рекомендуемые VDS-провайдеры

Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с

Выбор редакции
⚡

Timeweb Cloud — Быстрые NVMe VDS

Оптимальная площадка для развертывания Audiobookshelf: мгновенный старт контейнеров на быстрых NVMe, безлимитный трафик и удобное подключение S3.

Конфигурация
1 vCPU 3.3 ГГц • 1 ГБ RAM • 20 ГБ NVMe • Канал 200 Мбит/с
Премиум Tier III
🔷

Selectel — Надежные облачные VDS

Высокая доступность в дата-центрах уровня Tier III в РФ. Подходит для медиаколлекций с подключением дополнительных сетевых дисков большого объема.

Конфигурация
2 vCPU • 2 ГБ RAM • 30 ГБ NVMe • Сеть до 1 Гбит/с
Быстрый старт
🟠

Beget — Простота и стабильность

Удобная панель управления сервером, готовые образы Ubuntu и понятный мониторинг нагрузки для соло-разработчиков и энтузиастов self-hosted.

Конфигурация
1 vCPU • 1 ГБ RAM • 20 ГБ NVMe • Безлимитный трафик

5. Настройка Nginx Reverse Proxy: WebSocket, стриминг и загрузка больших файлов до 10 ГБ

Для безопасной работы мобильных приложений и веб-интерфейса подключение по HTTPS строго обязательно. Кроме того, современные мобильные браузеры блокируют воспроизведение медиапотоков и доступ к Service Worker (PWA) при использовании незашифрованного HTTP.

В качестве шлюза на хосте используем классический Nginx. Конфигурация должна решать три критические технические задачи:

  1. Полноценный проброс WebSocket: передача заголовков Upgrade и Connection "upgrade". Без них аудиопоток будет играть, но сохранение позиции и синхронизация между устройствами полностью сломаются.
  2. Снятие лимита на размер тела запроса (10 ГБ): аудиокниги в формате монолитных файлов M4B со встроенными главами часто весят от 500 МБ до 3–5 ГБ. Стандартный лимит Nginx client_max_body_size 1m; приведет к ошибке 413 Request Entity Too Large.
  3. Отключение буферизации запросов: директива proxy_request_buffering off; позволяет загружать тяжелые файлы напрямую в сервис, не забивая временными файлами дисковый кэш Nginx в /var/lib/nginx/body.

1. Установка Nginx и Certbot

sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx

2. Создание базового виртуального хоста

Чтобы избежать классической ошибки Certbot, когда конфигурация не проходит проверку синтаксиса из-за отсутствующих файлов SSL-сертификатов, сначала создаем чистый HTTP-блок на 80 порту. Замените audio.example.com на ваш реальный поддомен:

# /etc/nginx/sites-available/audiobookshelf.conf
server {
    listen 80;
    listen [::]:80;
    server_name audio.example.com;

    access_log /var/log/nginx/audiobookshelf.access.log;
    error_log /var/log/nginx/audiobookshelf.error.log;

    location / {
        proxy_pass http://127.0.0.1:13378;
        proxy_http_version 1.1;

        # Критично для синхронизации прогресса через WebSocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Корректная передача реальных IP-адресов клиентов
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Разрешаем загрузку тяжелых M4B-книг до 10 ГБ
        client_max_body_size 10240M;
        proxy_request_buffering off;

        # Таймауты для длинных аудиопотоков
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }
}

Активируем конфигурацию через создание символической ссылки и проверяем синтаксис:

# Создаем симлинк в sites-enabled
sudo ln -sf /etc/nginx/sites-available/audiobookshelf.conf /etc/nginx/sites-enabled/

# Проверяем синтаксис Nginx
sudo nginx -t

# Перезагружаем веб-сервер
sudo systemctl reload nginx

3. Выпуск бесплатного SSL-сертификата Let's Encrypt

Выполняем выпуск сертификата с автоматической настройкой перенаправления с HTTP на HTTPS:

sudo certbot --nginx --redirect -d audio.example.com

💡 Проверка правильности SSL-рукопожатия

После выпуска сертификата убедитесь, что веб-сервер корректно отдает полную цепочку сертификатов (Full Chain), а не только конечный сертификат. Проверить срок действия, протоколы TLS 1.2/1.3 и отсутствие смешанного контента можно через бесплатный онлайн-чекер SSL-сертификатов на SysKit.

Альтернатива на Caddy 2

Если вы используете современный веб-сервер Caddy вместо Nginx, вся настройка автоматического HTTPS, перенаправления и поддержки WebSocket сводится всего к четырем строкам в файле /etc/caddy/Caddyfile:

audio.example.com {
    encode gzip zstd
    reverse_proxy 127.0.0.1:13378
}

Проверить синтаксис Caddyfile и применить изменения:

caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy

6. Подключение мобильных клиентов iOS и Android: авторизация, офлайн-прослушивание и синхронизация

Главное преимущество Audiobookshelf перед обычными аудиоплеерами — наличие официальных мобильных приложений с открытым исходным кодом для Android и iOS, которые превращают ваш VDS в полноценный персональный аналог сервисов Audible или Storytel.

Где скачать приложения

  • Android: приложение официально доступно в каталогах Google Play, RuStore, F-Droid, а также в виде готовых установочных файлов APK в репозитории advplyr/audiobookshelf-app на GitHub.
  • iOS (iPhone / iPad): распространяется через программу Apple TestFlight. Из-за жесткого лимита Apple в 10 000 бета-тестеров свободные слоты периодически заполняются. Если слоты закрыты, вы можете использовать приложение как полноценное PWA (Progressive Web App): откройте адрес сервера в Safari и нажмите «На экран Домой» — веб-плеер поддерживает фоновое воспроизведение и сохранение прогресса.

Первичная настройка подключения и пользователей

После первого входа в веб-интерфейс по адресу https://audio.example.com мастер первоначальной настройки предложит создать учетную запись администратора. Задайте надежный пароль (сгенерировать надежный пароль можно через утилиту генератора безопасных паролей SysKit).

Для каждого члена семьи или коллеги рекомендуется создать отдельного пользователя в разделе Настройки сервера ➔ Пользователи:

  1. Укажите логин и пароль.
  2. Выберите тип аккаунта: User (обычный слушатель) без прав администратора.
  3. Разрешите или запретите скачивание исходных аудиофайлов на устройство (чекбокс Allow download).
  4. Назначите доступ к определенным библиотекам (например, только к аудиокнигам или только к подкастам).

💡 Независимый прогресс каждого слушателя

В Audiobookshelf каждый пользователь обладает полностью изолированным профилем: собственные закладки, индивидуальная скорость воспроизведения (например, 1.25x или 1.75x), таймер сна и отдельная история прослушивания. Даже если пять человек одновременно слушают один и тот же цикл книг, метки времени и прогресс ни у кого не перепутаются.

Работа в офлайн-режиме

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

Приложение сохраняет аудиофайлы в зашифрованное локальное хранилище. Во время воспроизведения без интернета мобильный клиент локально фиксирует все перемещения по главам. Как только смартфон подключается к мобильной сети или домашнему Wi-Fi, клиент мгновенно отправляет накопленный сессионный лог на VDS по протоколу WebSocket, синхронизируя базу SQLite на сервере с точностью до секунды.

7. Организация библиотеки: структура папок, автопоиск метаданных и разметка глав через Audnexus

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

Рекомендуемая файловая структура медиатеки

Для раздела /audiobooks разработчики Audiobookshelf рекомендуют трехуровневую иерархию папок:

audiobooks/
├── Фрэнк Герберт/
│   └── Хроники Дюны/
│       ├── 01. Дюна (2021) [M4B]/
│       │   ├── Dune.m4b
│       │   ├── cover.jpg
│       │   └── desc.txt
│       └── 02. Мессия Дюны/
│           ├── CD01.mp3
│           ├── CD02.mp3
│           └── cover.jpg
└── Лев Толстой/
    └── Война и мир/
        ├── Том 1.m4b
        └── Том 2.m4b

Ключевые принципы формирования каталогов:

  • Автор / Серия (опционально) / Книга: если у книги есть четкая серия, папка серии автоматически превратится в коллекцию в веб-интерфейсе с правильным порядком воспроизведения томов.
  • Изолированные папки под каждую книгу: категорически не рекомендуется сваливать десятки отдельных MP3-файлов разных произведений в один общий корень. Каждая аудиокнига обязана находиться в отдельной персональной папке.
  • Локальные обложки: если в папке книги лежит файл cover.jpg или cover.png, сервер сразу назначит его обложкой без отправки запросов во внешние базы данных.

Автоматический поиск метаданных и разметка глав через Audnexus

Если вы загружаете книги без встроенных тегов, встроенный в Audiobookshelf скрапер метаданных быстро приведет коллекцию в порядок:

  1. Откройте карточку книги и нажмите кнопку со значком лупы (Match / Поиск метаданных).
  2. В качестве источников доступны популярные каталоги: Google Books, Open Library, iTunes и специализированный провайдер Audnexus.
  3. Audnexus API: специализированный открытый сервис сообщества, хранящий точные таймкоды разделения на главы (глава 1, пролог, эпилог) для тысяч популярных аудиокниг.
  4. Сервер автоматически загрузит официальную аннотацию, имя диктора, год издания, теги жанров и применит точную сетку глав к вашему файлу без повторного перекодирования звука.

💡 Встроенный инструмент объединения файлов в M4B

Если книга досталась вам в виде разрозненного архива из 80 мелких файлов MP3, вам не нужны сторонние утилиты на компьютере вроде ffmpeg-scripts. В меню книги Audiobookshelf нажмите Инструменты книги ➔ Объединить в M4B. Встроенный серверный движок FFmpeg объединит треки в единый монолитный файл с сохранением кодека AAC, внедрит обложку и сгенерирует оглавление глав.

8. Резервное копирование SQLite и метаданных: встроенные архивы и офсайт-копия в S3

Медиафайлы книг занимают десятки и сотни гигабайт, но всю главную интеллектуальную ценность сервера формируют данные о вашей библиотеке: учетные записи, закладки, прогресс прослушивания, загруженные обложки и кастомные таймкоды глав. Потеря базы данных SQLite означает потерю сотен часов накопленного прогресса.

Встроенный механизм автоматических бэкапов

Разработчики Audiobookshelf позаботились об администраторах и внедрили встроенную систему инкрементальных архивов. В веб-интерфейсе перейдите в Настройки сервера ➔ Резервные копии:

  • Включите автоматическое расписание (например, ежедневно в 03:00 ночи).
  • Задайте лимит хранимых копий (например, 7 последних копий).
  • Сервер формирует монолитный архив с расширением .audiobookshelf в смонтированном каталоге /opt/audiobookshelf/metadata/backups/.
  • Внутрь архива попадают: файл базы audiobookshelf.sqlite, каталог сохраненных авторов metadata-authors/ и обложки metadata-items/. Сами тяжелые медиафайлы книг в бэкап не дублируются, благодаря чему архив весит всего несколько десятков мегабайт.

Процедура ручного восстановления из архива

Если потребовалось откатить сервер к предыдущему состоянию или перенести библиотеку на новый VDS, процедура восстановления занимает буквально пару минут:

cd /opt/audiobookshelf

# 1. Останавливаем контейнер для снятия блокировок SQLite
docker compose stop audiobookshelf

# 2. Переходим в папку с архивами и распаковываем нужный бэкап
cd metadata/backups
unzip 2026-10-22.audiobookshelf -d restore_tmp

# 3. Восстанавливаем базу данных в каталог config
cp restore_tmp/audiobookshelf.sqlite ../../config/audiobookshelf.sqlite

# 4. Восстанавливаем обложки и данные авторов в каталог metadata
cp -r restore_tmp/metadata-authors/* ../authors/
cp -r restore_tmp/metadata-items/* ../items/

# 5. Очищаем временную папку и запускаем медиасервер
rm -rf restore_tmp
cd ../..
docker compose start audiobookshelf

Офсайт-копирование бэкапов в S3-хранилище через Restic

Оставлять бэкапы исключительно на том же диске VDS — серьезный риск в случае аварии дата-центра или сбоя накопителя. Для безопасного шифрованного экспорта данных в отечественное объектное хранилище (например, Timeweb Cloud S3 или VK Cloud) инженеры SysKit рекомендуют использовать связку с Restic. Подробную схему с готовым bash-скриптом можно сгенерировать в нашем генераторе bash-скриптов бэкапов в S3 или настроить по статье о резервном копировании Docker в S3 через Restic.

9. Чек-лист безопасности администратора и типичные ошибки развертывания

Перед вводом медиасервера в постоянную эксплуатацию выполните контрольную проверку по чек-листу безопасности:

  1. Локальная изоляция Docker-портов: в файле docker-compose.yml порт 80 контейнера привязан строго к 127.0.0.1:13378, а не к 0.0.0.0:13378. Внешний доступ возможен исключительно через Nginx с шифрованием TLS.
  2. Фиксация секретного ключа JWT: в файле .env задана постоянная переменная JWT_SECRET_KEY, что защищает мобильные сессии от сброса при перезапуске контейнера.
  3. Лимит размера запроса в Nginx: параметр client_max_body_size 10240M; предотвращает ошибку 413 при загрузке аудиокниг объемом больше 1 ГБ.
  4. Проброс WebSocket-заголовков: в конфигурации виртуального хоста присутствуют директивы proxy_set_header Upgrade $http_upgrade; и proxy_set_header Connection "upgrade";, обеспечивающие непрерывную синхронизацию прогресса.
  5. Ограничение брутфорса: переменная RATE_LIMIT_AUTH_MAX=40 активна для блокировки перебора учетных данных злоумышленниками.
  6. Автоматический бэкап: настроено ежедневное создание архивов базы .audiobookshelf со сроком хранения не менее 7 дней.

Типичные ошибки развертывания и способы их устранения

Симптом проблемы Корневая причина Инженерное решение
Не сохраняется прогресс в приложении Nginx не проксирует WebSocket-соединение Добавить в блок location / директивы Upgrade и Connection "upgrade"
Ошибка 413 Request Entity Too Large Сработало стандартное ограничение Nginx (1 МБ) Задать client_max_body_size 10240M; и отключить proxy_request_buffering
При перезапуске слетает авторизация на смартфонах Не был задан статический JWT_SECRET_KEY Сгенерировать 64-символьный ключ в .env и перезапустить стек
Повреждение базы SQLite при высокой нагрузке Том /config смонтирован по сети через NFS / SMB Хранить /config строго на локальном NVMe диске сервера
Контейнер падает при первичном сканировании Нехватка оперативной памяти (OOM Killer) Создать swap-файл на 2 ГБ и задать лимиты mem_limit в compose

Развернутый медиасервер Audiobookshelf v2.37.1 полностью освобождает вас от ограничений коммерческих подписок. Вы получаете полную независимость, абсолютную конфиденциальность личных данных, безупречную синхронизацию на всех мобильных платформах и кристально чистый звук без рекламы и региональных ограничений.

Разверните персональный медиасервер на быстром VDS

Запустите Audiobookshelf на производительном российском NVMe VDS с гарантированной доступностью и широким сетевым каналом без переплат за лишние ресурсы.

Выбрать конфигурацию VDS в Timeweb Cloud

Инструменты SysKit по теме статьи

Бесплатные утилиты для проверки и диагностики вашего сервера

Вопросы и ответы (FAQ)

Популярные вопросы вебмастеров и сисадминов по данной теме

Сколько оперативной памяти требуется для Audiobookshelf на VDS?
Audiobookshelf написан на Node.js и крайне экономен к ресурсам: базовый контейнер потребляет всего 120–180 МБ RAM. Минимально для комфортной работы связки из Audiobookshelf, Nginx и операционной системы Ubuntu 24.04 достаточно VDS с 1 ГБ оперативной памяти и настроенным swap-файлом на 1–2 ГБ.
Почему при прослушивании через веб-интерфейс или приложение не сохраняется прогресс?
В 99% случаев проблема вызвана некорректной настройкой Reverse Proxy: Audiobookshelf передает данные о позиции прослушивания и синхронизации через WebSocket. Если в конфигурации Nginx отсутствуют заголовки Upgrade и Connection, соединение сбрасывается, и прогресс не фиксируется в базе SQLite.
Можно ли хранить конфигурацию и базу данных SQLite на сетевом диске (NFS / SMB)?
Категорически нет. В официальной документации Audiobookshelf прямо зафиксировано: том /config, содержащий базу SQLite, обязан располагаться на локальном блочном накопителе сервера. При монтировании SQLite через сетевые протоколы возникают блокировки файлов и гарантированное повреждение базы данных.
Как загружать аудиокниги размером больше 1–2 ГБ без ошибок веб-интерфейса?
По умолчанию Nginx ограничивает размер тела запроса (директива client_max_body_size 1m;), что приводит к ошибке 413 Request Entity Too Large. В виртуальном хосте Nginx необходимо явно задать директиву client_max_body_size 10240M;, что позволит загружать полные m4b-файлы и архивы объемом до 10 ГБ.
Где взять мобильные приложения для синхронизации с сервером?
Официальное приложение Audiobookshelf доступно для Android в Google Play Store, RuStore, F-Droid и в виде прямых APK-файлов в репозитории advplyr/audiobookshelf-app на GitHub. Для iOS приложение распространяется через TestFlight (проверяйте наличие свободных слотов в официальном Discord-сообществе проекта).

Читайте также в блоге SysKit

Смежные руководства и полезные технические статьи