version: '3.8' services: # PostgreSQL Database postgres: image: postgres:15-alpine container_name: license_postgres environment: POSTGRES_DB: licenses POSTGRES_USER: license_admin POSTGRES_PASSWORD: ${DB_PASSWORD:-secure_password} volumes: - postgres_data:/var/lib/postgresql/data - ./init.sql:/docker-entrypoint-initdb.d/init.sql ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U license_admin -d licenses"] interval: 10s timeout: 5s retries: 5 # Redis Cache redis: image: redis:7-alpine container_name: license_redis command: redis-server --requirepass ${REDIS_PASSWORD:-redis_password} ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # RabbitMQ Message Broker rabbitmq: image: rabbitmq:3-management-alpine container_name: license_rabbitmq environment: RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER:-admin} RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASS:-admin_password} ports: - "5672:5672" - "15672:15672" # Management UI volumes: - rabbitmq_data:/var/lib/rabbitmq healthcheck: test: ["CMD", "rabbitmq-diagnostics", "ping"] interval: 10s timeout: 5s retries: 5 # Auth Service auth_service: build: context: . dockerfile: Dockerfile.auth container_name: license_auth environment: DATABASE_URL: postgresql://license_admin:${DB_PASSWORD:-secure_password}@postgres:5432/licenses REDIS_URL: redis://:${REDIS_PASSWORD:-redis_password}@redis:6379 RABBITMQ_URL: amqp://${RABBITMQ_USER:-admin}:${RABBITMQ_PASS:-admin_password}@rabbitmq:5672 JWT_SECRET: ${JWT_SECRET:-change_this_in_production} ADMIN_SECRET: ${ADMIN_SECRET:-change_this_admin_secret} FLASK_ENV: ${FLASK_ENV:-production} PORT: 5001 ports: - "5001:5001" depends_on: postgres: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5001/health"] interval: 30s timeout: 10s retries: 3 # License API Service license_api: build: context: . dockerfile: Dockerfile.license container_name: license_api environment: DATABASE_URL: postgresql://license_admin:${DB_PASSWORD:-secure_password}@postgres:5432/licenses REDIS_URL: redis://:${REDIS_PASSWORD:-redis_password}@redis:6379 RABBITMQ_URL: amqp://${RABBITMQ_USER:-admin}:${RABBITMQ_PASS:-admin_password}@rabbitmq:5672 JWT_SECRET: ${JWT_SECRET:-change_this_in_production} FLASK_ENV: ${FLASK_ENV:-production} PORT: 5002 ports: - "5002:5002" depends_on: postgres: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5002/health"] interval: 30s timeout: 10s retries: 3 # Analytics Service analytics_service: build: context: . dockerfile: Dockerfile.analytics container_name: license_analytics environment: DATABASE_URL: postgresql://license_admin:${DB_PASSWORD:-secure_password}@postgres:5432/licenses REDIS_URL: redis://:${REDIS_PASSWORD:-redis_password}@redis:6379 RABBITMQ_URL: amqp://${RABBITMQ_USER:-admin}:${RABBITMQ_PASS:-admin_password}@rabbitmq:5672 FLASK_ENV: ${FLASK_ENV:-production} PORT: 5003 ports: - "5003:5003" depends_on: postgres: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5003/health"] interval: 30s timeout: 10s retries: 3 # Admin API Service admin_api: build: context: . dockerfile: Dockerfile.admin container_name: license_admin_api environment: DATABASE_URL: postgresql://license_admin:${DB_PASSWORD:-secure_password}@postgres:5432/licenses REDIS_URL: redis://:${REDIS_PASSWORD:-redis_password}@redis:6379 RABBITMQ_URL: amqp://${RABBITMQ_USER:-admin}:${RABBITMQ_PASS:-admin_password}@rabbitmq:5672 ADMIN_API_KEY: ${ADMIN_API_KEY:-admin-key-change-in-production} FLASK_ENV: ${FLASK_ENV:-production} PORT: 5004 ports: - "5004:5004" depends_on: postgres: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5004/health"] interval: 30s timeout: 10s retries: 3 # Nginx Reverse Proxy nginx: image: nginx:alpine container_name: license_nginx volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro ports: - "80:80" - "443:443" depends_on: - auth_service - license_api - analytics_service - admin_api healthcheck: test: ["CMD", "nginx", "-t"] interval: 30s timeout: 10s retries: 3 volumes: postgres_data: redis_data: rabbitmq_data: