version: '3.8' services: # ============================================ # 多模态解析服务 (Python/FastAPI) # ============================================ parse-service: build: context: ./parse-service dockerfile: Dockerfile container_name: parse-service ports: - "8000:8000" environment: - UPLOAD_DIR=/tmp/parse-service/uploads # AI 模型地址 - MINERU_API_URL=http://10.192.72.13:7284 - QWEN_VL_URL=http://10.192.72.13:7280 - QWEN_ASR_URL=http://10.192.72.13:7283 volumes: - parse-service-data:/tmp/parse-service/uploads networks: - multimodal-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 restart: unless-stopped # ============================================ # 向量化服务 (Java/Spring Boot) # ============================================ embedding-api: build: context: ./schedule-embedding-api dockerfile: Dockerfile container_name: embedding-api ports: - "8084:8084" environment: - SPRING_PROFILES_ACTIVE=prod # Elasticsearch 配置 - ELASTICSEARCH_URL=http://elasticsearch:9200 # MySQL 配置 - MYSQL_URL=jdbc:mysql://mysql:3306/multimodel?useUnicode=true&characterEncoding=utf-8 - MYSQL_USERNAME=root - MYSQL_PASSWORD=root123456 depends_on: - elasticsearch - mysql networks: - multimodal-network restart: unless-stopped # ============================================ # Flink JobManager # ============================================ flink-jobmanager: image: flink:1.18.1-scala_2.12-java17 container_name: flink-jobmanager ports: - "8081:8081" command: jobmanager environment: - | FLINK_PROPERTIES= jobmanager.rpc.address: flink-jobmanager execution.checkpointing.interval: 60000 state.backend: filesystem state.checkpoints.dir: /tmp/flink-checkpoints state.savepoints.dir: /tmp/flink-savepoints volumes: - flink-checkpoints:/tmp/flink-checkpoints - flink-savepoints:/tmp/flink-savepoints - ./schedule-flink/target:/opt/flink/usrlib networks: - multimodal-network restart: unless-stopped # ============================================ # Flink TaskManager # ============================================ flink-taskmanager: image: flink:1.18.1-scala_2.12-java17 container_name: flink-taskmanager depends_on: - flink-jobmanager command: taskmanager deploy: replicas: 2 environment: - | FLINK_PROPERTIES= jobmanager.rpc.address: flink-jobmanager taskmanager.numberOfTaskSlots: 4 volumes: - flink-checkpoints:/tmp/flink-checkpoints - flink-savepoints:/tmp/flink-savepoints networks: - multimodal-network restart: unless-stopped # ============================================ # Elasticsearch (向量存储 + 全文检索) # ============================================ elasticsearch: image: elasticsearch:8.12.0 container_name: elasticsearch ports: - "9200:9200" - "9300:9300" environment: - discovery.type=single-node - xpack.security.enabled=false - ES_JAVA_OPTS=-Xms4g -Xmx4g volumes: - es-data:/usr/share/elasticsearch/data networks: - multimodal-network restart: unless-stopped # ============================================ # MySQL (元数据存储) # ============================================ mysql: image: mysql:8.0 container_name: mysql ports: - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=root123456 - MYSQL_DATABASE=multimodel volumes: - mysql-data:/var/lib/mysql networks: - multimodal-network restart: unless-stopped # ============================================ # 管理前端 (Vue.js) # ============================================ schedule-admin: build: context: ./schedule-admin dockerfile: Dockerfile container_name: schedule-admin ports: - "8080:80" depends_on: - parse-service - embedding-api networks: - multimodal-network restart: unless-stopped volumes: parse-service-data: flink-checkpoints: flink-savepoints: es-data: mysql-data: networks: multimodal-network: driver: bridge