services: db: image: postgres:16-alpine environment: POSTGRES_USER: gates POSTGRES_PASSWORD: gates POSTGRES_DB: gates volumes: - pgdata:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U gates -d gates"] interval: 5s timeout: 5s retries: 10 backend: build: ./backend environment: DATABASE_URL: postgresql+psycopg2://gates:gates@db:5432/gates SECRET_KEY: ${SECRET_KEY:-dev-secret-change-me} TOKEN_TTL_SECONDS: ${TOKEN_TTL_SECONDS:-300} JWT_TTL_SECONDS: ${JWT_TTL_SECONDS:-28800} EXPIRATION_SCAN_SECONDS: ${EXPIRATION_SCAN_SECONDS:-60} CORS_ORIGINS: ${CORS_ORIGINS:-*} RUN_EXPIRATION_WORKER: "true" depends_on: db: condition: service_healthy ports: - "8000:8000" frontend: build: ./frontend environment: VITE_BACKEND_URL: http://backend:8000 VITE_API_URL: /api depends_on: - backend ports: - "5173:5173" volumes: pgdata: