|
|
||
|---|---|---|
| .agents/skills | ||
| .github | ||
| .impeccable/critique | ||
| assets/readme | ||
| bench | ||
| converter | ||
| docs | ||
| public | ||
| scripts | ||
| src | ||
| test | ||
| tools | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| AGENTS.md | ||
| build-release.cmd | ||
| CHANGELOG.md | ||
| check-idx.cjs | ||
| DESIGN.md | ||
| docker-compose.yml | ||
| docker-entrypoint.sh | ||
| Dockerfile | ||
| install.cmd | ||
| install.sh | ||
| LICENSE | ||
| package-lock.json | ||
| package.json | ||
| pkgcontent.txt | ||
| PRODUCT.md | ||
| README.md | ||
| reset-admin.cmd | ||
| reset-admin.sh | ||
| restart-server.cmd | ||
| restart.sh | ||
| skills-lock.json | ||
| start-server.cmd | ||
| start.sh | ||
| stop-server.cmd | ||
| stop.sh | ||
INPX Library Server — self-hosted веб-сервер для электронных библиотек на базе INPX/FB2. Каталог, поиск, чтение в браузере, OPDS для KOReader и отправка книг на Kindle/Kobo по почте — на NAS, Raspberry Pi или обычном ПК.
Возможности
| Каталог | Полнотекстовый поиск, авторы / серии / жанры, фильтры, карточка книги с обложкой и похожими |
| Форматы | FB2, EPUB, MOBI, AZW3 · архивы ZIP/7z · несколько источников сразу |
| Читалка | HTML5 для FB2/EPUB, темы, шрифты, закладки, позиция, TTS, «Продолжить» |
| Персональное | Избранное (книги, авторы, серии), полки, рекомендации |
| Выдача | Скачивание и пакетный ZIP · конвертация через fb2cng · email на ридер |
| OPDS | /opds для KOReader, Moon+, Librera, FBReader · Basic Auth · OpenSearch |
| Sidecar | Обложки Flibusta/FLibrary (в т.ч. JXL), рецензии, биографии, портреты |
| Админка | Источники, пользователи, SMTP, Telegram-бот, OIDC/SSO, дубликаты, логи, бэкап, обновление из ZIP |
| Безопасность | Сессии, CSRF, rate limit, шифрование SMTP-пароля, настраиваемый анонимный доступ |
Интерфейс RU · EN. Кластерный режим и health-checks (/health, /ready) для продакшена.
Метаданные книг живут в индексе и отдаются через /api/* — один контракт для веба, OPDS и Android-ридера.
Быстрый старт
Требования
- Node.js 20+ (на Windows
install.cmdставит портативный Node 24; на Linuxinstall.sh— Node 20) - Папка с книгами или INPX-архивами (
.inpx+.zip/.7z, либо каталог с FB2/EPUB)
Windows
- Скачайте релиз ZIP и распакуйте или клонируйте:
git clone https://github.com/Habsaec/inpx-library-server.git cd inpx-library-server - Запустите
install.cmd— скачает портативный Node.js и установит зависимости (включая конвертер). - При необходимости создайте
.envиз.env.exampleи укажите путь к книгам, например:LIBRARY_ROOT=D:\Books - Запустите
start-server.cmd→ откройте http://localhost:3000
Остановка:stop-server.cmd· перезапуск:restart-server.cmd
Первый вход: admin / admin — сразу смените пароль в профиле.
Linux (Debian / Ubuntu / Raspbian / OpenMediaVault)
git clone https://github.com/Habsaec/inpx-library-server.git
cd inpx-library-server
chmod +x install.sh start.sh stop.sh restart.sh
sudo ./install.sh # Node.js, зависимости; предложит systemd
./start.sh
Откройте http://localhost:3000 → admin / admin.
# если включили systemd при установке
sudo systemctl start inpx-library
sudo systemctl status inpx-library
sudo journalctl -u inpx-library -f
macOS
chmod +x install.sh start.sh
sudo ./install.sh # нужны Xcode Command Line Tools и Node (Homebrew или pkg с nodejs.org)
./start.sh
Docker (готовый образ)
docker pull habsaec/inpx-library-server:latest
docker run -d \
--name inpx-library \
--restart unless-stopped \
-p 3000:3000 \
-v inpx-app:/app \
-v inpx-data:/app/data \
-v /path/to/library:/library:ro \
-e LIBRARY_ROOT=/library \
habsaec/inpx-library-server:latest
Откройте http://localhost:3000. Доп. источники:
-v /path/to/epub:/sources/epub:ro
Затем в админке: Источники → Добавить → тип «Папка» → путь /sources/epub.
Сборка образа из исходников
docker build -t inpx-library .
docker run -d --name inpx-library -p 3000:3000 \
-v inpx-data:/app/data \
-v /path/to/library:/library:ro \
-e LIBRARY_ROOT=/library \
inpx-library
Docker Compose (пример для ПК)
Можно использовать образ с Docker Hub. Пример:
services:
library:
image: habsaec/inpx-library-server:latest
container_name: inpx-library
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- app-code:/app
- app-data:/app/data
- /path/to/library:/library:ro
environment:
- PORT=3000
- LIBRARY_ROOT=/library
volumes:
app-code:
app-data:
docker compose up -d
docker compose down -v удалит данные в именованных томах. Для Synology удобнее готовый docker-compose.yml в корне репозитория (см. ниже).
Synology NAS (Container Manager)
В репозитории уже есть docker-compose.yml под Synology:
- образ:
habsaec/inpx-library-server:latest - порт 3000 (открывайте
http://NAS-IP:3000) - данные: bind-mount
/volume1/docker/inpx-library-data→/app/data
- Создайте папку данных:
mkdir -p /volume1/docker/inpx-library-data - В compose раскомментируйте и укажите том с книгами, например:
- /volume1/books/library:/library:ro - Container Manager → Проект → Создать, укажите папку с
docker-compose.yml→ Применить - Откройте
http://NAS-IP:3000→ admin / admin
Образ: amd64 и arm64. Healthcheck идёт через curl (на слабых NAS Node-проверка часто не успевает).
После установки
- Войдите как admin / admin и смените пароль.
- В админке добавьте источник — папка с
.inpx/архивами или каталог с файлами книг. - Дождитесь индексации (минуты… ~45 мин на большой библиотеке). Статус — в админке.
- Язык интерфейса — RU · EN в шапке.
- SMTP для отправки на ридер — админка → почта / SMTP.
- Бэкап БД — админка → Операции → «Скачать бэкап» (или файл
data/library.db).
Продакшен за HTTPS / reverse proxy: задайте TRUST_PROXY=true и SESSION_SECURE_COOKIE=true (см. .env.example).
OPDS
Адрес: /opds. Аутентификация — Basic Auth (логин и пароль пользователя библиотеки). Подходит для KOReader, Moon+ Reader, Librera, FBReader.
Анонимный OPDS можно включить в админке → Пользователи → «Анонимный доступ».
API
Ошибки JSON содержат стабильное поле code (например UNAUTHORIZED) и локализованное error. Клиентам следует ориентироваться на code.
Ключевые маршруты для Android-ридера: GET /api/books/:id/meta, позиция чтения (position + CAS revision), sync закладок/заметок, GET /api/search, GET /api/catalog.
Переменные окружения
Шаблон: .env.example. Скопируйте в .env и правьте.
| Переменная | По умолчанию | Описание |
|---|---|---|
PORT |
3000 |
Порт сервера |
LIBRARY_ROOT |
/library |
Путь к папке с книгами (на Windows укажите свой диск) |
INPX_FILE |
— | Путь к .inpx (иначе задаётся в админке) |
SESSION_SECRET |
авто | Секрет cookie (≥16 символов или файл data/.session-secret) |
SESSION_SECURE_COOKIE |
false |
true для HTTPS |
SESSION_MAX_AGE_MS |
1209600000 |
TTL сессии (14 дней) |
LOGIN_WINDOW_MS |
900000 |
Окно rate limit входа |
LOGIN_MAX_ATTEMPTS |
10 |
Макс. неудачных попыток |
TRUST_PROXY |
false |
true за nginx / Caddy |
SMTP_HOST, SMTP_PORT, SMTP_SECURE |
— | SMTP для отправки на ридер |
SMTP_USER, SMTP_PASS, SMTP_FROM |
— | Учётные данные SMTP |
FB2CNG_PATH |
./converter/fbc |
Бинарник fb2cng |
FB2CNG_CONFIG_PATH |
./converter/fb2cng.yaml |
Конфиг конвертера |
SEVEN_ZIP_PATH |
npm 7zip-bin |
Путь к 7z |
COVER_MAX_WIDTH |
220 |
Ширина миниатюры |
COVER_MAX_HEIGHT |
320 |
Высота миниатюры |
COVER_QUALITY |
86 |
Качество WebP |
SCAN_INTERVAL_HOURS |
0 |
Автоскан каждые N часов (0 = выкл.) |
EVENTS_STDOUT |
true |
События в stdout (docker logs) |
HEALTH_MINIMAL |
false |
Минимальный /health |
CLUSTER_WORKERS |
0 |
Воркеры кластера (0 = один процесс) |
TELEGRAM_BOT_TOKEN |
— | Токен бота (или настройка в админке) |
PERF_PROFILE |
авто | default / embedded для NAS / мало RAM |
OIDC / SSO (Authentik и совместимые) включается в админке: Users → OIDC / SSO (по умолчанию выключен).
Устранение неполадок
- Не отвечает:
curl -sS http://127.0.0.1:3000/health→ в ответе должно быть"ok":true. - Порт занят: смените
PORTв.envили проброс портов в Docker. - Медленный старт: во время индексации задержки нормальны.
- Нет книг: источник добавлен в админке и индексация завершена?
- Windows: пустой каталог: проверьте
LIBRARY_ROOTв.env(напримерD:\Books). - Конвертация: после
install.cmd/install.shдолжен появитьсяconverter/fbc(fbc.exeна Windows). - Сброс пароля admin:
reset-admin.cmd(Windows) или./reset-admin.sh(Linux/macOS).