services: db: image: postgres:17-alpine restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env} POSTGRES_DB: ${POSTGRES_DB:-buildbase} # Only expose DB port in development — remove or comment out in production # ports: # - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-postgres}'] interval: 5s timeout: 5s retries: 5 deploy: resources: limits: memory: 512M app: build: . restart: unless-stopped ports: - '3000:3000' env_file: - .env environment: DATABASE_URL: postgres://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB:-buildbase} depends_on: db: condition: service_healthy read_only: true tmpfs: - /tmp deploy: resources: limits: memory: 1G volumes: pgdata: