services: postgres: image: postgres:16-alpine environment: POSTGRES_USER: ${POSTGRES_USER:-mangalord} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-mangalord} POSTGRES_DB: ${POSTGRES_DB:-mangalord} volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-mangalord}"] interval: 5s timeout: 5s retries: 10 backend: build: ./backend depends_on: postgres: condition: service_healthy environment: DATABASE_URL: postgres://${POSTGRES_USER:-mangalord}:${POSTGRES_PASSWORD:-mangalord}@postgres:5432/${POSTGRES_DB:-mangalord} BIND_ADDRESS: 0.0.0.0:8080 STORAGE_DIR: /var/lib/mangalord/storage RUST_LOG: ${RUST_LOG:-info,mangalord=debug} # Auth / cookies — see .env.example for context. COOKIE_SECURE: ${COOKIE_SECURE:-true} COOKIE_DOMAIN: ${COOKIE_DOMAIN:-} SESSION_TTL_DAYS: ${SESSION_TTL_DAYS:-30} # CORS — same-origin by default; populate when serving the API on # a different host than the frontend. CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-} # Upload limits. MAX_REQUEST_BYTES: ${MAX_REQUEST_BYTES:-209715200} MAX_FILE_BYTES: ${MAX_FILE_BYTES:-20971520} volumes: - storage-data:/var/lib/mangalord/storage # No host port mapping in the default setup — the frontend proxies # /api/* through its hooks.server.ts. Expose :8080 only if you want # to hit the API directly from the host (e.g., bot scripts during # development). expose: - "8080" frontend: build: ./frontend depends_on: - backend environment: # SvelteKit's hooks.server.ts proxies /api/* to this URL so the # browser only ever talks to :3000 and cookies stay same-origin. BACKEND_URL: http://backend:8080 ports: - "3000:3000" volumes: postgres-data: storage-data: