media-rip/docker-compose.yml
xpltd 5a6eb00906 Docker self-hosting: fix persistence, add data_dir config
Critical fix:
- Dockerfile env var was MEDIARIP__DATABASE__PATH (ignored) — now MEDIARIP__SERVER__DB_PATH
  DB was landing at /app/mediarip.db (lost on restart) instead of /data/mediarip.db

Persistence model:
- /downloads → media files (bind mount recommended)
- /data → SQLite DB, session cookies, error logs (named volume)
- /themes → custom CSS themes (read-only bind mount)
- /app/config.yaml → optional YAML config (read-only bind mount)

Other changes:
- Add server.data_dir config field (default: /data) for explicit session storage
- Cookie storage uses data_dir instead of fragile path math from output_dir parent
- Lifespan creates data_dir on startup
- .dockerignore excludes tests, dev DB, egg-info
- docker-compose.yml: inline admin/purge config examples
- docker-compose.example.yml: parameterized with env vars
- .env.example: session mode, clearer docs
- README: Docker volumes table, admin setup docs, full config reference
- PROJECT.md: reflects completed v1.0 state
- REQUIREMENTS.md: all 26 requirements validated
2026-03-19 09:56:10 -05:00

40 lines
1.3 KiB
YAML

# media.rip() — Zero-Config Docker Compose
#
# Usage:
# docker compose up
#
# The app will be available at http://localhost:8080
# Downloads are persisted in ./downloads/
# Database + session state persisted in the mediarip-data volume.
services:
mediarip:
image: ghcr.io/xpltdco/media-rip:latest
# build: . # Uncomment to build from source
ports:
- "8080:8000"
volumes:
- ./downloads:/downloads # Downloaded media files (browsable)
- mediarip-data:/data # Database, sessions, error logs
# Optional:
# - ./themes:/themes:ro # Custom theme CSS overrides
# - ./config.yaml:/app/config.yaml:ro # YAML config file
environment:
- MEDIARIP__SESSION__MODE=isolated
# Admin panel (disabled by default):
# - MEDIARIP__ADMIN__ENABLED=true
# - MEDIARIP__ADMIN__USERNAME=admin
# - MEDIARIP__ADMIN__PASSWORD_HASH=$2b$12$...your.bcrypt.hash...
# Auto-purge (disabled by default):
# - MEDIARIP__PURGE__ENABLED=true
# - MEDIARIP__PURGE__MAX_AGE_HOURS=168
restart: unless-stopped
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health')"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
volumes:
mediarip-data: