services: db: image: postgres:16-alpine environment: POSTGRES_USER: catmap POSTGRES_PASSWORD: catmap POSTGRES_DB: catmap ports: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U catmap"] interval: 5s timeout: 3s retries: 10 backend: build: ./backend environment: # Fixed for local Docker: must point at the "db" service, not localhost. DATABASE_URL: postgresql+psycopg://catmap:catmap@db:5432/catmap CORS_ORIGINS: "*" PUBLIC_SITE_URL: http://localhost:5173 PORT: "8000" # Overridable from your shell or repo-root .env (defaults match the app's). ADMIN_TOKEN: ${ADMIN_TOKEN:-} MAX_UPLOAD_MB: ${MAX_UPLOAD_MB:-10} AUTO_HIDE_THRESHOLD: ${AUTO_HIDE_THRESHOLD:-3} STALE_AFTER_DAYS: ${STALE_AFTER_DAYS:-30} RATE_LIMIT_CREATE: ${RATE_LIMIT_CREATE:-20/hour} RATE_LIMIT_CONFIRM: ${RATE_LIMIT_CONFIRM:-120/hour} RATE_LIMIT_REPORT: ${RATE_LIMIT_REPORT:-40/hour} CAT_DETECTION_ENABLED: ${CAT_DETECTION_ENABLED:-true} CAT_DETECTION_THRESHOLD: ${CAT_DETECTION_THRESHOLD:-0.20} CAT_DETECTION_ANIMAL_THRESHOLD: ${CAT_DETECTION_ANIMAL_THRESHOLD:-0.30} CAT_DETECTION_STRICT: ${CAT_DETECTION_STRICT:-true} TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN:-} TELEGRAM_CHAT_ID: ${TELEGRAM_CHAT_ID:-} GOOGLE_CLIENT_IDS: ${GOOGLE_CLIENT_IDS:-} RESEND_API_KEY: ${RESEND_API_KEY:-} EMAIL_FROM: ${EMAIL_FROM:-CatMap } SESSION_TTL_DAYS: ${SESSION_TTL_DAYS:-90} RATE_LIMIT_AUTH: ${RATE_LIMIT_AUTH:-20/hour} ports: - "8000:8000" depends_on: db: condition: service_healthy frontend: build: context: ./frontend args: VITE_API_BASE: "" environment: PORT: "80" BACKEND_URL: http://backend:8000 BACKEND_HOST: backend ports: - "5173:80" depends_on: - backend volumes: pgdata: