name: 'rollout-v5-stable'

services:
  # ==========================================
  # Edge Proxy (NGINX)
  # ==========================================
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    command: [ "/bin/sh", "-c", "sleep 160 && nginx -g 'daemon off;'" ]
    depends_on:
      - launch
      - ui
      - test
      - api-gateway
      - registry-server
      - grafana

  # ==========================================
  # Frontend Services
  # ==========================================
  launch:
    image: rolloutio/launch-web:5.0.1
    container_name: launch-web
    restart: always

  ui:
    image: rolloutio/dashboard-app:5.0.1
    container_name: dashboard-app
    restart: always

  test:
    image: rolloutio/test-app:5.0.1
    container_name: test-app
    restart: always

  # ==========================================
  # Infrastructure Services
  # ==========================================
  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    restart: always
    environment:
      - RABBITMQ_DEFAULT_USER=guest
      - RABBITMQ_DEFAULT_PASS=guest
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq
    healthcheck:
      test: [ "CMD", "rabbitmq-diagnostics", "-q", "ping" ]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:latest
    container_name: redis
    restart: always
    volumes:
      - redis_data:/data
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 10s
      timeout: 5s
      retries: 5

  # ==========================================
  # Monitoring Services
  # ==========================================
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: always
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: always
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_SERVER_DOMAIN=localhost
      - GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s/grafana/
      - GF_SERVER_SERVE_FROM_SUB_PATH=true
    volumes:
      - grafana_data:/var/lib/grafana
    depends_on:
      - prometheus

  # ==========================================
  # Microservices (Rollout.io)
  # ==========================================
  registry-server:
    image: rolloutio/registry-server:5.0.1
    container_name: registry-server
    restart: always
    entrypoint: [ "sh", "-c", "sleep 30 && java -jar app.jar" ]
    depends_on:
      - prometheus
    environment:
      - EUREKA_HOSTNAME=registry-server

  config-server:
    image: rolloutio/config-server:5.0.1
    container_name: config-server
    restart: always
    entrypoint: [ "sh", "-c", "sleep 60 && java -jar app.jar" ]
    depends_on:
      rabbitmq:
        condition: service_healthy
      registry-server:
        condition: service_started
    environment:
      - RABBITMQ_HOST=rabbitmq
      - EUREKA_URI=http://admin:admin123@registry-server:4999/eureka/

  api-gateway:
    image: rolloutio/api-gateway:5.0.1
    container_name: api-gateway
    restart: always
    entrypoint: [ "sh", "-c", "sleep 150 && java -jar app.jar" ]
    depends_on:
      - config-server
      - registry-server
      - redis
      - auth-service
      - controlplane-service
      - sdk-service
    environment:
      - REDIS_HOST=redis
      - CONFIG_SERVER_URI=http://config:pass@config-server:4998
      - EUREKA_URI=http://admin:admin123@registry-server:4999/eureka/
      - EUREKA_HOSTNAME=api-gateway

  auth-service:
    image: rolloutio/auth-service:5.0.1
    container_name: auth-service
    restart: always
    entrypoint: [ "sh", "-c", "sleep 100 && java -jar app.jar" ]
    depends_on:
      - config-server
      - registry-server
      - rabbitmq
    environment:
      - CONFIG_SERVER_URI=http://config:pass@config-server:4998
      - EUREKA_URI=http://admin:admin123@registry-server:4999/eureka/
      - EUREKA_HOSTNAME=auth-service
      - RABBITMQ_HOST=rabbitmq

  controlplane-service:
    image: rolloutio/controlplane-service:5.0.1
    container_name: controlplane-service
    restart: always
    entrypoint: [ "sh", "-c", "sleep 100 && java -jar app.jar" ]
    depends_on:
      - config-server
      - registry-server
      - rabbitmq
    environment:
      - CONFIG_SERVER_URI=http://config:pass@config-server:4998
      - EUREKA_URI=http://admin:admin123@registry-server:4999/eureka/
      - EUREKA_HOSTNAME=controlplane-service
      - RABBITMQ_HOST=rabbitmq

  sdk-service:
    image: rolloutio/sdk-service:5.0.1
    container_name: sdk-service
    restart: always
    entrypoint: [ "sh", "-c", "sleep 100 && java -jar app.jar" ]
    depends_on:
      - config-server
      - registry-server
      - redis
    environment:
      - REDIS_HOST=redis
      - CONFIG_SERVER_URI=http://config:pass@config-server:4998
      - EUREKA_URI=http://admin:admin123@registry-server:4999/eureka/
      - EUREKA_HOSTNAME=sdk-service

networks:
  default:
    name: rollout-v5-stable-network

volumes:
  rabbitmq_data:
  redis_data:
  prometheus_data:
  grafana_data:
