services: app: build: . ports: - "5000:5000" depends_on: db: condition: service_healthy volumes: - app_data:/data # To use a bind mount instead (gives direct host access to all app data): # - ./data:/data environment: DATABASE_URL: "postgresql+asyncpg://${POSTGRES_USER:-scribe}:${POSTGRES_PASSWORD:-scribe}@db:5432/${POSTGRES_DB:-scribe}" SECRET_KEY: "${SECRET_KEY:-dev-secret-change-me}" # Uncomment if you have a SearXNG instance you want to surface in the # Integrations tab as a configured web-search backend: # SEARXNG_URL: "http://searxng:8080" healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:5000/api/health')"] interval: 10s timeout: 5s retries: 5 start_period: 30s db: image: postgres:16-alpine stop_grace_period: 120s restart: unless-stopped volumes: - pgdata:/var/lib/postgresql/data environment: POSTGRES_USER: ${POSTGRES_USER:-scribe} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-scribe} POSTGRES_DB: ${POSTGRES_DB:-scribe} # Lenient by design: a transient host exec/healthcheck stall must never # escalate to killing the DB. Health here only gates app startup order. healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-scribe}"] interval: 30s timeout: 10s retries: 10 start_period: 180s volumes: pgdata: app_data: