# Self-contained local development stack — Postgres + API + scheduler + worker, all on this machine. # An OVERRIDE of docker-compose.yml, not a copy of it: only what local development changes lives # here, so the two cannot drift apart (they had — the worker here lost its wait for the API's # migrations). # # docker compose -f docker-compose.yml -f docker-compose.localdev.yml up -d --build # # Fully decoupled: its own local database (a Docker volume) and its own scheduler, so there is no # shared DB and no migration coupling with any other instance. Browse at http://localhost:8080 — # Google login works because the OAuth redirect is http://localhost:8080/auth/callback. The API runs # `alembic upgrade head` on startup, so it applies local migrations to THIS local DB only. Seed the # catalog once with a pg_dump from another instance if you want real data (see RUNBOOK). services: db: # Harmless on Docker Desktop; needed on some nested/hardened Docker hosts (every service below). security_opt: - apparmor:unconfined api: environment: # This instance owns its scheduler (its own DB, so no double-write concern). SCHEDULER_ENABLED: "true" # Plex HLS remux scratch on fast container-local storage (the /downloads bind-mount is a slow # Windows Docker Desktop mount in dev; prod uses fast local disk so it keeps the default). PLEX_HLS_DIR: /var/tmp/plex-hls security_opt: - apparmor:unconfined volumes: # Downloaded media lives on the host so you can inspect the generated Plex tree. Gitignored. - ./downloads:/downloads - plex_media:/plex-media:ro worker: security_opt: - apparmor:unconfined volumes: - ./downloads:/downloads - plex_media:/plex-media:ro bgutil-pot: security_opt: - apparmor:unconfined volumes: # OPTIONAL (Plex integration dev testing): the Plex media, mounted READ-ONLY so the container can # play the physical file locally (this dev box isn't the Plex host). Only referenced when the Plex # module is enabled; harmless otherwise. Point PLEX_MEDIA_HOST_PATH (.env, gitignored, so no site # path lives in the tracked compose) at the Docker-Desktop host path (e.g. # /run/desktop/mnt/host/d/plex-test-media for D:\plex-test-media), mirroring the Plex server's # /data//… layout so plex_path_map (/data=/plex-media) resolves. plex_media: driver: local driver_opts: type: none o: bind device: "${PLEX_MEDIA_HOST_PATH:-/run/desktop/mnt/host/d/plex-test-media}"