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;