Files

1 line
44 KiB
JSON

{"repo": "ais1on/cti-rag", "files": {"docker-compose.yml": {"191280ea83c8aa7364999963a644448667b3fce7": {"t": 1785745230.7623403, "n": 11924, "h": "879e011e4e1eac8d", "c": "services:\n # MySQL数据库\n mysql:\n image: docker1.aeko.cn/library/mysql:8\n container_name: threatrag-mysql\n restart: unless-stopped\n environment:\n MYSQL_DATABASE: knowledge_db\n MYSQL_USER: mysql\n MYSQL_PASSWORD: 12345678\n MYSQL_ROOT_PASSWORD: 12345678\n ports:\n - \"3309:3306\"\n volumes:\n - ./data/mysql:/var/lib/mysql\n - ./scripts/init-mysql.sql:/docker-entrypoint-initdb.d/init-mysql.sql\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD-SHELL\", \"mysqladmin ping -h 127.0.0.1 -u root -p$MYSQL_ROOT_PASSWORD || exit 1\" ]\n interval: 10s\n timeout: 5s\n retries: 5\n\n # Redis缓存数据库\n redis:\n image: docker1.aeko.cn/library/redis:7-alpine\n container_name: threatrag-redis\n restart: unless-stopped\n ports:\n - \"6379:6379\"\n volumes:\n - ./data/redis:/data\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"redis-cli\", \"ping\" ]\n interval: 10s\n timeout: 5s\n retries: 3\n\n # RabbitMQ 后台任务与健康检查通道\n rabbitmq:\n image: rabbitmq:3.13-management\n container_name: threatrag-rabbitmq\n restart: unless-stopped\n ports:\n - \"5672:5672\"\n - \"15672:15672\"\n environment:\n RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER:-guest}\n RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS:-guest}\n volumes:\n - ./data/rabbitmq:/var/lib/rabbitmq\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"rabbitmq-diagnostics\", \"-q\", \"ping\" ]\n interval: 15s\n timeout: 10s\n retries: 5\n\n # Neo4j图数据库\n neo4j:\n image: docker1.aeko.cn/neo4j:5.15-community\n container_name: threatrag-neo4j\n restart: unless-stopped\n environment:\n NEO4J_AUTH: neo4j/12345678\n NEO4J_PLUGINS: '[\"graph-data-science\",\"apoc\"]'\n NEO4J_dbms_security_procedures_unrestricted: gds.*,apoc.*\n NEO4J_dbms_security_procedures_allowlist: gds.*,apoc.*\n NEO4J_apoc_export_file_enabled: \"true\"\n NEO4J_apoc_import_file_enabled: \"true\"\n NEO4J_apoc_import_file_use__neo4j__config: \"true\"\n ports:\n - \"7475:7474\" # HTTP\n - \"7688:7687\" # Bolt\n volumes:\n - ./data/neo4j/data:/data\n - ./data/neo4j/logs:/logs\n - ./data/neo4j/plugins:/plugins\n - ./data/neo4j/import:/import\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD-SHELL\", \"echo 'RETURN 1;' | cypher-shell -u neo4j -p 12345678\" ]\n interval: 30s\n timeout: 10s\n retries: 5\n\n # Etcd (Milvus依赖)\n etcd:\n container_name: milvus-etcd\n image: quay.io/coreos/etcd:v3.5.5\n restart: unless-stopped\n environment:\n - ETCD_AUTO_COMPACTION_MODE=revision\n - ETCD_AUTO_COMPACTION_RETENTION=1000\n - ETCD_QUOTA_BACKEND_BYTES=4294967296\n - ETCD_SNAPSHOT_COUNT=50000\n volumes:\n - ./data/etcd:/etcd\n command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd\n networks:\n - threatrag-network\n\n # MinIO (Milvus依赖)\n minio:\n container_name: milvus-minio\n image: docker1.aeko.cn/minio/minio:RELEASE.2023-03-20T20-16-18Z\n restart: unless-stopped\n environment:\n MINIO_ACCESS_KEY: minioadmin\n MINIO_SECRET_KEY: minioadmin\n ports:\n - \"9001:9001\"\n - \"9000:9000\"\n volumes:\n - ./data/minio:/minio_data\n command: minio server /minio_data --console-address \":9001\"\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:9000/minio/health/live\" ]\n interval: 30s\n timeout: 20s\n retries: 3\n\n # Milvus向量数据库\n milvus-standalone:\n container_name: milvus-standalone\n image: docker1.aeko.cn/milvusdb/milvus:v2.3.4\n restart: unless-stopped\n command: [ \"milvus\", \"run\", \"standalone\" ]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - ./data/milvus:/var/lib/milvus\n ports:\n - \"19530:19530\"\n - \"9091:9091\"\n depends_on:\n - \"etcd\"\n - \"minio\"\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:9091/healthz\" ]\n interval: 30s\n start_period: 90s\n timeout: 20s\n retries: 3\n\n # Ollama 本地模型服务(GPU版本)\n ollama:\n image: ollama/ollama:latest\n container_name: threatrag-ollama\n restart: unless-stopped\n ports:\n - \"11434:11434\"\n volumes:\n - ./data/ollama:/root/.ollama\n networks:\n - threatrag-network\n # GPU 支持\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n count: all\n capabilities: [ gpu ]\n healthcheck:\n test: [ \"CMD-SHELL\", \"ollama list || exit 1\" ]\n interval: 30s\n timeout: 10s\n retries: 5\n start_period: 60s # 给 Ollama 更多启动时间\n\n # ThreatRAG API服务\n threatrag:\n build:\n context: .\n dockerfile: Dockerfile\n container_name: threatrag-api\n restart: unless-stopped\n extra_hosts:\n - \"host.docker.internal:host-gateway\"\n ports:\n - \"8006:8000\"\n env_file:\n - .env\n environment:\n - PYTHONPATH=/app\n - FASTAPI_ENV=${FASTAPI_ENV:-production}\n - NEO4J_URL=bolt://neo4j:7687\n - NEO4J_USERNAME=${NEO4J_USERNAME:-neo4j}\n - NEO4J_PASSWORD=${NEO4J_PASSWORD:-12345678}\n - MILVUS_HOST=milvus-standalone\n - MILVUS_PORT=19530\n - MYSQL_HOST=mysql\n - MYSQL_PORT=3306\n - MYSQL_DB=knowledge_db\n - MYSQL_USER=mysql\n - MYSQL_PASSWORD=12345678\n - REDIS_URL=redis://redis:6379\n - MODEL_ROUTER_ENABLED=${MODEL_ROUTER_ENABLED:-true}\n - MODEL_ROUTER_DEFAULT_PROVIDER=${MODEL_ROUTER_DEFAULT_PROVIDER:-deepseek}\n - MODEL_ROUTER_DEFAULT_MODEL=${MODEL_ROUTER_DEFAULT_MODEL:-deepseek-chat}\n - MODEL_ROUTER_FALLBACK_CHAIN=${MODEL_ROUTER_FALLBACK_CHAIN:-deepseek:deepseek-chat,ollama:qwen3:30b,ollama:qwen2.5:7b}\n - MODEL_ROUTER_REQUEST_TIMEOUT_SECONDS=${MODEL_ROUTER_REQUEST_TIMEOUT_SECONDS:-45}\n - MODEL_ROUTER_STREAM_TIMEOUT_SECONDS=${MODEL_ROUTER_STREAM_TIMEOUT_SECONDS:-90}\n - MODEL_ROUTER_MAX_RETRIES_PER_MODEL=${MODEL_ROUTER_MAX_RETRIES_PER_MODEL:-1}\n - MODEL_CIRCUIT_BREAKER_ENABLED=${MODEL_CIRCUIT_BREAKER_ENABLED:-true}\n - MODEL_CIRCUIT_BREAKER_FAILURE_THRESHOLD=${MODEL_CIRCUIT_BREAKER_FAILURE_THRESHOLD:-5}\n - MODEL_CIRCUIT_BREAKER_FAILURE_WINDOW_SECONDS=${MODEL_CIRCUIT_BREAKER_FAILURE_WINDOW_SECONDS:-60}\n - MODEL_CIRCUIT_BREAKER_OPEN_SECONDS=${MODEL_CIRCUIT_BREAKER_OPEN_SECONDS:-120}\n - MODEL_CIRCUIT_BREAKER_HALF_OPEN_PROBES=${MODEL_CIRCUIT_BREAKER_HALF_OPEN_PROBES:-2}\n - RUNTIME_REDIS_PREFIX=${RUNTIME_REDIS_PREFIX:-threatrag:runtime}\n - MODEL_STATUS_TTL_SECONDS=${MODEL_STATUS_TTL_SECONDS:-600}\n - REQUEST_IDEMPOTENCY_TTL_SECONDS=${REQUEST_IDEMPOTENCY_TTL_SECONDS:-300}\n - SHORT_CACHE_TTL_SECONDS=${SHORT_CACHE_TTL_SECONDS:-120}\n - RABBITMQ_URL=${RABBITMQ_URL:-amqp://guest:guest@rabbitmq:5672/}\n - RABBITMQ_TASK_EXCHANGE=${RABBITMQ_TASK_EXCHANGE:-threatrag.tasks}\n - RABBITMQ_TASK_QUEUE=${RABBITMQ_TASK_QUEUE:-threatrag.tasks.main}\n - RABBITMQ_RETRY_QUEUE=${RABBITMQ_RETRY_QUEUE:-threatrag.tasks.retry}\n - RABBITMQ_DLQ=${RABBITMQ_DLQ:-threatrag.tasks.dlq}\n - RABBITMQ_MAX_RETRIES=${RABBITMQ_MAX_RETRIES:-3}\n - RABBITMQ_RETRY_DELAY_MS=${RABBITMQ_RETRY_DELAY_MS:-10000}\n - BASE_MODEL=${BASE_MODEL:-deepseek-ai/DeepSeek-V3}\n - OPENAI_API_KEY=${OPENAI_API_KEY}\n - ZHIPUAI_API_KEY=${ZHIPUAI_API_KEY}\n - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n - SILICONFLOW_API_KEY=${SILICONFLOW_API_KEY}\n - SILICONFLOW_API_BASE=${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n - OLLAMA_API_BASE=${OLLAMA_API_BASE:-http://ollama:11434}\n - SESSION_EXPIRE_TIME=${SESSION_EXPIRE_TIME:-3600}\n - MAX_HISTORY_LENGTH=${MAX_HISTORY_LENGTH:-50}\n - MAX_CONCURRENT_CHATS=${MAX_CONCURRENT_CHATS:-20}\n - NVIDIA_VISIBLE_DEVICES=all\n - SUBGRAPH_SERVICE_URL=http://host.docker.internal:8013/prune_subgraph\n\n volumes:\n - ./data:/app/data\n - ./models:/app/models\n - ./config.yaml:/app/config.yaml\n - ./scripts:/app/scripts\n depends_on:\n mysql:\n condition: service_healthy\n redis:\n condition: service_healthy\n rabbitmq:\n condition: service_healthy\n neo4j:\n condition: service_healthy\n milvus-standalone:\n condition: service_healthy\n ollama:\n condition: service_healthy\n networks:\n - threatrag-network\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n count: all\n capabilities: [ gpu ]\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:8000/health\" ]\n interval: 300s\n start_period: 600s\n timeout: 10s\n retries: 3\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n\n # ThreatRAG 后台任务工作器\n threatrag-worker:\n build:\n context: .\n dockerfile: Dockerfile.worker\n container_name: threatrag-worker\n restart: unless-stopped\n env_file:\n - .env\n environment:\n - PYTHONPATH=/app\n - FASTAPI_ENV=${FASTAPI_ENV:-production}\n - WORKER_TYPE=${WORKER_TYPE:-task}\n - WORKER_COUNT=${WORKER_COUNT:-3}\n - REDIS_URL=redis://redis:6379\n - MODEL_ROUTER_ENABLED=${MODEL_ROUTER_ENABLED:-true}\n - MODEL_ROUTER_DEFAULT_PROVIDER=${MODEL_ROUTER_DEFAULT_PROVIDER:-deepseek}\n - MODEL_ROUTER_DEFAULT_MODEL=${MODEL_ROUTER_DEFAULT_MODEL:-deepseek-chat}\n - MODEL_ROUTER_FALLBACK_CHAIN=${MODEL_ROUTER_FALLBACK_CHAIN:-deepseek:deepseek-chat,ollama:qwen3:30b,ollama:qwen2.5:7b}\n - MODEL_ROUTER_REQUEST_TIMEOUT_SECONDS=${MODEL_ROUTER_REQUEST_TIMEOUT_SECONDS:-45}\n - MODEL_ROUTER_STREAM_TIMEOUT_SECONDS=${MODEL_ROUTER_STREAM_TIMEOUT_SECONDS:-90}\n - MODEL_ROUTER_MAX_RETRIES_PER_MODEL=${MODEL_ROUTER_MAX_RETRIES_PER_MODEL:-1}\n - MODEL_CIRCUIT_BREAKER_ENABLED=${MODEL_CIRCUIT_BREAKER_ENABLED:-true}\n - MODEL_CIRCUIT_BREAKER_FAILURE_THRESHOLD=${MODEL_CIRCUIT_BREAKER_FAILURE_THRESHOLD:-5}\n - MODEL_CIRCUIT_BREAKER_FAILURE_WINDOW_SECONDS=${MODEL_CIRCUIT_BREAKER_FAILURE_WINDOW_SECONDS:-60}\n - MODEL_CIRCUIT_BREAKER_OPEN_SECONDS=${MODEL_CIRCUIT_BREAKER_OPEN_SECONDS:-120}\n - MODEL_CIRCUIT_BREAKER_HALF_OPEN_PROBES=${MODEL_CIRCUIT_BREAKER_HALF_OPEN_PROBES:-2}\n - RUNTIME_REDIS_PREFIX=${RUNTIME_REDIS_PREFIX:-threatrag:runtime}\n - MODEL_STATUS_TTL_SECONDS=${MODEL_STATUS_TTL_SECONDS:-600}\n - REQUEST_IDEMPOTENCY_TTL_SECONDS=${REQUEST_IDEMPOTENCY_TTL_SECONDS:-300}\n - SHORT_CACHE_TTL_SECONDS=${SHORT_CACHE_TTL_SECONDS:-120}\n - RABBITMQ_URL=${RABBITMQ_URL:-amqp://guest:guest@rabbitmq:5672/}\n - RABBITMQ_TASK_EXCHANGE=${RABBITMQ_TASK_EXCHANGE:-threatrag.tasks}\n - RABBITMQ_TASK_QUEUE=${RABBITMQ_TASK_QUEUE:-threatrag.tasks.main}\n - RABBITMQ_RETRY_QUEUE=${RABBITMQ_RETRY_QUEUE:-threatrag.tasks.retry}\n - RABBITMQ_DLQ=${RABBITMQ_DLQ:-threatrag.tasks.dlq}\n - RABBITMQ_MAX_RETRIES=${RABBITMQ_MAX_RETRIES:-3}\n - RABBITMQ_RETRY_DELAY_MS=${RABBITMQ_RETRY_DELAY_MS:-10000}\n - OPENAI_API_KEY=${OPENAI_API_KEY}\n - ZHIPUAI_API_KEY=${ZHIPUAI_API_KEY}\n - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n - SILICONFLOW_API_KEY=${SILICONFLOW_API_KEY}\n - SILICONFLOW_API_BASE=${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n - OLLAMA_API_BASE=${OLLAMA_API_BASE:-http://ollama:11434}\n volumes:\n - ./data:/app/data\n - ./models:/app/models\n - ./config.yaml:/app/config.yaml\n - ./scripts:/app/scripts\n depends_on:\n redis:\n condition: service_healthy\n rabbitmq:\n condition: service_healthy\n ollama:\n condition: service_healthy\n networks:\n - threatrag-network\n\nnetworks:\n threatrag-network:\n driver: bridge\n"}, "ce344a4e7f6b4fdc367114d31b299fe217532393": {"t": 1785748980.092483, "n": 6112, "h": "1b3ea93aaa5f29f7", "c": "services:\n # MySQL数据库\n mysql:\n image: docker1.aeko.cn/library/mysql:8\n container_name: threatrag-mysql\n restart: unless-stopped\n environment:\n MYSQL_DATABASE: knowledge_db\n MYSQL_USER: mysql\n MYSQL_PASSWORD: 12345678\n MYSQL_ROOT_PASSWORD: 12345678\n ports:\n - \"3309:3306\"\n volumes:\n - ./data/mysql:/var/lib/mysql\n - ./scripts/init-mysql.sql:/docker-entrypoint-initdb.d/init-mysql.sql\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD-SHELL\", \"mysqladmin ping -h 127.0.0.1 -u root -p$MYSQL_ROOT_PASSWORD || exit 1\" ]\n interval: 10s\n timeout: 5s\n retries: 5\n\n # Redis缓存数据库\n redis:\n image: docker1.aeko.cn/library/redis:7-alpine\n container_name: threatrag-redis\n restart: unless-stopped\n ports:\n - \"6379:6379\"\n volumes:\n - ./data/redis:/data\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"redis-cli\", \"ping\" ]\n interval: 10s\n timeout: 5s\n retries: 3\n\n # Neo4j图数据库\n neo4j:\n image: docker1.aeko.cn/neo4j:5.15-community\n container_name: threatrag-neo4j\n restart: unless-stopped\n environment:\n NEO4J_AUTH: neo4j/12345678\n NEO4J_PLUGINS: '[\"graph-data-science\"]'\n NEO4J_dbms_security_procedures_unrestricted: gds.*\n NEO4J_dbms_security_procedures_allowlist: gds.*\n ports:\n - \"7475:7474\" # HTTP\n - \"7688:7687\" # Bolt\n volumes:\n - ./data/neo4j/data:/data\n - ./data/neo4j/logs:/logs\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD-SHELL\", \"echo 'RETURN 1;' | cypher-shell -u neo4j -p 12345678\" ]\n interval: 30s\n timeout: 10s\n retries: 5\n\n # Etcd (Milvus依赖)\n etcd:\n container_name: milvus-etcd\n image: quay.io/coreos/etcd:v3.5.5\n restart: unless-stopped\n environment:\n - ETCD_AUTO_COMPACTION_MODE=revision\n - ETCD_AUTO_COMPACTION_RETENTION=1000\n - ETCD_QUOTA_BACKEND_BYTES=4294967296\n - ETCD_SNAPSHOT_COUNT=50000\n volumes:\n - ./data/etcd:/etcd\n command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd\n networks:\n - threatrag-network\n\n # MinIO (Milvus依赖)\n minio:\n container_name: milvus-minio\n image: docker1.aeko.cn/minio/minio:RELEASE.2023-03-20T20-16-18Z\n restart: unless-stopped\n environment:\n MINIO_ACCESS_KEY: minioadmin\n MINIO_SECRET_KEY: minioadmin\n ports:\n - \"9001:9001\"\n - \"9000:9000\"\n volumes:\n - ./data/minio:/minio_data\n command: minio server /minio_data --console-address \":9001\"\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:9000/minio/health/live\" ]\n interval: 30s\n timeout: 20s\n retries: 3\n\n # Milvus向量数据库\n milvus-standalone:\n container_name: milvus-standalone\n image: docker1.aeko.cn/milvusdb/milvus:v2.3.4\n restart: unless-stopped\n command: [ \"milvus\", \"run\", \"standalone\" ]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - ./data/milvus:/var/lib/milvus\n ports:\n - \"19530:19530\"\n - \"9091:9091\"\n depends_on:\n - \"etcd\"\n - \"minio\"\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:9091/healthz\" ]\n interval: 30s\n start_period: 90s\n timeout: 20s\n retries: 3\n\n # Ollama 本地模型服务(GPU版本)\n ollama:\n image: docker1.aeko.cn/ollama/ollama:latest\n container_name: threatrag-ollama\n restart: unless-stopped\n ports:\n - \"11434:11434\"\n volumes:\n - ./data/ollama:/root/.ollama\n networks:\n - threatrag-network\n # GPU 支持已启用\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n count: all # 使用所有可用GPU\n capabilities: [gpu]\n healthcheck:\n test: [\"CMD-SHELL\", \"ollama list || exit 1\"]\n interval: 30s\n timeout: 10s\n retries: 5\n start_period: 60s # 给 Ollama 更多启动时间\n\n # ThreatRAG API服务\n threatrag:\n build:\n context: .\n dockerfile: Dockerfile\n container_name: threatrag-api\n restart: unless-stopped\n ports:\n - \"8006:8000\"\n env_file:\n - .env\n environment:\n - PYTHONPATH=/app\n - FASTAPI_ENV=${FASTAPI_ENV:-production}\n - NEO4J_URL=bolt://neo4j:7687\n - NEO4J_USERNAME=${NEO4J_USERNAME:-neo4j}\n - NEO4J_PASSWORD=${NEO4J_PASSWORD:-12345678}\n - MILVUS_HOST=milvus-standalone\n - MILVUS_PORT=19530\n - MYSQL_HOST=mysql\n - MYSQL_PORT=3306\n - MYSQL_DB=knowledge_db\n - MYSQL_USER=mysql\n - MYSQL_PASSWORD=12345678\n - REDIS_URL=redis://redis:6379\n - BASE_MODEL=${BASE_MODEL:-deepseek-ai/DeepSeek-V3}\n - OPENAI_API_KEY=${OPENAI_API_KEY}\n - ZHIPUAI_API_KEY=${ZHIPUAI_API_KEY}\n - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n - SILICONFLOW_API_KEY=${SILICONFLOW_API_KEY}\n - SILICONFLOW_API_BASE=${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n - OLLAMA_API_BASE=${OLLAMA_API_BASE:-http://ollama:11434}\n - SESSION_EXPIRE_TIME=${SESSION_EXPIRE_TIME:-3600}\n - MAX_HISTORY_LENGTH=${MAX_HISTORY_LENGTH:-50}\n - MAX_CONCURRENT_CHATS=${MAX_CONCURRENT_CHATS:-20}\n volumes:\n - ./data:/app/data\n - ./models:/app/models\n - ./config.yaml:/app/config.yaml\n - ./scripts:/app/scripts\n depends_on:\n mysql:\n condition: service_healthy\n redis:\n condition: service_healthy\n neo4j:\n condition: service_healthy\n milvus-standalone:\n condition: service_healthy\n ollama:\n condition: service_healthy\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:8000/health\" ]\n interval: 300s\n start_period: 600s\n timeout: 10s\n retries: 3\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n\nnetworks:\n threatrag-network:\n driver: bridge\n\n# 所有数据现在挂载到本地 ./data 目录\n# volumes 部分已移除,改为使用本地目录挂载\n\n\n"}, "258aca704f7657bb08f1556a5f2f6fead636374e": {"t": 1785748981.2861164, "n": 5406, "h": "08404f12331283a9", "c": "services:\n # MySQL数据库\n mysql:\n image: docker1.aeko.cn/library/mysql:8\n container_name: threatrag-mysql\n restart: unless-stopped\n environment:\n MYSQL_DATABASE: knowledge_db\n MYSQL_USER: mysql\n MYSQL_PASSWORD: 12345678\n MYSQL_ROOT_PASSWORD: 12345678\n ports:\n - \"3309:3306\"\n volumes:\n - mysql_data:/var/lib/mysql\n - ./scripts/init-mysql.sql:/docker-entrypoint-initdb.d/init-mysql.sql\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD-SHELL\", \"mysqladmin ping -h 127.0.0.1 -u root -p$MYSQL_ROOT_PASSWORD || exit 1\" ]\n interval: 10s\n timeout: 5s\n retries: 5\n\n # Redis缓存数据库\n redis:\n image: docker1.aeko.cn/library/redis:7-alpine\n container_name: threatrag-redis\n restart: unless-stopped\n ports:\n - \"6379:6379\"\n volumes:\n - redis_data:/data\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"redis-cli\", \"ping\" ]\n interval: 10s\n timeout: 5s\n retries: 3\n\n # Neo4j图数据库\n neo4j:\n image: docker1.aeko.cn/neo4j:5.15-community\n container_name: threatrag-neo4j\n restart: unless-stopped\n environment:\n NEO4J_AUTH: neo4j/12345678\n NEO4J_PLUGINS: '[\"graph-data-science\"]'\n NEO4J_dbms_security_procedures_unrestricted: gds.*\n NEO4J_dbms_security_procedures_allowlist: gds.*\n ports:\n - \"7475:7474\" # HTTP\n - \"7688:7687\" # Bolt\n volumes:\n - neo4j_data:/data\n - neo4j_logs:/logs\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD-SHELL\", \"echo 'RETURN 1;' | cypher-shell -u neo4j -p 12345678\" ]\n interval: 30s\n timeout: 10s\n retries: 5\n\n # Etcd (Milvus依赖)\n etcd:\n container_name: milvus-etcd\n image: quay.io/coreos/etcd:v3.5.5\n restart: unless-stopped\n environment:\n - ETCD_AUTO_COMPACTION_MODE=revision\n - ETCD_AUTO_COMPACTION_RETENTION=1000\n - ETCD_QUOTA_BACKEND_BYTES=4294967296\n - ETCD_SNAPSHOT_COUNT=50000\n volumes:\n - etcd_data:/etcd\n command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd\n networks:\n - threatrag-network\n\n # MinIO (Milvus依赖)\n minio:\n container_name: milvus-minio\n image: docker1.aeko.cn/minio/minio:RELEASE.2023-03-20T20-16-18Z\n restart: unless-stopped\n environment:\n MINIO_ACCESS_KEY: minioadmin\n MINIO_SECRET_KEY: minioadmin\n ports:\n - \"9001:9001\"\n - \"9000:9000\"\n volumes:\n - minio_data:/minio_data\n command: minio server /minio_data --console-address \":9001\"\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:9000/minio/health/live\" ]\n interval: 30s\n timeout: 20s\n retries: 3\n\n # Milvus向量数据库\n milvus-standalone:\n container_name: milvus-standalone\n image: docker1.aeko.cn/milvusdb/milvus:v2.3.4\n restart: unless-stopped\n command: [ \"milvus\", \"run\", \"standalone\" ]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - milvus_data:/var/lib/milvus\n ports:\n - \"19530:19530\"\n - \"9091:9091\"\n depends_on:\n - \"etcd\"\n - \"minio\"\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:9091/healthz\" ]\n interval: 30s\n start_period: 90s\n timeout: 20s\n retries: 3\n\n # ThreatRAG API服务\n threatrag:\n build:\n context: .\n dockerfile: Dockerfile\n container_name: threatrag-api\n restart: unless-stopped\n ports:\n - \"8006:8000\"\n env_file:\n - .env\n environment:\n - PYTHONPATH=/app\n - FASTAPI_ENV=${FASTAPI_ENV:-production}\n - NEO4J_URL=bolt://neo4j:7687\n - NEO4J_USERNAME=${NEO4J_USERNAME:-neo4j}\n - NEO4J_PASSWORD=${NEO4J_PASSWORD:-12345678}\n - MILVUS_HOST=milvus-standalone\n - MILVUS_PORT=19530\n - MYSQL_HOST=mysql\n - MYSQL_PORT=3306\n - MYSQL_DB=knowledge_db\n - MYSQL_USER=mysql\n - MYSQL_PASSWORD=12345678\n - REDIS_URL=redis://redis:6379\n - BASE_MODEL=${BASE_MODEL:-deepseek-ai/DeepSeek-V3}\n - OPENAI_API_KEY=${OPENAI_API_KEY}\n - ZHIPUAI_API_KEY=${ZHIPUAI_API_KEY}\n - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n - SILICONFLOW_API_KEY=${SILICONFLOW_API_KEY}\n - SILICONFLOW_API_BASE=${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n - SESSION_EXPIRE_TIME=${SESSION_EXPIRE_TIME:-3600}\n - MAX_HISTORY_LENGTH=${MAX_HISTORY_LENGTH:-50}\n - MAX_CONCURRENT_CHATS=${MAX_CONCURRENT_CHATS:-20}\n volumes:\n - ./data:/app/data\n - ./models:/app/models\n - ./config.yaml:/app/config.yaml\n - ./scripts:/app/scripts\n depends_on:\n mysql:\n condition: service_healthy\n redis:\n condition: service_healthy\n neo4j:\n condition: service_healthy\n milvus-standalone:\n condition: service_healthy\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:8000/health\" ]\n interval: 300s\n start_period: 600s\n timeout: 10s\n retries: 3\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n\nnetworks:\n threatrag-network:\n driver: bridge\n\nvolumes:\n mysql_data:\n redis_data:\n neo4j_data:\n neo4j_logs:\n etcd_data:\n minio_data:\n milvus_data:\n\n\n"}, "5ef8be74152ebe9178d30408f0c6674da7bba593": {"t": 1785748982.4914882, "n": 5406, "h": "c466b238f56544dd", "c": "services:\n # MySQL数据库\n mysql:\n image: docker1.aeko.cn/library/mysql:8\n container_name: threatrag-mysql\n restart: unless-stopped\n environment:\n MYSQL_DATABASE: knowledge_db\n MYSQL_USER: mysql\n MYSQL_PASSWORD: 12345678\n MYSQL_ROOT_PASSWORD: 12345678\n ports:\n - \"3309:3306\"\n volumes:\n - mysql_data:/var/lib/mysql\n - ./scripts/init-mysql.sql:/docker-entrypoint-initdb.d/init-mysql.sql\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD-SHELL\", \"mysqladmin ping -h 127.0.0.1 -u root -p$MYSQL_ROOT_PASSWORD || exit 1\" ]\n interval: 10s\n timeout: 5s\n retries: 5\n\n # Redis缓存数据库\n redis:\n image: docker1.aeko.cn/library/redis:7-alpine\n container_name: threatrag-redis\n restart: unless-stopped\n ports:\n - \"6379:6379\"\n volumes:\n - redis_data:/data\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"redis-cli\", \"ping\" ]\n interval: 10s\n timeout: 5s\n retries: 3\n\n # Neo4j图数据库\n neo4j:\n image: docker1.aeko.cn/neo4j:5.15-community\n container_name: threatrag-neo4j\n restart: unless-stopped\n environment:\n NEO4J_AUTH: neo4j/12345678\n NEO4J_PLUGINS: '[\"graph-data-science\"]'\n NEO4J_dbms_security_procedures_unrestricted: gds.*\n NEO4J_dbms_security_procedures_allowlist: gds.*\n ports:\n - \"7475:7474\" # HTTP\n - \"7688:7688\" # Bolt\n volumes:\n - neo4j_data:/data\n - neo4j_logs:/logs\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD-SHELL\", \"echo 'RETURN 1;' | cypher-shell -u neo4j -p 12345678\" ]\n interval: 30s\n timeout: 10s\n retries: 5\n\n # Etcd (Milvus依赖)\n etcd:\n container_name: milvus-etcd\n image: quay.io/coreos/etcd:v3.5.5\n restart: unless-stopped\n environment:\n - ETCD_AUTO_COMPACTION_MODE=revision\n - ETCD_AUTO_COMPACTION_RETENTION=1000\n - ETCD_QUOTA_BACKEND_BYTES=4294967296\n - ETCD_SNAPSHOT_COUNT=50000\n volumes:\n - etcd_data:/etcd\n command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd\n networks:\n - threatrag-network\n\n # MinIO (Milvus依赖)\n minio:\n container_name: milvus-minio\n image: docker1.aeko.cn/minio/minio:RELEASE.2023-03-20T20-16-18Z\n restart: unless-stopped\n environment:\n MINIO_ACCESS_KEY: minioadmin\n MINIO_SECRET_KEY: minioadmin\n ports:\n - \"9001:9001\"\n - \"9000:9000\"\n volumes:\n - minio_data:/minio_data\n command: minio server /minio_data --console-address \":9001\"\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:9000/minio/health/live\" ]\n interval: 30s\n timeout: 20s\n retries: 3\n\n # Milvus向量数据库\n milvus-standalone:\n container_name: milvus-standalone\n image: docker1.aeko.cn/milvusdb/milvus:v2.3.4\n restart: unless-stopped\n command: [ \"milvus\", \"run\", \"standalone\" ]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - milvus_data:/var/lib/milvus\n ports:\n - \"19530:19530\"\n - \"9091:9091\"\n depends_on:\n - \"etcd\"\n - \"minio\"\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:9091/healthz\" ]\n interval: 30s\n start_period: 90s\n timeout: 20s\n retries: 3\n\n # ThreatRAG API服务\n threatrag:\n build:\n context: .\n dockerfile: Dockerfile\n container_name: threatrag-api\n restart: unless-stopped\n ports:\n - \"8006:8000\"\n env_file:\n - .env\n environment:\n - PYTHONPATH=/app\n - FASTAPI_ENV=${FASTAPI_ENV:-production}\n - NEO4J_URL=bolt://neo4j:7687\n - NEO4J_USERNAME=${NEO4J_USERNAME:-neo4j}\n - NEO4J_PASSWORD=${NEO4J_PASSWORD:-12345678}\n - MILVUS_HOST=milvus-standalone\n - MILVUS_PORT=19530\n - MYSQL_HOST=mysql\n - MYSQL_PORT=3306\n - MYSQL_DB=knowledge_db\n - MYSQL_USER=mysql\n - MYSQL_PASSWORD=12345678\n - REDIS_URL=redis://redis:6379\n - BASE_MODEL=${BASE_MODEL:-deepseek-ai/DeepSeek-V3}\n - OPENAI_API_KEY=${OPENAI_API_KEY}\n - ZHIPUAI_API_KEY=${ZHIPUAI_API_KEY}\n - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n - SILICONFLOW_API_KEY=${SILICONFLOW_API_KEY}\n - SILICONFLOW_API_BASE=${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n - SESSION_EXPIRE_TIME=${SESSION_EXPIRE_TIME:-3600}\n - MAX_HISTORY_LENGTH=${MAX_HISTORY_LENGTH:-50}\n - MAX_CONCURRENT_CHATS=${MAX_CONCURRENT_CHATS:-20}\n volumes:\n - ./data:/app/data\n - ./models:/app/models\n - ./config.yaml:/app/config.yaml\n - ./scripts:/app/scripts\n depends_on:\n mysql:\n condition: service_healthy\n redis:\n condition: service_healthy\n neo4j:\n condition: service_healthy\n milvus-standalone:\n condition: service_healthy\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:8000/health\" ]\n interval: 300s\n start_period: 600s\n timeout: 10s\n retries: 3\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n\nnetworks:\n threatrag-network:\n driver: bridge\n\nvolumes:\n mysql_data:\n redis_data:\n neo4j_data:\n neo4j_logs:\n etcd_data:\n minio_data:\n milvus_data:\n\n\n"}, "960271ba429e62c1528c4c9be90ad4b2e47118c3": {"t": 1785748983.584901, "n": 5404, "h": "95d59708b1b401dd", "c": "services:\n # MySQL数据库\n mysql:\n image: docker1.aeko.cn/library/mysql:8\n container_name: threatrag-mysql\n restart: unless-stopped\n environment:\n MYSQL_DATABASE: knowledge_db\n MYSQL_USER: mysql\n MYSQL_PASSWORD: 12345678\n MYSQL_ROOT_PASSWORD: 12345678\n ports:\n - \"3309:3306\"\n volumes:\n - mysql_data:/var/lib/mysql\n - ./scripts/init-mysql.sql:/docker-entrypoint-initdb.d/init-mysql.sql\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD-SHELL\", \"mysqladmin ping -h 127.0.0.1 -u root -p$MYSQL_ROOT_PASSWORD || exit 1\" ]\n interval: 10s\n timeout: 5s\n retries: 5\n\n # Redis缓存数据库\n redis:\n image: docker1.aeko.cn/library/redis:7-alpine\n container_name: threatrag-redis\n restart: unless-stopped\n ports:\n - \"6379:6379\"\n volumes:\n - redis_data:/data\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"redis-cli\", \"ping\" ]\n interval: 10s\n timeout: 5s\n retries: 3\n\n # Neo4j图数据库\n neo4j:\n image: docker1.aeko.cn/neo4j:5.15-community\n container_name: threatrag-neo4j\n restart: unless-stopped\n environment:\n NEO4J_AUTH: neo4j/12345678\n NEO4J_PLUGINS: '[\"graph-data-science\"]'\n NEO4J_dbms_security_procedures_unrestricted: gds.*\n NEO4J_dbms_security_procedures_allowlist: gds.*\n ports:\n - \"7475:7474\" # HTTP\n - \"7688:7688\" # Bolt\n volumes:\n - neo4j_data:/data\n - neo4j_logs:/logs\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD-SHELL\", \"echo 'RETURN 1;' | cypher-shell -u neo4j -p 12345678\" ]\n interval: 30s\n timeout: 10s\n retries: 5\n\n # Etcd (Milvus依赖)\n etcd:\n container_name: milvus-etcd\n image: quay.io/coreos/etcd:v3.5.5\n restart: unless-stopped\n environment:\n - ETCD_AUTO_COMPACTION_MODE=revision\n - ETCD_AUTO_COMPACTION_RETENTION=1000\n - ETCD_QUOTA_BACKEND_BYTES=4294967296\n - ETCD_SNAPSHOT_COUNT=50000\n volumes:\n - etcd_data:/etcd\n command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd\n networks:\n - threatrag-network\n\n # MinIO (Milvus依赖)\n minio:\n container_name: milvus-minio\n image: docker1.aeko.cn/minio/minio:RELEASE.2023-03-20T20-16-18Z\n restart: unless-stopped\n environment:\n MINIO_ACCESS_KEY: minioadmin\n MINIO_SECRET_KEY: minioadmin\n ports:\n - \"9001:9001\"\n - \"9000:9000\"\n volumes:\n - minio_data:/minio_data\n command: minio server /minio_data --console-address \":9001\"\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:9000/minio/health/live\" ]\n interval: 30s\n timeout: 20s\n retries: 3\n\n # Milvus向量数据库\n milvus-standalone:\n container_name: milvus-standalone\n image: docker1.aeko.cn/milvusdb/milvus:v2.3.4\n restart: unless-stopped\n command: [ \"milvus\", \"run\", \"standalone\" ]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - milvus_data:/var/lib/milvus\n ports:\n - \"19530:19530\"\n - \"9091:9091\"\n depends_on:\n - \"etcd\"\n - \"minio\"\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:9091/healthz\" ]\n interval: 30s\n start_period: 90s\n timeout: 20s\n retries: 3\n\n # ThreatRAG API服务\n threatrag:\n build:\n context: .\n dockerfile: Dockerfile\n container_name: threatrag-api\n restart: unless-stopped\n ports:\n - \"8006:8000\"\n env_file:\n - .env\n environment:\n - PYTHONPATH=/app\n - FASTAPI_ENV=${FASTAPI_ENV:-production}\n - NEO4J_URL=bolt://neo4j:7687\n - NEO4J_USERNAME=${NEO4J_USERNAME:-neo4j}\n - NEO4J_PASSWORD=${NEO4J_PASSWORD:-12345678}\n - MILVUS_HOST=milvus-standalone\n - MILVUS_PORT=19530\n - MYSQL_HOST=mysql\n - MYSQL_PORT=3306\n - MYSQL_DB=knowledge_db\n - MYSQL_USER=mysql\n - MYSQL_PASSWORD=12345678\n - REDIS_URL=redis://redis:6379\n - BASE_MODEL=${BASE_MODEL:-deepseek-ai/DeepSeek-V3}\n - OPENAI_API_KEY=${OPENAI_API_KEY}\n - ZHIPUAI_API_KEY=${ZHIPUAI_API_KEY}\n - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n - SILICONFLOW_API_KEY=${SILICONFLOW_API_KEY}\n - SILICONFLOW_API_BASE=${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n - SESSION_EXPIRE_TIME=${SESSION_EXPIRE_TIME:-3600}\n - MAX_HISTORY_LENGTH=${MAX_HISTORY_LENGTH:-50}\n - MAX_CONCURRENT_CHATS=${MAX_CONCURRENT_CHATS:-20}\n volumes:\n - ./data:/app/data\n - ./models:/app/models\n - ./config.yaml:/app/config.yaml\n - ./scripts:/app/scripts\n depends_on:\n mysql:\n condition: service_healthy\n redis:\n condition: service_healthy\n neo4j:\n condition: service_healthy\n milvus-standalone:\n condition: service_healthy\n networks:\n - threatrag-network\n healthcheck:\n test: [ \"CMD\", \"curl\", \"-f\", \"http://localhost:8000/health\" ]\n interval: 30s\n start_period: 60s\n timeout: 10s\n retries: 3\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n\nnetworks:\n threatrag-network:\n driver: bridge\n\nvolumes:\n mysql_data:\n redis_data:\n neo4j_data:\n neo4j_logs:\n etcd_data:\n minio_data:\n milvus_data:\n\n\n"}, "d6ff003aaaef9c5baeb07edfef99b5154dc1fd83": {"t": 1785748984.8478026, "n": 5849, "h": "af98a5ef651513f3", "c": "version: '3.8'\n\nservices:\n # PostgreSQL数据库\n # MySQL数据库\n mysql:\n image: docker1.aeko.cn/library/mysql:8.0\n container_name: threatrag-mysql\n restart: unless-stopped\n environment:\n MYSQL_DATABASE: knowledge_db\n MYSQL_USER: root\n MYSQL_PASSWORD: 123456\n MYSQL_ROOT_PASSWORD: 123456\n ports:\n - \"3309:3306\"\n volumes:\n - mysql_data:/var/lib/mysql\n - ./scripts/init-mysql.sql:/docker-entrypoint-initdb.d/init-mysql.sql\n networks:\n - threatrag-network\n healthcheck:\n test: [\"CMD\", \"mysqladmin\", \"ping\", \"-h\", \"localhost\"]\n interval: 10s\n timeout: 5s\n retries: 5\n\n # RabbitMQ消息队列\n rabbitmq:\n image: docker1.aeko.cn/library/rabbitmq:3-management\n container_name: threatrag-rabbitmq\n restart: unless-stopped\n environment:\n RABBITMQ_DEFAULT_USER: guest\n RABBITMQ_DEFAULT_PASS: guest\n ports:\n - \"5672:5672\" # RabbitMQ服务端口\n - \"15672:15672\" # RabbitMQ管理界面端口\n volumes:\n - rabbitmq_data:/var/lib/rabbitmq\n networks:\n - threatrag-network\n healthcheck:\n test: [\"CMD\", \"rabbitmqctl\", \"status\"]\n interval: 30s\n timeout: 10s\n retries: 5\n\n # Redis缓存数据库\n redis:\n image: docker1.aeko.cn/library/redis:7-alpine\n container_name: threatrag-redis\n restart: unless-stopped\n ports:\n - \"6379:6379\"\n volumes:\n - redis_data:/data\n networks:\n - threatrag-network\n healthcheck:\n test: [\"CMD\", \"redis-cli\", \"ping\"]\n interval: 10s\n timeout: 5s\n retries: 3\n\n # Neo4j图数据库\n neo4j:\n image: docker1.aeko.cn/neo4j:5.15-community\n container_name: threatrag-neo4j\n restart: unless-stopped\n environment:\n NEO4J_AUTH: neo4j/12345678\n NEO4J_PLUGINS: '[\"graph-data-science\"]'\n NEO4J_dbms_security_procedures_unrestricted: gds.*\n NEO4J_dbms_security_procedures_allowlist: gds.*\n ports:\n - \"7475:7474\" # HTTP\n - \"7688:7688\" # Bolt\n volumes:\n - neo4j_data:/data\n - neo4j_logs:/logs\n networks:\n - threatrag-network\n healthcheck:\n test: [\"CMD-SHELL\", \"echo 'RETURN 1;' | cypher-shell -u neo4j -p 12345678\"]\n interval: 30s\n timeout: 10s\n retries: 5\n\n # Etcd (Milvus依赖)\n etcd:\n container_name: milvus-etcd\n image: quay.io/coreos/etcd:v3.5.5\n restart: unless-stopped\n environment:\n - ETCD_AUTO_COMPACTION_MODE=revision\n - ETCD_AUTO_COMPACTION_RETENTION=1000\n - ETCD_QUOTA_BACKEND_BYTES=4294967296\n - ETCD_SNAPSHOT_COUNT=50000\n volumes:\n - etcd_data:/etcd\n command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd\n networks:\n - threatrag-network\n\n # MinIO (Milvus依赖)\n minio:\n container_name: milvus-minio\n image: docker1.aeko.cn/minio/minio:RELEASE.2023-03-20T20-16-18Z\n restart: unless-stopped\n environment:\n MINIO_ACCESS_KEY: minioadmin\n MINIO_SECRET_KEY: minioadmin\n ports:\n - \"9001:9001\"\n - \"9000:9000\"\n volumes:\n - minio_data:/minio_data\n command: minio server /minio_data --console-address \":9001\"\n networks:\n - threatrag-network\n healthcheck:\n test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:9000/minio/health/live\"]\n interval: 30s\n timeout: 20s\n retries: 3\n\n # Milvus向量数据库\n milvus-standalone:\n container_name: milvus-standalone\n image: docker1.aeko.cn/milvusdb/milvus:v2.3.4\n restart: unless-stopped\n command: [\"milvus\", \"run\", \"standalone\"]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - milvus_data:/var/lib/milvus\n ports:\n - \"19530:19530\"\n - \"9091:9091\"\n depends_on:\n - \"etcd\"\n - \"minio\"\n networks:\n - threatrag-network\n healthcheck:\n test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:9091/healthz\"]\n interval: 30s\n start_period: 90s\n timeout: 20s\n retries: 3\n\n # ThreatRAG API服务\n threatrag:\n build:\n context: .\n dockerfile: Dockerfile\n container_name: threatrag-api\n restart: unless-stopped\n ports:\n - \"8006:8000\"\n env_file:\n - .env\n environment:\n - PYTHONPATH=/app\n - FASTAPI_ENV=${FASTAPI_ENV:-production}\n - NEO4J_URL=bolt://neo4j:7687\n - NEO4J_USERNAME=${NEO4J_USERNAME:-neo4j}\n - NEO4J_PASSWORD=${NEO4J_PASSWORD:-12345678}\n - MILVUS_HOST=milvus-standalone\n - MILVUS_PORT=19530\n - POSTGRES_HOST=postgres\n - POSTGRES_PORT=5432\n - POSTGRES_DB=knowledge_db\n - POSTGRES_USER=postgres\n - POSTGRES_PASSWORD=12345678\n - REDIS_URL=redis://redis:6379\n - BASE_MODEL=${BASE_MODEL:-deepseek-ai/DeepSeek-V3}\n - OPENAI_API_KEY=${OPENAI_API_KEY}\n - ZHIPUAI_API_KEY=${ZHIPUAI_API_KEY}\n - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n - SILICONFLOW_API_KEY=${SILICONFLOW_API_KEY}\n - SILICONFLOW_API_BASE=${SILICONFLOW_API_BASE:-https://api.siliconflow.cn/v1}\n - SESSION_EXPIRE_TIME=${SESSION_EXPIRE_TIME:-3600}\n - MAX_HISTORY_LENGTH=${MAX_HISTORY_LENGTH:-50}\n - MAX_CONCURRENT_CHATS=${MAX_CONCURRENT_CHATS:-20}\n volumes:\n - ./data:/app/data\n - ./models:/app/models\n - ./config.yaml:/app/config.yaml\n - ./scripts:/app/scripts\n depends_on:\n postgres:\n condition: service_healthy\n redis:\n condition: service_healthy\n neo4j:\n condition: service_healthy\n milvus-standalone:\n condition: service_healthy\n networks:\n - threatrag-network\n healthcheck:\n test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:8000/health\"]\n interval: 30s\n start_period: 60s\n timeout: 10s\n retries: 3\n\nnetworks:\n threatrag-network:\n driver: bridge\n\nvolumes:\n postgres_data:\n redis_data:\n neo4j_data:\n neo4j_logs:\n etcd_data:\n minio_data:\n milvus_data:\n"}, "60a4a86508e9ca10294876fbca91f2e98d1bcce9": {"t": 1785748986.0853436, "n": 1684, "h": "6d41902bf6bced65", "c": "version: '3.8'\n\nservices:\n rabbitmq:\n image: rabbitmq:3-management\n container_name: threatrag-rabbitmq\n ports:\n - \"5672:5672\" # RabbitMQ服务端口\n - \"15672:15672\" # RabbitMQ管理界面端口\n environment:\n - RABBITMQ_DEFAULT_USER=guest\n - RABBITMQ_DEFAULT_PASS=guest\n volumes:\n - rabbitmq_data:/var/lib/rabbitmq\n networks:\n - threatrag-network\n healthcheck:\n test: [\"CMD\", \"rabbitmqctl\", \"status\"]\n interval: 30s\n timeout: 10s\n retries: 5\n\n api:\n build:\n context: .\n dockerfile: Dockerfile\n container_name: threatrag-api\n ports:\n - \"8000:8000\"\n environment:\n - RABBITMQ_HOST=rabbitmq\n - RABBITMQ_PORT=5672\n - RABBITMQ_USERNAME=guest\n - RABBITMQ_PASSWORD=guest\n - RABBITMQ_VHOST=/\n - CONVERSATION_WORKERS=3\n - VECTOR_SEARCH_WORKERS=3\n volumes:\n - ./data:/app/data\n - ./models:/app/models\n depends_on:\n rabbitmq:\n condition: service_healthy\n networks:\n - threatrag-network\n\n worker:\n build:\n context: .\n dockerfile: Dockerfile.worker\n container_name: threatrag-worker\n environment:\n - RABBITMQ_HOST=rabbitmq\n - RABBITMQ_PORT=5672\n - RABBITMQ_USERNAME=guest\n - RABBITMQ_PASSWORD=guest\n - RABBITMQ_VHOST=/\n - WORKER_TYPE=all # 可选: conversation, vector, all\n - WORKER_COUNT=3\n volumes:\n - ./data:/app/data\n - ./models:/app/models\n depends_on:\n rabbitmq:\n condition: service_healthy\n networks:\n - threatrag-network\n deploy:\n replicas: 2 # 可以根据需要调整工作器实例数量\n\nnetworks:\n threatrag-network:\n driver: bridge\n\nvolumes:\n rabbitmq_data:"}}}}