services: postgres: image: postgres:17-alpine restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 backend: build: context: ./backend restart: unless-stopped depends_on: postgres: condition: service_healthy environment: APP_ENV: ${APP_ENV} APP_PUBLIC_URL: ${APP_PUBLIC_URL} APP_TIMEZONE: ${APP_TIMEZONE} HTTP_ADDR: ${HTTP_ADDR} LOG_LEVEL: ${LOG_LEVEL} SUPER_ADMIN_EMAIL: ${SUPER_ADMIN_EMAIL} SUPER_ADMIN_PASSWORD: ${SUPER_ADMIN_PASSWORD} DATABASE_URL: ${DATABASE_URL} JWT_SECRET: ${JWT_SECRET} JWT_ACCESS_TOKEN_TTL_MINUTES: ${JWT_ACCESS_TOKEN_TTL_MINUTES} JWT_REFRESH_TOKEN_TTL_DAYS: ${JWT_REFRESH_TOKEN_TTL_DAYS} CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS} CALENDAR_PROVIDER: ${CALENDAR_PROVIDER} CALENDAR_API_BASE_URL: ${CALENDAR_API_BASE_URL} CALENDAR_API_KEY: ${CALENDAR_API_KEY} CALENDAR_CACHE_TTL_HOURS: ${CALENDAR_CACHE_TTL_HOURS} SMTP_HOST: ${SMTP_HOST} SMTP_PORT: ${SMTP_PORT} SMTP_USER: ${SMTP_USER} SMTP_PASSWORD: ${SMTP_PASSWORD} SMTP_FROM_EMAIL: ${SMTP_FROM_EMAIL} SMTP_FROM_NAME: ${SMTP_FROM_NAME} UPLOAD_MAX_SIZE_MB: ${UPLOAD_MAX_SIZE_MB} UPLOAD_ALLOWED_MIME_TYPES: ${UPLOAD_ALLOWED_MIME_TYPES} STORAGE_DRIVER: ${STORAGE_DRIVER} STORAGE_LOCAL_PATH: ${STORAGE_LOCAL_PATH} volumes: - uploads:/var/lib/mira/uploads ports: - "${BACKEND_PORT:-8080}:8080" frontend: build: context: ./frontend args: VITE_API_BASE_URL: ${VITE_API_BASE_URL} restart: unless-stopped depends_on: - backend ports: - "${FRONTEND_PORT:-5173}:80" volumes: postgres_data: uploads: