diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ce7d9dd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +FROM node:20-alpine as build + +WORKDIR /app +ENV PATH /app/node_modules/.bin:$PATH +COPY .babelrc .eslintrc nodemon.json package-lock.json package.json README.md ./ +COPY build ./build/ +COPY client ./client/ +COPY server ./server/ + +RUN apk add zip +RUN npm install +RUN npm run build:client +RUN node build/prepkg.js linux +RUN pkg -t node18-linux-x64 -C Brotli --options max-old-space-size=4096,expose-gc -o dist/linux/inpx-web . + +# Build the prod image +FROM alpine:latest + +# Move to /dist directory as the place for resulting binary folder +WORKDIR /app +RUN apk add libgcc libstdc++ gcompat curl +RUN mkdir -m 0777 data +COPY docker_entrypoint.sh entrypoint.sh +COPY --from=build /app/dist/linux/inpx-web . + +EXPOSE 12380 + +HEALTHCHECK CMD curl --fail http://localhost:12380 || exit 1 + +ENTRYPOINT [ "/app/entrypoint.sh" ] diff --git a/README.md b/README.md index c325110..3af254c 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ OPDS-сервер доступен по адресу [http://127.0.0.1:12380/opd [Отблагодарить автора проекта](https://donatty.com/liberama) +## ## * [Возможности программы](#capabilities) * [Использование](#usage) @@ -32,6 +33,7 @@ OPDS-сервер доступен по адресу [http://127.0.0.1:12380/opd * [Сборка релизов](#build) * [Запуск без сборки релиза](#native_run) * [Разработка](#development) +* [Запуск в docker](#docker) @@ -110,7 +112,7 @@ Options: // пустая строка: использовать значение по умолчанию - inpx-файл, что найдется в директории библиотеки "inpx": "", - // конфигурационный файл для фильра по авторам и книгам (см. ниже) + // конфигурационный файл для фильтра по авторам и книгам (см. ниже) // пустая строка: использовать значение по умолчанию - файл filter.json в директории файла конфигурации "inpxFilterFile": "", @@ -410,4 +412,22 @@ node server --app-dir=.inpx-web npm run dev ``` + + +### Запуск в docker + +Сборка: +```sh +docker build -t inpx-web . +``` + +Запуск: +```sh +docker run -v /path/to/library:/library:ro --user=1000 -p 12380:12380 inpx-web +``` + +- В этом случае база данных и конфигурация будут пересоздаваться при каждом запуске. Для того, что сделать конфигурацию персистентной примонтируйте каталог в /app/data добавлением параметра в docker run: `-v /path/to/app_data:/app_data` +- Использование индекса, находящегося не в директории с библиотекой - передайте в docker run: `-v /path/to/index/flibusta.inpx:/app/index.inpx:ro -e INDEX_FILE=/app/index.inpx` +- Если используется персистентная конфигурация (см выше), но нужно перечитывать индекс при каждом запуске передайте в docker run: `-e RECREATE=1` + Связаться с автором проекта: [bookpauk@gmail.com](mailto:bookpauk@gmail.com) \ No newline at end of file diff --git a/docker_entrypoint.sh b/docker_entrypoint.sh new file mode 100755 index 0000000..a8a8bc8 --- /dev/null +++ b/docker_entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +OPTS="--lib-dir=/library --app-dir=/app/data" + +[ -z ${INDEX_FILE+x} ] || OPTS="$OPTS --inpx=\"${INDEX_FILE}\"" +[ -z ${RECREATE+x} ] || OPTS="$OPTS --recreate" + +echo Starting ./inpx-web $OPTS +./inpx-web $OPTS \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 94eead9..b940eec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "inpx-web", - "version": "1.5.7", + "version": "1.5.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "inpx-web", - "version": "1.5.7", + "version": "1.5.8", "hasInstallScript": true, "license": "CC0-1.0", "dependencies": { diff --git a/package.json b/package.json index 0b78227..74fc7f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "inpx-web", - "version": "1.5.7", + "version": "1.5.8", "author": "Book Pauk ", "license": "CC0-1.0", "repository": "bookpauk/inpx-web", diff --git a/server/config/index.js b/server/config/index.js index fc170e1..307ac66 100644 --- a/server/config/index.js +++ b/server/config/index.js @@ -52,7 +52,7 @@ class ConfigManager { return instance; } - async init(tempDataDir, configFile) { + async init(defaultDataDir, configFile) { if (this.inited) throw new Error('already inited'); @@ -69,14 +69,15 @@ class ConfigManager { this.branchConfigFile = __dirname + `/${this.branch}.js`; const config = require(this.branchConfigFile); - if (!tempDataDir) { - tempDataDir = `${config.execDir}/.${config.name}`; + if (!defaultDataDir) { + defaultDataDir = `${config.execDir}/.${config.name}`; } if (configFile) { config.configFile = path.resolve(configFile); } else { - config.configFile = `${tempDataDir}/config.json`; + await fs.ensureDir(defaultDataDir); + config.configFile = `${defaultDataDir}/config.json`; } this._config = config;