MediaShelf/docker-compose.yml
Jess Hallsworth c0becae3ed
Build in-place for a Portainer git stack
No registry exists yet and there is no SSH onto Nox, so Portainer clones this
repo there and compose builds the image on the box. Adds build: . and moves the
default host port to 8086, which is free on Nox (808x is crowded).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GVbG48GAXfCZatcmX123Ra
2026-09-10 13:54:16 +00:00

64 lines
2.4 KiB
YAML

# Portainer stack for Nox. See docs/design.md §11.3.
#
# Every variable the app reads MUST be listed under `environment:` here.
# A variable set in Portainer's UI but absent from this file silently does
# nothing — the trap that bit PLAYERMAP_SHOW_GMS on the Mythica stack.
#
# Deployed as a Portainer *git* stack: Portainer clones this repo onto Nox and
# `docker compose up` builds the image there, so no registry is needed. The
# image: tag still pins a real version so a redeploy replaces it predictably
# rather than reusing a stale :latest.
services:
mediashelf:
image: ${MEDIASHELF_IMAGE:-mediashelf:0.1.0}
build: .
container_name: mediashelf
restart: unless-stopped
ports:
- "${MEDIASHELF_PORT:-8086}:8080"
volumes:
- mediashelf_data:/data
environment:
- MEDIASHELF_SECRET_KEY=${MEDIASHELF_SECRET_KEY}
- LOG_LEVEL=${LOG_LEVEL:-INFO}
- TZ=${TZ:-America/Regina}
- PLEX_BASE_URL=${PLEX_BASE_URL}
- PLEX_TOKEN=${PLEX_TOKEN}
- PLEX_VERIFY_SSL=${PLEX_VERIFY_SSL:-true}
- PLEX_TIMEOUT_S=${PLEX_TIMEOUT_S:-30}
- PLEX_PAGE_SIZE=${PLEX_PAGE_SIZE:-500}
- PLEX_REQUEST_DELAY_MS=${PLEX_REQUEST_DELAY_MS:-0}
- TAUTULLI_BASE_URL=${TAUTULLI_BASE_URL}
- TAUTULLI_API_KEY=${TAUTULLI_API_KEY}
- TAUTULLI_TIMEOUT_S=${TAUTULLI_TIMEOUT_S:-30}
- TAUTULLI_PAGE_SIZE=${TAUTULLI_PAGE_SIZE:-1000}
- HISTORY_SOURCE=${HISTORY_SOURCE:-auto}
- SESSION_MERGE_WINDOW_H=${SESSION_MERGE_WINDOW_H:-6}
- COMPLETION_THRESHOLD=${COMPLETION_THRESHOLD:-85}
- ABANDON_CEILING=${ABANDON_CEILING:-15}
- DATABASE_PATH=/data/mediashelf.db
- SCAN_SCHEDULE_CRON=${SCAN_SCHEDULE_CRON:-0 4 * * *}
- SCAN_FULL_SWEEP_CRON=${SCAN_FULL_SWEEP_CRON:-0 3 * * 0}
- SCAN_ON_STARTUP=${SCAN_ON_STARTUP:-false}
- SCAN_LOCK_TIMEOUT_S=${SCAN_LOCK_TIMEOUT_S:-7200}
- SCHEDULER_ENABLED=${SCHEDULER_ENABLED:-true}
- SCORE_STALE_HORIZON_DAYS=${SCORE_STALE_HORIZON_DAYS:-730}
- SCORE_AGE_HORIZON_DAYS=${SCORE_AGE_HORIZON_DAYS:-1095}
- SCORE_POPULAR_AT=${SCORE_POPULAR_AT:-3}
- SCORE_REJECTED_AT=${SCORE_REJECTED_AT:-2}
- SCORE_SOLITUDE_AT=${SCORE_SOLITUDE_AT:-3}
- SCORE_GRACE_DAYS=${SCORE_GRACE_DAYS:-30}
- SCORE_RECENT_DAYS=${SCORE_RECENT_DAYS:-90}
# Empty by default. Nothing is ever kept unless someone says so (§6.6).
- KEEP_ALL_LIBRARIES=${KEEP_ALL_LIBRARIES:-}
volumes:
mediashelf_data: