version: "3" services: # Database (Postgres) postgres: image: postgres restart: unless-stopped ports: - ${POSTGRES_PORT:-5432}:5432 volumes: - postgres_data:/var/lib/postgresql/data environment: POSTGRES_DB: ${POSTGRES_DB:-postgres} POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} healthcheck: test: ["CMD", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-postgres}"] interval: 10s timeout: 5s retries: 5 # Storage (for image uploads) minio: image: minio/minio restart: unless-stopped command: server /data ports: - ${STORAGE_PORT:-9000}:9000 - 9001:9001 # Minio Console (Optional) volumes: - minio_data:/data environment: MINIO_ADDRESS: :9000 MINIO_CONSOLE_ADDRESS: :9001 MINIO_ROOT_USER: ${STORAGE_ACCESS_KEY:-minioadmin} MINIO_ROOT_PASSWORD: ${STORAGE_SECRET_KEY:-minioadmin} healthcheck: test: ["CMD", "curl -f http://minio:9000/minio/health/live"] start_period: 40s interval: 30s timeout: 10s retries: 3 # Chrome Browser (for printing and previews) chrome: image: browserless/chrome restart: unless-stopped ports: - ${CHROME_PORT:-8080}:3000 environment: TOKEN: ${CHROME_TOKEN:-chrome_token} EXIT_ON_HEALTH_FAILURE: true PRE_REQUEST_HEALTH_CHECK: true # Redis (for cache & server session management) redis: image: redis restart: unless-stopped command: redis-server --requirepass ${REDIS_PASSWORD:-password} ports: - ${REDIS_PORT:-6379}:6379 volumes: - redis_data:/data volumes: minio_data: redis_data: postgres_data: