Files

1 line
86 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "anothersunset/zhixianyunshu", "files": {"zhiqian/deploy/kustomize/base/rag-deployment.yaml": {"450a71e5cdc3cfb27544c338af7e73ac5bd5efab": {"t": 1785745215.5284715, "n": 1674, "h": "652fd2a34ddf73be", "c": "# v2-step-18: rag FastAPI Deployment\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: zhiqian-rag\n labels:\n app.kubernetes.io/name: rag\n app.kubernetes.io/component: retrieval\nspec:\n replicas: 1\n strategy:\n type: RollingUpdate\n rollingUpdate:\n maxSurge: 1\n maxUnavailable: 0\n selector:\n matchLabels:\n app.kubernetes.io/name: rag\n app.kubernetes.io/component: retrieval\n template:\n metadata:\n labels:\n app.kubernetes.io/name: rag\n app.kubernetes.io/component: retrieval\n spec:\n securityContext:\n runAsNonRoot: true\n runAsUser: 1000\n containers:\n - name: rag\n image: zhiqian/rag:2.0.0\n imagePullPolicy: IfNotPresent\n ports:\n - name: http\n containerPort: 8001\n protocol: TCP\n envFrom:\n - configMapRef:\n name: zhiqian-rag-env\n env:\n - name: DEEPSEEK_API_KEY\n valueFrom:\n secretKeyRef:\n name: zhiqian-backend-secret\n key: deepseek-api-key\n livenessProbe:\n httpGet:\n path: /health\n port: http\n initialDelaySeconds: 30\n periodSeconds: 30\n timeoutSeconds: 5\n readinessProbe:\n httpGet:\n path: /health\n port: http\n initialDelaySeconds: 15\n periodSeconds: 10\n timeoutSeconds: 3\n resources:\n requests:\n cpu: 200m\n memory: 512Mi\n limits:\n cpu: 2000m\n memory: 4Gi\n"}, "9833e4dce4b1fc7f63debc9bcd33309590b0ae91": {"t": 1785748801.360206, "n": 1674, "h": "652fd2a34ddf73be", "c": "# v2-step-18: rag FastAPI Deployment\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: zhiqian-rag\n labels:\n app.kubernetes.io/name: rag\n app.kubernetes.io/component: retrieval\nspec:\n replicas: 1\n strategy:\n type: RollingUpdate\n rollingUpdate:\n maxSurge: 1\n maxUnavailable: 0\n selector:\n matchLabels:\n app.kubernetes.io/name: rag\n app.kubernetes.io/component: retrieval\n template:\n metadata:\n labels:\n app.kubernetes.io/name: rag\n app.kubernetes.io/component: retrieval\n spec:\n securityContext:\n runAsNonRoot: true\n runAsUser: 1000\n containers:\n - name: rag\n image: zhiqian/rag:2.0.0\n imagePullPolicy: IfNotPresent\n ports:\n - name: http\n containerPort: 8001\n protocol: TCP\n envFrom:\n - configMapRef:\n name: zhiqian-rag-env\n env:\n - name: DEEPSEEK_API_KEY\n valueFrom:\n secretKeyRef:\n name: zhiqian-backend-secret\n key: deepseek-api-key\n livenessProbe:\n httpGet:\n path: /health\n port: http\n initialDelaySeconds: 30\n periodSeconds: 30\n timeoutSeconds: 5\n readinessProbe:\n httpGet:\n path: /health\n port: http\n initialDelaySeconds: 15\n periodSeconds: 10\n timeoutSeconds: 3\n resources:\n requests:\n cpu: 200m\n memory: 512Mi\n limits:\n cpu: 2000m\n memory: 4Gi\n"}}, "zhiqian/deploy/docker-compose.yml": {"450a71e5cdc3cfb27544c338af7e73ac5bd5efab": {"t": 1785746339.8696232, "n": 6378, "h": "a6956220897e08af", "c": "name: zhiqian\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: zhiqian-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: zhiqian\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_DB: zhiqian\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-db.sql:/docker-entrypoint-initdb.d/00_init.sql:ro\n - ./init-temporal-db.sql:/docker-entrypoint-initdb.d/10_temporal.sql:ro\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U zhiqian -d zhiqian\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n qdrant:\n image: qdrant/qdrant:v1.11.3\n container_name: zhiqian-qdrant\n restart: unless-stopped\n volumes:\n - qdrantdata:/qdrant/storage\n ports:\n - \"6333:6333\"\n - \"6334:6334\"\n healthcheck:\n test: [\"CMD\", \"bash\", \"-c\", \"timeout 1 bash -c '</dev/tcp/127.0.0.1/6333' && echo ok\"]\n interval: 10s\n timeout: 5s\n retries: 10\n\n # v2-step-14: Temporal server (auto-setup, 依赖 postgres)\n # 启动方式: docker compose --profile temporal up -d\n # 需要在 .env 中设置 TEMPORAL_ENABLED=true 让 backend 连这里\n temporal:\n image: temporalio/auto-setup:1.25.0\n container_name: zhiqian-temporal\n restart: unless-stopped\n profiles: [\"temporal\"]\n environment:\n DB: postgres12\n DB_PORT: 5432\n POSTGRES_USER: zhiqian\n POSTGRES_PWD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_SEEDS: postgres\n DBNAME: temporal\n VISIBILITY_DBNAME: temporal_visibility\n TEMPORAL_ADDRESS: temporal:7233\n TEMPORAL_CLI_ADDRESS: temporal:7233\n ports:\n - \"7233:7233\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"tctl\", \"--address\", \"temporal:7233\", \"cluster\", \"health\"]\n interval: 15s\n timeout: 5s\n retries: 12\n start_period: 60s\n\n temporal-ui:\n image: temporalio/ui:2.31.2\n container_name: zhiqian-temporal-ui\n restart: unless-stopped\n profiles: [\"temporal\"]\n environment:\n TEMPORAL_ADDRESS: temporal:7233\n TEMPORAL_CORS_ORIGINS: http://localhost:3000,http://localhost:8233\n ports:\n - \"8233:8080\"\n depends_on:\n - temporal\n\n backend:\n build:\n context: ../backend\n dockerfile: Dockerfile\n container_name: zhiqian-backend\n restart: unless-stopped\n environment:\n SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/zhiqian\n SPRING_DATASOURCE_USERNAME: zhiqian\n SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n APP_JWT_SECRET: ${JWT_SECRET:?请在 .env 中设置 JWT_SECRET}\n APP_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?请在 .env 中设置 ADMIN_PASSWORD}\n APP_RAG_BASE_URL: http://rag:8001\n LLM_PROVIDER: ${LLM_PROVIDER:-deepseek}\n LLM_API_KEY: ${LLM_API_KEY:-}\n LLM_BASE_URL: ${LLM_BASE_URL:-https://api.deepseek.com/v1}\n LLM_CHAT_MODEL: ${LLM_CHAT_MODEL:-deepseek-chat}\n LLM_REASONER_MODEL: ${LLM_REASONER_MODEL:-deepseek-reasoner}\n LLM_TEMPERATURE: ${LLM_TEMPERATURE:-0.2}\n LLM_MAX_TOKENS: ${LLM_MAX_TOKENS:-2048}\n LLM_TIMEOUT_SECONDS: ${LLM_TIMEOUT_SECONDS:-60}\n LLM_THINKING_ENABLED: ${LLM_THINKING_ENABLED:-true}\n LLM_REASONING_EFFORT: ${LLM_REASONING_EFFORT:-high}\n # v2-step-08: Langfuse 后端全链观测。留空即 disabled\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-https://cloud.langfuse.com}\n # v2-step-14: Temporal durable workflow。默认 false。\n # TEMPORAL_ENABLED=true 且 docker compose --profile temporal up 后才走 Temporal 路径。\n TEMPORAL_ENABLED: ${TEMPORAL_ENABLED:-false}\n TEMPORAL_TARGET: ${TEMPORAL_TARGET:-temporal:7233}\n TEMPORAL_NAMESPACE: ${TEMPORAL_NAMESPACE:-default}\n TEMPORAL_TASK_QUEUE: ${TEMPORAL_TASK_QUEUE:-zhiqian-migration}\n JAVA_TOOL_OPTIONS: \"-Xms256m -Xmx768m\"\n ports:\n - \"8080:8080\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:8080/actuator/health\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 40s\n\n rag:\n build:\n context: ../rag\n dockerfile: Dockerfile\n args:\n BUILD_ML: ${RAG_BUILD_ML:-0}\n container_name: zhiqian-rag\n restart: unless-stopped\n environment:\n ZHIQIAN_RAG_CHROMA_PATH: /data/.chroma\n RAG_USE_BGE_M3: ${RAG_USE_BGE_M3:-true}\n RAG_BGE_MODEL: ${RAG_BGE_MODEL:-/models/bge-m3}\n RAG_BGE_FP16: ${RAG_BGE_FP16:-true}\n RAG_USE_RERANKER: ${RAG_USE_RERANKER:-true}\n RAG_RERANKER_MODEL: ${RAG_RERANKER_MODEL:-/models/bge-reranker-v2-m3}\n RAG_RERANKER_FP16: ${RAG_RERANKER_FP16:-true}\n RAG_EMBEDDING_DIM: ${RAG_EMBEDDING_DIM:-1024}\n RAG_USE_QDRANT: ${RAG_USE_QDRANT:-true}\n RAG_QDRANT_URL: ${RAG_QDRANT_URL:-http://qdrant:6333}\n RAG_QDRANT_API_KEY: ${RAG_QDRANT_API_KEY:-}\n RAG_RRF_K: ${RAG_RRF_K:-60}\n RAG_CHUNK_STRATEGY: ${RAG_CHUNK_STRATEGY:-semantic}\n RAG_CHUNK_SIM_THRESHOLD: ${RAG_CHUNK_SIM_THRESHOLD:-0.62}\n RAG_CHUNK_MAX_CHARS: ${RAG_CHUNK_MAX_CHARS:-1200}\n RAG_LATE_CHUNK_MAX_CHARS: ${RAG_LATE_CHUNK_MAX_CHARS:-600}\n RAG_LATE_CHUNK_OVERLAP: ${RAG_LATE_CHUNK_OVERLAP:-80}\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-https://cloud.langfuse.com}\n HF_ENDPOINT: ${HF_ENDPOINT:-https://hf-mirror.com}\n TRANSFORMERS_OFFLINE: 1\n volumes:\n - ragdata:/data\n # Bind mount: 直接挂载宿主机模型目录,零拷贝\n - ${HF_CACHE_DIR:-C:/Users/anoth/.hf_cache}/modelscope/BAAI/bge-m3:/models/bge-m3:ro\n - ${HF_CACHE_DIR:-C:/Users/anoth/.hf_cache}/modelscope/BAAI/bge-reranker-v2-m3:/models/bge-reranker-v2-m3:ro\n ports:\n - \"8001:8001\"\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8001/health').status==200 else 1)\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 30s\n\n web:\n build:\n context: ../web\n dockerfile: Dockerfile\n container_name: zhiqian-web\n restart: unless-stopped\n ports:\n - \"80:80\"\n depends_on:\n - backend\n - rag\n\nvolumes:\n pgdata:\n ragdata:\n qdrantdata:\n"}, "3d3749d13fd6199027b417ff621974161d367e57": {"t": 1785748800.8432949, "n": 6378, "h": "a6956220897e08af", "c": "name: zhiqian\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: zhiqian-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: zhiqian\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_DB: zhiqian\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-db.sql:/docker-entrypoint-initdb.d/00_init.sql:ro\n - ./init-temporal-db.sql:/docker-entrypoint-initdb.d/10_temporal.sql:ro\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U zhiqian -d zhiqian\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n qdrant:\n image: qdrant/qdrant:v1.11.3\n container_name: zhiqian-qdrant\n restart: unless-stopped\n volumes:\n - qdrantdata:/qdrant/storage\n ports:\n - \"6333:6333\"\n - \"6334:6334\"\n healthcheck:\n test: [\"CMD\", \"bash\", \"-c\", \"timeout 1 bash -c '</dev/tcp/127.0.0.1/6333' && echo ok\"]\n interval: 10s\n timeout: 5s\n retries: 10\n\n # v2-step-14: Temporal server (auto-setup, 依赖 postgres)\n # 启动方式: docker compose --profile temporal up -d\n # 需要在 .env 中设置 TEMPORAL_ENABLED=true 让 backend 连这里\n temporal:\n image: temporalio/auto-setup:1.25.0\n container_name: zhiqian-temporal\n restart: unless-stopped\n profiles: [\"temporal\"]\n environment:\n DB: postgres12\n DB_PORT: 5432\n POSTGRES_USER: zhiqian\n POSTGRES_PWD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_SEEDS: postgres\n DBNAME: temporal\n VISIBILITY_DBNAME: temporal_visibility\n TEMPORAL_ADDRESS: temporal:7233\n TEMPORAL_CLI_ADDRESS: temporal:7233\n ports:\n - \"7233:7233\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"tctl\", \"--address\", \"temporal:7233\", \"cluster\", \"health\"]\n interval: 15s\n timeout: 5s\n retries: 12\n start_period: 60s\n\n temporal-ui:\n image: temporalio/ui:2.31.2\n container_name: zhiqian-temporal-ui\n restart: unless-stopped\n profiles: [\"temporal\"]\n environment:\n TEMPORAL_ADDRESS: temporal:7233\n TEMPORAL_CORS_ORIGINS: http://localhost:3000,http://localhost:8233\n ports:\n - \"8233:8080\"\n depends_on:\n - temporal\n\n backend:\n build:\n context: ../backend\n dockerfile: Dockerfile\n container_name: zhiqian-backend\n restart: unless-stopped\n environment:\n SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/zhiqian\n SPRING_DATASOURCE_USERNAME: zhiqian\n SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n APP_JWT_SECRET: ${JWT_SECRET:?请在 .env 中设置 JWT_SECRET}\n APP_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?请在 .env 中设置 ADMIN_PASSWORD}\n APP_RAG_BASE_URL: http://rag:8001\n LLM_PROVIDER: ${LLM_PROVIDER:-deepseek}\n LLM_API_KEY: ${LLM_API_KEY:-}\n LLM_BASE_URL: ${LLM_BASE_URL:-https://api.deepseek.com/v1}\n LLM_CHAT_MODEL: ${LLM_CHAT_MODEL:-deepseek-chat}\n LLM_REASONER_MODEL: ${LLM_REASONER_MODEL:-deepseek-reasoner}\n LLM_TEMPERATURE: ${LLM_TEMPERATURE:-0.2}\n LLM_MAX_TOKENS: ${LLM_MAX_TOKENS:-2048}\n LLM_TIMEOUT_SECONDS: ${LLM_TIMEOUT_SECONDS:-60}\n LLM_THINKING_ENABLED: ${LLM_THINKING_ENABLED:-true}\n LLM_REASONING_EFFORT: ${LLM_REASONING_EFFORT:-high}\n # v2-step-08: Langfuse 后端全链观测。留空即 disabled\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-https://cloud.langfuse.com}\n # v2-step-14: Temporal durable workflow。默认 false。\n # TEMPORAL_ENABLED=true 且 docker compose --profile temporal up 后才走 Temporal 路径。\n TEMPORAL_ENABLED: ${TEMPORAL_ENABLED:-false}\n TEMPORAL_TARGET: ${TEMPORAL_TARGET:-temporal:7233}\n TEMPORAL_NAMESPACE: ${TEMPORAL_NAMESPACE:-default}\n TEMPORAL_TASK_QUEUE: ${TEMPORAL_TASK_QUEUE:-zhiqian-migration}\n JAVA_TOOL_OPTIONS: \"-Xms256m -Xmx768m\"\n ports:\n - \"8080:8080\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:8080/actuator/health\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 40s\n\n rag:\n build:\n context: ../rag\n dockerfile: Dockerfile\n args:\n BUILD_ML: ${RAG_BUILD_ML:-0}\n container_name: zhiqian-rag\n restart: unless-stopped\n environment:\n ZHIQIAN_RAG_CHROMA_PATH: /data/.chroma\n RAG_USE_BGE_M3: ${RAG_USE_BGE_M3:-true}\n RAG_BGE_MODEL: ${RAG_BGE_MODEL:-/models/bge-m3}\n RAG_BGE_FP16: ${RAG_BGE_FP16:-true}\n RAG_USE_RERANKER: ${RAG_USE_RERANKER:-true}\n RAG_RERANKER_MODEL: ${RAG_RERANKER_MODEL:-/models/bge-reranker-v2-m3}\n RAG_RERANKER_FP16: ${RAG_RERANKER_FP16:-true}\n RAG_EMBEDDING_DIM: ${RAG_EMBEDDING_DIM:-1024}\n RAG_USE_QDRANT: ${RAG_USE_QDRANT:-true}\n RAG_QDRANT_URL: ${RAG_QDRANT_URL:-http://qdrant:6333}\n RAG_QDRANT_API_KEY: ${RAG_QDRANT_API_KEY:-}\n RAG_RRF_K: ${RAG_RRF_K:-60}\n RAG_CHUNK_STRATEGY: ${RAG_CHUNK_STRATEGY:-semantic}\n RAG_CHUNK_SIM_THRESHOLD: ${RAG_CHUNK_SIM_THRESHOLD:-0.62}\n RAG_CHUNK_MAX_CHARS: ${RAG_CHUNK_MAX_CHARS:-1200}\n RAG_LATE_CHUNK_MAX_CHARS: ${RAG_LATE_CHUNK_MAX_CHARS:-600}\n RAG_LATE_CHUNK_OVERLAP: ${RAG_LATE_CHUNK_OVERLAP:-80}\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-https://cloud.langfuse.com}\n HF_ENDPOINT: ${HF_ENDPOINT:-https://hf-mirror.com}\n TRANSFORMERS_OFFLINE: 1\n volumes:\n - ragdata:/data\n # Bind mount: 直接挂载宿主机模型目录,零拷贝\n - ${HF_CACHE_DIR:-C:/Users/anoth/.hf_cache}/modelscope/BAAI/bge-m3:/models/bge-m3:ro\n - ${HF_CACHE_DIR:-C:/Users/anoth/.hf_cache}/modelscope/BAAI/bge-reranker-v2-m3:/models/bge-reranker-v2-m3:ro\n ports:\n - \"8001:8001\"\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8001/health').status==200 else 1)\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 30s\n\n web:\n build:\n context: ../web\n dockerfile: Dockerfile\n container_name: zhiqian-web\n restart: unless-stopped\n ports:\n - \"80:80\"\n depends_on:\n - backend\n - rag\n\nvolumes:\n pgdata:\n ragdata:\n qdrantdata:\n"}, "6289d20e0c9fe48f73b519670c34a6cc06a0ef74": {"t": 1785748801.94169, "n": 6121, "h": "959b8330f882a60f", "c": "name: zhiqian\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: zhiqian-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: zhiqian\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_DB: zhiqian\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-db.sql:/docker-entrypoint-initdb.d/00_init.sql:ro\n - ./init-temporal-db.sql:/docker-entrypoint-initdb.d/10_temporal.sql:ro\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U zhiqian -d zhiqian\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n qdrant:\n image: qdrant/qdrant:v1.11.3\n container_name: zhiqian-qdrant\n restart: unless-stopped\n profiles: [\"ml\"]\n volumes:\n - qdrantdata:/qdrant/storage\n ports:\n - \"6333:6333\"\n - \"6334:6334\"\n healthcheck:\n test: [\"CMD\", \"bash\", \"-c\", \"timeout 1 bash -c '</dev/tcp/127.0.0.1/6333' && echo ok\"]\n interval: 10s\n timeout: 5s\n retries: 10\n\n # v2-step-14: Temporal server (auto-setup, 依赖 postgres)\n # 启动方式: docker compose --profile temporal up -d\n # 需要在 .env 中设置 TEMPORAL_ENABLED=true 让 backend 连这里\n temporal:\n image: temporalio/auto-setup:1.25.0\n container_name: zhiqian-temporal\n restart: unless-stopped\n profiles: [\"temporal\"]\n environment:\n DB: postgres12\n DB_PORT: 5432\n POSTGRES_USER: zhiqian\n POSTGRES_PWD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_SEEDS: postgres\n DBNAME: temporal\n VISIBILITY_DBNAME: temporal_visibility\n TEMPORAL_ADDRESS: temporal:7233\n TEMPORAL_CLI_ADDRESS: temporal:7233\n ports:\n - \"7233:7233\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"tctl\", \"--address\", \"temporal:7233\", \"cluster\", \"health\"]\n interval: 15s\n timeout: 5s\n retries: 12\n start_period: 60s\n\n temporal-ui:\n image: temporalio/ui:2.31.2\n container_name: zhiqian-temporal-ui\n restart: unless-stopped\n profiles: [\"temporal\"]\n environment:\n TEMPORAL_ADDRESS: temporal:7233\n TEMPORAL_CORS_ORIGINS: http://localhost:3000,http://localhost:8233\n ports:\n - \"8233:8080\"\n depends_on:\n - temporal\n\n backend:\n build:\n context: ../backend\n dockerfile: Dockerfile\n container_name: zhiqian-backend\n restart: unless-stopped\n environment:\n SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/zhiqian\n SPRING_DATASOURCE_USERNAME: zhiqian\n SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n APP_JWT_SECRET: ${JWT_SECRET:?请在 .env 中设置 JWT_SECRET}\n APP_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?请在 .env 中设置 ADMIN_PASSWORD}\n APP_RAG_BASE_URL: http://rag:8001\n LLM_PROVIDER: ${LLM_PROVIDER:-deepseek}\n LLM_API_KEY: ${LLM_API_KEY:-}\n LLM_BASE_URL: ${LLM_BASE_URL:-https://api.deepseek.com/v1}\n LLM_CHAT_MODEL: ${LLM_CHAT_MODEL:-deepseek-chat}\n LLM_REASONER_MODEL: ${LLM_REASONER_MODEL:-deepseek-reasoner}\n LLM_TEMPERATURE: ${LLM_TEMPERATURE:-0.2}\n LLM_MAX_TOKENS: ${LLM_MAX_TOKENS:-2048}\n LLM_TIMEOUT_SECONDS: ${LLM_TIMEOUT_SECONDS:-60}\n LLM_THINKING_ENABLED: ${LLM_THINKING_ENABLED:-true}\n LLM_REASONING_EFFORT: ${LLM_REASONING_EFFORT:-high}\n # v2-step-08: Langfuse 后端全链观测。留空即 disabled\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-https://cloud.langfuse.com}\n # v2-step-14: Temporal durable workflow。默认 false。\n # TEMPORAL_ENABLED=true 且 docker compose --profile temporal up 后才走 Temporal 路径。\n TEMPORAL_ENABLED: ${TEMPORAL_ENABLED:-false}\n TEMPORAL_TARGET: ${TEMPORAL_TARGET:-temporal:7233}\n TEMPORAL_NAMESPACE: ${TEMPORAL_NAMESPACE:-default}\n TEMPORAL_TASK_QUEUE: ${TEMPORAL_TASK_QUEUE:-zhiqian-migration}\n JAVA_TOOL_OPTIONS: \"-Xms256m -Xmx768m\"\n ports:\n - \"8080:8080\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:8080/actuator/health\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 40s\n\n rag:\n build:\n context: ../rag\n dockerfile: Dockerfile\n args:\n BUILD_ML: ${RAG_BUILD_ML:-0}\n container_name: zhiqian-rag\n restart: unless-stopped\n environment:\n ZHIQIAN_RAG_CHROMA_PATH: /data/.chroma\n RAG_USE_BGE_M3: ${RAG_USE_BGE_M3:-true}\n RAG_BGE_MODEL: ${RAG_BGE_MODEL:-BAAI/bge-m3}\n RAG_BGE_FP16: ${RAG_BGE_FP16:-true}\n RAG_USE_RERANKER: ${RAG_USE_RERANKER:-true}\n RAG_RERANKER_MODEL: ${RAG_RERANKER_MODEL:-BAAI/bge-reranker-v2-m3}\n RAG_RERANKER_FP16: ${RAG_RERANKER_FP16:-true}\n RAG_EMBEDDING_DIM: ${RAG_EMBEDDING_DIM:-1024}\n RAG_USE_QDRANT: ${RAG_USE_QDRANT:-true}\n RAG_QDRANT_URL: ${RAG_QDRANT_URL:-http://qdrant:6333}\n RAG_QDRANT_API_KEY: ${RAG_QDRANT_API_KEY:-}\n RAG_RRF_K: ${RAG_RRF_K:-60}\n RAG_CHUNK_STRATEGY: ${RAG_CHUNK_STRATEGY:-semantic}\n RAG_CHUNK_SIM_THRESHOLD: ${RAG_CHUNK_SIM_THRESHOLD:-0.62}\n RAG_CHUNK_MAX_CHARS: ${RAG_CHUNK_MAX_CHARS:-1200}\n RAG_LATE_CHUNK_MAX_CHARS: ${RAG_LATE_CHUNK_MAX_CHARS:-600}\n RAG_LATE_CHUNK_OVERLAP: ${RAG_LATE_CHUNK_OVERLAP:-80}\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-https://cloud.langfuse.com}\n HF_ENDPOINT: ${HF_ENDPOINT:-https://hf-mirror.com}\n volumes:\n - ragdata:/data\n ports:\n - \"8001:8001\"\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8001/health').status==200 else 1)\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 30s\n\n web:\n build:\n context: ../web\n dockerfile: Dockerfile\n container_name: zhiqian-web\n restart: unless-stopped\n ports:\n - \"80:80\"\n depends_on:\n - backend\n - rag\n\nvolumes:\n pgdata:\n ragdata:\n qdrantdata:\n"}, "39ac14c653f35d43deb02685190205b76503e9a1": {"t": 1785748803.0185356, "n": 6005, "h": "b491b4ed8647c239", "c": "name: zhiqian\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: zhiqian-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: zhiqian\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_DB: zhiqian\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-db.sql:/docker-entrypoint-initdb.d/00_init.sql:ro\n - ./init-temporal-db.sql:/docker-entrypoint-initdb.d/10_temporal.sql:ro\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U zhiqian -d zhiqian\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n qdrant:\n image: qdrant/qdrant:v1.11.3\n container_name: zhiqian-qdrant\n restart: unless-stopped\n profiles: [\"ml\"]\n volumes:\n - qdrantdata:/qdrant/storage\n ports:\n - \"6333:6333\"\n - \"6334:6334\"\n healthcheck:\n test: [\"CMD\", \"bash\", \"-c\", \"timeout 1 bash -c '</dev/tcp/127.0.0.1/6333' && echo ok\"]\n interval: 10s\n timeout: 5s\n retries: 10\n\n # v2-step-14: Temporal server (auto-setup, 依赖 postgres)\n # 启动方式: docker compose --profile temporal up -d\n # 需要在 .env 中设置 TEMPORAL_ENABLED=true 让 backend 连这里\n temporal:\n image: temporalio/auto-setup:1.25.0\n container_name: zhiqian-temporal\n restart: unless-stopped\n profiles: [\"temporal\"]\n environment:\n DB: postgres12\n DB_PORT: 5432\n POSTGRES_USER: zhiqian\n POSTGRES_PWD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_SEEDS: postgres\n DBNAME: temporal\n VISIBILITY_DBNAME: temporal_visibility\n TEMPORAL_ADDRESS: temporal:7233\n TEMPORAL_CLI_ADDRESS: temporal:7233\n ports:\n - \"7233:7233\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"tctl\", \"--address\", \"temporal:7233\", \"cluster\", \"health\"]\n interval: 15s\n timeout: 5s\n retries: 12\n start_period: 60s\n\n temporal-ui:\n image: temporalio/ui:2.31.2\n container_name: zhiqian-temporal-ui\n restart: unless-stopped\n profiles: [\"temporal\"]\n environment:\n TEMPORAL_ADDRESS: temporal:7233\n TEMPORAL_CORS_ORIGINS: http://localhost:3000,http://localhost:8233\n ports:\n - \"8233:8080\"\n depends_on:\n - temporal\n\n backend:\n build:\n context: ../backend\n dockerfile: Dockerfile\n container_name: zhiqian-backend\n restart: unless-stopped\n environment:\n SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/zhiqian\n SPRING_DATASOURCE_USERNAME: zhiqian\n SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n APP_JWT_SECRET: ${JWT_SECRET:?请在 .env 中设置 JWT_SECRET}\n APP_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?请在 .env 中设置 ADMIN_PASSWORD}\n APP_RAG_BASE_URL: http://rag:8001\n LLM_PROVIDER: ${LLM_PROVIDER:-deepseek}\n LLM_API_KEY: ${LLM_API_KEY:-}\n LLM_BASE_URL: ${LLM_BASE_URL:-https://api.deepseek.com/v1}\n LLM_CHAT_MODEL: ${LLM_CHAT_MODEL:-deepseek-chat}\n LLM_REASONER_MODEL: ${LLM_REASONER_MODEL:-deepseek-reasoner}\n LLM_TEMPERATURE: ${LLM_TEMPERATURE:-0.2}\n LLM_MAX_TOKENS: ${LLM_MAX_TOKENS:-2048}\n LLM_TIMEOUT_SECONDS: ${LLM_TIMEOUT_SECONDS:-60}\n # v2-step-08: Langfuse 后端全链观测。留空即 disabled\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-https://cloud.langfuse.com}\n # v2-step-14: Temporal durable workflow。默认 false。\n # TEMPORAL_ENABLED=true 且 docker compose --profile temporal up 后才走 Temporal 路径。\n TEMPORAL_ENABLED: ${TEMPORAL_ENABLED:-false}\n TEMPORAL_TARGET: ${TEMPORAL_TARGET:-temporal:7233}\n TEMPORAL_NAMESPACE: ${TEMPORAL_NAMESPACE:-default}\n TEMPORAL_TASK_QUEUE: ${TEMPORAL_TASK_QUEUE:-zhiqian-migration}\n JAVA_TOOL_OPTIONS: \"-Xms256m -Xmx768m\"\n ports:\n - \"8080:8080\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:8080/actuator/health\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 40s\n\n rag:\n build:\n context: ../rag\n dockerfile: Dockerfile\n args:\n BUILD_ML: ${RAG_BUILD_ML:-0}\n container_name: zhiqian-rag\n restart: unless-stopped\n environment:\n ZHIQIAN_RAG_CHROMA_PATH: /data/.chroma\n RAG_USE_BGE_M3: ${RAG_USE_BGE_M3:-true}\n RAG_BGE_MODEL: ${RAG_BGE_MODEL:-BAAI/bge-m3}\n RAG_BGE_FP16: ${RAG_BGE_FP16:-true}\n RAG_USE_RERANKER: ${RAG_USE_RERANKER:-true}\n RAG_RERANKER_MODEL: ${RAG_RERANKER_MODEL:-BAAI/bge-reranker-v2-m3}\n RAG_RERANKER_FP16: ${RAG_RERANKER_FP16:-true}\n RAG_EMBEDDING_DIM: ${RAG_EMBEDDING_DIM:-1024}\n RAG_USE_QDRANT: ${RAG_USE_QDRANT:-true}\n RAG_QDRANT_URL: ${RAG_QDRANT_URL:-http://qdrant:6333}\n RAG_QDRANT_API_KEY: ${RAG_QDRANT_API_KEY:-}\n RAG_RRF_K: ${RAG_RRF_K:-60}\n RAG_CHUNK_STRATEGY: ${RAG_CHUNK_STRATEGY:-semantic}\n RAG_CHUNK_SIM_THRESHOLD: ${RAG_CHUNK_SIM_THRESHOLD:-0.62}\n RAG_CHUNK_MAX_CHARS: ${RAG_CHUNK_MAX_CHARS:-1200}\n RAG_LATE_CHUNK_MAX_CHARS: ${RAG_LATE_CHUNK_MAX_CHARS:-600}\n RAG_LATE_CHUNK_OVERLAP: ${RAG_LATE_CHUNK_OVERLAP:-80}\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-https://cloud.langfuse.com}\n HF_ENDPOINT: ${HF_ENDPOINT:-https://hf-mirror.com}\n volumes:\n - ragdata:/data\n ports:\n - \"8001:8001\"\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8001/health').status==200 else 1)\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 30s\n\n web:\n build:\n context: ../web\n dockerfile: Dockerfile\n container_name: zhiqian-web\n restart: unless-stopped\n ports:\n - \"80:80\"\n depends_on:\n - backend\n - rag\n\nvolumes:\n pgdata:\n ragdata:\n qdrantdata:\n"}, "1ca293a26a759be82c2187635965d84ddcdfdb9a": {"t": 1785748804.2523763, "n": 4383, "h": "77f0353b397db177", "c": "name: zhiqian\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: zhiqian-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: zhiqian\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_DB: zhiqian\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-db.sql:/docker-entrypoint-initdb.d/00_init.sql:ro\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U zhiqian -d zhiqian\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n qdrant:\n image: qdrant/qdrant:v1.11.3\n container_name: zhiqian-qdrant\n restart: unless-stopped\n profiles: [\"ml\"]\n volumes:\n - qdrantdata:/qdrant/storage\n ports:\n - \"6333:6333\"\n - \"6334:6334\"\n healthcheck:\n test: [\"CMD\", \"bash\", \"-c\", \"timeout 1 bash -c '</dev/tcp/127.0.0.1/6333' && echo ok\"]\n interval: 10s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ../backend\n dockerfile: Dockerfile\n container_name: zhiqian-backend\n restart: unless-stopped\n environment:\n SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/zhiqian\n SPRING_DATASOURCE_USERNAME: zhiqian\n SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n APP_JWT_SECRET: ${JWT_SECRET:?请在 .env 中设置 JWT_SECRET}\n APP_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?请在 .env 中设置 ADMIN_PASSWORD}\n APP_RAG_BASE_URL: http://rag:8001\n LLM_PROVIDER: ${LLM_PROVIDER:-deepseek}\n LLM_API_KEY: ${LLM_API_KEY:-}\n LLM_BASE_URL: ${LLM_BASE_URL:-https://api.deepseek.com/v1}\n LLM_CHAT_MODEL: ${LLM_CHAT_MODEL:-deepseek-chat}\n LLM_REASONER_MODEL: ${LLM_REASONER_MODEL:-deepseek-reasoner}\n LLM_TEMPERATURE: ${LLM_TEMPERATURE:-0.2}\n LLM_MAX_TOKENS: ${LLM_MAX_TOKENS:-2048}\n LLM_TIMEOUT_SECONDS: ${LLM_TIMEOUT_SECONDS:-60}\n # v2-step-08: Langfuse 后端全链观测。留空即 disabled,不影响功能。\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-https://cloud.langfuse.com}\n JAVA_TOOL_OPTIONS: \"-Xms256m -Xmx768m\"\n ports:\n - \"8080:8080\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:8080/actuator/health\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 40s\n\n rag:\n build:\n context: ../rag\n dockerfile: Dockerfile\n args:\n BUILD_ML: ${RAG_BUILD_ML:-0}\n container_name: zhiqian-rag\n restart: unless-stopped\n environment:\n ZHIQIAN_RAG_CHROMA_PATH: /data/.chroma\n RAG_USE_BGE_M3: ${RAG_USE_BGE_M3:-true}\n RAG_BGE_MODEL: ${RAG_BGE_MODEL:-BAAI/bge-m3}\n RAG_BGE_FP16: ${RAG_BGE_FP16:-true}\n RAG_USE_RERANKER: ${RAG_USE_RERANKER:-true}\n RAG_RERANKER_MODEL: ${RAG_RERANKER_MODEL:-BAAI/bge-reranker-v2-m3}\n RAG_RERANKER_FP16: ${RAG_RERANKER_FP16:-true}\n RAG_EMBEDDING_DIM: ${RAG_EMBEDDING_DIM:-1024}\n RAG_USE_QDRANT: ${RAG_USE_QDRANT:-true}\n RAG_QDRANT_URL: ${RAG_QDRANT_URL:-http://qdrant:6333}\n RAG_QDRANT_API_KEY: ${RAG_QDRANT_API_KEY:-}\n RAG_RRF_K: ${RAG_RRF_K:-60}\n # v2-step-06: Chunking\n RAG_CHUNK_STRATEGY: ${RAG_CHUNK_STRATEGY:-semantic}\n RAG_CHUNK_SIM_THRESHOLD: ${RAG_CHUNK_SIM_THRESHOLD:-0.62}\n RAG_CHUNK_MAX_CHARS: ${RAG_CHUNK_MAX_CHARS:-1200}\n RAG_LATE_CHUNK_MAX_CHARS: ${RAG_LATE_CHUNK_MAX_CHARS:-600}\n RAG_LATE_CHUNK_OVERLAP: ${RAG_LATE_CHUNK_OVERLAP:-80}\n # v2-step-07: Langfuse 全链观测 (留空即 disabled)\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-https://cloud.langfuse.com}\n HF_ENDPOINT: ${HF_ENDPOINT:-https://hf-mirror.com}\n volumes:\n - ragdata:/data\n ports:\n - \"8001:8001\"\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8001/health').status==200 else 1)\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 30s\n\n web:\n build:\n context: ../web\n dockerfile: Dockerfile\n container_name: zhiqian-web\n restart: unless-stopped\n ports:\n - \"80:80\"\n depends_on:\n - backend\n - rag\n\nvolumes:\n pgdata:\n ragdata:\n qdrantdata:\n"}, "ceb2703477fb12e3453db571e443990336a31447": {"t": 1785748805.4740767, "n": 4157, "h": "c6795509ee8c5d81", "c": "name: zhiqian\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: zhiqian-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: zhiqian\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_DB: zhiqian\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-db.sql:/docker-entrypoint-initdb.d/00_init.sql:ro\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U zhiqian -d zhiqian\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n qdrant:\n image: qdrant/qdrant:v1.11.3\n container_name: zhiqian-qdrant\n restart: unless-stopped\n profiles: [\"ml\"]\n volumes:\n - qdrantdata:/qdrant/storage\n ports:\n - \"6333:6333\"\n - \"6334:6334\"\n healthcheck:\n test: [\"CMD\", \"bash\", \"-c\", \"timeout 1 bash -c '</dev/tcp/127.0.0.1/6333' && echo ok\"]\n interval: 10s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ../backend\n dockerfile: Dockerfile\n container_name: zhiqian-backend\n restart: unless-stopped\n environment:\n SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/zhiqian\n SPRING_DATASOURCE_USERNAME: zhiqian\n SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n APP_JWT_SECRET: ${JWT_SECRET:?请在 .env 中设置 JWT_SECRET}\n APP_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?请在 .env 中设置 ADMIN_PASSWORD}\n APP_RAG_BASE_URL: http://rag:8001\n LLM_PROVIDER: ${LLM_PROVIDER:-deepseek}\n LLM_API_KEY: ${LLM_API_KEY:-}\n LLM_BASE_URL: ${LLM_BASE_URL:-https://api.deepseek.com/v1}\n LLM_CHAT_MODEL: ${LLM_CHAT_MODEL:-deepseek-chat}\n LLM_REASONER_MODEL: ${LLM_REASONER_MODEL:-deepseek-reasoner}\n LLM_TEMPERATURE: ${LLM_TEMPERATURE:-0.2}\n LLM_MAX_TOKENS: ${LLM_MAX_TOKENS:-2048}\n LLM_TIMEOUT_SECONDS: ${LLM_TIMEOUT_SECONDS:-60}\n JAVA_TOOL_OPTIONS: \"-Xms256m -Xmx768m\"\n ports:\n - \"8080:8080\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:8080/actuator/health\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 40s\n\n rag:\n build:\n context: ../rag\n dockerfile: Dockerfile\n args:\n BUILD_ML: ${RAG_BUILD_ML:-0}\n container_name: zhiqian-rag\n restart: unless-stopped\n environment:\n ZHIQIAN_RAG_CHROMA_PATH: /data/.chroma\n RAG_USE_BGE_M3: ${RAG_USE_BGE_M3:-true}\n RAG_BGE_MODEL: ${RAG_BGE_MODEL:-BAAI/bge-m3}\n RAG_BGE_FP16: ${RAG_BGE_FP16:-true}\n RAG_USE_RERANKER: ${RAG_USE_RERANKER:-true}\n RAG_RERANKER_MODEL: ${RAG_RERANKER_MODEL:-BAAI/bge-reranker-v2-m3}\n RAG_RERANKER_FP16: ${RAG_RERANKER_FP16:-true}\n RAG_EMBEDDING_DIM: ${RAG_EMBEDDING_DIM:-1024}\n RAG_USE_QDRANT: ${RAG_USE_QDRANT:-true}\n RAG_QDRANT_URL: ${RAG_QDRANT_URL:-http://qdrant:6333}\n RAG_QDRANT_API_KEY: ${RAG_QDRANT_API_KEY:-}\n RAG_RRF_K: ${RAG_RRF_K:-60}\n # v2-step-06: Chunking\n RAG_CHUNK_STRATEGY: ${RAG_CHUNK_STRATEGY:-semantic}\n RAG_CHUNK_SIM_THRESHOLD: ${RAG_CHUNK_SIM_THRESHOLD:-0.62}\n RAG_CHUNK_MAX_CHARS: ${RAG_CHUNK_MAX_CHARS:-1200}\n RAG_LATE_CHUNK_MAX_CHARS: ${RAG_LATE_CHUNK_MAX_CHARS:-600}\n RAG_LATE_CHUNK_OVERLAP: ${RAG_LATE_CHUNK_OVERLAP:-80}\n # v2-step-07: Langfuse 全链观测 (留空即 disabled)\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-https://cloud.langfuse.com}\n HF_ENDPOINT: ${HF_ENDPOINT:-https://hf-mirror.com}\n volumes:\n - ragdata:/data\n ports:\n - \"8001:8001\"\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8001/health').status==200 else 1)\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 30s\n\n web:\n build:\n context: ../web\n dockerfile: Dockerfile\n container_name: zhiqian-web\n restart: unless-stopped\n ports:\n - \"80:80\"\n depends_on:\n - backend\n - rag\n\nvolumes:\n pgdata:\n ragdata:\n qdrantdata:\n"}, "4670edd5d4003c6ab3cb900c7c950bb33aba70f6": {"t": 1785748806.6921072, "n": 3938, "h": "ab8397dd3cf8ed73", "c": "name: zhiqian\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: zhiqian-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: zhiqian\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_DB: zhiqian\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-db.sql:/docker-entrypoint-initdb.d/00_init.sql:ro\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U zhiqian -d zhiqian\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n qdrant:\n image: qdrant/qdrant:v1.11.3\n container_name: zhiqian-qdrant\n restart: unless-stopped\n profiles: [\"ml\"]\n volumes:\n - qdrantdata:/qdrant/storage\n ports:\n - \"6333:6333\"\n - \"6334:6334\"\n healthcheck:\n test: [\"CMD\", \"bash\", \"-c\", \"timeout 1 bash -c '</dev/tcp/127.0.0.1/6333' && echo ok\"]\n interval: 10s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ../backend\n dockerfile: Dockerfile\n container_name: zhiqian-backend\n restart: unless-stopped\n environment:\n SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/zhiqian\n SPRING_DATASOURCE_USERNAME: zhiqian\n SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n APP_JWT_SECRET: ${JWT_SECRET:?请在 .env 中设置 JWT_SECRET}\n APP_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?请在 .env 中设置 ADMIN_PASSWORD}\n APP_RAG_BASE_URL: http://rag:8001\n LLM_PROVIDER: ${LLM_PROVIDER:-deepseek}\n LLM_API_KEY: ${LLM_API_KEY:-}\n LLM_BASE_URL: ${LLM_BASE_URL:-https://api.deepseek.com/v1}\n LLM_CHAT_MODEL: ${LLM_CHAT_MODEL:-deepseek-chat}\n LLM_REASONER_MODEL: ${LLM_REASONER_MODEL:-deepseek-reasoner}\n LLM_TEMPERATURE: ${LLM_TEMPERATURE:-0.2}\n LLM_MAX_TOKENS: ${LLM_MAX_TOKENS:-2048}\n LLM_TIMEOUT_SECONDS: ${LLM_TIMEOUT_SECONDS:-60}\n JAVA_TOOL_OPTIONS: \"-Xms256m -Xmx768m\"\n ports:\n - \"8080:8080\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:8080/actuator/health\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 40s\n\n rag:\n build:\n context: ../rag\n dockerfile: Dockerfile\n args:\n BUILD_ML: ${RAG_BUILD_ML:-0}\n container_name: zhiqian-rag\n restart: unless-stopped\n environment:\n ZHIQIAN_RAG_CHROMA_PATH: /data/.chroma\n RAG_USE_BGE_M3: ${RAG_USE_BGE_M3:-true}\n RAG_BGE_MODEL: ${RAG_BGE_MODEL:-BAAI/bge-m3}\n RAG_BGE_FP16: ${RAG_BGE_FP16:-true}\n RAG_USE_RERANKER: ${RAG_USE_RERANKER:-true}\n RAG_RERANKER_MODEL: ${RAG_RERANKER_MODEL:-BAAI/bge-reranker-v2-m3}\n RAG_RERANKER_FP16: ${RAG_RERANKER_FP16:-true}\n RAG_EMBEDDING_DIM: ${RAG_EMBEDDING_DIM:-1024}\n RAG_USE_QDRANT: ${RAG_USE_QDRANT:-true}\n RAG_QDRANT_URL: ${RAG_QDRANT_URL:-http://qdrant:6333}\n RAG_QDRANT_API_KEY: ${RAG_QDRANT_API_KEY:-}\n RAG_RRF_K: ${RAG_RRF_K:-60}\n # v2-step-06: Chunking\n RAG_CHUNK_STRATEGY: ${RAG_CHUNK_STRATEGY:-semantic}\n RAG_CHUNK_SIM_THRESHOLD: ${RAG_CHUNK_SIM_THRESHOLD:-0.62}\n RAG_CHUNK_MAX_CHARS: ${RAG_CHUNK_MAX_CHARS:-1200}\n RAG_LATE_CHUNK_MAX_CHARS: ${RAG_LATE_CHUNK_MAX_CHARS:-600}\n RAG_LATE_CHUNK_OVERLAP: ${RAG_LATE_CHUNK_OVERLAP:-80}\n HF_ENDPOINT: ${HF_ENDPOINT:-https://hf-mirror.com}\n volumes:\n - ragdata:/data\n ports:\n - \"8001:8001\"\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8001/health').status==200 else 1)\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 30s\n\n web:\n build:\n context: ../web\n dockerfile: Dockerfile\n container_name: zhiqian-web\n restart: unless-stopped\n ports:\n - \"80:80\"\n depends_on:\n - backend\n - rag\n\nvolumes:\n pgdata:\n ragdata:\n qdrantdata:\n"}, "104381a8e33048d5162b58fca77eb21d335261e2": {"t": 1785748807.9113543, "n": 3738, "h": "9d95484fc4410bc0", "c": "name: zhiqian\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: zhiqian-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: zhiqian\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_DB: zhiqian\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-db.sql:/docker-entrypoint-initdb.d/00_init.sql:ro\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U zhiqian -d zhiqian\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n # v2-step-05:Qdrant 向量库。默认不启(仅在 --profile ml 时启动)。\n # 不启时 RAG 服务会检测到 Qdrant 不可达,自动退化到单走 BM25 路径。\n qdrant:\n image: qdrant/qdrant:v1.11.3\n container_name: zhiqian-qdrant\n restart: unless-stopped\n profiles: [\"ml\"]\n volumes:\n - qdrantdata:/qdrant/storage\n ports:\n - \"6333:6333\"\n - \"6334:6334\"\n healthcheck:\n test: [\"CMD\", \"bash\", \"-c\", \"timeout 1 bash -c '</dev/tcp/127.0.0.1/6333' && echo ok\"]\n interval: 10s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ../backend\n dockerfile: Dockerfile\n container_name: zhiqian-backend\n restart: unless-stopped\n environment:\n SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/zhiqian\n SPRING_DATASOURCE_USERNAME: zhiqian\n SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n APP_JWT_SECRET: ${JWT_SECRET:?请在 .env 中设置 JWT_SECRET}\n APP_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?请在 .env 中设置 ADMIN_PASSWORD}\n APP_RAG_BASE_URL: http://rag:8001\n LLM_PROVIDER: ${LLM_PROVIDER:-deepseek}\n LLM_API_KEY: ${LLM_API_KEY:-}\n LLM_BASE_URL: ${LLM_BASE_URL:-https://api.deepseek.com/v1}\n LLM_CHAT_MODEL: ${LLM_CHAT_MODEL:-deepseek-chat}\n LLM_REASONER_MODEL: ${LLM_REASONER_MODEL:-deepseek-reasoner}\n LLM_TEMPERATURE: ${LLM_TEMPERATURE:-0.2}\n LLM_MAX_TOKENS: ${LLM_MAX_TOKENS:-2048}\n LLM_TIMEOUT_SECONDS: ${LLM_TIMEOUT_SECONDS:-60}\n JAVA_TOOL_OPTIONS: \"-Xms256m -Xmx768m\"\n ports:\n - \"8080:8080\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:8080/actuator/health\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 40s\n\n rag:\n build:\n context: ../rag\n dockerfile: Dockerfile\n args:\n BUILD_ML: ${RAG_BUILD_ML:-0}\n container_name: zhiqian-rag\n restart: unless-stopped\n environment:\n ZHIQIAN_RAG_CHROMA_PATH: /data/.chroma\n RAG_USE_BGE_M3: ${RAG_USE_BGE_M3:-true}\n RAG_BGE_MODEL: ${RAG_BGE_MODEL:-BAAI/bge-m3}\n RAG_BGE_FP16: ${RAG_BGE_FP16:-true}\n RAG_USE_RERANKER: ${RAG_USE_RERANKER:-true}\n RAG_RERANKER_MODEL: ${RAG_RERANKER_MODEL:-BAAI/bge-reranker-v2-m3}\n RAG_RERANKER_FP16: ${RAG_RERANKER_FP16:-true}\n RAG_EMBEDDING_DIM: ${RAG_EMBEDDING_DIM:-1024}\n # v2-step-05:Qdrant + RRF\n RAG_USE_QDRANT: ${RAG_USE_QDRANT:-true}\n RAG_QDRANT_URL: ${RAG_QDRANT_URL:-http://qdrant:6333}\n RAG_QDRANT_API_KEY: ${RAG_QDRANT_API_KEY:-}\n RAG_RRF_K: ${RAG_RRF_K:-60}\n HF_ENDPOINT: ${HF_ENDPOINT:-https://hf-mirror.com}\n volumes:\n - ragdata:/data\n ports:\n - \"8001:8001\"\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8001/health').status==200 else 1)\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 30s\n\n web:\n build:\n context: ../web\n dockerfile: Dockerfile\n container_name: zhiqian-web\n restart: unless-stopped\n ports:\n - \"80:80\"\n depends_on:\n - backend\n - rag\n\nvolumes:\n pgdata:\n ragdata:\n qdrantdata:\n"}, "d6b4ac5824daae83250beff2d35a3eb6c3f1ced8": {"t": 1785748809.1605284, "n": 3208, "h": "b3b40d332bcffe31", "c": "name: zhiqian\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: zhiqian-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: zhiqian\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_DB: zhiqian\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-db.sql:/docker-entrypoint-initdb.d/00_init.sql:ro\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U zhiqian -d zhiqian\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ../backend\n dockerfile: Dockerfile\n container_name: zhiqian-backend\n restart: unless-stopped\n environment:\n SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/zhiqian\n SPRING_DATASOURCE_USERNAME: zhiqian\n SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n APP_JWT_SECRET: ${JWT_SECRET:?请在 .env 中设置 JWT_SECRET}\n APP_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?请在 .env 中设置 ADMIN_PASSWORD}\n APP_RAG_BASE_URL: http://rag:8001\n LLM_PROVIDER: ${LLM_PROVIDER:-deepseek}\n LLM_API_KEY: ${LLM_API_KEY:-}\n LLM_BASE_URL: ${LLM_BASE_URL:-https://api.deepseek.com/v1}\n LLM_CHAT_MODEL: ${LLM_CHAT_MODEL:-deepseek-chat}\n LLM_REASONER_MODEL: ${LLM_REASONER_MODEL:-deepseek-reasoner}\n LLM_TEMPERATURE: ${LLM_TEMPERATURE:-0.2}\n LLM_MAX_TOKENS: ${LLM_MAX_TOKENS:-2048}\n LLM_TIMEOUT_SECONDS: ${LLM_TIMEOUT_SECONDS:-60}\n JAVA_TOOL_OPTIONS: \"-Xms256m -Xmx768m\"\n ports:\n - \"8080:8080\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:8080/actuator/health\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 40s\n\n rag:\n build:\n context: ../rag\n dockerfile: Dockerfile\n args:\n # v2-step-04:默认 0 保持轻依赖;BUILD_ML=1 启用 BGE-M3 + Reranker 真模型。\n BUILD_ML: ${RAG_BUILD_ML:-0}\n container_name: zhiqian-rag\n restart: unless-stopped\n environment:\n ZHIQIAN_RAG_CHROMA_PATH: /data/.chroma\n # v2-step-04:BGE-M3 / Reranker 运行期开关。BUILD_ML=0 时这些变量也能设 true,代码会自动检测并退化。\n RAG_USE_BGE_M3: ${RAG_USE_BGE_M3:-true}\n RAG_BGE_MODEL: ${RAG_BGE_MODEL:-BAAI/bge-m3}\n RAG_BGE_FP16: ${RAG_BGE_FP16:-true}\n RAG_USE_RERANKER: ${RAG_USE_RERANKER:-true}\n RAG_RERANKER_MODEL: ${RAG_RERANKER_MODEL:-BAAI/bge-reranker-v2-m3}\n RAG_RERANKER_FP16: ${RAG_RERANKER_FP16:-true}\n RAG_EMBEDDING_DIM: ${RAG_EMBEDDING_DIM:-1024}\n # HuggingFace 镜像源(仅在 BUILD_ML=1 且需要拉取模型时生效)\n HF_ENDPOINT: ${HF_ENDPOINT:-https://hf-mirror.com}\n volumes:\n - ragdata:/data\n ports:\n - \"8001:8001\"\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8001/health').status==200 else 1)\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 30s\n\n web:\n build:\n context: ../web\n dockerfile: Dockerfile\n container_name: zhiqian-web\n restart: unless-stopped\n ports:\n - \"80:80\"\n depends_on:\n - backend\n - rag\n\nvolumes:\n pgdata:\n ragdata:\n"}, "790b10f2382ffa782077ff539159dd10a99c6d64": {"t": 1785748810.26697, "n": 2596, "h": "749ca77e2020b659", "c": "name: zhiqian\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: zhiqian-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: zhiqian\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_DB: zhiqian\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-db.sql:/docker-entrypoint-initdb.d/00_init.sql:ro\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U zhiqian -d zhiqian\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ../backend\n dockerfile: Dockerfile\n container_name: zhiqian-backend\n restart: unless-stopped\n environment:\n SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/zhiqian\n SPRING_DATASOURCE_USERNAME: zhiqian\n SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n APP_JWT_SECRET: ${JWT_SECRET:?请在 .env 中设置 JWT_SECRET}\n APP_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?请在 .env 中设置 ADMIN_PASSWORD}\n APP_RAG_BASE_URL: http://rag:8001\n # v2-step-02 新增:LLM 变量透传。未设置则为空字串,后端走 MockLlmClient。\n LLM_PROVIDER: ${LLM_PROVIDER:-deepseek}\n LLM_API_KEY: ${LLM_API_KEY:-}\n LLM_BASE_URL: ${LLM_BASE_URL:-https://api.deepseek.com/v1}\n LLM_CHAT_MODEL: ${LLM_CHAT_MODEL:-deepseek-chat}\n LLM_REASONER_MODEL: ${LLM_REASONER_MODEL:-deepseek-reasoner}\n LLM_TEMPERATURE: ${LLM_TEMPERATURE:-0.2}\n LLM_MAX_TOKENS: ${LLM_MAX_TOKENS:-2048}\n LLM_TIMEOUT_SECONDS: ${LLM_TIMEOUT_SECONDS:-60}\n JAVA_TOOL_OPTIONS: \"-Xms256m -Xmx768m\"\n ports:\n - \"8080:8080\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:8080/actuator/health\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 40s\n\n rag:\n build:\n context: ../rag\n dockerfile: Dockerfile\n container_name: zhiqian-rag\n restart: unless-stopped\n environment:\n ZHIQIAN_RAG_CHROMA_PATH: /data/.chroma\n volumes:\n - ragdata:/data\n ports:\n - \"8001:8001\"\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8001/health').status==200 else 1)\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 20s\n\n web:\n build:\n context: ../web\n dockerfile: Dockerfile\n container_name: zhiqian-web\n restart: unless-stopped\n ports:\n - \"80:80\"\n depends_on:\n - backend\n - rag\n\nvolumes:\n pgdata:\n ragdata:\n"}, "eb9342499731cc21fbd423d9b9b05f7c8f226959": {"t": 1785748811.3246198, "n": 2121, "h": "3f79fba06addedff", "c": "name: zhiqian\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: zhiqian-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: zhiqian\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n POSTGRES_DB: zhiqian\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-db.sql:/docker-entrypoint-initdb.d/00_init.sql:ro\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U zhiqian -d zhiqian\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ../backend\n dockerfile: Dockerfile\n container_name: zhiqian-backend\n restart: unless-stopped\n environment:\n SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/zhiqian\n SPRING_DATASOURCE_USERNAME: zhiqian\n SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:?请在 .env 中设置 POSTGRES_PASSWORD}\n APP_JWT_SECRET: ${JWT_SECRET:?请在 .env 中设置 JWT_SECRET}\n APP_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?请在 .env 中设置 ADMIN_PASSWORD}\n APP_RAG_BASE_URL: http://rag:8001\n JAVA_TOOL_OPTIONS: \"-Xms256m -Xmx768m\"\n ports:\n - \"8080:8080\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:8080/actuator/health\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 40s\n\n rag:\n build:\n context: ../rag\n dockerfile: Dockerfile\n container_name: zhiqian-rag\n restart: unless-stopped\n environment:\n ZHIQIAN_RAG_CHROMA_PATH: /data/.chroma\n volumes:\n - ragdata:/data\n ports:\n - \"8001:8001\"\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8001/health').status==200 else 1)\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 20s\n\n web:\n build:\n context: ../web\n dockerfile: Dockerfile\n container_name: zhiqian-web\n restart: unless-stopped\n ports:\n - \"80:80\"\n depends_on:\n - backend\n - rag\n\nvolumes:\n pgdata:\n ragdata:\n"}, "ac79f9bc38873d56ad0197d0107627b96a685df0": {"t": 1785748812.4498308, "n": 2065, "h": "11e91c7b40e4bea2", "c": "name: zhiqian\n\nservices:\n postgres:\n image: postgres:16-alpine\n container_name: zhiqian-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: zhiqian\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-zhiqian123}\n POSTGRES_DB: zhiqian\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-db.sql:/docker-entrypoint-initdb.d/00_init.sql:ro\n ports:\n - \"5432:5432\"\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U zhiqian -d zhiqian\"]\n interval: 5s\n timeout: 5s\n retries: 10\n\n backend:\n build:\n context: ../backend\n dockerfile: Dockerfile\n container_name: zhiqian-backend\n restart: unless-stopped\n environment:\n SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/zhiqian\n SPRING_DATASOURCE_USERNAME: zhiqian\n SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:-zhiqian123}\n APP_JWT_SECRET: ${JWT_SECRET:-change-me-please-change-me-please-32bytes-min}\n APP_RAG_BASE_URL: http://rag:8001\n JAVA_TOOL_OPTIONS: \"-Xms256m -Xmx768m\"\n ports:\n - \"8080:8080\"\n depends_on:\n postgres:\n condition: service_healthy\n healthcheck:\n test: [\"CMD\", \"wget\", \"-qO-\", \"http://localhost:8080/actuator/health\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 40s\n\n rag:\n build:\n context: ../rag\n dockerfile: Dockerfile\n container_name: zhiqian-rag\n restart: unless-stopped\n environment:\n ZHIQIAN_RAG_CHROMA_PATH: /data/.chroma\n volumes:\n - ragdata:/data\n ports:\n - \"8001:8001\"\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8001/health').status==200 else 1)\"]\n interval: 10s\n timeout: 5s\n retries: 12\n start_period: 20s\n\n web:\n build:\n context: ../web\n dockerfile: Dockerfile\n container_name: zhiqian-web\n restart: unless-stopped\n ports:\n - \"80:80\"\n depends_on:\n - backend\n - rag\n\nvolumes:\n pgdata:\n ragdata:\n"}}, "zhiqian/backend/src/main/resources/application.yml": {"450a71e5cdc3cfb27544c338af7e73ac5bd5efab": {"t": 1785746948.0518847, "n": 2453, "h": "0b9407b3eb66bd24", "c": "server:\n port: 8080\n tomcat:\n connection-timeout: 300000 # 5min — 单次 migrate 请求可能包含 6 阶段 × 多次 LLM 调用\n threads:\n max: 32 # Tomcat 线程减少,实际 LLM 工作在 migrateExecutor 线程池\n accept-count: 200 # 排队队列加长,防止连接被拒\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\nspring:\n application:\n name: zhiqian-backend\n datasource:\n url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/zhiqian}\n username: ${SPRING_DATASOURCE_USERNAME:zhiqian}\n password: ${SPRING_DATASOURCE_PASSWORD}\n driver-class-name: org.postgresql.Driver\n flyway:\n enabled: true\n baseline-on-migrate: true\n locations: classpath:db/migration\n\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info\n\napp:\n jwt:\n secret: ${APP_JWT_SECRET}\n ttl-minutes: ${APP_JWT_TTL_MINUTES:60}\n admin:\n password: ${APP_ADMIN_PASSWORD}\n rag:\n base-url: ${APP_RAG_BASE_URL:http://localhost:8001}\n # ===== v2-step-02: LLM 接入配置 =====\n llm:\n provider: ${LLM_PROVIDER:deepseek}\n api-key: ${LLM_API_KEY:}\n base-url: ${LLM_BASE_URL:https://api.deepseek.com/v1}\n chat-model: ${LLM_CHAT_MODEL:deepseek-chat}\n reasoner-model: ${LLM_REASONER_MODEL:deepseek-reasoner}\n temperature: ${LLM_TEMPERATURE:0.2}\n max-tokens: ${LLM_MAX_TOKENS:2048}\n timeout-seconds: ${LLM_TIMEOUT_SECONDS:60}\n thinking-enabled: ${LLM_THINKING_ENABLED:true}\n reasoning-effort: ${LLM_REASONING_EFFORT:high}\n # ===== v2-step-08: Langfuse 后端全链观测 =====\n langfuse:\n enabled: ${LANGFUSE_ENABLED:true}\n host: ${LANGFUSE_HOST:https://cloud.langfuse.com}\n public-key: ${LANGFUSE_PUBLIC_KEY:}\n secret-key: ${LANGFUSE_SECRET_KEY:}\n # ===== v2-step-14: Temporal durable workflow =====\n # enabled=false (默认) 时不装载任何 Temporal bean, 原 AgentRunner 路径完全不变。\n # 启用后必需 docker compose --profile temporal up 拉起 temporal-server。\n temporal:\n enabled: ${TEMPORAL_ENABLED:false}\n service-target: ${TEMPORAL_TARGET:127.0.0.1:7233}\n namespace: ${TEMPORAL_NAMESPACE:default}\n task-queue: ${TEMPORAL_TASK_QUEUE:zhiqian-migration}\n workflow-execution-timeout-minutes: ${TEMPORAL_WF_TIMEOUT_MIN:60}\n activity-start-to-close-timeout-seconds: ${TEMPORAL_ACT_TIMEOUT_SEC:600}\n activity-max-attempts: ${TEMPORAL_ACT_MAX_ATTEMPTS:3}\n worker-concurrent-activity-execution-size: ${TEMPORAL_WORKER_CONCURRENCY:8}\n\nlogging:\n level:\n root: INFO\n com.zhiqian: DEBUG\n"}, "3d3749d13fd6199027b417ff621974161d367e57": {"t": 1785748801.0481782, "n": 2453, "h": "0b9407b3eb66bd24", "c": "server:\n port: 8080\n tomcat:\n connection-timeout: 300000 # 5min — 单次 migrate 请求可能包含 6 阶段 × 多次 LLM 调用\n threads:\n max: 32 # Tomcat 线程减少,实际 LLM 工作在 migrateExecutor 线程池\n accept-count: 200 # 排队队列加长,防止连接被拒\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\nspring:\n application:\n name: zhiqian-backend\n datasource:\n url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/zhiqian}\n username: ${SPRING_DATASOURCE_USERNAME:zhiqian}\n password: ${SPRING_DATASOURCE_PASSWORD}\n driver-class-name: org.postgresql.Driver\n flyway:\n enabled: true\n baseline-on-migrate: true\n locations: classpath:db/migration\n\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info\n\napp:\n jwt:\n secret: ${APP_JWT_SECRET}\n ttl-minutes: ${APP_JWT_TTL_MINUTES:60}\n admin:\n password: ${APP_ADMIN_PASSWORD}\n rag:\n base-url: ${APP_RAG_BASE_URL:http://localhost:8001}\n # ===== v2-step-02: LLM 接入配置 =====\n llm:\n provider: ${LLM_PROVIDER:deepseek}\n api-key: ${LLM_API_KEY:}\n base-url: ${LLM_BASE_URL:https://api.deepseek.com/v1}\n chat-model: ${LLM_CHAT_MODEL:deepseek-chat}\n reasoner-model: ${LLM_REASONER_MODEL:deepseek-reasoner}\n temperature: ${LLM_TEMPERATURE:0.2}\n max-tokens: ${LLM_MAX_TOKENS:2048}\n timeout-seconds: ${LLM_TIMEOUT_SECONDS:60}\n thinking-enabled: ${LLM_THINKING_ENABLED:true}\n reasoning-effort: ${LLM_REASONING_EFFORT:high}\n # ===== v2-step-08: Langfuse 后端全链观测 =====\n langfuse:\n enabled: ${LANGFUSE_ENABLED:true}\n host: ${LANGFUSE_HOST:https://cloud.langfuse.com}\n public-key: ${LANGFUSE_PUBLIC_KEY:}\n secret-key: ${LANGFUSE_SECRET_KEY:}\n # ===== v2-step-14: Temporal durable workflow =====\n # enabled=false (默认) 时不装载任何 Temporal bean, 原 AgentRunner 路径完全不变。\n # 启用后必需 docker compose --profile temporal up 拉起 temporal-server。\n temporal:\n enabled: ${TEMPORAL_ENABLED:false}\n service-target: ${TEMPORAL_TARGET:127.0.0.1:7233}\n namespace: ${TEMPORAL_NAMESPACE:default}\n task-queue: ${TEMPORAL_TASK_QUEUE:zhiqian-migration}\n workflow-execution-timeout-minutes: ${TEMPORAL_WF_TIMEOUT_MIN:60}\n activity-start-to-close-timeout-seconds: ${TEMPORAL_ACT_TIMEOUT_SEC:600}\n activity-max-attempts: ${TEMPORAL_ACT_MAX_ATTEMPTS:3}\n worker-concurrent-activity-execution-size: ${TEMPORAL_WORKER_CONCURRENCY:8}\n\nlogging:\n level:\n root: INFO\n com.zhiqian: DEBUG\n"}, "6289d20e0c9fe48f73b519670c34a6cc06a0ef74": {"t": 1785748802.127709, "n": 2226, "h": "d0c6d015a8ba8d24", "c": "server:\n port: 8080\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\nspring:\n application:\n name: zhiqian-backend\n datasource:\n url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/zhiqian}\n username: ${SPRING_DATASOURCE_USERNAME:zhiqian}\n password: ${SPRING_DATASOURCE_PASSWORD}\n driver-class-name: org.postgresql.Driver\n flyway:\n enabled: true\n baseline-on-migrate: true\n locations: classpath:db/migration\n\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info\n\napp:\n jwt:\n secret: ${APP_JWT_SECRET}\n ttl-minutes: ${APP_JWT_TTL_MINUTES:60}\n admin:\n password: ${APP_ADMIN_PASSWORD}\n rag:\n base-url: ${APP_RAG_BASE_URL:http://localhost:8001}\n # ===== v2-step-02: LLM 接入配置 =====\n llm:\n provider: ${LLM_PROVIDER:deepseek}\n api-key: ${LLM_API_KEY:}\n base-url: ${LLM_BASE_URL:https://api.deepseek.com/v1}\n chat-model: ${LLM_CHAT_MODEL:deepseek-chat}\n reasoner-model: ${LLM_REASONER_MODEL:deepseek-reasoner}\n temperature: ${LLM_TEMPERATURE:0.2}\n max-tokens: ${LLM_MAX_TOKENS:2048}\n timeout-seconds: ${LLM_TIMEOUT_SECONDS:60}\n thinking-enabled: ${LLM_THINKING_ENABLED:true}\n reasoning-effort: ${LLM_REASONING_EFFORT:high}\n # ===== v2-step-08: Langfuse 后端全链观测 =====\n langfuse:\n enabled: ${LANGFUSE_ENABLED:true}\n host: ${LANGFUSE_HOST:https://cloud.langfuse.com}\n public-key: ${LANGFUSE_PUBLIC_KEY:}\n secret-key: ${LANGFUSE_SECRET_KEY:}\n # ===== v2-step-14: Temporal durable workflow =====\n # enabled=false (默认) 时不装载任何 Temporal bean, 原 AgentRunner 路径完全不变。\n # 启用后必需 docker compose --profile temporal up 拉起 temporal-server。\n temporal:\n enabled: ${TEMPORAL_ENABLED:false}\n service-target: ${TEMPORAL_TARGET:127.0.0.1:7233}\n namespace: ${TEMPORAL_NAMESPACE:default}\n task-queue: ${TEMPORAL_TASK_QUEUE:zhiqian-migration}\n workflow-execution-timeout-minutes: ${TEMPORAL_WF_TIMEOUT_MIN:60}\n activity-start-to-close-timeout-seconds: ${TEMPORAL_ACT_TIMEOUT_SEC:600}\n activity-max-attempts: ${TEMPORAL_ACT_MAX_ATTEMPTS:3}\n worker-concurrent-activity-execution-size: ${TEMPORAL_WORKER_CONCURRENCY:8}\n\nlogging:\n level:\n root: INFO\n com.zhiqian: DEBUG\n"}, "39ac14c653f35d43deb02685190205b76503e9a1": {"t": 1785748803.2438421, "n": 2124, "h": "5f4f04d7915a9523", "c": "server:\n port: 8080\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\nspring:\n application:\n name: zhiqian-backend\n datasource:\n url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/zhiqian}\n username: ${SPRING_DATASOURCE_USERNAME:zhiqian}\n password: ${SPRING_DATASOURCE_PASSWORD}\n driver-class-name: org.postgresql.Driver\n flyway:\n enabled: true\n baseline-on-migrate: true\n locations: classpath:db/migration\n\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info\n\napp:\n jwt:\n secret: ${APP_JWT_SECRET}\n ttl-minutes: ${APP_JWT_TTL_MINUTES:60}\n admin:\n password: ${APP_ADMIN_PASSWORD}\n rag:\n base-url: ${APP_RAG_BASE_URL:http://localhost:8001}\n # ===== v2-step-02: LLM 接入配置 =====\n llm:\n provider: ${LLM_PROVIDER:deepseek}\n api-key: ${LLM_API_KEY:}\n base-url: ${LLM_BASE_URL:https://api.deepseek.com/v1}\n chat-model: ${LLM_CHAT_MODEL:deepseek-chat}\n reasoner-model: ${LLM_REASONER_MODEL:deepseek-reasoner}\n temperature: ${LLM_TEMPERATURE:0.2}\n max-tokens: ${LLM_MAX_TOKENS:2048}\n timeout-seconds: ${LLM_TIMEOUT_SECONDS:60}\n # ===== v2-step-08: Langfuse 后端全链观测 =====\n langfuse:\n enabled: ${LANGFUSE_ENABLED:true}\n host: ${LANGFUSE_HOST:https://cloud.langfuse.com}\n public-key: ${LANGFUSE_PUBLIC_KEY:}\n secret-key: ${LANGFUSE_SECRET_KEY:}\n # ===== v2-step-14: Temporal durable workflow =====\n # enabled=false (默认) 时不装载任何 Temporal bean, 原 AgentRunner 路径完全不变。\n # 启用后必需 docker compose --profile temporal up 拉起 temporal-server。\n temporal:\n enabled: ${TEMPORAL_ENABLED:false}\n service-target: ${TEMPORAL_TARGET:127.0.0.1:7233}\n namespace: ${TEMPORAL_NAMESPACE:default}\n task-queue: ${TEMPORAL_TASK_QUEUE:zhiqian-migration}\n workflow-execution-timeout-minutes: ${TEMPORAL_WF_TIMEOUT_MIN:60}\n activity-start-to-close-timeout-seconds: ${TEMPORAL_ACT_TIMEOUT_SEC:600}\n activity-max-attempts: ${TEMPORAL_ACT_MAX_ATTEMPTS:3}\n worker-concurrent-activity-execution-size: ${TEMPORAL_WORKER_CONCURRENCY:8}\n\nlogging:\n level:\n root: INFO\n com.zhiqian: DEBUG\n"}, "1ca293a26a759be82c2187635965d84ddcdfdb9a": {"t": 1785748804.385864, "n": 1665, "h": "fa44afa34446b195", "c": "server:\n port: 8080\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\nspring:\n application:\n name: zhiqian-backend\n datasource:\n url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/zhiqian}\n username: ${SPRING_DATASOURCE_USERNAME:zhiqian}\n password: ${SPRING_DATASOURCE_PASSWORD}\n driver-class-name: org.postgresql.Driver\n flyway:\n enabled: true\n baseline-on-migrate: true\n locations: classpath:db/migration\n\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info\n\napp:\n jwt:\n secret: ${APP_JWT_SECRET}\n ttl-minutes: ${APP_JWT_TTL_MINUTES:60}\n admin:\n password: ${APP_ADMIN_PASSWORD}\n rag:\n base-url: ${APP_RAG_BASE_URL:http://localhost:8001}\n # ===== v2-step-02 新增:LLM 接入配置 =====\n # 默认指向 DeepSeek-V3.1,使用 OpenAI 兼容协议。\n # api-key 为空时后端会启用 MockLlmClient(仅回显),不阻塞启动。\n llm:\n provider: ${LLM_PROVIDER:deepseek}\n api-key: ${LLM_API_KEY:}\n base-url: ${LLM_BASE_URL:https://api.deepseek.com/v1}\n chat-model: ${LLM_CHAT_MODEL:deepseek-chat}\n reasoner-model: ${LLM_REASONER_MODEL:deepseek-reasoner}\n temperature: ${LLM_TEMPERATURE:0.2}\n max-tokens: ${LLM_MAX_TOKENS:2048}\n timeout-seconds: ${LLM_TIMEOUT_SECONDS:60}\n # ===== v2-step-08 新增:Langfuse 后端全链观测 =====\n # public-key/secret-key 留空即 disabled,行为完全不变,不影响功能。\n # 配上后,task.migration root trace + 6 stage span + 每次 LLM 调用 generation 都会上报。\n langfuse:\n enabled: ${LANGFUSE_ENABLED:true}\n host: ${LANGFUSE_HOST:https://cloud.langfuse.com}\n public-key: ${LANGFUSE_PUBLIC_KEY:}\n secret-key: ${LANGFUSE_SECRET_KEY:}\n\nlogging:\n level:\n root: INFO\n com.zhiqian: DEBUG\n"}, "790b10f2382ffa782077ff539159dd10a99c6d64": {"t": 1785748805.5553286, "n": 1304, "h": "83a3a6b48e931a01", "c": "server:\n port: 8080\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\nspring:\n application:\n name: zhiqian-backend\n datasource:\n url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/zhiqian}\n username: ${SPRING_DATASOURCE_USERNAME:zhiqian}\n password: ${SPRING_DATASOURCE_PASSWORD}\n driver-class-name: org.postgresql.Driver\n flyway:\n enabled: true\n baseline-on-migrate: true\n locations: classpath:db/migration\n\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info\n\napp:\n jwt:\n secret: ${APP_JWT_SECRET}\n ttl-minutes: ${APP_JWT_TTL_MINUTES:60}\n admin:\n password: ${APP_ADMIN_PASSWORD}\n rag:\n base-url: ${APP_RAG_BASE_URL:http://localhost:8001}\n # ===== v2-step-02 新增:LLM 接入配置 =====\n # 默认指向 DeepSeek-V3.1,使用 OpenAI 兼容协议。\n # api-key 为空时后端会启用 MockLlmClient(仅回显),不阻塞启动。\n llm:\n provider: ${LLM_PROVIDER:deepseek}\n api-key: ${LLM_API_KEY:}\n base-url: ${LLM_BASE_URL:https://api.deepseek.com/v1}\n chat-model: ${LLM_CHAT_MODEL:deepseek-chat}\n reasoner-model: ${LLM_REASONER_MODEL:deepseek-reasoner}\n temperature: ${LLM_TEMPERATURE:0.2}\n max-tokens: ${LLM_MAX_TOKENS:2048}\n timeout-seconds: ${LLM_TIMEOUT_SECONDS:60}\n\nlogging:\n level:\n root: INFO\n com.zhiqian: DEBUG\n"}, "eb9342499731cc21fbd423d9b9b05f7c8f226959": {"t": 1785748806.6224804, "n": 812, "h": "62013e25a2e0105a", "c": "server:\n port: 8080\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\nspring:\n application:\n name: zhiqian-backend\n datasource:\n url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/zhiqian}\n username: ${SPRING_DATASOURCE_USERNAME:zhiqian}\n password: ${SPRING_DATASOURCE_PASSWORD}\n driver-class-name: org.postgresql.Driver\n flyway:\n enabled: true\n baseline-on-migrate: true\n locations: classpath:db/migration\n\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info\n\napp:\n jwt:\n secret: ${APP_JWT_SECRET}\n ttl-minutes: ${APP_JWT_TTL_MINUTES:60}\n admin:\n password: ${APP_ADMIN_PASSWORD}\n rag:\n base-url: ${APP_RAG_BASE_URL:http://localhost:8001}\n\nlogging:\n level:\n root: INFO\n com.zhiqian: DEBUG\n"}, "7907a90cf614d5c136b037f852c898a5d369cc2b": {"t": 1785748807.766152, "n": 825, "h": "dfc5db553507a973", "c": "server:\n port: 8080\n servlet:\n encoding:\n charset: UTF-8\n enabled: true\n force: true\n\nspring:\n application:\n name: zhiqian-backend\n datasource:\n url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/zhiqian}\n username: ${SPRING_DATASOURCE_USERNAME:zhiqian}\n password: ${SPRING_DATASOURCE_PASSWORD:zhiqian123}\n driver-class-name: org.postgresql.Driver\n flyway:\n enabled: true\n baseline-on-migrate: true\n locations: classpath:db/migration\n\nmanagement:\n endpoints:\n web:\n exposure:\n include: health,info\n\napp:\n jwt:\n secret: ${APP_JWT_SECRET:change-me-please-change-me-please-32bytes-min}\n ttl-minutes: ${APP_JWT_TTL_MINUTES:720}\n rag:\n base-url: ${APP_RAG_BASE_URL:http://localhost:8001}\n\nlogging:\n level:\n root: INFO\n com.zhiqian: DEBUG\n"}, "31c555708565771221a992c72a36435992460974": {"t": 1785748808.950704, "n": 637, "h": "7476e41447a9eb95", "c": "server:\n port: 8080\nspring:\n application:\n name: zhiqian-backend\n datasource:\n url: jdbc:mysql://localhost:3306/zhiqian?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai\n username: zhiqian\n password: zhiqian\n driver-class-name: com.mysql.cj.jdbc.Driver\n flyway:\n enabled: true\n locations: classpath:db/migration\n servlet:\n multipart:\n max-file-size: 512MB\n max-request-size: 512MB\nzhiqian:\n jwt:\n secret: please-change-in-prod-32-bytes-min\n expire-hours: 24\n rag:\n base-url: http://localhost:8001\n analyzer:\n workspace: ./workspace\n llm:\n default-provider: glm\n"}}, "zhiqian/deploy/helm/zhiqian/values.yaml": {"450a71e5cdc3cfb27544c338af7e73ac5bd5efab": {"t": 1785747057.2554524, "n": 4005, "h": "08c99e16bd4e9a11", "c": "# v2-step-18: Helm values for ZhiQian YunShu\n# 生产部署时 override 关键项: image.tag / postgres.password / backend.secrets.jwtSecret /\n# backend.secrets.deepseekApiKey / ingress.hosts / persistence.size\n# ----\n\nglobal:\n imageRegistry: \"\" # 例 ghcr.io/anothersunset/, 为空时走 docker.io / 本地\n imagePullSecrets: []\n storageClass: \"\"\n\nnameOverride: \"\"\nfullnameOverride: \"\"\n\n# ===== 三个服务 =====\nbackend:\n enabled: true\n replicaCount: 1\n image:\n repository: zhiqian/backend\n tag: \"\" # 为空时使用 .Chart.AppVersion\n pullPolicy: IfNotPresent\n service:\n type: ClusterIP\n port: 8080\n resources:\n requests:\n cpu: 200m\n memory: 512Mi\n limits:\n cpu: 1500m\n memory: 2Gi\n config:\n # 可被 override 的非敏感配置\n llm:\n provider: deepseek\n baseUrl: https://api.deepseek.com\n chatModel: deepseek-chat\n reasonerModel: deepseek-reasoner\n temperature: 0.2\n maxTokens: 2048\n timeoutSeconds: 60\n langfuse:\n enabled: false\n host: https://cloud.langfuse.com\n temporal:\n enabled: false\n serviceTarget: temporal:7233\n namespace: default\n taskQueue: zhiqian-migration\n secrets:\n # 使用 helm install --set backend.secrets.jwtSecret=... 覆盖, 或 secretRef 外部报存\n jwtSecret: \"please-change-me-to-a-long-random-string-at-least-32-chars\"\n deepseekApiKey: \"\"\n langfusePublicKey: \"\"\n langfuseSecretKey: \"\"\n livenessProbe:\n httpGet:\n path: /actuator/health/liveness\n port: http\n initialDelaySeconds: 60\n periodSeconds: 30\n readinessProbe:\n httpGet:\n path: /actuator/health/readiness\n port: http\n initialDelaySeconds: 30\n periodSeconds: 10\n podSecurityContext:\n runAsNonRoot: true\n runAsUser: 1000\n fsGroup: 1000\n nodeSelector: {}\n tolerations: []\n affinity: {}\n\nrag:\n enabled: true\n replicaCount: 1\n image:\n repository: zhiqian/rag\n tag: \"\"\n pullPolicy: IfNotPresent\n service:\n type: ClusterIP\n port: 8001\n resources:\n requests:\n cpu: 200m\n memory: 512Mi\n limits:\n cpu: 2000m\n memory: 4Gi # ML 模型需要, 启用 BGE-M3 时 ≥ 3Gi\n env:\n RAG_CHUNK_STRATEGY: semantic\n RAG_CHUNK_SIM_THRESHOLD: \"0.62\"\n RAG_OUTLINES_ENABLED: \"false\"\n RAG_CRAG_USE_LLM_EVAL: \"0\"\n HF_ENDPOINT: https://hf-mirror.com\n qdrant:\n enabled: false # 默认 BM25 单路降级; 上营由 ArgoCD overlay 开\n url: http://qdrant:6333\n livenessProbe:\n httpGet:\n path: /health\n port: http\n initialDelaySeconds: 30\n periodSeconds: 30\n readinessProbe:\n httpGet:\n path: /health\n port: http\n initialDelaySeconds: 15\n periodSeconds: 10\n podSecurityContext:\n runAsNonRoot: true\n runAsUser: 1000\n fsGroup: 1000\n\nweb:\n enabled: true\n replicaCount: 1\n image:\n repository: zhiqian/web\n tag: \"\"\n pullPolicy: IfNotPresent\n service:\n type: ClusterIP\n port: 80\n resources:\n requests:\n cpu: 50m\n memory: 64Mi\n limits:\n cpu: 200m\n memory: 256Mi\n\n# ===== PostgreSQL =====\npostgres:\n enabled: true\n image:\n repository: postgres\n tag: \"16-alpine\"\n pullPolicy: IfNotPresent\n service:\n type: ClusterIP\n port: 5432\n auth:\n username: zhiqian\n password: zhiqian-change-me\n database: zhiqian\n persistence:\n enabled: true\n size: 10Gi\n accessMode: ReadWriteOnce\n resources:\n requests:\n cpu: 100m\n memory: 256Mi\n limits:\n cpu: 1000m\n memory: 1Gi\n\n# ===== Ingress =====\ningress:\n enabled: false\n className: nginx\n annotations:\n nginx.ingress.kubernetes.io/proxy-body-size: 50m\n nginx.ingress.kubernetes.io/proxy-read-timeout: \"300\"\n hosts:\n - host: zhiqian.local\n paths:\n - path: /api\n pathType: Prefix\n service: backend\n - path: /rag\n pathType: Prefix\n service: rag\n - path: /\n pathType: Prefix\n service: web\n tls: []\n # - secretName: zhiqian-tls\n # hosts: [zhiqian.local]\n\nserviceAccount:\n create: true\n annotations: {}\n name: \"\"\n"}, "c2851ba9e60a5f8ca6dda387146f4b4c7d91b1b1": {"t": 1785748801.7968087, "n": 4005, "h": "08c99e16bd4e9a11", "c": "# v2-step-18: Helm values for ZhiQian YunShu\n# 生产部署时 override 关键项: image.tag / postgres.password / backend.secrets.jwtSecret /\n# backend.secrets.deepseekApiKey / ingress.hosts / persistence.size\n# ----\n\nglobal:\n imageRegistry: \"\" # 例 ghcr.io/anothersunset/, 为空时走 docker.io / 本地\n imagePullSecrets: []\n storageClass: \"\"\n\nnameOverride: \"\"\nfullnameOverride: \"\"\n\n# ===== 三个服务 =====\nbackend:\n enabled: true\n replicaCount: 1\n image:\n repository: zhiqian/backend\n tag: \"\" # 为空时使用 .Chart.AppVersion\n pullPolicy: IfNotPresent\n service:\n type: ClusterIP\n port: 8080\n resources:\n requests:\n cpu: 200m\n memory: 512Mi\n limits:\n cpu: 1500m\n memory: 2Gi\n config:\n # 可被 override 的非敏感配置\n llm:\n provider: deepseek\n baseUrl: https://api.deepseek.com\n chatModel: deepseek-chat\n reasonerModel: deepseek-reasoner\n temperature: 0.2\n maxTokens: 2048\n timeoutSeconds: 60\n langfuse:\n enabled: false\n host: https://cloud.langfuse.com\n temporal:\n enabled: false\n serviceTarget: temporal:7233\n namespace: default\n taskQueue: zhiqian-migration\n secrets:\n # 使用 helm install --set backend.secrets.jwtSecret=... 覆盖, 或 secretRef 外部报存\n jwtSecret: \"please-change-me-to-a-long-random-string-at-least-32-chars\"\n deepseekApiKey: \"\"\n langfusePublicKey: \"\"\n langfuseSecretKey: \"\"\n livenessProbe:\n httpGet:\n path: /actuator/health/liveness\n port: http\n initialDelaySeconds: 60\n periodSeconds: 30\n readinessProbe:\n httpGet:\n path: /actuator/health/readiness\n port: http\n initialDelaySeconds: 30\n periodSeconds: 10\n podSecurityContext:\n runAsNonRoot: true\n runAsUser: 1000\n fsGroup: 1000\n nodeSelector: {}\n tolerations: []\n affinity: {}\n\nrag:\n enabled: true\n replicaCount: 1\n image:\n repository: zhiqian/rag\n tag: \"\"\n pullPolicy: IfNotPresent\n service:\n type: ClusterIP\n port: 8001\n resources:\n requests:\n cpu: 200m\n memory: 512Mi\n limits:\n cpu: 2000m\n memory: 4Gi # ML 模型需要, 启用 BGE-M3 时 ≥ 3Gi\n env:\n RAG_CHUNK_STRATEGY: semantic\n RAG_CHUNK_SIM_THRESHOLD: \"0.62\"\n RAG_OUTLINES_ENABLED: \"false\"\n RAG_CRAG_USE_LLM_EVAL: \"0\"\n HF_ENDPOINT: https://hf-mirror.com\n qdrant:\n enabled: false # 默认 BM25 单路降级; 上营由 ArgoCD overlay 开\n url: http://qdrant:6333\n livenessProbe:\n httpGet:\n path: /health\n port: http\n initialDelaySeconds: 30\n periodSeconds: 30\n readinessProbe:\n httpGet:\n path: /health\n port: http\n initialDelaySeconds: 15\n periodSeconds: 10\n podSecurityContext:\n runAsNonRoot: true\n runAsUser: 1000\n fsGroup: 1000\n\nweb:\n enabled: true\n replicaCount: 1\n image:\n repository: zhiqian/web\n tag: \"\"\n pullPolicy: IfNotPresent\n service:\n type: ClusterIP\n port: 80\n resources:\n requests:\n cpu: 50m\n memory: 64Mi\n limits:\n cpu: 200m\n memory: 256Mi\n\n# ===== PostgreSQL =====\npostgres:\n enabled: true\n image:\n repository: postgres\n tag: \"16-alpine\"\n pullPolicy: IfNotPresent\n service:\n type: ClusterIP\n port: 5432\n auth:\n username: zhiqian\n password: zhiqian-change-me\n database: zhiqian\n persistence:\n enabled: true\n size: 10Gi\n accessMode: ReadWriteOnce\n resources:\n requests:\n cpu: 100m\n memory: 256Mi\n limits:\n cpu: 1000m\n memory: 1Gi\n\n# ===== Ingress =====\ningress:\n enabled: false\n className: nginx\n annotations:\n nginx.ingress.kubernetes.io/proxy-body-size: 50m\n nginx.ingress.kubernetes.io/proxy-read-timeout: \"300\"\n hosts:\n - host: zhiqian.local\n paths:\n - path: /api\n pathType: Prefix\n service: backend\n - path: /rag\n pathType: Prefix\n service: rag\n - path: /\n pathType: Prefix\n service: web\n tls: []\n # - secretName: zhiqian-tls\n # hosts: [zhiqian.local]\n\nserviceAccount:\n create: true\n annotations: {}\n name: \"\"\n"}}, "zhiqian/deploy/kustomize/base/backend-configmap.yaml": {"450a71e5cdc3cfb27544c338af7e73ac5bd5efab": {"t": 1785747059.1829314, "n": 1354, "h": "fec882ace8ef12af", "c": "# v2-step-18: backend application config (non-secret)\napiVersion: v1\nkind: ConfigMap\nmetadata:\n name: zhiqian-backend-config\n labels:\n app.kubernetes.io/name: backend\n app.kubernetes.io/component: api\ndata:\n application.yaml: |\n spring:\n datasource:\n url: jdbc:postgresql://zhiqian-postgres:5432/zhiqian\n username: zhiqian\n password: ${SPRING_DATASOURCE_PASSWORD}\n flyway:\n enabled: true\n baseline-on-migrate: true\n server:\n port: 8080\n management:\n endpoints:\n web:\n exposure:\n include: health,info,metrics\n endpoint:\n health:\n probes:\n enabled: true\n app:\n jwt:\n secret: ${APP_JWT_SECRET}\n expire-minutes: 1440\n llm:\n provider: deepseek\n api-key: ${APP_LLM_API_KEY}\n base-url: https://api.deepseek.com\n chat-model: deepseek-chat\n reasoner-model: deepseek-reasoner\n temperature: 0.2\n max-tokens: 2048\n timeout-seconds: 60\n langfuse:\n enabled: false\n host: https://cloud.langfuse.com\n public-key: ${APP_LANGFUSE_PUBLIC_KEY}\n secret-key: ${APP_LANGFUSE_SECRET_KEY}\n temporal:\n enabled: false\n service-target: temporal:7233\n namespace: default\n task-queue: zhiqian-migration\n"}, "9833e4dce4b1fc7f63debc9bcd33309590b0ae91": {"t": 1785748801.34762, "n": 1354, "h": "fec882ace8ef12af", "c": "# v2-step-18: backend application config (non-secret)\napiVersion: v1\nkind: ConfigMap\nmetadata:\n name: zhiqian-backend-config\n labels:\n app.kubernetes.io/name: backend\n app.kubernetes.io/component: api\ndata:\n application.yaml: |\n spring:\n datasource:\n url: jdbc:postgresql://zhiqian-postgres:5432/zhiqian\n username: zhiqian\n password: ${SPRING_DATASOURCE_PASSWORD}\n flyway:\n enabled: true\n baseline-on-migrate: true\n server:\n port: 8080\n management:\n endpoints:\n web:\n exposure:\n include: health,info,metrics\n endpoint:\n health:\n probes:\n enabled: true\n app:\n jwt:\n secret: ${APP_JWT_SECRET}\n expire-minutes: 1440\n llm:\n provider: deepseek\n api-key: ${APP_LLM_API_KEY}\n base-url: https://api.deepseek.com\n chat-model: deepseek-chat\n reasoner-model: deepseek-reasoner\n temperature: 0.2\n max-tokens: 2048\n timeout-seconds: 60\n langfuse:\n enabled: false\n host: https://cloud.langfuse.com\n public-key: ${APP_LANGFUSE_PUBLIC_KEY}\n secret-key: ${APP_LANGFUSE_SECRET_KEY}\n temporal:\n enabled: false\n service-target: temporal:7233\n namespace: default\n task-queue: zhiqian-migration\n"}}}}