version: '3.8' services: # ============================================ # Infrastructure Services # ============================================ # PostgreSQL Database postgres: image: postgres:15-alpine container_name: mpc-postgres environment: POSTGRES_DB: mpc_system POSTGRES_USER: mpc_user POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-mpc_secret_password} ports: - "5432:5432" volumes: - postgres-data:/var/lib/postgresql/data - ./migrations:/docker-entrypoint-initdb.d:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U mpc_user -d mpc_system"] interval: 10s timeout: 5s retries: 5 start_period: 30s networks: - mpc-network # Redis Cache redis: image: redis:7-alpine container_name: mpc-redis ports: - "6379:6379" volumes: - redis-data:/data command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: - mpc-network # RabbitMQ Message Broker rabbitmq: image: rabbitmq:3-management-alpine container_name: mpc-rabbitmq ports: - "5672:5672" - "15672:15672" environment: RABBITMQ_DEFAULT_USER: mpc_user RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:-mpc_rabbit_password} RABBITMQ_DEFAULT_VHOST: / volumes: - rabbitmq-data:/var/lib/rabbitmq healthcheck: test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] interval: 30s timeout: 10s retries: 5 start_period: 30s networks: - mpc-network # Consul Service Discovery consul: image: consul:1.16 container_name: mpc-consul ports: - "8500:8500" - "8600:8600/udp" command: agent -server -ui -bootstrap-expect=1 -client=0.0.0.0 volumes: - consul-data:/consul/data healthcheck: test: ["CMD", "consul", "members"] interval: 10s timeout: 5s retries: 5 networks: - mpc-network # ============================================ # MPC Services # ============================================ # Session Coordinator Service session-coordinator: build: context: . dockerfile: services/session-coordinator/Dockerfile container_name: mpc-session-coordinator ports: - "50051:50051" # gRPC - "8080:8080" # HTTP environment: MPC_SERVER_GRPC_PORT: 50051 MPC_SERVER_HTTP_PORT: 8080 MPC_SERVER_ENVIRONMENT: development MPC_DATABASE_HOST: postgres MPC_DATABASE_PORT: 5432 MPC_DATABASE_USER: mpc_user MPC_DATABASE_PASSWORD: ${POSTGRES_PASSWORD:-mpc_secret_password} MPC_DATABASE_DBNAME: mpc_system MPC_DATABASE_SSLMODE: disable MPC_REDIS_HOST: redis MPC_REDIS_PORT: 6379 MPC_RABBITMQ_HOST: rabbitmq MPC_RABBITMQ_PORT: 5672 MPC_RABBITMQ_USER: mpc_user MPC_RABBITMQ_PASSWORD: ${RABBITMQ_PASSWORD:-mpc_rabbit_password} MPC_CONSUL_HOST: consul MPC_CONSUL_PORT: 8500 MPC_JWT_SECRET_KEY: ${JWT_SECRET_KEY:-super_secret_jwt_key_change_in_production} MPC_JWT_ISSUER: mpc-system depends_on: postgres: condition: service_healthy redis: condition: service_healthy rabbitmq: condition: service_healthy healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: - mpc-network restart: unless-stopped # Message Router Service message-router: build: context: . dockerfile: services/message-router/Dockerfile container_name: mpc-message-router ports: - "50052:50051" # gRPC - "8081:8080" # HTTP environment: MPC_SERVER_GRPC_PORT: 50051 MPC_SERVER_HTTP_PORT: 8080 MPC_SERVER_ENVIRONMENT: development MPC_DATABASE_HOST: postgres MPC_DATABASE_PORT: 5432 MPC_DATABASE_USER: mpc_user MPC_DATABASE_PASSWORD: ${POSTGRES_PASSWORD:-mpc_secret_password} MPC_DATABASE_DBNAME: mpc_system MPC_DATABASE_SSLMODE: disable MPC_RABBITMQ_HOST: rabbitmq MPC_RABBITMQ_PORT: 5672 MPC_RABBITMQ_USER: mpc_user MPC_RABBITMQ_PASSWORD: ${RABBITMQ_PASSWORD:-mpc_rabbit_password} depends_on: postgres: condition: service_healthy rabbitmq: condition: service_healthy healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: - mpc-network restart: unless-stopped # Server Party Service - Party 1 server-party-1: build: context: . dockerfile: services/server-party/Dockerfile container_name: mpc-server-party-1 ports: - "50053:50051" # gRPC - "8082:8080" # HTTP environment: MPC_SERVER_GRPC_PORT: 50051 MPC_SERVER_HTTP_PORT: 8080 MPC_SERVER_ENVIRONMENT: development MPC_DATABASE_HOST: postgres MPC_DATABASE_PORT: 5432 MPC_DATABASE_USER: mpc_user MPC_DATABASE_PASSWORD: ${POSTGRES_PASSWORD:-mpc_secret_password} MPC_DATABASE_DBNAME: mpc_system MPC_DATABASE_SSLMODE: disable SESSION_COORDINATOR_ADDR: session-coordinator:50051 MESSAGE_ROUTER_ADDR: message-router:50051 MPC_CRYPTO_MASTER_KEY: ${CRYPTO_MASTER_KEY:-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef} PARTY_ID: server-party-1 depends_on: postgres: condition: service_healthy session-coordinator: condition: service_healthy message-router: condition: service_healthy healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: - mpc-network restart: unless-stopped # Server Party Service - Party 2 server-party-2: build: context: . dockerfile: services/server-party/Dockerfile container_name: mpc-server-party-2 ports: - "50055:50051" # gRPC - "8084:8080" # HTTP environment: MPC_SERVER_GRPC_PORT: 50051 MPC_SERVER_HTTP_PORT: 8080 MPC_SERVER_ENVIRONMENT: development MPC_DATABASE_HOST: postgres MPC_DATABASE_PORT: 5432 MPC_DATABASE_USER: mpc_user MPC_DATABASE_PASSWORD: ${POSTGRES_PASSWORD:-mpc_secret_password} MPC_DATABASE_DBNAME: mpc_system MPC_DATABASE_SSLMODE: disable SESSION_COORDINATOR_ADDR: session-coordinator:50051 MESSAGE_ROUTER_ADDR: message-router:50051 MPC_CRYPTO_MASTER_KEY: ${CRYPTO_MASTER_KEY:-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef} PARTY_ID: server-party-2 depends_on: postgres: condition: service_healthy session-coordinator: condition: service_healthy message-router: condition: service_healthy healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: - mpc-network restart: unless-stopped # Server Party Service - Party 3 server-party-3: build: context: . dockerfile: services/server-party/Dockerfile container_name: mpc-server-party-3 ports: - "50056:50051" # gRPC - "8085:8080" # HTTP environment: MPC_SERVER_GRPC_PORT: 50051 MPC_SERVER_HTTP_PORT: 8080 MPC_SERVER_ENVIRONMENT: development MPC_DATABASE_HOST: postgres MPC_DATABASE_PORT: 5432 MPC_DATABASE_USER: mpc_user MPC_DATABASE_PASSWORD: ${POSTGRES_PASSWORD:-mpc_secret_password} MPC_DATABASE_DBNAME: mpc_system MPC_DATABASE_SSLMODE: disable SESSION_COORDINATOR_ADDR: session-coordinator:50051 MESSAGE_ROUTER_ADDR: message-router:50051 MPC_CRYPTO_MASTER_KEY: ${CRYPTO_MASTER_KEY:-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef} PARTY_ID: server-party-3 depends_on: postgres: condition: service_healthy session-coordinator: condition: service_healthy message-router: condition: service_healthy healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: - mpc-network restart: unless-stopped # Account Service account-service: build: context: . dockerfile: services/account/Dockerfile container_name: mpc-account-service ports: - "50054:50051" # gRPC - "8083:8080" # HTTP environment: MPC_SERVER_GRPC_PORT: 50051 MPC_SERVER_HTTP_PORT: 8080 MPC_SERVER_ENVIRONMENT: development MPC_DATABASE_HOST: postgres MPC_DATABASE_PORT: 5432 MPC_DATABASE_USER: mpc_user MPC_DATABASE_PASSWORD: ${POSTGRES_PASSWORD:-mpc_secret_password} MPC_DATABASE_DBNAME: mpc_system MPC_DATABASE_SSLMODE: disable MPC_COORDINATOR_URL: session-coordinator:50051 MPC_JWT_SECRET_KEY: ${JWT_SECRET_KEY:-super_secret_jwt_key_change_in_production} depends_on: postgres: condition: service_healthy session-coordinator: condition: service_healthy healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: - mpc-network restart: unless-stopped # ============================================ # Networks # ============================================ networks: mpc-network: driver: bridge # ============================================ # Volumes # ============================================ volumes: postgres-data: redis-data: rabbitmq-data: consul-data: