Deploy BookOrbit on media-core
This commit is contained in:
@@ -0,0 +1,14 @@
|
|||||||
|
# BookOrbit on media-core
|
||||||
|
|
||||||
|
- Web: `http://192.168.50.46:3000`
|
||||||
|
- Book library: `/mnt/truenas/multimedia/books` -> `/books`
|
||||||
|
- Book Dock: `/mnt/truenas/multimedia/curator/staging/bookorbit` -> `/book-dock`
|
||||||
|
- App data: `/opt/media-core/appdata/bookorbit/app`
|
||||||
|
- PostgreSQL: `/opt/media-core/appdata/bookorbit/postgres`
|
||||||
|
- Secrets: `/opt/media-core/appdata/bookorbit/secrets` (`0600`, not in Git)
|
||||||
|
|
||||||
|
Create the first library with container path `/books`. Do not later widen or replace that root without a database backup and a tested migration: BookOrbit currently has an open issue where root-folder changes can duplicate books or lose metadata and reading progress.
|
||||||
|
|
||||||
|
The existing Curator and BookOrbit share the final book files, but they do not share databases. During the initial evaluation, keep BookOrbit automatic file rename and metadata write-back disabled. Use Book Dock for reviewed imports and retain Curator as the control ledger until BookOrbit integration is explicitly designed.
|
||||||
|
|
||||||
|
Before upgrades, create a PostgreSQL dump and back up `/opt/media-core/appdata/bookorbit/app`. Image tags are descriptive and digests are authoritative.
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
x-arcane:
|
||||||
|
icon: bookorbit
|
||||||
|
urls:
|
||||||
|
- https://bookorbit.app/
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: ghcr.io/bookorbit/bookorbit:3.1.0@sha256:78b6eac18306eb7eba0dbf6592ecdee01b15f24de9a941cb853db4a0232d7999
|
||||||
|
container_name: bookorbit-app
|
||||||
|
restart: unless-stopped
|
||||||
|
init: true
|
||||||
|
depends_on:
|
||||||
|
postgres:
|
||||||
|
condition: service_healthy
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
environment:
|
||||||
|
NODE_ENV: production
|
||||||
|
PORT: "3000"
|
||||||
|
APP_URL: http://192.168.50.46:3000
|
||||||
|
CLIENT_URL: http://192.168.50.46:3000
|
||||||
|
POSTGRES_HOST: postgres
|
||||||
|
POSTGRES_PORT: "5432"
|
||||||
|
POSTGRES_USER: bookorbit
|
||||||
|
POSTGRES_DB: bookorbit
|
||||||
|
POSTGRES_PASSWORD_FILE: /run/secrets/postgres_password
|
||||||
|
JWT_SECRET_FILE: /run/secrets/jwt_secret
|
||||||
|
PODCAST_ENCRYPTION_KEY_FILE: /run/secrets/podcast_encryption_key
|
||||||
|
SETUP_BOOTSTRAP_TOKEN_FILE: /run/secrets/setup_bootstrap_token
|
||||||
|
EMAIL_ENCRYPTION_KEY_FILE: /run/secrets/email_encryption_key
|
||||||
|
MIGRATION_ENCRYPTION_KEY_FILE: /run/secrets/migration_encryption_key
|
||||||
|
BOOK_REQUEST_ENCRYPTION_KEY_FILE: /run/secrets/book_request_encryption_key
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
PUID: "1000"
|
||||||
|
PGID: "1000"
|
||||||
|
NODE_MAX_OLD_SPACE_SIZE: "2048"
|
||||||
|
BOOK_DOCK_PATH: /book-dock
|
||||||
|
LIBRARY_BROWSE_ROOT: /books
|
||||||
|
DISABLE_LOCAL_AUTH: "false"
|
||||||
|
volumes:
|
||||||
|
- type: bind
|
||||||
|
source: /mnt/truenas/multimedia/books
|
||||||
|
target: /books
|
||||||
|
bind:
|
||||||
|
create_host_path: false
|
||||||
|
- type: bind
|
||||||
|
source: /mnt/truenas/multimedia/curator/staging/bookorbit
|
||||||
|
target: /book-dock
|
||||||
|
bind:
|
||||||
|
create_host_path: false
|
||||||
|
- type: bind
|
||||||
|
source: /opt/media-core/appdata/bookorbit/app
|
||||||
|
target: /data
|
||||||
|
bind:
|
||||||
|
create_host_path: false
|
||||||
|
secrets:
|
||||||
|
- postgres_password
|
||||||
|
- jwt_secret
|
||||||
|
- podcast_encryption_key
|
||||||
|
- setup_bootstrap_token
|
||||||
|
- email_encryption_key
|
||||||
|
- migration_encryption_key
|
||||||
|
- book_request_encryption_key
|
||||||
|
read_only: true
|
||||||
|
tmpfs:
|
||||||
|
- /tmp
|
||||||
|
cap_drop:
|
||||||
|
- ALL
|
||||||
|
cap_add:
|
||||||
|
- CHOWN
|
||||||
|
- DAC_OVERRIDE
|
||||||
|
- FOWNER
|
||||||
|
- SETGID
|
||||||
|
- SETUID
|
||||||
|
security_opt:
|
||||||
|
- no-new-privileges:true
|
||||||
|
healthcheck:
|
||||||
|
test:
|
||||||
|
- CMD
|
||||||
|
- node
|
||||||
|
- -e
|
||||||
|
- const p=process.env.PORT||3000;fetch('http://127.0.0.1:'+p+'/api/v1/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))
|
||||||
|
interval: 30s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
start_period: 60s
|
||||||
|
stop_grace_period: 30s
|
||||||
|
labels:
|
||||||
|
com.getarcaneapp.arcane.icon: bookorbit
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: 10m
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
postgres:
|
||||||
|
image: pgvector/pgvector:pg18@sha256:2ba9ca5f2e7daa0f0e7723cba1ee9167bab54efd3640516a44ac1a928dd67e7a
|
||||||
|
container_name: bookorbit-db
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: bookorbit
|
||||||
|
POSTGRES_PASSWORD_FILE: /run/secrets/postgres_password
|
||||||
|
POSTGRES_DB: bookorbit
|
||||||
|
PGDATA: /var/lib/postgresql/data/pgdata
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
volumes:
|
||||||
|
- type: bind
|
||||||
|
source: /opt/media-core/appdata/bookorbit/postgres
|
||||||
|
target: /var/lib/postgresql/data
|
||||||
|
bind:
|
||||||
|
create_host_path: false
|
||||||
|
secrets:
|
||||||
|
- postgres_password
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "pg_isready -U \"$$POSTGRES_USER\" -d \"$$POSTGRES_DB\""]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
|
start_period: 30s
|
||||||
|
security_opt:
|
||||||
|
- no-new-privileges:true
|
||||||
|
stop_grace_period: 60s
|
||||||
|
labels:
|
||||||
|
com.getarcaneapp.arcane.icon: postgres
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: 10m
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
secrets:
|
||||||
|
postgres_password:
|
||||||
|
file: /opt/media-core/appdata/bookorbit/secrets/postgres_password
|
||||||
|
jwt_secret:
|
||||||
|
file: /opt/media-core/appdata/bookorbit/secrets/jwt_secret
|
||||||
|
podcast_encryption_key:
|
||||||
|
file: /opt/media-core/appdata/bookorbit/secrets/podcast_encryption_key
|
||||||
|
setup_bootstrap_token:
|
||||||
|
file: /opt/media-core/appdata/bookorbit/secrets/setup_bootstrap_token
|
||||||
|
email_encryption_key:
|
||||||
|
file: /opt/media-core/appdata/bookorbit/secrets/email_encryption_key
|
||||||
|
migration_encryption_key:
|
||||||
|
file: /opt/media-core/appdata/bookorbit/secrets/migration_encryption_key
|
||||||
|
book_request_encryption_key:
|
||||||
|
file: /opt/media-core/appdata/bookorbit/secrets/book_request_encryption_key
|
||||||
Reference in New Issue
Block a user