# geMoldInsight — moldinsight-only 模式 # # 一键启动: # docker compose -f docker-compose.moldinsight.yml up -d # # 服务清单:moldinsight(独立 API)+ moldinsight-celery(异步分析 worker) # 不含前端、不含 inventory。 # 镜像:两服务共用 gemold-backend:latest(同一 build 声明,compose 只构建一次; # celery 仅以 command 覆盖启动 worker),无跨镜像构建依赖,干净机器裸 up 一把过。 # 注意:服务未声明 profiles(避免裸 up 报 "no service selected"), # 模式切换唯一入口是 -f 文件名。 # --------------------------------------------------------------- # 公共环境变量(moldinsight 家族共用) # --------------------------------------------------------------- x-base-env: &base_env DB_HOST: ${DB_HOST} DB_PORT: ${DB_PORT:-5432} DB_NAME: ${DB_NAME:-moldinsight} DB_USER: ${DB_USER} DB_PASSWORD: ${DB_PASSWORD} REDIS_HOST: ${REDIS_HOST} REDIS_PORT: ${REDIS_PORT:-6379} REDIS_PASSWORD: ${REDIS_PASSWORD:-} RUSTFS_ENDPOINT: ${RUSTFS_ENDPOINT} RUSTFS_ACCESS_KEY: ${RUSTFS_ACCESS_KEY} RUSTFS_SECRET_KEY: ${RUSTFS_SECRET_KEY} RUSTFS_TIMEOUT: ${RUSTFS_TIMEOUT:-30} SECRET_KEY: ${SECRET_KEY:?SECRET_KEY 未配置:请在 .env 中设置} ALGORITHM: ${ALGORITHM:-HS256} ACCESS_TOKEN_EXPIRE_MINUTES: ${ACCESS_TOKEN_EXPIRE_MINUTES:-1440} DEBUG: ${DEBUG:-false} SERVE_FRONTEND_STATIC: ${SERVE_FRONTEND_STATIC:-false} UPLOAD_DIR: ${UPLOAD_DIR:-./uploads} MAX_FILE_SIZE: ${MAX_FILE_SIZE:-104857600} ALLOWED_EXTENSIONS: ${ALLOWED_EXTENSIONS:-.stp,.step,.stp.gz} POINTCLOUD_SAMPLE_COUNT: ${POINTCLOUD_SAMPLE_COUNT:-10000} MESH_QUALITY: ${MESH_QUALITY:-high} PARALLEL_PROCESSING: ${PARALLEL_PROCESSING:-true} RUSTFS_PRESIGNED_URL_EXPIRES: ${RUSTFS_PRESIGNED_URL_EXPIRES:-3600} ENABLE_FREECAD_VERIFICATION: ${ENABLE_FREECAD_VERIFICATION:-false} FREECAD_VERIFICATION_TIMEOUT: ${FREECAD_VERIFICATION_TIMEOUT:-120} LLM_ENABLED: ${LLM_ENABLED:-false} LLM_API_URL: ${LLM_API_URL:-https://api.openai.com/v1} LLM_API_KEY: ${LLM_API_KEY:-} LLM_MODEL: ${LLM_MODEL:-gpt-4o-mini} LLM_TIMEOUT: ${LLM_TIMEOUT:-60} LLM_MAX_TOKENS: ${LLM_MAX_TOKENS:-2000} services: moldinsight: build: context: . dockerfile: deploy/Dockerfile.moldinsight # 统一用 gemold-backend tag(历史 gemold-moldinsight:latest 双 tag 已废弃) image: gemold-backend:latest container_name: gemold_moldinsight command: ["python", "-m", "uvicorn", "entrypoints.moldinsight:app", "--host", "0.0.0.0", "--port", "8000"] ports: - "${MOLDINSIGHT_PORT:-8000}:8000" environment: <<: *base_env HOST: 0.0.0.0 PORT: "8000" ADMIN_USERNAME: ${ADMIN_USERNAME:-admin} ADMIN_PASSWORD: ${ADMIN_PASSWORD:?ADMIN_PASSWORD 未配置:请在 .env 中设置} ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@gemold.com} ADMIN_FULL_NAME: ${ADMIN_FULL_NAME:-系统管理员} AUTO_MIGRATE: ${AUTO_MIGRATE:-true} # uploads_data:D6 过渡兜底,RustFS 异常时本地路径回退 # html_data:D11 后仅作 /html 报告代理的存量兜底读(新产物不落本地) volumes: - uploads_data:/app/uploads - html_data:/app/html_output restart: unless-stopped networks: - gemold_network moldinsight-celery: # 与 moldinsight 共用同一镜像,仅 command 覆盖启动 worker build: context: . dockerfile: deploy/Dockerfile.moldinsight image: gemold-backend:latest container_name: gemold_celery command: ["sh", "-c", "cd /app/src && exec celery -A celery_app worker --concurrency=${CELERY_CONCURRENCY:-2} --max-tasks-per-child=${CELERY_MAX_TASKS_PER_CHILD:-50} --loglevel=info"] environment: <<: *base_env # Celery/OCC 吞吐调优(OCC_THROUGHPUT 方案 A) CELERY_CONCURRENCY: ${CELERY_CONCURRENCY:-2} CELERY_MAX_TASKS_PER_CHILD: ${CELERY_MAX_TASKS_PER_CHILD:-50} volumes: - uploads_data:/app/uploads # 注:本文件无 backend service,celery 必须等 moldinsight API 就绪后再启动 depends_on: - moldinsight restart: unless-stopped networks: - gemold_network networks: gemold_network: name: gemold_network driver: bridge volumes: uploads_data: name: gemold_uploads_data html_data: name: gemold_html_data