# infra/docker-compose.yml version: '3.8' services: # Node 1: Primary Node (Bootstrap) cockroach-1: image: cockroachdb/cockroach:latest container_name: cockroach-1 command: start --insecure --host=cockroach-1 --listen-addr=cockroach-1:26257 --advertise-addr=cockroach-1:26257 --join=cockroach-1:26257,cockroach-2:26257,cockroach-3:26257 restart: always volumes: - cockroach1:/cockroach/data ports: - "26257:26257" # Default SQL Port - "8080:8080" # Web UI Port (สำหรับดูสถานะ Cluster) # Node 2: Joining Node cockroach-2: image: cockroachdb/cockroach:latest container_name: cockroach-2 command: start --insecure --host=cockroach-2 --listen-addr=cockroach-2:26257 --advertise-addr=cockroach-2:26257 --join=cockroach-1:26257,cockroach-2:26257,cockroach-3:26257 restart: always volumes: - cockroach2:/cockroach/data # Node 3: Joining Node cockroach-3: image: cockroachdb/cockroach:latest container_name: cockroach-3 command: start --insecure --host=cockroach-3 --listen-addr=cockroach-3:26257 --advertise-addr=cockroach-3:26257 --join=cockroach-1:26257,cockroach-2:26257,cockroach-3:26257 restart: always volumes: - cockroach3:/cockroach/data # 4. Init Cluster (ตั้งค่าครั้งแรก) init-cluster: image: cockroachdb/cockroach:latest container_name: init-cluster command: init --insecure --host=cockroach-1:26257 depends_on: - cockroach-1 - cockroach-2 - cockroach-3 # ตั้งค่าให้ Container ตายหลังจากรัน init เสร็จ (ไม่รันซ้ำ) restart: "no" # Redis Service redis: image: redis:7-alpine container_name: redis ports: - "6379:6379" restart: always # Celery Flower Monitoring Service flower: build: context: ../backend dockerfile: Dockerfile.celery container_name: celery_flower ports: - "5555:5555" environment: CELERY_BROKER_URL: redis://redis:6379/0 CELERY_APP: core volumes: - ../backend:/app working_dir: /app depends_on: - redis - celery_worker command: celery -A core flower --port=5555 restart: always # Celery Worker Service celery_worker: build: context: ../backend dockerfile: Dockerfile.celery container_name: celery_worker volumes: - ../backend:/app command: celery -A core worker -l info # รัน worker process depends_on: - redis # Worker ต้องรอให้ Redis พร้อม - cockroach-1 # Worker อาจจะต้องเข้าถึง DB ด้วย # Environment Variables สำหรับการส่งอีเมล environment: MAILJET_SMTP_HOST: ${MAILJET_SMTP_HOST} MAILJET_SMTP_PORT: ${MAILJET_SMTP_PORT} MAILJET_API_KEY: ${MAILJET_API_KEY} MAILJET_SECRET_KEY: ${MAILJET_SECRET_KEY} DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL} # กำหนด HOST/PORT DB/Redis ซ้ำอีกครั้ง (เป็น Best Practice) REDIS_HOST: redis DB_HOST: cockroach-1 # Backend/API (DRF) backend: build: context: ../backend dockerfile: Dockerfile volumes: - ../backend:/app ports: - "8000:8000" # เปลี่ยนให้พึ่งพา Node ฐานข้อมูลโดยตรง (เพราะ entrypoint script จะจัดการการรอ) depends_on: - cockroach-1 - cockroach-2 - cockroach-3 - redis environment: DB_HOST: cockroach-1 DB_PORT: 26257 DB_NAME: my_db DB_USER: root DB_PASSWORD: '' # AI Model Serving Service (MONAI Inference) ai_model_server: build: context: ../ # อ้างอิงจาก Root Monorepo dockerfile: infra/docker/Dockerfile.ai container_name: ai_model_server volumes: - ../ai-medical:/app/ai-medical # Map โฟลเดอร์โค้ด AI # - /path/to/gpu/device:/dev/nvidia0 # Uncomment ถ้าใช้ GPU ports: - "8001:8001" # Port สำหรับ API Model Serving depends_on: - backend # ให้มั่นใจว่า Backend พร้อมใช้งานก่อน environment: # กำหนดตัวแปรสภาพแวดล้อมที่ AI Service ต้องใช้ MODEL_STORAGE_URL: http://minio:9000/models/ MODEL_FILE_NAME: monai_model_v1.pth # MinIO Service (S3-Compatible Object Storage) minio: image: minio/minio container_name: minio ports: - "9000:9000" # API Port - "9001:9001" # Console/Web UI Port volumes: - minio_data:/data environment: MINIO_ROOT_USER: minio_admin MINIO_ROOT_PASSWORD: minio_p@ssw0rd! command: server /data --console-address ":9001" restart: always volumes: cockroach1: cockroach2: cockroach3: minio_data: