services: postgres: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} POSTGRES_DB: ${POSTGRES_DB:-fiscal} volumes: - postgres_data:/var/lib/postgresql/data expose: - "5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-fiscal}"] interval: 5s timeout: 5s retries: 10 backend: build: context: ./backend dockerfile: Dockerfile restart: unless-stopped env_file: - path: ./.env required: false - path: ../.env required: false environment: DATABASE_URL: ${DATABASE_URL:-postgres://postgres:postgres@postgres:5432/fiscal} PORT: ${PORT:-3001} POSTGRES_HOST: postgres BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:-local-dev-better-auth-secret-change-me} BETTER_AUTH_BASE_URL: ${BETTER_AUTH_BASE_URL:-http://localhost:3001} FRONTEND_URL: ${FRONTEND_URL:-http://localhost:3000} expose: - "3001" depends_on: postgres: condition: service_healthy healthcheck: test: ["CMD-SHELL", "wget -q --spider http://localhost:3001/api/health || exit 1"] interval: 30s timeout: 10s retries: 3 frontend: build: context: ./frontend dockerfile: Dockerfile args: NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://backend:3001} restart: unless-stopped environment: PORT: 3000 HOSTNAME: 0.0.0.0 NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://backend:3001} expose: - "3000" depends_on: - backend volumes: postgres_data: