services: frontend: build: context: . dockerfile: deploy/Dockerfile.frontend image: gemold-frontend:latest container_name: gemold_frontend ports: - "${FRONTEND_PORT:-80}:80" depends_on: - backend restart: unless-stopped profiles: - full - frontend networks: - gemold_network backend: build: context: . dockerfile: deploy/Dockerfile.moldinsight image: gemold-backend:latest container_name: gemold_backend command: ["python", "-m", "uvicorn", "entrypoints.unified:app", "--host", "0.0.0.0", "--port", "8000"] ports: - "${BACKEND_PORT:-8000}:8000" environment: HOST: 0.0.0.0 PORT: "8000" 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 中设置} 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:-系统管理员} 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} AUTO_MIGRATE: ${AUTO_MIGRATE:-true} # 共享卷过渡兜底(D6/D11):主链路已改走 RustFS。uploads 供 RustFS 异常时 # 本地路径回退;html_output 仅作 /html 报告代理的存量兜底读(新产物不落本地) volumes: - uploads_data:/app/uploads - html_data:/app/html_output restart: unless-stopped profiles: - full - unified networks: - gemold_network moldinsight-celery: build: context: . dockerfile: deploy/Dockerfile.celery container_name: gemold_celery environment: 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} # Celery/OCC 吞吐调优(OCC_THROUGHPUT 方案 A,默认值在 Dockerfile.celery) CELERY_CONCURRENCY: ${CELERY_CONCURRENCY:-2} CELERY_MAX_TASKS_PER_CHILD: ${CELERY_MAX_TASKS_PER_CHILD:-50} # uploads_data 共享卷(D6 过渡兜底):RustFS 异常时 worker 回退本地路径下载。 # D11 后 worker 不再写 HTML 产物(直传 RustFS 报告键),无需 html_data 卷 volumes: - uploads_data:/app/uploads depends_on: - backend restart: unless-stopped profiles: - full - unified - moldinsight networks: - gemold_network moldinsight: build: context: . dockerfile: deploy/Dockerfile.moldinsight image: gemold-moldinsight:latest container_name: gemold_moldinsight ports: - "${MOLDINSIGHT_PORT:-8000}:8000" environment: HOST: 0.0.0.0 PORT: "8000" 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 中设置} 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:-系统管理员} 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} AUTO_MIGRATE: ${AUTO_MIGRATE:-true} # html_output 仅作 /html 报告代理的存量兜底读(D11,新产物不落本地) volumes: - uploads_data:/app/uploads - html_data:/app/html_output restart: unless-stopped profiles: - moldinsight networks: - gemold_network inventory: build: context: . dockerfile: deploy/Dockerfile.inventory image: gemold-inventory:latest container_name: gemold_inventory ports: - "${INVENTORY_PORT:-8001}:8001" environment: HOST: 0.0.0.0 PORT: "8001" 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:-} SECRET_KEY: ${SECRET_KEY:?SECRET_KEY 未配置:请在 .env 中设置} 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:-系统管理员} ALGORITHM: ${ALGORITHM:-HS256} ACCESS_TOKEN_EXPIRE_MINUTES: ${ACCESS_TOKEN_EXPIRE_MINUTES:-1440} DEBUG: ${DEBUG:-false} SERVE_FRONTEND_STATIC: ${SERVE_FRONTEND_STATIC:-false} AUTO_MIGRATE: ${AUTO_MIGRATE:-true} restart: unless-stopped profiles: - inventory networks: - gemold_network networks: gemold_network: driver: bridge volumes: uploads_data: html_data: