# 使用说明 # 1. 复制此文件为 .env # 2. 替换所有占位符为实际值 # 3. 确保 .env 文件不会被提交到版本控制系统 # ========== MCP Server ========== # WeKnora API Key — 在 WeKnora 前端 "设置 → API Keys" 生成,供 MCP Server 访问 REST API # WEKNORA_API_KEY= # 对外暴露的 MCP Server 端口(默认 8082) # MCP_PORT=8082 # ========== 镜像版本 ========== # WeKnora 镜像版本标签,可选值: latest(稳定版), main(最新开发版) # WEKNORA_VERSION=latest # gin mod # 可选值: debug(开发模式,有详细日志), release(生产模式,禁用Swagger文档) GIN_MODE=release # 日志级别,可选值:debug, info, warn, error, fatal,默认为debug # LOG_LEVEL=debug # LLM 调试日志:将每次大模型调用的完整请求和响应写入独立日志文件,便于排查上下文问题 # 可选值:true(自动放在 LOG_PATH 同目录下 llm_debug.log)、false/空(关闭)、或指定文件路径 # LLM_DEBUG_LOG=true # ========== 内置模型(Built-in Models)声明式配置(可选) ========== # 如果启用了 config/builtin_models.yaml(见 config/builtin_models.yaml.example), # YAML 中的 ${NAME} 占位符会在应用启动期从这里读取真实值。变量名由 YAML 自行 # 指定,下面给出常见命名作为参考;按你自己的部署改名也可以。详见 # docs/BUILTIN_MODELS.md。 # # LLM_MODEL_NAME= # LLM_BASE_URL= # LLM_API_KEY= # LLM_PROVIDER=openai # # EMBEDDING_MODEL_NAME= # EMBEDDING_BASE_URL= # EMBEDDING_API_KEY= # EMBEDDING_PROVIDER=openai # # RERANK_MODEL_NAME= # RERANK_BASE_URL= # RERANK_API_KEY= # RERANK_PROVIDER=generic # ========== Langfuse 可观测性(可选) ========== # 用于追踪 chat / embedding / rerank / VLM / ASR 模型调用,统计 token 消耗。 # 详细说明:docs/Langfuse集成.md # # 方案 A:接入 Langfuse Cloud(最简单) # 1) 登录 https://cloud.langfuse.com 生成 API Key # 2) 填入下方 PUBLIC_KEY / SECRET_KEY # 3) docker compose up -d app # # 方案 B:自建 Langfuse(局域网/内网环境) # 1) 启动自建栈:docker compose --profile langfuse up -d # 首次启动后 ClickHouse 迁移约 1-2 分钟,耐心等待 langfuse-web 健康 # 2) 浏览器打开 http://localhost:3000 注册管理员账号并生成 API Key # 3) 取消注释下方 LANGFUSE_HOST=http://langfuse-web:3000 # 填入刚生成的 PUBLIC_KEY / SECRET_KEY # 4) docker compose up -d app # # 只要同时设置了 PUBLIC_KEY + SECRET_KEY 就会自动启用,无需显式开关。 LANGFUSE_PUBLIC_KEY=pk-lf-xxxxxxxx LANGFUSE_SECRET_KEY=sk-lf-xxxxxxxx LANGFUSE_HOST=http://langfuse-web:3000 # 自建模式下改成:LANGFUSE_HOST=http://langfuse-web:3000 # # 可选:显式开关(true/false,默认根据 key 自动判断) # LANGFUSE_ENABLED=true # 可选:版本 / 环境标签,便于在 Langfuse UI 过滤 # LANGFUSE_RELEASE=v0.4.2 # LANGFUSE_ENVIRONMENT=production # 可选:批量上报与采样策略(生产高流量建议调大 FLUSH_AT、降低 SAMPLE_RATE) # LANGFUSE_FLUSH_AT=15 # LANGFUSE_FLUSH_INTERVAL=3s # LANGFUSE_QUEUE_SIZE=2048 # LANGFUSE_REQUEST_TIMEOUT=10s # LANGFUSE_SAMPLE_RATE=1.0 # LANGFUSE_DEBUG=false # ========== Langfuse 自建栈配置(仅在使用 --profile langfuse 时需要) ========== # 设计说明:为了最小化资源占用,Langfuse 自建栈会**复用** WeKnora 已有的 # - postgres:创建独立的 "langfuse" 数据库(由 langfuse-db-init 容器一次性创建) # - redis :使用独立的 Redis DB 号(默认 1,WeKnora 用 0) # 真正新增的只有 3 个常驻容器:langfuse-web、langfuse-worker、langfuse-clickhouse # + 1 个专用 S3:langfuse-minio # + 1 个一次性 init:langfuse-db-init # # Langfuse Web UI 对外端口 # LANGFUSE_WEB_PORT=3000 # # Langfuse 专用 MinIO 端口(避免和 WeKnora 主 MinIO 9000/9001 冲突) # LANGFUSE_MINIO_S3_PORT=9100 # LANGFUSE_MINIO_CONSOLE_PORT=9101 # # 在 WeKnora-postgres 中创建的 Langfuse 库名 # LANGFUSE_DB_NAME=langfuse # # 在 WeKnora-redis 中使用的 DB 号(1~15,不要和 WeKnora 的 0 冲突) # LANGFUSE_REDIS_DB=1 # # ClickHouse / Langfuse 专用 MinIO 凭证(生产请务必修改) # LANGFUSE_CLICKHOUSE_USER=clickhouse # LANGFUSE_CLICKHOUSE_PASSWORD=clickhouse # LANGFUSE_MINIO_USER=langfuseminio # LANGFUSE_MINIO_PASSWORD=langfuseminiosecret # # Langfuse 核心安全字段,生产必须重新生成: # LANGFUSE_SALT=$(openssl rand -base64 32) # LANGFUSE_ENCRYPTION_KEY=$(openssl rand -hex 32) # LANGFUSE_NEXTAUTH_SECRET=$(openssl rand -base64 32) # LANGFUSE_SALT= # LANGFUSE_ENCRYPTION_KEY= # LANGFUSE_NEXTAUTH_SECRET= # LANGFUSE_NEXTAUTH_URL=http://localhost:3000 # LANGFUSE_TELEMETRY_ENABLED=false # # 可选:自动化首次启动(填写后直接注入管理员+项目,跳过 UI 注册) # LANGFUSE_INIT_ORG_ID=WeKnora # LANGFUSE_INIT_ORG_NAME=WeKnora # LANGFUSE_INIT_PROJECT_ID=WeKnora # LANGFUSE_INIT_PROJECT_NAME=WeKnora # LANGFUSE_INIT_PROJECT_PUBLIC_KEY=pk-lf-weknora-init # LANGFUSE_INIT_PROJECT_SECRET_KEY=sk-lf-weknora-init # LANGFUSE_INIT_USER_EMAIL=admin@example.com # LANGFUSE_INIT_USER_NAME=Admin # LANGFUSE_INIT_USER_PASSWORD=change-me-please # 时区设置,默认为 Asia/Shanghai # 影响系统时间显示和日志时间戳 # 常用值:Asia/Shanghai, Asia/Tokyo, America/New_York, Europe/London, UTC TZ=Asia/Shanghai # 系统默认语言(BCP-47 格式),用于 Prompt 中 {{language}} 占位符的回退值 # 优先级:Accept-Language 请求头 > 此环境变量 > 内置默认值 (en-US) # 常用值:zh-CN, en-US, ja-JP, ko-KR, ru-RU # WEKNORA_LANGUAGE=zh-CN # 禁止新用户注册(生产环境建议设为 true) DISABLE_REGISTRATION=false # Ollama 服务的基准 URL,用于连接本地/其他服务器上运行的 Ollama 服务 OLLAMA_BASE_URL=http://host.docker.internal:11434 # 存储配置 # 主数据库类型(postgres/mysql) DB_DRIVER=postgres # 向量存储类型(postgres/elasticsearch_v7/elasticsearch_v8/qdrant/milvus/weaviate/doris/tencent_vectordb) RETRIEVE_DRIVER=postgres # 允许用户使用哪些文件存储类型,使用逗号分隔,留空则允许所有类型的存储 # STORAGE_ALLOW_LIST=local,minio,cos,tos,s3 # 文件存储类型(local/minio/cos/tos/s3) STORAGE_TYPE=local # 流处理后端(memory/redis) STREAM_MANAGER_TYPE=redis # 应用服务主机名,默认为app(Docker内部服务名) # 如需代理到远程后端,可设为远程地址,如 remote-app.example.com APP_HOST=app # 应用服务宿主机映射端口,默认为8080(仅影响宿主机访问,不影响容器间通信) APP_PORT=8080 # NGINX 代理到后端的目标端口,默认为8080(App容器内部监听端口) # 本地部署:保持默认即可,无需随 APP_PORT 修改 # 远程部署:设为远程 App 服务的实际端口 # APP_BACKEND_PORT=8080 # NGINX 代理到后端的协议,默认为http # 远程部署如后端为 HTTPS,需设为 https # APP_SCHEME=http # 应用外部访问地址(仅影响 IM 渠道中 local 后端的图片/文件链接) # 设置为 WeKnora 实例的「IM 平台 / 客户端公网可达」URL,如 https://weknora.example.com # # 作用范围: # - local 后端:必须设置,否则 IM 收到的是 local://... 路径,无法渲染 # - MinIO/COS/OSS/S3/TOS/OBS/KS3:不读取此变量;它们的链接由各自 SDK 生成, # host 由对应的 *_ENDPOINT 决定,同样必须公网可达 # # 内网 IP(192.168.x / 10.x / 172.16-31.x)和 localhost 对飞书 / 企微 / Slack # 等 IM 平台服务器都不可达;本地开发请用 ngrok / cloudflared / frp 之类的隧道。 # APP_EXTERNAL_URL= # 前端服务端口,默认为80 FRONTEND_PORT=80 # 文档解析模块端口,默认为50051 DOCREADER_PORT=50051 # 数据库主机地址 DB_HOST=localhost # 数据库端口 DB_PORT=5432 # 数据库用户名 DB_USER=postgres # 数据库密码 DB_PASSWORD=postgres123!@# # 数据库名称 DB_NAME=WeKnora # 如果使用 redis 作为流处理后端,需要配置以下参数 # Redis用户名,Redis 6.0+ ACL 功能支持(可选) # REDIS_USERNAME= # Redis密码,如果没有设置密码,可以留空 REDIS_PASSWORD=redis123!@# # Redis数据库索引,默认为0 REDIS_DB=0 # Redis key的前缀,用于命名空间隔离 REDIS_PREFIX=stream: # 当使用本地存储时,文件保存的基础目录路径 LOCAL_STORAGE_BASE_DIR=/data/files # 是否自动恢复脏数据 AUTO_RECOVER_DIRTY=true TENANT_AES_KEY=weknorarag-api-key-secret-secret # AES-256 密钥,用于数据库中 API Key 等敏感字段的落盘加密(必须为32字节) SYSTEM_AES_KEY=weknora-system-aes-key-32bytes!! # SSRF 校验白名单(可选)。逗号分隔;每条可为:精确域名(api.internal)、通配域名(*.example.com)、 # IPv4(203.0.113.5)、IPv6(2001:db8::1,不带方括号)或 CIDR(10.0.0.0/8, 2001:db8::/32)。 # 列入者会在 URL 校验等地方绕过常规 SSRF 规则,生产环境请谨慎配置。 # SSRF_WHITELIST=internal.service,*.corp.example,172.16.0.0/12,2001:db8::1,fd00::/8 # # ===== 向量库地址的 SSRF 校验 ===== # 通过 API 创建/测试向量库连接时,地址会经过 SSRF 校验。docker-compose 内置服务 # (qdrant, milvus, weaviate, doris-fe)已通过 SSRF_WHITELIST_EXTRA 默认放行。 # 如使用外部私网地址或被拦截端口(5432, 9200 等),请将主机加入 SSRF_WHITELIST_EXTRA # (注意:自定义该变量会覆盖 compose 默认值,需重新包含内置服务名),例如: # SSRF_WHITELIST_EXTRA=searxng,qdrant,milvus,weaviate,doris-fe,my-opensearch.internal # # 本地开发(go run + docker-compose.dev.yml --profile opensearch):后端跑在宿主机, # OpenSearch 经 published 端口 http://localhost:9200 访问;通过 API 创建该向量库前, # 需把 localhost 加入 SSRF_WHITELIST(9200 是被拦截端口,localhost 是受限主机名): # SSRF_WHITELIST=localhost # ===== SearXNG(可选自建网络搜索)===== # 启用:`docker compose --profile searxng up -d`。 # SEARXNG_SECRET 不设时使用 docker-compose 中的写死默认值,足够本机/loopback # 部署使用;如果改 SEARXNG_BIND=0.0.0.0 把实例暴露到 LAN/公网,请务必用 # `openssl rand -hex 32` 生成并显式设置 SEARXNG_SECRET,否则默认值会被任何人 # 用于签名 image-proxy URL。 # # 后端访问方式(容器化部署):控制台中 Provider 类型选 "SearXNG", # Instance URL 填 http://searxng:8080 ;docker compose 已默认把 `searxng` 主机名 # 注入 SSRF_WHITELIST_EXTRA,无需额外配置。 # # 本地开发(go run + docker compose -f docker-compose.dev.yml --profile searxng up): # 后端跑在宿主机,需走 published 端口;Instance URL 填 http://127.0.0.1:8888 , # 并把 127.0.0.1 加入下方 SSRF_WHITELIST: # SSRF_WHITELIST=127.0.0.1 # # 端口默认仅监听 127.0.0.1,避免把开了 limiter:false 的实例暴露到 LAN。 # 如需对内网开放,显式覆盖 SEARXNG_BIND=0.0.0.0 并自行加固。 # SEARXNG_PORT=8888 # SEARXNG_BIND=127.0.0.1 # SEARXNG_SECRET= # SSRF_WHITELIST_EXTRA=searxng # 是否开启知识图谱构建和检索(构建阶段需调用大模型,耗时较长) ENABLE_GRAPH_RAG=false # 配置 JWT_SECRET 用于前端登录刷新Token JWT_SECRET=weknora-jwt-secret # MinIO端口 # MINIO_PORT=9000 # MinIO控制台端口 # MINIO_CONSOLE_PORT=9001 # Embedding并发数,出现429错误时,可调小此参数 CONCURRENCY_POOL_SIZE=5 # (Removed: IMAGE_MAX_CONCURRENT, OCR_BACKEND — moved to Go App module after lightweight refactoring) # 如果使用ElasticSearch作为向量存储,需要配置以下参数 # ElasticSearch地址,例如 http://localhost:9200 # ELASTICSEARCH_ADDR=your_elasticsearch_addr # ElasticSearch用户名,如果需要身份验证 # ELASTICSEARCH_USERNAME=your_elasticsearch_username # ElasticSearch密码,如果需要身份验证 # ELASTICSEARCH_PASSWORD=your_elasticsearch_password # ElasticSearch索引名称,用于存储向量数据 # ELASTICSEARCH_INDEX=WeKnora # 如果使用Qdrant作为向量存储,需要配置以下参数 # Qdrant服务主机地址 # QDRANT_HOST=localhost # Qdrant服务端口 # QDRANT_PORT=6334 # Qdrant集合名称,用于存储向量数据 # QDRANT_COLLECTION=weknora_embeddings # Qdrant API密钥,如果需要身份验证(可选) # QDRANT_API_KEY=your_qdrant_api_key # 是否启用TLS加密连接(可选,默认为false) # QDRANT_USE_TLS=false # 如果使用腾讯云 Tencent VectorDB 作为向量存储,需要配置以下参数 # Tencent VectorDB 访问地址 # TENCENT_VECTORDB_ADDR=http://your-instance.tencentvectordb.com # Tencent VectorDB 用户名 # TENCENT_VECTORDB_USERNAME=root # Tencent VectorDB API Key # TENCENT_VECTORDB_API_KEY=your_tencent_vectordb_api_key # Tencent VectorDB 数据库名称(可选,默认 weknora) # TENCENT_VECTORDB_DATABASE=weknora # Tencent VectorDB 集合名前缀(可选,默认 weknora_embeddings;实际集合会按向量维度追加后缀) # TENCENT_VECTORDB_COLLECTION=weknora_embeddings # Tencent VectorDB 集合副本数(可选,默认 1;单节点 QA 环境可设为 0) # TENCENT_VECTORDB_REPLICA_NUMBER=1 # 如果使用MinIO作为文件存储,需要配置以下参数 # MinIO访问端点(host:port),连接外部MinIO时需修改 # # 重要:用于 IM 渠道时,MINIO_ENDPOINT 必须是 IM 平台 / 客户端公网可达的 host。 # MinIO SDK 生成的 presigned URL 直接使用这个 host,飞书 / 企微 / Slack 等都 # 无法解析 docker-compose 的内部服务名 minio:9000,会导致 IM 中图片不显示。 # 推荐做法:配置一个公网域名(如 minio.example.com)并启用 HTTPS。 # MINIO_ENDPOINT=minio:9000 # MinIO访问密钥 # MINIO_ACCESS_KEY_ID=your_minio_access_key # MinIO密钥 # MINIO_SECRET_ACCESS_KEY=your_minio_secret_key # MinIO桶名称,用于存储文件 # MINIO_BUCKET_NAME=your_minio_bucket_name # 如果使用腾讯云COS作为文件存储,需要配置以下参数 # 腾讯云COS的访问密钥ID # COS_SECRET_ID=your_cos_secret_id # 腾讯云COS的密钥 # COS_SECRET_KEY=your_cos_secret_key # 腾讯云COS的区域,例如 ap-guangzhou # COS_REGION=your_cos_region # 腾讯云COS的桶名称 # COS_BUCKET_NAME=your_cos_bucket_name # 腾讯云COS的应用ID # COS_APP_ID=your_cos_app_id # 腾讯云COS的路径前缀,用于存储文件 # COS_PATH_PREFIX=your_cos_path_prefix # COS_ENABLE_OLD_DOMAIN=true 表示启用旧的域名格式,默认为 true COS_ENABLE_OLD_DOMAIN=true # 如果使用火山引擎TOS作为文件存储,需要配置以下参数 # 火山引擎TOS的访问端点,例如 https://tos-cn-beijing.volces.com # TOS_ENDPOINT=https://tos-cn-beijing.volces.com # 火山引擎TOS的区域,例如 cn-beijing # TOS_REGION=cn-beijing # 火山引擎TOS访问密钥 Access Key # TOS_ACCESS_KEY=your_tos_access_key # 火山引擎TOS访问密钥 Secret Key # TOS_SECRET_KEY=your_tos_secret_key # 火山引擎TOS桶名称 # TOS_BUCKET_NAME=your_tos_bucket_name # 火山引擎TOS可选路径前缀(可选) # TOS_PATH_PREFIX=your_tos_path_prefix # 火山引擎TOS临时桶名称(可选,用于存放自动过期临时文件) # TOS_TEMP_BUCKET_NAME=your_tos_temp_bucket_name # 火山引擎TOS临时桶区域(可选,默认与主桶相同) # TOS_TEMP_REGION=your_tos_temp_region # 如果使用AWS S3作为文件存储,需要配置以下参数 # AWS S3的访问端点,例如 https://s3.amazonaws.com # S3_ENDPOINT=https://s3.amazonaws.com # AWS S3的区域,例如 us-east-1 # S3_REGION=us-east-1 # AWS S3访问密钥 Access Key # S3_ACCESS_KEY=your_s3_access_key # AWS S3访问密钥 Secret Key # S3_SECRET_KEY=your_s3_secret_key # AWS S3桶名称 # S3_BUCKET_NAME=your_s3_bucket_name # AWS S3可选路径前缀(可选) # S3_PATH_PREFIX=your_s3_path_prefix # 如果使用华为云OBS作为文件存储,需要配置以下参数 # 华为云OBS的访问端点,例如 obs.cn-north-4.myhuaweicloud.com # OBS_ENDPOINT=obs.cn-north-4.myhuaweicloud.com # 华为云OBS的区域,默认 cn-north-4 # OBS_REGION=cn-north-4 # 华为云OBS访问密钥 Access Key # OBS_ACCESS_KEY=your_obs_access_key # 华为云OBS访问密钥 Secret Key # OBS_SECRET_KEY=your_obs_secret_key # 华为云OBS桶名称 # OBS_BUCKET_NAME=your_obs_bucket_name # 华为云OBS可选路径前缀(可选) # OBS_PATH_PREFIX=weknora/ # 华云OBS代理域名(可选,优先级最高) # OBS_PROXY_DOMAIN=https://your-domain.com/obs # 如果解析网络连接使用Web代理,需要配置以下参数 # WEB_PROXY=your_web_proxy # Neo4j 开关 # NEO4J_ENABLE=false # Neo4j的访问地址 # NEO4J_URI=neo4j://neo4j:7687 # Neo4j的用户名和密码 # NEO4J_USERNAME=neo4j # Neo4j的密码 # NEO4J_PASSWORD=password # ========== 文件上传大小限制 ========== # 统一的文件大小限制(MB),默认为 50MB。 # 影响:单文件上传、docreader gRPC 消息大小、frontend Nginx 请求体大小、 # 前端浏览器侧的客户端校验。 # # 这是部署期配置:四个层(Go 后端 / Nginx / docreader / 浏览器 bundle) # 都在容器启动时读取一次,运行中改 env 不会生效。修改后必须同步重启 # 这四层。曾经尝试做成 system_settings 运行时项,但 Nginx / # docreader / 浏览器 bundle 不会随之 reload,结果是 UI 改了 200 但 # Nginx 仍按旧值在 50 处直接 413,所以撤回了 UI 入口(见 # internal/utils/filesize.go 注释)。 # MAX_FILE_SIZE_MB=50 # ========== Agent Skills Sandbox 配置 ========== # Sandbox 模式: docker(默认), local, disabled WEKNORA_SANDBOX_MODE=docker # 脚本执行超时时间(秒),默认60 WEKNORA_SANDBOX_TIMEOUT=60 # ========== Agent 配置 ========== # 智能体大模型调用默认超时时间(秒),默认 120 # 对于复杂的推理行为,建议调大此值(如 300 或 600) # 注:此值为全局默认值。若单个智能体在数据库中配置了独立的 llm_call_timeout,则以智能体配置为准(优先级更高)。 # WEKNORA_AGENT_LLM_TIMEOUT=300 # MCP 工具人工审核等待超时(秒)(可选) # 当某个 MCP 工具被标记为「需人工审核」后,Agent 会暂停并等待用户确认; # 该值控制最长等待时间,超时视为拒绝。默认 600(10 分钟)。 # 也支持 Go duration 写法(如 30s / 5m / 1h)。 # WEKNORA_AGENT_TOOL_APPROVAL_TIMEOUT=600 # ========== Tenant / RBAC 配置 ========== # 启用租户级 RBAC(基于 tenant_members 表的角色强制鉴权)。 # - true(默认):开启后,无 active membership 或角色不足的请求会被 403 拒绝 # - false:观察模式,记录但不拦截,仅用于上线初期审计角色分配的灰度窗口 # 详细灰度方案见 docs/RBAC说明.md。 # 注意:开发环境用 Air 热重载时,修改本变量需重启 dev 脚本(仅源代码变更才重读 .env)。 # WEKNORA_TENANT_ENABLE_RBAC=true # 启动时自动把指定 email 的用户提升为系统管理员(SystemAdmin)。 # - 该用户必须已经注册过;如果尚未注册,启动只会 warn 一行,下次重启会重试 # - 操作幂等:已是系统管理员的用户重复 bootstrap 是 no-op # - 仅 PROMOTE,从不 DEMOTE:在 UI 上手动撤销后,下次重启不会被覆盖 # - 适用于 docker-compose / k8s 部署的初次自举;后续的提权/撤销请走 SystemAdmin 管理页 # WEKNORA_BOOTSTRAP_SYSTEM_ADMIN_EMAIL= # 单个非超管用户可自助创建(成为 Owner)的租户数上限。 # 仅统计 Owner 角色——被邀请为 Admin/Editor/Viewer 的不计入。 # 拥有 CanAccessAllTenants 的超管不受此限制。 # > 0 :启用该值作为硬上限;超出返回 429 # = 0 :使用 handler 默认值 # < 0 :彻底关闭限额(不建议在共享部署中使用) # WEKNORA_TENANT_MAX_OWNED_PER_USER= # APK 镜像源设置(可选) APK_MIRROR_ARG=mirrors.tencent.com # 如果使用Milvus作为向量存储,需要配置以下参数 # Milvus服务地址 # MILVUS_ADDRESS=milvus:19530 # Milvus集合名称,用于存储向量数据 # MILVUS_COLLECTION=weknora_embeddings # Milvus向量搜索度量类型,支持 IP(默认)、COSINE、L2 # 注意:修改度量类型后需要重建collection才能生效 # MILVUS_METRIC_TYPE=IP # Milvus 用户名(可选) # MILVUS_USERNAME=your_milvus_username # Milvus 密码(可选) # MILVUS_PASSWORD=your_milvus_password # Milvus 数据库名称(可选) # MILVUS_DB_NAME=your_milvus_db_name # Docreader 地址 DOCREADER_ADDR=docreader:50051 # Docreader 连接方式 DOCREADER_TRANSPORT=grpc # gRPC TLS 配置(可选) # GRPC_TLS_ENABLED=false # GRPC_TLS_CERT=/path/to/server.crt # server: 必填;client: mTLS 时填 # GRPC_TLS_KEY=/path/to/server.key # 同上 # GRPC_TLS_CA=/path/to/ca.crt # client: 校验 server 证书用;server: mTLS 时签发客户端证书的 CA # GRPC_TLS_SERVER_NAME= # 可选;当 DOCREADER_ADDR 用 IP/与证书 CN 不一致时设为证书的 hostname # GRPC_MTLS_REQUIRE_CLIENT_CERT=false # server 端:true 时强制要求客户端证书(mTLS) # gRPC 认证 Token(可选,客户端和服务端需配置相同的值) # 注意:启用 GRPC_AUTH_TOKEN 时强烈建议同时启用 TLS,否则 token 会以明文随 # 每次 RPC 在网络上传输。当 GRPC_TLS_ENABLED=true 时客户端会拒绝在不安全 # 的连接上发送 token。 # GRPC_AUTH_TOKEN=your-secret-token-at-least-16-bytes # Docreader 中 DOCX 解析的最大页数,默认 0(不限制) # 设为正整数(如 500)可限制超大 Word 文档的解析开销;超过页数的内容将不会继续解析 # DOCREADER_DOCX_MAX_PAGES=0 # Docreader 重型解析器并发控制,适合限制多 PDF/OCR 同时导入时的资源占用 # 设为 0 可关闭对应限流;默认 1 更适合普通单机或 GPU 资源有限的部署 # DOCREADER_MARKITDOWN_MAX_WORKERS=1 # DOCREADER_PDF_RENDER_MAX_WORKERS=1 # 单个 PDF 内部「扫描页渲染」的并行进程数。pdfium 非线程安全,故按进程并行, # 每个进程各自打开文档渲染分到的页。大体量扫描件串行渲染在 CPU 受限容器上可能 # 耗时数小时,这是缩短该耗时的主要手段(实测 874 页 117s→30s/4 进程,→17s/8 进程)。 # 默认随 CPU 核数自动取 min(4, cpu)。注意:容器需分配足够 CPU 才能吃到加速。 # DOCREADER_PDF_RENDER_PARALLELISM=4 # DOCREADER_PDF_RENDER_DPI=200 # DOCREADER_PDF_JPEG_QUALITY=85 # 渲染页图的最大长边像素(防止超大页面 PDF 渲染出 100+MP 图、撑爆 gRPC 消息上限) # 调小可进一步减小图片体积;过小会影响 OCR 识别(密集中文建议 >=1600) # DOCREADER_PDF_RENDER_MAX_EDGE=2000 # Layout text: insert spaces when glyph gaps exceed this × median char width (default 0.4). # DOCREADER_PDF_WORD_GAP_WIDTH_RATIO=0.4 # Native PDF layout: drop narrow margin columns (arXiv sidebar) below this page-width ratio (default 0.12). # DOCREADER_PDF_MARGIN_COL_WIDTH_RATIO=0.12 # DOCREADER_PDF_MIN_HEADING_LINE_CHARS=8 # Remove U+FFFE/soft-hyphen artifacts; strip vector chart axis text; render chart areas as JPEG. # DOCREADER_PDF_SANITIZE_TEXT=true # DOCREADER_PDF_STRIP_CHART_DEBRIS=true # DOCREADER_PDF_RENDER_VECTOR_FIGURES=true # 强制 PDF 全页按扫描件解析。适合文本层质量很差、但页面可 OCR 的 PDF。 # 开启后所有 PDF 页都会渲染成图片再走 OCR/VLM,速度和模型调用成本会上升。 # DOCREADER_PDF_FORCE_SCANNED=false # OpenDataLoader PDF(知识库 parser_engine_rules 指定 engine: opendataloader) # 需 Java 11+;docreader 镜像已包含 openjdk-17-jre-headless。 # DOCREADER_ODL_MAX_WORKERS=1 # fast 模式(默认):DOCREADER_ODL_HYBRID=off # hybrid 需另起服务;镜像/模型较大,默认 pull/up 与 --full 均不含 odl-hybrid。 # 默认 --no-ocr(不做 EasyOCR)。 # 开发:make dev-start DEV_ARGS=--odl-hybrid(本地 build) # 生产/docker-compose.yml(需 DOCREADER_ODL_HYBRID=docling-fast 等): # docker compose --profile odl-hybrid up -d --build odl-hybrid # 该镜像未发布到 Docker Hub(本地 tag: weknora-odl-hybrid:local),make pull-images 不会拉取,只能按需 build。 # 修改 Dockerfile.odl-hybrid 后需重建:docker compose --profile odl-hybrid build --no-cache odl-hybrid # ODL_HYBRID_EXTRA_ARGS=--no-ocr # 扫描件不要用 hybrid OCR,请用 builtin 扫描渲染 + Go OCR,或 MinerU;若坚持 hybrid OCR: # ODL_HYBRID_EXTRA_ARGS=--force-ocr # DOCREADER_ODL_HYBRID=docling-fast # DOCREADER_ODL_HYBRID_URL=http://odl-hybrid:5002 # 开发环境 hybrid:make dev-start DEV_ARGS=--odl-hybrid # 仅用 fast 模式(不需 odl-hybrid 容器)时请保持 DOCREADER_ODL_HYBRID=off。 # ODL_HYBRID_PORT=5002 # ODL_HYBRID_STARTUP_WAIT_SEC=180 # DOCREADER_ODL_HYBRID_MODE=auto # DOCREADER_ODL_HYBRID_FALLBACK=false # DOCREADER_ODL_MARKDOWN_WITH_HTML=false # VLM(视觉模型)单次 HTTP 请求的整体超时时间(秒)。 # 扫描件整页 OCR(全文+版式抽取)在慢端点上很容易超过默认值, # 出现 "context deadline exceeded (Client.Timeout exceeded while awaiting headers)" 时调大本值。 # 默认 180。 # VLM_HTTP_TIMEOUT_SECONDS=180 # 如果使用Weaviate作为向量存储,需要配置以下参数 # 注意:容器内访问请使用 service:port(不要用 localhost,也不要用宿主机映射端口) # Weaviate HTTP 地址(Docker 内:weaviate:8080;宿主机访问:localhost:9035) # WEAVIATE_HOST=weaviate:8080 # Weaviate gRPC 地址(Docker 内:weaviate:50051;宿主机访问:localhost:50052) # WEAVIATE_GRPC_ADDRESS=weaviate:50051 # 保留原始 URL 的图片域名白名单(可选,逗号分隔) # 配置后,这些域名的图片仍会被下载和分析(OCR/字幕),但 markdown 中保留原始 URL, # 不会被替换为对象存储的 provider:// URL。适用于内部稳定服务(如自建 MinerU)。 # IMAGE_HOST_KEEP_URL=mineru.internal.example.com # Weaviate 架构模式 # WEAVIATE_SCHEME=http # 是否开启认证(如果你在 weaviate 里启用了 APIKey/OIDC 认证,再把这里设为 true 并配置 WEAVIATE_API_KEY) # WEAVIATE_AUTH_ENABLED=false # API Key(可选) # WEAVIATE_API_KEY=your_secret_key # Weaviate 数据库名称(可选) #WEAVIATE_COLLECTION=your_weaviate_db_name # 如果使用 Apache Doris 4.1+ 作为向量存储,需要配置以下参数 # Doris FE 的 MySQL 协议地址(host:port)。容器内推荐用服务名 doris-fe:9030。 # DORIS_ADDR=doris-fe:9030 # Doris FE 的 HTTP 端口,用于 Stream Load 批量字段更新(partial update)。 # DORIS_HTTP_PORT=8030 # Doris 目标数据库名(建库语句:CREATE DATABASE weknora;) # DORIS_DATABASE=weknora # Doris 用户名(默认 root) # DORIS_USERNAME=root # Doris 密码(默认空) # DORIS_PASSWORD= # Doris 表前缀,对应每维度的物理表 _ # DORIS_TABLE_PREFIX=weknora_embeddings # Doris compatibility mode: auto (probe server), legacy (cosine_distance), or inner_product_duplicate (inner_product); NOT interchangeable after tables are created. # DORIS_COMPAT_MODE= # Tavily Search API Key(可选,启用 Tavily 网页搜索提供者) # TAVILY_API_KEY=tvly-your_tavily_api_key # ----- OIDC Auth ----- # 如果需要启用OIDC登录,设为true并填写后续字段 # OIDC_AUTH_ENABLE=false # (Optional) 用于OIDC自动发现端点配置 # OIDC_AUTH_ISSUER_URL=http://127.0.0.1:5556/dex # OIDC_AUTH_DISCOVERY_URL=http://127.0.0.1:5556/dex/.well-known/openid-configuration # OIDC_AUTH_PROVIDER_DISPLAY_NAME=OIDC # OIDC_AUTH_CLIENT_ID=client_id_for_oidc_client # OIDC_AUTH_CLIENT_SECRET=secret_for_oidc_client # (Optional) OIDC 端点配置, 如果上面的OIDC_AUTH_DISCOVERY_URL填过了,下面的这些可以留空 # OIDC_AUTH_AUTHORIZATION_ENDPOINT=http://127.0.0.1:5556/dex/auth # OIDC_AUTH_TOKEN_ENDPOINT=http://127.0.0.1:5556/dex/token # OIDC_AUTH_USER_INFO_ENDPOINT=http://127.0.0.1:5556/dex/userinfo # OIDC_AUTH_SCOPES="openid profile email" # 用于OIDC用于信息中提取用户数据 # OIDC_USER_INFO_MAPPING_USER_NAME=name # OIDC_USER_INFO_MAPPING_EMAIL=email # Document processing task timeout. Large files may need more than Asynq's default 30m. # WEKNORA_DOCUMENT_PROCESS_TIMEOUT=2h # --- Async pipeline tuning (optional) ----------------------------------------- # Worker pool size for the asynq server. Default 32 — raise it on machines # that handle many concurrent uploads (default Go runtime.NumCPU() under- # provisions for the I/O-bound document pipeline). Can also be set in the # management UI under Settings → System settings (asynq.concurrency); # UI changes require a process restart. # WEKNORA_ASYNQ_CONCURRENCY=32 # Read/write timeout (in milliseconds) the asynq client uses against Redis. # Default 500ms (writes scale to 1000ms). Bump if you see "i/o timeout" # errors during heavy multimodal counter DECRs or large batch uploads. # WEKNORA_REDIS_OP_TIMEOUT_MS=500 # Maximum wall time for a single DocReader call. Caps a hung docreader # (network partition, OCR runaway) so it cannot pin a worker for hours. # Default 30m. Must be shorter than WEKNORA_DOCUMENT_PROCESS_TIMEOUT. # WEKNORA_DOCREADER_CALL_TIMEOUT=30m # Background sweep that recovers knowledge stuck in "processing" past # DocumentProcessTimeout + 10m. Set to "false" to opt out (not recommended). # WEKNORA_HOUSEKEEPING_ENABLED=true