{"owner":"Tencent","repo":"WeKnora","hasDocker":true,"hasCompose":true,"hasDockerfile":false,"composePath":"docker-compose.yml","servicesCount":23,"services":[{"name":"frontend","image":"wechatopenai/weknora-ui:${WEKNORA_VERSION:-latest}","build":{"context":"./frontend"},"restart":"unless-stopped","ports":["${FRONTEND_PORT:-80}:80"],"environment":["MAX_FILE_SIZE_MB=${MAX_FILE_SIZE_MB:-50}","MAX_SKILL_BUNDLE_SIZE_MB=${MAX_SKILL_BUNDLE_SIZE_MB:-256}","DEFAULT_LOCALE=${DEFAULT_LOCALE:-}","APP_HOST=${APP_HOST:-app}","APP_PORT=${APP_BACKEND_PORT:-8080}","APP_SCHEME=${APP_SCHEME:-http}"],"depends_on":["app"]},{"name":"app","image":"wechatopenai/weknora-app:${WEKNORA_VERSION:-latest}","build":{"context":".","dockerfile":"docker/Dockerfile.app"},"restart":"unless-stopped","ports":["${APP_PORT:-8080}:8080"],"environment":["LOG_LEVEL=${LOG_LEVEL:-debug}","LOG_PATH=${LOG_PATH:-}","LOG_FORMAT=${LOG_FORMAT:-}","LLM_DEBUG_LOG=${LLM_DEBUG_LOG:-false}","GIN_MODE=${GIN_MODE:-release}","TZ=${TZ:-Asia/Shanghai}","WEKNORA_LANGUAGE=${WEKNORA_LANGUAGE:-}","WEKNORA_SANDBOX_DOCKER_ENABLED=${WEKNORA_SANDBOX_DOCKER_ENABLED:-false}","WEKNORA_OUTBOUND_DIAL_TIMEOUT=${WEKNORA_OUTBOUND_DIAL_TIMEOUT:-}","AUTO_MIGRATE=${AUTO_MIGRATE:-true}","FRONTEND_BASE_URL=${FRONTEND_BASE_URL:-}","COS_SECRET_ID=${COS_SECRET_ID:-}","COS_SECRET_KEY=${COS_SECRET_KEY:-}","COS_REGION=${COS_REGION:-}","COS_BUCKET_NAME=${COS_BUCKET_NAME:-}","COS_APP_ID=${COS_APP_ID:-}","COS_PATH_PREFIX=${COS_PATH_PREFIX:-}","COS_TEMP_BUCKET_NAME=${COS_TEMP_BUCKET_NAME:-}","COS_TEMP_REGION=${COS_TEMP_REGION:-}","DISABLE_REGISTRATION=${DISABLE_REGISTRATION:-false}","WEKNORA_AUTH_COMPLEX_PASSWORD_ENABLED=${WEKNORA_AUTH_COMPLEX_PASSWORD_ENABLED:-false}","WEKNORA_AUTH_DEFAULT_TENANT_MODE=${WEKNORA_AUTH_DEFAULT_TENANT_MODE:-create_personal}","WEKNORA_TENANT_SELF_SERVICE_CREATION_ENABLED=${WEKNORA_TENANT_SELF_SERVICE_CREATION_ENABLED:-true}","WEKNORA_TENANT_ENABLE_CROSS_TENANT_ACCESS=${WEKNORA_TENANT_ENABLE_CROSS_TENANT_ACCESS:-false}","WEKNORA_TENANT_DEFAULT_STORAGE_QUOTA_GB=${WEKNORA_TENANT_DEFAULT_STORAGE_QUOTA_GB:-10}","WEKNORA_INVITATION_TTL=${WEKNORA_INVITATION_TTL:-168h}","WEKNORA_AUDIT_RETENTION_DAYS=${WEKNORA_AUDIT_RETENTION_DAYS:-90}","DB_DRIVER=${DB_DRIVER:-postgres}","DB_HOST=${DB_HOST:-postgres}","DB_PORT=${DB_PORT:-5432}","DB_USER=${DB_USER:-}","DB_PASSWORD=${DB_PASSWORD:-}","DB_NAME=${DB_NAME:-}","LANGFUSE_ENABLED=${LANGFUSE_ENABLED:-}","LANGFUSE_HOST=${LANGFUSE_HOST:-https://cloud.langfuse.com}","LANGFUSE_PUBLIC_KEY=${LANGFUSE_PUBLIC_KEY:-}","LANGFUSE_SECRET_KEY=${LANGFUSE_SECRET_KEY:-}","LANGFUSE_RELEASE=${LANGFUSE_RELEASE:-}","LANGFUSE_ENVIRONMENT=${LANGFUSE_ENVIRONMENT:-}","LANGFUSE_FLUSH_AT=${LANGFUSE_FLUSH_AT:-}","LANGFUSE_FLUSH_INTERVAL=${LANGFUSE_FLUSH_INTERVAL:-}","LANGFUSE_QUEUE_SIZE=${LANGFUSE_QUEUE_SIZE:-}","LANGFUSE_REQUEST_TIMEOUT=${LANGFUSE_REQUEST_TIMEOUT:-}","LANGFUSE_SAMPLE_RATE=${LANGFUSE_SAMPLE_RATE:-}","LANGFUSE_DEBUG=${LANGFUSE_DEBUG:-}","RETRIEVE_DRIVER=${RETRIEVE_DRIVER:-postgres}","ELASTICSEARCH_ADDR=${ELASTICSEARCH_ADDR:-}","ELASTICSEARCH_USERNAME=${ELASTICSEARCH_USERNAME:-}","ELASTICSEARCH_PASSWORD=${ELASTICSEARCH_PASSWORD:-}","ELASTICSEARCH_INDEX=${ELASTICSEARCH_INDEX:-}","QDRANT_HOST=${QDRANT_HOST:-qdrant}","QDRANT_PORT=${QDRANT_PORT:-6334}","QDRANT_COLLECTION=${QDRANT_COLLECTION:-weknora_embeddings}","QDRANT_API_KEY=${QDRANT_API_KEY:-}","QDRANT_USE_TLS=${QDRANT_USE_TLS:-false}","MILVUS_ADDRESS=${MILVUS_ADDRESS:-milvus:19530}","MILVUS_COLLECTION=${MILVUS_COLLECTION:-weknora_embeddings}","MILVUS_METRIC_TYPE=${MILVUS_METRIC_TYPE:-IP}","MILVUS_USERNAME=${MILVUS_USERNAME:-}","MILVUS_PASSWORD=${MILVUS_PASSWORD:-}","MILVUS_DB_NAME=${MILVUS_DB_NAME:-}","MULTI_STORE_RETRIEVE_TIMEOUT_SEC=${MULTI_STORE_RETRIEVE_TIMEOUT_SEC:-}","OPENSEARCH_ADDR=${OPENSEARCH_ADDR:-}","OPENSEARCH_USERNAME=${OPENSEARCH_USERNAME:-}","OPENSEARCH_PASSWORD=${OPENSEARCH_PASSWORD:-}","OPENSEARCH_INSECURE_SKIP_VERIFY=${OPENSEARCH_INSECURE_SKIP_VERIFY:-false}","OPENSEARCH_INDEX=${OPENSEARCH_INDEX:-}","TENCENT_VECTORDB_ADDR=${TENCENT_VECTORDB_ADDR:-}","TENCENT_VECTORDB_USERNAME=${TENCENT_VECTORDB_USERNAME:-}","TENCENT_VECTORDB_API_KEY=${TENCENT_VECTORDB_API_KEY:-}","TENCENT_VECTORDB_DATABASE=${TENCENT_VECTORDB_DATABASE:-}","TENCENT_VECTORDB_COLLECTION=${TENCENT_VECTORDB_COLLECTION:-}","TENCENT_VECTORDB_REPLICA_NUMBER=${TENCENT_VECTORDB_REPLICA_NUMBER:-}","DOCREADER_ADDR=${DOCREADER_ADDR:-docreader:50051}","DOCREADER_TRANSPORT=${DOCREADER_TRANSPORT:-grpc}","GRPC_TLS_ENABLED=${GRPC_TLS_ENABLED:-false}","GRPC_TLS_CERT=${GRPC_TLS_CERT:-}","GRPC_TLS_KEY=${GRPC_TLS_KEY:-}","GRPC_TLS_CA=${GRPC_TLS_CA:-}","GRPC_TLS_SERVER_NAME=${GRPC_TLS_SERVER_NAME:-}","GRPC_AUTH_TOKEN=${GRPC_AUTH_TOKEN:-}","WEAVIATE_HOST=${WEAVIATE_HOST:-}","WEAVIATE_GRPC_ADDRESS=${WEAVIATE_GRPC_ADDRESS:-}","WEAVIATE_SCHEME=${WEAVIATE_SCHEME:-}","WEAVIATE_AUTH_ENABLED=${WEAVIATE_AUTH_ENABLED:-}","WEAVIATE_API_KEY=${WEAVIATE_API_KEY:-}","DORIS_ADDR=${DORIS_ADDR:-}","DORIS_HTTP_PORT=${DORIS_HTTP_PORT:-}","DORIS_DATABASE=${DORIS_DATABASE:-}","DORIS_USERNAME=${DORIS_USERNAME:-}","DORIS_PASSWORD=${DORIS_PASSWORD:-}","DORIS_TABLE_PREFIX=${DORIS_TABLE_PREFIX:-}","DORIS_COMPAT_MODE=${DORIS_COMPAT_MODE:-}","STORAGE_TYPE=${STORAGE_TYPE:-local}","STORAGE_ALLOW_LIST=${STORAGE_ALLOW_LIST:-}","LOCAL_STORAGE_BASE_DIR=${LOCAL_STORAGE_BASE_DIR:-/data/files}","LOCAL_STORAGE_PATH_PREFIX=${LOCAL_STORAGE_PATH_PREFIX:-}","AUTO_RECOVER_DIRTY=${AUTO_RECOVER_DIRTY:-true}","MINIO_ENDPOINT=${MINIO_ENDPOINT:-minio:9000}","MINIO_ACCESS_KEY_ID=${MINIO_ACCESS_KEY_ID:-minioadmin}","MINIO_SECRET_ACCESS_KEY=${MINIO_SECRET_ACCESS_KEY:-minioadmin}","MINIO_BUCKET_NAME=${MINIO_BUCKET_NAME:-}","MINIO_PATH_PREFIX=${MINIO_PATH_PREFIX:-}","MINIO_USE_SSL=${MINIO_USE_SSL:-false}","TOS_ENDPOINT=${TOS_ENDPOINT:-}","TOS_REGION=${TOS_REGION:-}","TOS_ACCESS_KEY=${TOS_ACCESS_KEY:-}","TOS_SECRET_KEY=${TOS_SECRET_KEY:-}","TOS_BUCKET_NAME=${TOS_BUCKET_NAME:-}","TOS_PATH_PREFIX=${TOS_PATH_PREFIX:-}","TOS_TEMP_BUCKET_NAME=${TOS_TEMP_BUCKET_NAME:-}","TOS_TEMP_REGION=${TOS_TEMP_REGION:-}","S3_ENDPOINT=${S3_ENDPOINT:-}","S3_REGION=${S3_REGION:-}","S3_ACCESS_KEY=${S3_ACCESS_KEY:-}","S3_SECRET_KEY=${S3_SECRET_KEY:-}","S3_BUCKET_NAME=${S3_BUCKET_NAME:-}","S3_PATH_PREFIX=${S3_PATH_PREFIX:-weknora/}","S3_USE_SSL=${S3_USE_SSL:-true}","S3_FORCE_PATH_STYLE=${S3_FORCE_PATH_STYLE:-false}","OBS_ENDPOINT=${OBS_ENDPOINT:-}","OBS_REGION=${OBS_REGION:-}","OBS_ACCESS_KEY=${OBS_ACCESS_KEY:-}","OBS_SECRET_KEY=${OBS_SECRET_KEY:-}","OBS_BUCKET_NAME=${OBS_BUCKET_NAME:-}","OBS_PATH_PREFIX=${OBS_PATH_PREFIX:-weknora/}","OBS_USE_SSL=${OBS_USE_SSL:-true}","OBS_PROXY_DOMAIN=${OBS_PROXY_DOMAIN:-}","OSS_ENDPOINT=${OSS_ENDPOINT:-}","OSS_REGION=${OSS_REGION:-}","OSS_ACCESS_KEY=${OSS_ACCESS_KEY:-}","OSS_SECRET_KEY=${OSS_SECRET_KEY:-}","OSS_BUCKET_NAME=${OSS_BUCKET_NAME:-}","OSS_PATH_PREFIX=${OSS_PATH_PREFIX:-weknora/}","OSS_TEMP_BUCKET_NAME=${OSS_TEMP_BUCKET_NAME:-}","OSS_TEMP_REGION=${OSS_TEMP_REGION:-}","OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-http://host.docker.internal:11434}","OLLAMA_OPTIONAL=${OLLAMA_OPTIONAL:-true}","BATCH_EMBED_SIZE=${BATCH_EMBED_SIZE:-}","VLM_HTTP_TIMEOUT_SECONDS=${VLM_HTTP_TIMEOUT_SECONDS:-}","WEKNORA_LLM_STREAM_RAW_DUMP=${WEKNORA_LLM_STREAM_RAW_DUMP:-}","WEKNORA_LLM_STREAM_RAW_DUMP_DIR=${WEKNORA_LLM_STREAM_RAW_DUMP_DIR:-}","STREAM_MANAGER_TYPE=${STREAM_MANAGER_TYPE:-}","REDIS_ADDR=${REDIS_ADDR:-redis:6379}","REDIS_USERNAME=${REDIS_USERNAME:-}","REDIS_PASSWORD=${REDIS_PASSWORD:-}","REDIS_DB=${REDIS_DB:-}","REDIS_PREFIX=${REDIS_PREFIX:-}","REDIS_TLS_SERVER_NAME=${REDIS_TLS_SERVER_NAME:-}","REDIS_TLS_INSECURE_SKIP_VERIFY=${REDIS_TLS_INSECURE_SKIP_VERIFY:-}","WEKNORA_REDIS_NAMESPACE=${WEKNORA_REDIS_NAMESPACE:-}","WEKNORA_REDIS_OP_TIMEOUT_MS=${WEKNORA_REDIS_OP_TIMEOUT_MS:-}","NEO4J_ENABLE=${NEO4J_ENABLE:-}","NEO4J_URI=${NEO4J_URI:-bolt://neo4j:7687}","NEO4J_USERNAME=${NEO4J_USERNAME:-neo4j}","NEO4J_PASSWORD=${NEO4J_PASSWORD:-password}","SYSTEM_AES_KEY=${SYSTEM_AES_KEY:-}","SYSTEM_SIGNING_KEY=${SYSTEM_SIGNING_KEY:-}","SSRF_WHITELIST=${SSRF_WHITELIST:-}","IMAGE_HOST_KEEP_URL=${IMAGE_HOST_KEEP_URL:-}","SSRF_WHITELIST_EXTRA=${SSRF_WHITELIST_EXTRA:-searxng,qdrant,milvus,weaviate,doris-fe,doris-be,minio}","SSRF_DNS_WHITELIST_ONLY=${SSRF_DNS_WHITELIST_ONLY:-}","CONCURRENCY_POOL_SIZE=${CONCURRENCY_POOL_SIZE:-5}","JWT_SECRET=${JWT_SECRET:-}","MAX_FILE_SIZE_MB=${MAX_FILE_SIZE_MB:-50}","MAX_SKILL_BUNDLE_SIZE_MB=${MAX_SKILL_BUNDLE_SIZE_MB:-256}","WEKNORA_DOCUMENT_PROCESS_TIMEOUT=${WEKNORA_DOCUMENT_PROCESS_TIMEOUT:-}","WEKNORA_DOCREADER_CALL_TIMEOUT=${WEKNORA_DOCREADER_CALL_TIMEOUT:-}","WEKNORA_PADDLEOCR_VL_TIMEOUT=${WEKNORA_PADDLEOCR_VL_TIMEOUT:-}","WEKNORA_MINERU_TIMEOUT=${WEKNORA_MINERU_TIMEOUT:-}","WEKNORA_MINERU_CLOUD_TIMEOUT=${WEKNORA_MINERU_CLOUD_TIMEOUT:-}","WEKNORA_PADDLEOCR_VL_CLOUD_TIMEOUT=${WEKNORA_PADDLEOCR_VL_CLOUD_TIMEOUT:-}","WEKNORA_WEKNORACLOUD_TIMEOUT=${WEKNORA_WEKNORACLOUD_TIMEOUT:-}","WEKNORA_HOUSEKEEPING_ENABLED=${WEKNORA_HOUSEKEEPING_ENABLED:-}","WEKNORA_CHAT_ATTACHMENT_TTL_HOURS=${WEKNORA_CHAT_ATTACHMENT_TTL_HOURS:-24}","WEKNORA_CHAT_ATTACHMENT_WAIT_TIMEOUT_SEC=${WEKNORA_CHAT_ATTACHMENT_WAIT_TIMEOUT_SEC:-60}","WEKNORA_CHAT_ATTACHMENT_OCR_CONCURRENCY=${WEKNORA_CHAT_ATTACHMENT_OCR_CONCURRENCY:-8}","WEKNORA_CHAT_ATTACHMENT_OCR_MAX_PAGES=${WEKNORA_CHAT_ATTACHMENT_OCR_MAX_PAGES:-8}","WEKNORA_AGENT_LLM_TIMEOUT=${WEKNORA_AGENT_LLM_TIMEOUT:-}","WEKNORA_WEB_FETCH_TIMEOUT=${WEKNORA_WEB_FETCH_TIMEOUT:-}","WEKNORA_AGENT_TOOL_APPROVAL_TIMEOUT=${WEKNORA_AGENT_TOOL_APPROVAL_TIMEOUT:-}","WEKNORA_AGENT_TOOL_APPROVAL_FAIL_OPEN=${WEKNORA_AGENT_TOOL_APPROVAL_FAIL_OPEN:-}","WEKNORA_TENANT_ENABLE_RBAC=${WEKNORA_TENANT_ENABLE_RBAC:-}","WEKNORA_TENANT_MAX_OWNED_PER_USER=${WEKNORA_TENANT_MAX_OWNED_PER_USER:-}","WEKNORA_TENANT_AUTO_CREATE_API_KEY=${WEKNORA_TENANT_AUTO_CREATE_API_KEY:-}","WEKNORA_ASYNQ_CORE_CONCURRENCY=${WEKNORA_ASYNQ_CORE_CONCURRENCY:-8}","WEKNORA_ASYNQ_POSTPROCESS_CONCURRENCY=${WEKNORA_ASYNQ_POSTPROCESS_CONCURRENCY:-2}","WEKNORA_ASYNQ_ENRICHMENT_CONCURRENCY=${WEKNORA_ASYNQ_ENRICHMENT_CONCURRENCY:-12}","WEKNORA_ASYNQ_MAINTENANCE_CONCURRENCY=${WEKNORA_ASYNQ_MAINTENANCE_CONCURRENCY:-4}","WEKNORA_ASYNQ_SHARED_CONCURRENCY=${WEKNORA_ASYNQ_SHARED_CONCURRENCY:-6}","WEKNORA_WIKI_ASYNQ_CONCURRENCY=${WEKNORA_WIKI_ASYNQ_CONCURRENCY:-8}","WEKNORA_MODEL_MAX_CONCURRENCY=${WEKNORA_MODEL_MAX_CONCURRENCY:-32}","APK_MIRROR_ARG=${APK_MIRROR_ARG:-}","WEKNORA_BOOTSTRAP_SYSTEM_ADMIN_EMAIL=${WEKNORA_BOOTSTRAP_SYSTEM_ADMIN_EMAIL:-}","OIDC_AUTH_ENABLE=${OIDC_AUTH_ENABLE:-false}","OIDC_AUTH_ISSUER_URL=${OIDC_AUTH_ISSUER_URL:-}","OIDC_AUTH_DISCOVERY_URL=${OIDC_AUTH_DISCOVERY_URL:-}","OIDC_AUTH_PROVIDER_DISPLAY_NAME=${OIDC_AUTH_PROVIDER_DISPLAY_NAME:-}","OIDC_AUTH_CLIENT_ID=${OIDC_AUTH_CLIENT_ID:-}","OIDC_AUTH_CLIENT_SECRET=${OIDC_AUTH_CLIENT_SECRET:-}","OIDC_AUTH_AUTHORIZATION_ENDPOINT=${OIDC_AUTH_AUTHORIZATION_ENDPOINT:-}","OIDC_AUTH_TOKEN_ENDPOINT=${OIDC_AUTH_TOKEN_ENDPOINT:-}","OIDC_AUTH_USER_INFO_ENDPOINT=${OIDC_AUTH_USER_INFO_ENDPOINT:-}","OIDC_AUTH_JWKS_URI=${OIDC_AUTH_JWKS_URI:-}","OIDC_AUTH_SCOPES=${OIDC_AUTH_SCOPES:-}","OIDC_USER_INFO_MAPPING_USER_NAME=${OIDC_USER_INFO_MAPPING_USER_NAME:-}","OIDC_USER_INFO_MAPPING_EMAIL=${OIDC_USER_INFO_MAPPING_EMAIL:-}","FEISHU_DOCX_PARSE_MODE=${FEISHU_DOCX_PARSE_MODE:-}"],"volumes":["data-files:/data/files","docreader-tmp:/tmp/docreader:ro","./config/config.yaml:/app/config/config.yaml"],"depends_on":["redis","postgres","docreader"]},{"name":"sandbox","image":"wechatopenai/weknora-sandbox:${WEKNORA_VERSION:-latest}","build":{"context":".","dockerfile":"docker/Dockerfile.sandbox"},"restart":"no","command":"true"},{"name":"docreader","image":"wechatopenai/weknora-docreader:${WEKNORA_VERSION:-latest}","build":{"context":".","dockerfile":"docker/Dockerfile.docreader"},"restart":"unless-stopped","environment":["TZ=${TZ:-Asia/Shanghai}","LOG_LEVEL=${LOG_LEVEL:-}","DOCREADER_IMAGE_OUTPUT_DIR=/tmp/docreader","MAX_FILE_SIZE_MB=${MAX_FILE_SIZE_MB:-}","SSRF_WHITELIST=${SSRF_WHITELIST:-}","SSRF_WHITELIST_EXTRA=${SSRF_WHITELIST_EXTRA:-}","SSRF_DNS_WHITELIST_ONLY=${SSRF_DNS_WHITELIST_ONLY:-}","GRPC_TLS_ENABLED=${GRPC_TLS_ENABLED:-false}","GRPC_TLS_CERT=${GRPC_TLS_CERT:-}","GRPC_TLS_KEY=${GRPC_TLS_KEY:-}","GRPC_TLS_CA=${GRPC_TLS_CA:-}","GRPC_TLS_SERVER_NAME=${GRPC_TLS_SERVER_NAME:-}","GRPC_MTLS_REQUIRE_CLIENT_CERT=${GRPC_MTLS_REQUIRE_CLIENT_CERT:-false}","GRPC_AUTH_TOKEN=${GRPC_AUTH_TOKEN:-}","DOCREADER_GRPC_MAX_WORKERS=${DOCREADER_GRPC_MAX_WORKERS:-4}","DOCREADER_GRPC_MAX_FILE_SIZE_MB=${DOCREADER_GRPC_MAX_FILE_SIZE_MB:-${MAX_FILE_SIZE_MB:-50}}","DOCREADER_GRPC_PORT=${DOCREADER_GRPC_PORT:-50051}","DOCREADER_PREPROCESS_MAX_WORKERS=${DOCREADER_PREPROCESS_MAX_WORKERS:-1}","DOCREADER_PREPROCESS_TIMEOUT_SECONDS=${DOCREADER_PREPROCESS_TIMEOUT_SECONDS:-30}","DOCREADER_PREPROCESS_THREADS=${DOCREADER_PREPROCESS_THREADS:-2}","DOCREADER_PREPROCESS_MEMORY_MB=${DOCREADER_PREPROCESS_MEMORY_MB:-2048}","DOCREADER_PREPROCESS_MAX_PIXELS=${DOCREADER_PREPROCESS_MAX_PIXELS:-16000000}","DOCREADER_PREPROCESS_MAX_EDGE=${DOCREADER_PREPROCESS_MAX_EDGE:-2000}","DOCREADER_DOCX_MAX_PAGES=${DOCREADER_DOCX_MAX_PAGES:-0}","DOCREADER_MARKITDOWN_MAX_WORKERS=${DOCREADER_MARKITDOWN_MAX_WORKERS:-1}","DOCREADER_HTML_MAIN_CONTENT=${DOCREADER_HTML_MAIN_CONTENT:-false}","DOCREADER_XLSX_PERCENT_AS_TEXT=${DOCREADER_XLSX_PERCENT_AS_TEXT:-false}","DOCREADER_XLSX_PCT_ROW_HINT_MIN=${DOCREADER_XLSX_PCT_ROW_HINT_MIN:-0}","WEKNORA_PREPROCESS_PAD=${WEKNORA_PREPROCESS_PAD:-}","WEKNORA_PREPROCESS_MIN_SCORE=${WEKNORA_PREPROCESS_MIN_SCORE:-}","WEKNORA_PREPROCESS_ANG_TOL=${WEKNORA_PREPROCESS_ANG_TOL:-}","WEKNORA_PREPROCESS_SIZE_MIN=${WEKNORA_PREPROCESS_SIZE_MIN:-}","WEKNORA_PREPROCESS_QUAD_TOL=${WEKNORA_PREPROCESS_QUAD_TOL:-}","DOCREADER_EXTERNAL_HTTP_PROXY=${DOCREADER_EXTERNAL_HTTP_PROXY:-}","DOCREADER_EXTERNAL_HTTPS_PROXY=${DOCREADER_EXTERNAL_HTTPS_PROXY:-}","DOCREADER_ODL_MAX_WORKERS=${DOCREADER_ODL_MAX_WORKERS:-1}","DOCREADER_ODL_HYBRID=${DOCREADER_ODL_HYBRID:-off}","DOCREADER_ODL_HYBRID_URL=${DOCREADER_ODL_HYBRID_URL:-http://odl-hybrid:5002}","DOCREADER_ODL_HYBRID_MODE=${DOCREADER_ODL_HYBRID_MODE:-auto}","DOCREADER_ODL_HYBRID_FALLBACK=${DOCREADER_ODL_HYBRID_FALLBACK:-false}","DOCREADER_ODL_MARKDOWN_WITH_HTML=${DOCREADER_ODL_MARKDOWN_WITH_HTML:-false}","DOCREADER_PDF_RENDER_MAX_WORKERS=${DOCREADER_PDF_RENDER_MAX_WORKERS:-1}","DOCREADER_PDF_RENDER_PARALLELISM=${DOCREADER_PDF_RENDER_PARALLELISM:-}","DOCREADER_PDF_RENDER_DPI=${DOCREADER_PDF_RENDER_DPI:-200}","DOCREADER_PDF_JPEG_QUALITY=${DOCREADER_PDF_JPEG_QUALITY:-85}","DOCREADER_PDF_RENDER_MAX_EDGE=${DOCREADER_PDF_RENDER_MAX_EDGE:-2000}","DOCREADER_PDF_FORCE_SCANNED=${DOCREADER_PDF_FORCE_SCANNED:-false}","DOCREADER_PDF_WORD_GAP_WIDTH_RATIO=${DOCREADER_PDF_WORD_GAP_WIDTH_RATIO:-0.4}","DOCREADER_PDF_MARGIN_COL_WIDTH_RATIO=${DOCREADER_PDF_MARGIN_COL_WIDTH_RATIO:-0.12}","DOCREADER_PDF_MIN_HEADING_LINE_CHARS=${DOCREADER_PDF_MIN_HEADING_LINE_CHARS:-8}","DOCREADER_PDF_SANITIZE_TEXT=${DOCREADER_PDF_SANITIZE_TEXT:-true}","DOCREADER_PDF_STRIP_CHART_DEBRIS=${DOCREADER_PDF_STRIP_CHART_DEBRIS:-true}","DOCREADER_PDF_RENDER_VECTOR_FIGURES=${DOCREADER_PDF_RENDER_VECTOR_FIGURES:-true}","DOCREADER_PDF_DETECT_HEADINGS=${DOCREADER_PDF_DETECT_HEADINGS:-}","DOCREADER_PDF_LAYOUT_ORDERING=${DOCREADER_PDF_LAYOUT_ORDERING:-}","DOCREADER_PDF_FILTER_HIDDEN_TEXT=${DOCREADER_PDF_FILTER_HIDDEN_TEXT:-}","DOCREADER_PDF_SCAN_IMAGE_RATIO=${DOCREADER_PDF_SCAN_IMAGE_RATIO:-}","DOCREADER_PDF_SCAN_MIN_CHARS=${DOCREADER_PDF_SCAN_MIN_CHARS:-}","DOCREADER_PDF_EXTRACT_EMBEDDED_IMAGES=${DOCREADER_PDF_EXTRACT_EMBEDDED_IMAGES:-}","DOCREADER_PDF_EMBED_MIN_PIXELS=${DOCREADER_PDF_EMBED_MIN_PIXELS:-}","DOCREADER_PDF_EMBED_MIN_AREA_RATIO=${DOCREADER_PDF_EMBED_MIN_AREA_RATIO:-}","DOCREADER_PDF_EMBED_REPEAT_PAGE_FRAC=${DOCREADER_PDF_EMBED_REPEAT_PAGE_FRAC:-}","DOCREADER_PDF_EMBED_MAX_IMAGES=${DOCREADER_PDF_EMBED_MAX_IMAGES:-}","DOCREADER_PDF_MIN_CHART_REGION_AREA=${DOCREADER_PDF_MIN_CHART_REGION_AREA:-}","DOCREADER_PDF_MIN_CHART_REGION_CHARS=${DOCREADER_PDF_MIN_CHART_REGION_CHARS:-}","DOCREADER_PDF_MAX_CHART_REGION_AREA=${DOCREADER_PDF_MAX_CHART_REGION_AREA:-}","DOCREADER_PDF_MAX_FIGURE_HEIGHT_RATIO=${DOCREADER_PDF_MAX_FIGURE_HEIGHT_RATIO:-}"],"volumes":["docreader-tmp:/tmp/docreader"]},{"name":"odl-hybrid","image":"weknora-odl-hybrid:local","build":{"context":".","dockerfile":"docker/Dockerfile.odl-hybrid"},"restart":"unless-stopped","environment":["ODL_HYBRID_EXTRA_ARGS=${ODL_HYBRID_EXTRA_ARGS:---no-ocr}"]},{"name":"postgres","image":"paradedb/paradedb:v0.25.11-pg17","restart":"unless-stopped","environment":["POSTGRES_USER=${DB_USER}","POSTGRES_PASSWORD=${DB_PASSWORD}","POSTGRES_DB=${DB_NAME}"],"volumes":["postgres-data:/var/lib/postgresql/data"]},{"name":"redis","image":"redis:7.0-alpine","restart":"always","command":"redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}"},{"name":"searxng-init","image":"busybox:1.36","restart":"no","command":"sh -c cp /template/settings.yml /etc/searxng/settings.yml && chmod 0644 /etc/searxng/settings.yml","volumes":["./docker/searxng/settings.yml:/template/settings.yml:ro","searxng_config:/etc/searxng"]},{"name":"searxng","image":"searxng/searxng:latest","restart":"unless-stopped","ports":["${SEARXNG_BIND:-127.0.0.1}:${SEARXNG_PORT:-8888}:8080"],"environment":["SEARXNG_BASE_URL=http://localhost:${SEARXNG_PORT:-8888}/","INSTANCE_NAME=weknora-searxng","SEARXNG_SECRET=${SEARXNG_SECRET:-weknora-default-searxng-secret-rotate-before-exposing-publicly}"],"volumes":["searxng_config:/etc/searxng"],"depends_on":["searxng-init"]},{"name":"minio","image":"pgsty/minio:RELEASE.2026-08-04T00-00-00Z","command":"server --console-address \":9001\" /data","ports":["${MINIO_PORT:-9000}:9000","${MINIO_CONSOLE_PORT:-9001}:9001"],"environment":["MINIO_ROOT_USER=${MINIO_ACCESS_KEY_ID:-minioadmin}","MINIO_ROOT_PASSWORD=${MINIO_SECRET_ACCESS_KEY:-minioadmin}"],"volumes":["minio_data:/data"]},{"name":"neo4j","image":"neo4j:2025.10.1","restart":"always","ports":["7474:7474","7687:7687"],"environment":["NEO4J_AUTH=${NEO4J_USERNAME:-neo4j}/${NEO4J_PASSWORD:-password}","NEO4J_apoc_export_file_enabled=true","NEO4J_apoc_import_file_enabled=true","NEO4J_apoc_import_file_use__neo4j__config=true","NEO4JLABS_PLUGINS=[\"apoc\"]"],"volumes":["neo4j-data:/data"]},{"name":"qdrant","image":"qdrant/qdrant:v1.16.2","restart":"unless-stopped","ports":["${QDRANT_REST_PORT:-6333}:6333","${QDRANT_PORT:-6334}:6334"],"volumes":["qdrant_data:/qdrant/storage"]},{"name":"milvus","image":"milvusdb/milvus:v2.6.11","restart":"unless-stopped","command":"milvus run standalone","ports":["19530:19530","9091:9091"],"environment":["ETCD_USE_EMBED=true","ETCD_DATA_DIR=/var/lib/milvus/etcd","COMMON_STORAGETYPE=local","DEPLOY_MODE=STANDALONE"],"volumes":["milvus_data:/var/lib/milvus"]},{"name":"weaviate","image":"semitechnologies/weaviate:1.28.4","restart":"unless-stopped","ports":["9035:8080","50052:50051"],"environment":["PERSISTENCE_DATA_PATH=/var/lib/weaviate","CLUSTER_HOSTNAME=node1","DEFAULT_VECTORIZER_MODULE=none","ENABLE_MODULES=none","AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true","CLUSTER_GOSSIP_BIND_PORT=7000","CLUSTER_DATA_BIND_PORT=7001","RAFT_BOOTSTRAP_EXPECT=1"],"volumes":["weaviate_data:/var/lib/weaviate"]},{"name":"doris-fe","image":"apache/doris:fe-4.1.0","restart":"unless-stopped","ports":["${DORIS_FE_HTTP_PORT:-8030}:8030","${DORIS_FE_MYSQL_PORT:-9030}:9030"],"environment":["FE_SERVERS=fe1:doris-fe:9010","FE_ID=1"],"volumes":["doris_fe_meta:/opt/apache-doris/fe/doris-meta","doris_fe_log:/opt/apache-doris/fe/log"]},{"name":"doris-be","image":"apache/doris:be-4.1.0","restart":"unless-stopped","ports":["${DORIS_BE_HTTP_PORT:-8040}:8040"],"environment":["FE_SERVERS=fe1:doris-fe:9010","BE_ADDR=doris-be:9050"],"volumes":["doris_be_storage:/opt/apache-doris/be/storage","doris_be_log:/opt/apache-doris/be/log"],"depends_on":["doris-fe"]},{"name":"dex","image":"dexidp/dex:latest","command":"dex serve /etc/dex/config.yaml","ports":["5556:5556"],"volumes":["./misc/dex-config.yaml:/etc/dex/config.yaml"]},{"name":"langfuse-db-init","image":"paradedb/paradedb:v0.25.11-pg17","restart":"no","command":"set -e\necho \"[langfuse-db-init] ensuring database '${LANGFUSE_DB_NAME:-langfuse}' exists in WeKnora-postgres...\"\n# 先刷新现有库的 collation（镜像 ICU 2.36 与宿主 2.41 不匹配时必须做），否则 CREATE DATABASE 会失败\npsql -h postgres -U ${DB_USER} -d postgres -v ON_ERROR_STOP=0 -c \"ALTER DATABASE template1 REFRESH COLLATION VERSION;\" >/dev/null 2>&1 || true\npsql -h postgres -U ${DB_USER} -d postgres -v ON_ERROR_STOP=0 -c \"ALTER DATABASE postgres REFRESH COLLATION VERSION;\" >/dev/null 2>&1 || true\n# 幂等创建：已存在则跳过；不存在则从 template0 克隆（template0 永远不会有 collation 漂移）\nif psql -h postgres -U ${DB_USER} -d postgres -tAc \"SELECT 1 FROM pg_database WHERE datname='${LANGFUSE_DB_NAME:-langfuse}'\" | grep -q 1; then\n  echo \"[langfuse-db-init] database '${LANGFUSE_DB_NAME:-langfuse}' already exists, skipping.\"\nelse\n  psql -h postgres -U ${DB_USER} -d postgres -v ON_ERROR_STOP=1 -c \"CREATE DATABASE \\\"${LANGFUSE_DB_NAME:-langfuse}\\\" TEMPLATE template0;\"\n  echo \"[langfuse-db-init] database '${LANGFUSE_DB_NAME:-langfuse}' created.\"\nfi\necho \"[langfuse-db-init] done.\"\n","environment":["PGPASSWORD=${DB_PASSWORD}"],"depends_on":["postgres"]},{"name":"langfuse-clickhouse","image":"clickhouse/clickhouse-server:24.8","restart":"unless-stopped","environment":["CLICKHOUSE_DB=default","CLICKHOUSE_USER=${LANGFUSE_CLICKHOUSE_USER:-clickhouse}","CLICKHOUSE_PASSWORD=${LANGFUSE_CLICKHOUSE_PASSWORD:-clickhouse}"],"volumes":["langfuse_clickhouse_data:/var/lib/clickhouse","langfuse_clickhouse_logs:/var/log/clickhouse-server"]},{"name":"langfuse-minio","image":"pgsty/minio:RELEASE.2026-08-04T00-00-00Z","restart":"unless-stopped","command":"-c 'mkdir -p /data/langfuse && minio server --address \":9000\" --console-address \":9001\" /data'","ports":["${LANGFUSE_MINIO_S3_PORT:-9100}:9000","${LANGFUSE_MINIO_CONSOLE_PORT:-9101}:9001"],"environment":["MINIO_ROOT_USER=${LANGFUSE_MINIO_USER:-langfuseminio}","MINIO_ROOT_PASSWORD=${LANGFUSE_MINIO_PASSWORD:-langfuseminiosecret}"],"volumes":["langfuse_minio_data:/data"]},{"name":"langfuse-worker","image":"langfuse/langfuse-worker:3","restart":"unless-stopped","environment":["_LF_DB_USER=${DB_USER}","_LF_DB_PASSWORD=${DB_PASSWORD}","_LF_DB_NAME=${LANGFUSE_DB_NAME:-langfuse}","_LF_REDIS_PASSWORD=${REDIS_PASSWORD}","_LF_REDIS_DB=${LANGFUSE_REDIS_DB:-1}","SALT=${LANGFUSE_SALT:-weknora-langfuse-dev-salt-change-me}","ENCRYPTION_KEY=${LANGFUSE_ENCRYPTION_KEY:-0000000000000000000000000000000000000000000000000000000000000000}","NEXTAUTH_URL=${LANGFUSE_NEXTAUTH_URL:-http://localhost:3000}","NEXTAUTH_SECRET=${LANGFUSE_NEXTAUTH_SECRET:-weknora-langfuse-dev-nextauth-secret-change-me}","TELEMETRY_ENABLED=${LANGFUSE_TELEMETRY_ENABLED:-false}","LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES=false","CLICKHOUSE_URL=http://langfuse-clickhouse:8123","CLICKHOUSE_MIGRATION_URL=clickhouse://langfuse-clickhouse:9000","CLICKHOUSE_USER=${LANGFUSE_CLICKHOUSE_USER:-clickhouse}","CLICKHOUSE_PASSWORD=${LANGFUSE_CLICKHOUSE_PASSWORD:-clickhouse}","CLICKHOUSE_CLUSTER_ENABLED=false","LANGFUSE_S3_EVENT_UPLOAD_BUCKET=langfuse","LANGFUSE_S3_EVENT_UPLOAD_REGION=auto","LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID=${LANGFUSE_MINIO_USER:-langfuseminio}","LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY=${LANGFUSE_MINIO_PASSWORD:-langfuseminiosecret}","LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT=http://langfuse-minio:9000","LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE=true","LANGFUSE_S3_EVENT_UPLOAD_PREFIX=events/","LANGFUSE_S3_MEDIA_UPLOAD_BUCKET=langfuse","LANGFUSE_S3_MEDIA_UPLOAD_REGION=auto","LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID=${LANGFUSE_MINIO_USER:-langfuseminio}","LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY=${LANGFUSE_MINIO_PASSWORD:-langfuseminiosecret}","LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT=${LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT:-http://localhost:9100}","LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE=true","LANGFUSE_S3_MEDIA_UPLOAD_PREFIX=media/"],"depends_on":["langfuse-db-init","redis","langfuse-clickhouse","langfuse-minio"]},{"name":"langfuse-web","image":"langfuse/langfuse:3","restart":"unless-stopped","ports":["${LANGFUSE_WEB_PORT:-3000}:3000"],"environment":["_LF_DB_USER=${DB_USER}","_LF_DB_PASSWORD=${DB_PASSWORD}","_LF_DB_NAME=${LANGFUSE_DB_NAME:-langfuse}","_LF_REDIS_PASSWORD=${REDIS_PASSWORD}","_LF_REDIS_DB=${LANGFUSE_REDIS_DB:-1}","SALT=${LANGFUSE_SALT:-weknora-langfuse-dev-salt-change-me}","ENCRYPTION_KEY=${LANGFUSE_ENCRYPTION_KEY:-0000000000000000000000000000000000000000000000000000000000000000}","NEXTAUTH_URL=${LANGFUSE_NEXTAUTH_URL:-http://localhost:3000}","NEXTAUTH_SECRET=${LANGFUSE_NEXTAUTH_SECRET:-weknora-langfuse-dev-nextauth-secret-change-me}","TELEMETRY_ENABLED=${LANGFUSE_TELEMETRY_ENABLED:-false}","LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES=false","CLICKHOUSE_URL=http://langfuse-clickhouse:8123","CLICKHOUSE_MIGRATION_URL=clickhouse://langfuse-clickhouse:9000","CLICKHOUSE_USER=${LANGFUSE_CLICKHOUSE_USER:-clickhouse}","CLICKHOUSE_PASSWORD=${LANGFUSE_CLICKHOUSE_PASSWORD:-clickhouse}","CLICKHOUSE_CLUSTER_ENABLED=false","LANGFUSE_S3_EVENT_UPLOAD_BUCKET=langfuse","LANGFUSE_S3_EVENT_UPLOAD_REGION=auto","LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID=${LANGFUSE_MINIO_USER:-langfuseminio}","LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY=${LANGFUSE_MINIO_PASSWORD:-langfuseminiosecret}","LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT=http://langfuse-minio:9000","LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE=true","LANGFUSE_S3_EVENT_UPLOAD_PREFIX=events/","LANGFUSE_S3_MEDIA_UPLOAD_BUCKET=langfuse","LANGFUSE_S3_MEDIA_UPLOAD_REGION=auto","LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID=${LANGFUSE_MINIO_USER:-langfuseminio}","LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY=${LANGFUSE_MINIO_PASSWORD:-langfuseminiosecret}","LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT=${LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT:-http://localhost:9100}","LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE=true","LANGFUSE_S3_MEDIA_UPLOAD_PREFIX=media/","LANGFUSE_INIT_ORG_ID=${LANGFUSE_INIT_ORG_ID:-}","LANGFUSE_INIT_ORG_NAME=${LANGFUSE_INIT_ORG_NAME:-}","LANGFUSE_INIT_PROJECT_ID=${LANGFUSE_INIT_PROJECT_ID:-}","LANGFUSE_INIT_PROJECT_NAME=${LANGFUSE_INIT_PROJECT_NAME:-}","LANGFUSE_INIT_PROJECT_PUBLIC_KEY=${LANGFUSE_INIT_PROJECT_PUBLIC_KEY:-}","LANGFUSE_INIT_PROJECT_SECRET_KEY=${LANGFUSE_INIT_PROJECT_SECRET_KEY:-}","LANGFUSE_INIT_USER_EMAIL=${LANGFUSE_INIT_USER_EMAIL:-}","LANGFUSE_INIT_USER_NAME=${LANGFUSE_INIT_USER_NAME:-}","LANGFUSE_INIT_USER_PASSWORD=${LANGFUSE_INIT_USER_PASSWORD:-}"],"depends_on":["langfuse-db-init","redis","langfuse-clickhouse","langfuse-minio"]},{"name":"mcp","build":{"context":"./mcp-server"},"restart":"unless-stopped","ports":["${MCP_PORT:-8082}:8000"],"environment":["WEKNORA_BASE_URL=http://app:8080/api/v1","WEKNORA_API_KEY=${WEKNORA_API_KEY:-}","MCP_SERVER_AUTH_TOKEN=${MCP_SERVER_AUTH_TOKEN:-}","WEKNORA_CHAT_TIMEOUT=${WEKNORA_CHAT_TIMEOUT:-300}","WEKNORA_VERIFY_SSL=${WEKNORA_VERIFY_SSL:-true}","MCP_ALLOWED_UPLOAD_DIRS=${MCP_ALLOWED_UPLOAD_DIRS:-}"],"depends_on":["app"]}],"exposedPorts":["80","8080","8888","9000","9001","7474","7687","6333","6334","19530","9091","9035","50052","8030","9030","8040","5556","9100","9101","3000","8082"],"dockerRunCommand":"docker run -d --name weknora -p 80:80 --restart always weknora-odl-hybrid:local","podmanRunCommand":"podman run -d --name weknora -p 80:80 --restart always weknora-odl-hybrid:local","skopeoInspectCommand":"skopeo inspect docker://docker.io/library/weknora-odl-hybrid:local","orasPullCommand":"oras pull weknora-odl-hybrid:local","registryMeta":{"provider":"dockerhub","image":"library/weknora-odl-hybrid","canonicalImage":"docker.io/library/weknora-odl-hybrid:local","latestTag":"local","cliCommands":{"dockerRun":"docker run -d --name weknora -p 80:80 --restart always weknora-odl-hybrid:local","dockerPull":"docker pull weknora-odl-hybrid:local","podmanRun":"podman run -d --name weknora -p 80:80 --restart always weknora-odl-hybrid:local","skopeoInspect":"skopeo inspect docker://docker.io/library/weknora-odl-hybrid:local","orasPull":"oras pull weknora-odl-hybrid:local","composeYaml":"services:\n  weknora:\n    image: weknora-odl-hybrid:local\n    restart: unless-stopped\n    ports:\n      - \"80:80\""}}}