services: postgres: image: postgres:16-alpine container_name: hr-lab-postgres environment: POSTGRES_DB: hr_lab POSTGRES_USER: hr_app POSTGRES_PASSWORD: hr_app_password ports: - "5432:5432" volumes: - postgres-data:/var/lib/postgresql/data - ../storage/backups:/backups healthcheck: test: ["CMD-SHELL", "pg_isready -U hr_app -d hr_lab"] interval: 10s timeout: 5s retries: 10 redis: image: redis:7-alpine container_name: hr-lab-redis ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 10 rabbitmq: image: rabbitmq:3.13-management-alpine container_name: hr-lab-rabbitmq environment: RABBITMQ_DEFAULT_USER: hr_app RABBITMQ_DEFAULT_PASS: hr_app_password ports: - "5672:5672" - "15672:15672" healthcheck: test: ["CMD", "rabbitmq-diagnostics", "ping"] interval: 10s timeout: 5s retries: 10 backend: build: context: .. dockerfile: deploy/backend.Dockerfile container_name: hr-lab-backend environment: SPRING_PROFILES_ACTIVE: lab DB_URL: jdbc:postgresql://postgres:5432/hr_lab DB_USERNAME: hr_app DB_PASSWORD: hr_app_password REDIS_HOST: redis RABBITMQ_HOST: rabbitmq RABBITMQ_USERNAME: hr_app RABBITMQ_PASSWORD: hr_app_password JWT_SECRET: local-development-secret-please-change-32bytes TASKS_INLINE: "true" LAB_EMPLOYEE_COUNT: "2000" LAB_CANDIDATE_COUNT: "500" LAB_ATTENDANCE_DAYS: "180" EXPORT_DIR: /app/storage/exports IMPORT_DIR: /app/storage/imports ports: - "8080:8080" volumes: - ../storage:/app/storage depends_on: postgres: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy frontend: build: context: .. dockerfile: deploy/frontend.Dockerfile container_name: hr-lab-frontend ports: - "5173:80" depends_on: - backend volumes: postgres-data: