inpx-web ======== Веб-сервер для поиска по .inpx-коллекции. Выглядит следующим образом: [https://lib.omnireader.ru](https://lib.omnireader.ru) .inpx - индексный файл для импорта\экспорта информации из базы данных сетевых библиотек в базу каталогизатора [MyHomeLib](https://alex80.github.io/mhl/) или [freeLib](http://sourceforge.net/projects/freelibdesign) или [LightLib](https://lightlib.azurewebsites.net) [Установка](#usage): просто поместить приложение `inpx-web` в папку с .inpx-файлом и файлами библиотеки (zip-архивами) и запустить. По умолчанию, веб-сервер будет доступен по адресу [http://127.0.0.1:12380](http://127.0.0.1:12380) OPDS-сервер доступен по адресу [http://127.0.0.1:12380/opds](http://127.0.0.1:12380/opds) Для указания местоположения .inpx-файла или папки с файлами библиотеки, воспользуйтесь [параметрами командной строки](#cli). Дополнительные параметры сервера настраиваются в [конфигурационном файле](#config). [Отблагодарить автора проекта](https://donatty.com/liberama) ## * [Возможности программы](#capabilities) * [Использование](#usage) * [Параметры командной строки](#cli) * [Конфигурация](#config) * [Удаленная библиотека](#remotelib) * [Фильтр по авторам и книгам](#filter) * [Настройка https с помощью nginx](#https) * [Сборка релизов](#build) * [Запуск без сборки релиза](#native_run) * [Разработка](#development) ## Возможности программы - веб-интерфейс и OPDS-сервер - поиск по автору, серии, названию и пр. - скачивание книги, копирование ссылки или открытие в читалке - возможность указать рабочий каталог при запуске, а также расположение .inpx и файлов библиотеки - ограничение доступа по паролю - работа в режиме "удаленная библиотека" - фильтр авторов и книг при создании поисковой БД для создания своей коллекции "на лету" - подхват изменений .inpx-файла (периодическая проверка), автоматическое пересоздание поисковой БД - мощная оптимизация, хорошая скорость поиска - релизы под Linux, MacOS и Windows ## Использование Поместите приложение `inpx-web` в папку с .inpx-файлом и файлами библиотеки и запустите. Там же, при первом запуске, будет создана рабочая директория `.inpx-web`, в которой хранится конфигурационный файл `config.json`, файлы базы данных, журналы и прочее. По умолчанию веб-интерфейс будет доступен по адресу [http://127.0.0.1:12380](http://127.0.0.1:12380) OPDS-сервер доступен по адресу [http://127.0.0.1:12380/opds](http://127.0.0.1:12380/opds) ### Параметры командной строки Запустите `inpx-web --help`, чтобы увидеть список опций: ```console Usage: inpx-web [options] Options: --help Показать опции командной строки --host= Задать имя хоста для веб сервера, по умолчанию: 0.0.0.0 --port= Задать порт для веб сервера, по умолчанию: 12380 --config= Задать файл конфигурации, по умолчанию: /config.json --data-dir= (или --app-dir) Задать рабочую директорию, по умолчанию: /.inpx-web --lib-dir= Задать директорию библиотеки (с zip-архивами), по умолчанию: там же, где лежит файл приложения --inpx= Задать путь к файлу .inpx, по умолчанию: тот, что найдется в директории библиотеки --recreate Принудительно пересоздать поисковую БД при запуске приложения --unsafe-filter Использовать небезопасный фильтр на свой страх и риск ``` ### Конфигурация По умолчанию, при первом запуске в рабочей директории будет создан конфигурационный файл `config.json`. При необходимости, можно настроить нужный параметр в этом файле вручную. Параметры командной строки имеют больший приоритет, чем настройки из `config.json`. ```js { // рабочая директория приложения, аналог параметра командной строки --data-dir (или --app-dir) // пустая строка: использовать значение по умолчанию - /.inpx-web // где execDir - директория файла приложения "dataDir": "", // директория для хранения временных файлов // пустая строка: использовать значение по умолчанию - /tmp // специальное значение "${OS}" указывается для использования системного каталога: // "${OS}" => "/inpx-web" "tempDir": "", // директория для хранения логов // пустая строка: использовать значение по умолчанию - /logs "logDir": "", // директория библиотеки (с zip-архивами), аналог параметра командной строки --lib-dir // пустая строка: использовать значение по умолчанию - директорию файла приложения (execDir) "libDir": "", // путь к файлу .inpx, аналог параметра командной строки --inpx // пустая строка: использовать значение по умолчанию - inpx-файл, что найдется в директории библиотеки "inpx": "", // конфигурационный файл для фильтра по авторам и книгам (см. ниже) // пустая строка: использовать значение по умолчанию - файл filter.json в директории файла конфигурации "inpxFilterFile": "", // разрешить(true)/запретить(false) перезаписывать файл конфигурации, если появились новые параметры для настройки // файл перезаписывается с сохранением всех предыдущих настроек и с новыми по умолчанию // бывает полезно при выходе новых версий приложения "allowConfigRewrite": false, // разрешить(true)/запретить(false) использовать небезопасный фильтр (см. ниже) // аналог параметра командной строки --unsafe-filter "allowUnsafeFilter": false, // пароль для ограничения доступа к веб-интерфейсу сервера // пустое значение - доступ без ограничений "accessPassword": "", // таймаут автозавершения сессии доступа к веб-интерфейсу (если задан accessPassword), // при неактивности в течение указанного времени (в минутах), пароль будет запрошен заново // 0 - отключить таймаут, время доступа по паролю не ограничено "accessTimeout": 0, // включить(true)/выключить(false) возможность расширенного поиска (раздел "") // расширенный поиск не оптимизирован, поэтому может сильно нагружать сервер // чтобы ускорить поиск, увеличьте параметр dbCacheSize "extendedSearch": true, // содержимое кнопки-ссылки "(читать)", если не задано - кнопка "(читать)" не показывается // пример: "https://omnireader.ru/#/reader?url=${DOWNLOAD_LINK}" // на место ${DOWNLOAD_LINK} будет подставлена ссылка на скачивание файла книги // пример: "https://mydomain.ru/#/reader?url=http://127.0.0.1:8086${DOWNLOAD_URI}" // на место ${DOWNLOAD_URI} будут подставлены параметры (без имени хоста) из ссылки на скачивание файла книги "bookReadLink": "", // включить(true)/выключить(false) журналирование "loggingEnabled": true, // включить/выключить ежеминутный вывод в лог memUsage и loadAvg "logServerStats": false, // включить/выключить вывод в лог запросов и времени их выполнения "logQueries": false, // максимальный размер кеша каждой таблицы в БД, в блоках (требуется примерно 1-10Мб памяти на один блок) // если надо кешировать всю БД, можно поставить значение от 1000 и больше "dbCacheSize": 5, // максимальный размер в байтах директории закешированных файлов в <раб.дир>/public-files // чистка каждый час "maxFilesDirSize": 1073741824, // включить(true)/выключить(false) серверное кеширование запросов на диске и в памяти "queryCacheEnabled": true, // размер кеша запросов в оперативной памяти (количество) // 0 - отключить кеширование запросов в оперативной памяти "queryCacheMemSize": 50, // размер кеша запросов на диске (количество) // 0 - отключить кеширование запросов на диске "queryCacheDiskSize": 500, // периодичность чистки кеша запросов на сервере, в минутах // 0 - отключить чистку "cacheCleanInterval": 60, // периодичность проверки изменений .inpx-файла, в минутах // если файл изменился, поисковая БД будет автоматически пересоздана // 0 - отключить проверку "inpxCheckInterval": 60, // включить(true)/выключить(false) режим работы с малым количеством физической памяти на машине // при включении этого режима, количество требуемой для создания БД памяти снижается примерно в 1.5-2 раза // во столько же раз увеличивается время создания "lowMemoryMode": false, // включить(true)/выключить(false) полную оптимизацию поисковой БД // ускоряет работу поиска, но увеличивает размер БД в 2-3 раза при импорте INPX "fullOptimization": false, // включить(true)/выключить(false) режим "Удаленная библиотека" (сервер) "allowRemoteLib": false, // включить(Object)/выключить(false) режим "Удаленная библиотека" (клиент) // подробнее см. раздел "Удаленная библиотека" ниже "remoteLib": false, // настройки веб-сервера // парамертр root указывает путь для кореневой страницы inpx-web // например для "root": "/library", веб-интерфейс будет доступен по адресу http://127.0.0.1:12380/library // root необходим при настройке reverse-proxy и встраивании inpx-web в уже существующий сервер "server": { "host": "0.0.0.0", "port": "12380", "root": "" }, // настройки opds-сервера // user, password используются для Basic HTTP authentication // параметр root задает путь для доступа к opds-серверу "opds": { "enabled": true, "user": "", "password": "", "root": "/opds" }, // страница для скачивания свежего релиза "latestReleaseLink": "https://github.com/bookpauk/inpx-web/releases/latest", // api для проверки новой версии, // пустая строка - отключить проверку выхода новых версий "checkReleaseLink": "https://api.github.com/repos/bookpauk/inpx-web/releases/latest", // настройки по умолчанию для веб-интерфейса // устанавливаются при первой загрузке страницы в браузере // дальнейшие изменения настроек с помощью веб-интерфейса уже сохраняются в самом браузере "uiDefaults": { "limit": 20, // результатов на странице "downloadAsZip": false, // скачивать книги в виде zip-архива "showCounts": true, // показывать количество "showRates": true, // показывать оценки "showInfo": true, // показывать кнопку (инфо) "showGenres": true, // показывать жанры "showDates": false, // показывать даты поступления "showDeleted": false, // показывать удаленные "abCacheEnabled": true, // кешировать запросы "langDefault": "", // язык по умолчанию (например "ru,en") "showJson": false, // показывать JSON (в расширенном поиске) "showNewReleaseAvailable": true // уведомлять о выходе новой версии } } ``` ### Удаленная библиотека В случае, когда необходимо физически разнести веб-интерфейс и библиотеку файлов на разные машины, приложение может работать в режиме клиент-сервер: веб-интерфейс, поисковый движок и поисковая БД на одной машине (клиент), а библиотека книг и .inpx-файл на другой (сервер). Для этого необходимо развернуть два приложения, первое из которых будет клиентом для второго. На сервере правим `config.json`: ``` "accessPassword": "123456", "allowRemoteLib": true, ``` На клиенте: ``` "remoteLib": { "accessPassword": "123456", "url": "ws://server.host:12380" }, ``` Если сервер работает по протоколу `http://`, то указываем протокол `ws://`, а для `https://` соответственно `wss://`. Пароль не обязателен, но необходим в случае, если сервер тоже "смотрит" в интернет, для ограничения доступа к его веб-интерфейсу. При указании `"remoteLib": {...}` настройки командной строки --inpx и --lib-dir игнорируются, т.к. файлы .inpx-индекса и библиотеки используются удаленно. ### Фильтр по авторам и книгам При создании поисковой БД, во время загрузки и парсинга .inpx-файла, имеется возможность отфильтровать авторов и книги, задав определенные критерии. По умолчанию, для этого небходимо создать в директории конфигурационного файла (там же, где `config.json`) файл `filter.json` следующего вида: ```json { "info": { "collection": "Новое название коллекции", "version": "1.0.0" }, "filter": "(r) => r.del == 0", "includeAuthors": ["Имя автора 1", "Имя автора 2"], "excludeAuthors": ["Имя автора"] } ``` При фильтрации, авторы и их книги из `includeAuthors` будут оставлены, а из `excludeAuthors` исключены. Использование совместно `includeAuthors` и `excludeAuthors` имеет мало смысла, поэтому для включения определенных авторов можно использовать только `includeAuthors`: ```json { "info": { "collection": "Новое название коллекции" }, "includeAuthors": ["Имя автора 1", "Имя автора 2"] } ``` Для исключения: ```json { "info": { "collection": "Новое название коллекции" }, "excludeAuthors": ["Имя автора 1", "Имя автора 2"] } ``` Параметр `filter` используется для более гибкой фильтрации по атрибутам записей из .inpx. Уберем все записи, помеченные как удаленные и исключим "Имя автора 1": ```json { "info": { "collection": "Новое название коллекции" }, "filter": "(inpxRec) => inpxRec.del == 0", "excludeAuthors": ["Имя автора 1"] } ``` Использование `filter` небезопасно, т.к. позволяет выполнить произвольный js-код внутри программы, поэтому запуск приложения в этом случае должен сопровождаться дополнительным параметром командной строки `--unsafe-filter` или разрешением в конфиге `allowUnsafeFilter`. Названия атрибутов inpxRec соответствуют названиям в нижнем регистре из структуры structure.info в .inpx-файле. Файл `filter.json` можно расположить где угодно, что задается параметром `inpxFilterFile` в конфиге. ### Настройка https с помощью nginx Проще всего настроить https с помощью certbot и проксирования в nginx (пример для debian-based linux): ```sh #ставим nginx sudo apt install nginx ``` ``` #правим конфиг nginx server { listen 80; server_name <имя сервера>; set $inpx_web http://127.0.0.1:12380; client_max_body_size 512m; proxy_read_timeout 1h; location / { proxy_pass $inpx_web; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } ``` ```sh #загружаем новый конфиг sudo service nginx reload ``` Далее следовать инструкции установки https://certbot.eff.org/instructions?ws=nginx&os=debianbuster ### Сборка релизов Сборка только в среде Linux. Необходима версия node.js не ниже 16. Для сборки linux-arm64 необходимо предварительно установить [QEMU](https://wiki.debian.org/QemuUserEmulation). ```sh git clone https://github.com/bookpauk/inpx-web cd inpx-web npm i npm run release ``` Результат сборки будет доступен в каталоге `dist/release` ### Запуск без сборки релиза Т.к. сборщик pkg поддерживает не все платформы, то не всегда удается собрать релиз. Однако, можно скачать и запустить inpx-web нативным путем, с помощью nodejs. Ниже пример для Ubuntu, для других линуксов различия не принципиальны: ```sh # установка nodejs v16 и выше: curl -s https://deb.nodesource.com/setup_16.x | sudo bash sudo apt install nodejs -y # подготовка git clone https://github.com/bookpauk/inpx-web cd inpx-web npm i npm run build:client && node build/prepkg.js linux # удалим файл development-среды, чтобы запускался в production-режиме rm ./server/config/application_env # запуск inpx-web, тут же будет создан каталог .inpx-web node server --app-dir=.inpx-web ``` ### Разработка ```sh npm run dev ``` Связаться с автором проекта: [bookpauk@gmail.com](mailto:bookpauk@gmail.com)