Skip to content

Подробная конфигурация ​

Конфигурация aihelpme.ru состоит из четырёх слоёв, приоритет — от низкого к высокому:

СлойРасположениеНазначение
Основной файл конфигурацииconfig/config.yamlСтруктурированные значения по умолчанию, поставляются вместе с образом
Шаблоны / пресетыconfig/prompt_templates/*.yaml, builtin_agents.yaml, agent_type_presets.yaml, builtin_models.yaml, models.jsonНаложение промптов, встроенных Agent, встроенных моделей и каталога провайдеров моделей
Переменные окружения.env / окружение контейнераПереопределение уровня развёртывания; после изменения нужен перезапуск
Системные настройки времени выполнениятаблица system_settings в базе данных, интерфейс — «Настройки → Система»Поддерживаемые настройки можно менять на лету; они приоритетнее переменных окружения, большинство применяется сразу

Режим регистрации, политики и квоты пространств, белый список SSRF, параллелизм задач и пределы параллелизма моделей поддерживают настройку во время выполнения. После изменения в консоли значения в базе данных приоритетнее переменных окружения; только сброс настройки (DELETE /api/v1/system/admin/settings/:key) возвращает использование переменных окружения или встроенных значений по умолчанию. Если переменная окружения не действует, сначала проверьте, нет ли для неё настройки времени выполнения. Полный список настроек — в разделе Управление платформой и системный администратор.

Структура основной конфигурации определена в internal/config/config.go. Ниже описаны значения и условия применения каждой настройки и переменной окружения.

Механизм загрузки конфигурации ​

Порядок работы LoadConfig() из internal/config/config.go:

  1. viper последовательно ищет config.yaml: текущий каталог → ./config → $HOME/.appname → /etc/appname/;
  2. подстановка переменных окружения: содержимое файла обрабатывается регулярным выражением, ${ENV_VAR} заменяется значением одноимённой переменной окружения; если переменная не задана, литерал ${ENV_VAR} остаётся как есть (так проще заметить ошибку конфигурации);
  3. у viper включён AutomaticEnv(), а разделитель ключей . отображается на _ (то есть server.port можно переопределить переменной окружения SERVER_PORT);
  4. из config/prompt_templates/*.yaml загружаются шаблоны промптов и по полю xxx_prompt_id заполняются обратно в конфигурацию conversation (backfillConversationDefaults);
  5. загружаются builtin_agents.yaml (встроенные Agent) и agent_type_presets.yaml (пресеты типов Agent), разрешаются ссылки system_prompt_id;
  6. применяются переопределения из переменных окружения (группы OIDC, Agent, KnowledgeBase, Auth/Tenant, Audit) и выполняется проверка ValidateConfig.

Разбор config/config.yaml по секциям ​

server (ServerConfig) ​

ИмяТипЗначение по умолчаниюОписание
server.portint8080Порт прослушивания HTTP, допустимый диапазон 1–65535
server.hoststring"0.0.0.0"Адрес прослушивания
server.log_pathstringпустоПуть к файлу журнала (можно также задать переменной окружения LOG_PATH)
server.shutdown_timeoutduration30sОбщий бюджет корректной остановки. Общий для дренажа соединений и очистки ресурсов; по умолчанию 5s оставляется на очистку

conversation (ConversationConfig) — конвейер поиска и ответов ​

ИмяТипЗначение по умолчанию (config.yaml)Описание
max_roundsint5Сколько раундов истории переносится в контекст
keyword_thresholdfloat0.3Минимальный балл поиска по ключевым словам
embedding_top_kint30Число возвращаемых результатов векторного поиска (>=0)
vector_thresholdfloat0.2Порог схожести векторов (0–1)
rerank_top_kint30Число, оставляемое после переранжирования
rerank_thresholdfloat0.3Минимальный балл переранжирования (-10–10)
fallback_strategystring"model"Стратегия при пустой выборке: model (отдать на откуп модели) или фиксированный ответ
fallback_responsestring"Sorry, I am unable to answer this question."Текст фиксированного ответа
enable_rewritebooltrueРазрешение местоимений в многораундовом диалоге / переписывание запроса
enable_query_expansionbooltrueРасширение запроса
enable_rerankbooltrueВключить Rerank
fallback_prompt_idstring"default_fallback_prompt"ID шаблона промпта запасного ответа (prompt_templates/fallback.yaml, mode:"model")
rewrite_prompt_idstring"default_rewrite"ID шаблона переписывания (system-часть content + user-часть user)
generate_summary_prompt_idstring"default_summary"ID шаблона профиля документа (краткое резюме + gist/тема/тип/типичные вопросы, вывод JSON)
generate_kb_description_prompt_idstring"default_kb_description"ID шаблона описания базы знаний (на входе — агрегат профилей документов, а не их текст)
generate_session_title_prompt_idstring"default_session_title"ID шаблона генерации заголовка сессии
extract_entities_prompt_id / extract_relationships_prompt_idstring"default_extract_entities" / "default_extract_relationships"ID шаблонов извлечения графа (graph_extraction.yaml)
generate_questions_prompt_idstring"default_generate_questions"ID шаблона предварительной генерации вопросов

conversation.summary (SummaryConfig, параметры генерации ответа):

ИмяТипЗначение по умолчаниюОписание
max_input_charsint8192Максимальное число символов, передаваемых в LLM. Для профиля документа достаточно начала, чтобы определить тему, 8k хватает; старые значения 16384/24576 кратно увеличивают стоимость резюме каждого документа
temperaturefloat0.3Температура генерации
repeat_penaltyfloat1.0Штраф за повтор
max_completion_tokensint1024Максимум генерируемых токенов (все поля JSON-профиля короткие)
no_match_prefixstring thinking\n</think>\nNO_MATCHЕсли вывод модели начинается с этого префикса, он считается «промахом» и запускает fallback
prompt_idstring"default_kb"ID шаблона системного промпта (system_prompt.yaml)
context_template_idstring"default_context"ID шаблона сборки контекста (context_template.yaml)
max_tokens / top_k / top_p / frequency_penalty / presence_penalty / seed / thinkingразныене заданыДополнительные параметры сэмплинга, передаваемые модели; thinking имеет тип *bool и управляет режимом рассуждения

knowledge_base (KnowledgeBaseConfig) — глобальные блоки по умолчанию ​

ИмяТипЗначение по умолчаниюОписание
chunk_sizeint512Размер блока по умолчанию (>0 и > overlap)
chunk_overlapint50Перекрытие блоков
split_markers[]string["\n\n", "\n", "。"]Маркеры разделения
keep_separatorboolfalseСохранять разделители
document_process_timeoutduration2hОбщий тайм-аут задачи обработки одного документа (переопределяется env WEKNORA_DOCUMENT_PROCESS_TIMEOUT)
docreader_call_timeoutduration30mТайм-аут одного RPC DocReader (env WEKNORA_DOCREADER_CALL_TIMEOUT), должен быть меньше предыдущей величины
image_processing.enable_multimodalbooltrueВключать мультимодальную обработку изображений при загрузке (OCR/Caption)

ChunkingConfig каждой базы знаний переопределяет эти глобальные значения по умолчанию.

extract (ExtractManagerConfig) — шаблоны извлечения графа знаний ​

extract.extract_graph / extract.extract_entity / extract.fabri_text задают пояснительный текст извлечения графа (description), разрешённые метки отношений (tags, по умолчанию Author, Alias) и примеры few-shot (examples: text + node + relation). «Пробное извлечение / генерация примера текста» в мастере инициализации использует эти конфигурации (%s в fabri_text.with_tag / with_no_tag заменяется списком меток).

tenant (TenantConfig) ​

ИмяТипЗначение по умолчаниюОписание
enable_cross_tenant_accessboolfalseРазрешить пользователям с CanAccessAllTenants доступ между пространствами (можно включить во внутренней сети)
enable_rbac*booltrueОбязательная проверка ролей пространства; явное false включает «серый» режим: проверки ролей внутри пространства только логируются, не блокируют, а доступ между пространствами по-прежнему блокируется (env WEKNORA_TENANT_ENABLE_RBAC)
max_owned_per_userint0 (используется значение handler по умолчанию)Верхняя граница числа пространств, которые не-супер-админ может создать сам; <0 отключает ограничение (env WEKNORA_TENANT_MAX_OWNED_PER_USER)
self_service_creation_enabled*booltrueМожет ли обычный пользователь создавать собственные пространства (env WEKNORA_TENANT_SELF_SERVICE_CREATION_ENABLED)
default_session_name / default_session_title / default_session_descriptionstringпустоТекст по умолчанию для новой сессии

Секции, поддерживаемые структурой, но не записанные в файл по умолчанию ​

Приведённые ниже секции присутствуют в структуре Config и могут быть при необходимости добавлены в config.yaml (для большинства есть и вход через переменные окружения):

СекцияСтруктураКлючевые поля и значения по умолчанию
authAuthConfigregistration_mode: self_serve (по умолчанию, открытая регистрация) / invite_register (только по приглашениям) / invite_only (регистрация запрещена, используется при DISABLE_REGISTRATION=true); default_tenant_mode: create_personal (по умолчанию) / tenantless
auditAuditConfigretention_days: число дней хранения журнала аудита, при опущенной секции — 90; 0 отключает очистку; <0 вызывает ошибку проверки (env WEKNORA_AUDIT_RETENTION_DAYS)
oidc_authOIDCAuthConfigenable, issuer_url, jwks_uri, discovery_url (по умолчанию из issuer собирается /.well-known/openid-configuration), client_id, client_secret, authorization_endpoint, token_endpoint, user_info_endpoint, scopes (по умолчанию openid profile email), user_info_mapping.username (по умолчанию name) / email (по умолчанию email); всё переопределяется переменными окружения OIDC_AUTH_*
agentAgentConfigllm_call_timeout: тайм-аут одного вызова LLM в секундах (по умолчанию 120, env WEKNORA_AGENT_LLM_TIMEOUT); tool_approval_timeout_seconds: ожидание ручного подтверждения инструмента MCP (по умолчанию 600, env WEKNORA_AGENT_TOOL_APPROVAL_TIMEOUT)
imIMConfigПараллелизм QA каналов IM: workers (5), global_max_workers (0 = без ограничения, нужен Redis), max_queue_size (50), max_per_user (3), rate_limit_window (60s), rate_limit_max (10)
docreaderDocReaderConfigaddr (адрес gRPC, например docreader:50051, либо base URL HTTP), transport: grpc (по умолчанию) / http; обычно используются env DOCREADER_ADDR / DOCREADER_TRANSPORT
vector_databaseVectorDatabaseConfigdriver (обычно используется env RETRIEVE_DRIVER)
stream_managerStreamManagerConfigtype: memory / redis; redis.address/username/password/db/prefix/ttl; cleanup_timeout (обычно используются env STREAM_MANAGER_TYPE, REDIS_*)
web_searchWebSearchConfigtimeout: тайм-аут веб-поиска в секундах
models[]ModelConfigУстаревший статический список моделей (type/source/model_name/parameters); сейчас рекомендуется использовать builtin_models.yaml или настройку в интерфейсе
frontend_base_urlstringпусто

Важные переменные окружения ​

Приведённые ниже переменные берутся из секции environment app/docreader в docker-compose.yml, из .env.example и из os.Getenv в коде. В продакшн-развёртывании минимум нужно изменить: DB_USER/DB_PASSWORD/DB_NAME, REDIS_PASSWORD, JWT_SECRET, SYSTEM_AES_KEY.

Основы времени выполнения ​

ИмяЗначение по умолчаниюОписание
GIN_MODEreleasedebug — режим разработки (включает Swagger) / release — продакшн
LOG_LEVEL / LOG_PATH / LOG_FORMATdebug / пусто / пустоУровень логирования, путь к файлу (пусто — только stdout), пользовательский формат
LLM_DEBUG_LOGfalseПри true пишет llm_debug.log в тот же каталог, что LOG_PATH
TZAsia/ShanghaiЧасовой пояс
DEFAULT_LOCALEпустоЯзык интерфейса фронтенда по умолчанию (читает контейнер frontend): zh-CN / en-US / ru-RU / ko-KR / ja-JP, недопустимые значения игнорируются. Влияет только на пользователей, которые вручную не меняли язык; приоритет: выбранный пользователем язык > эта переменная > zh-CN; после изменения достаточно перезапустить контейнер frontend, пересобирать образ не нужно
WEKNORA_LANGUAGEпустоЯзык обработки документов (генерация вопросов/резюме). Приоритет: эта переменная > Accept-Language запроса > встроенный zh-CN. Язык обработки документов можно задавать независимо от языка интерфейса, например обрабатывать корейские документы при английском интерфейсе. Каналы IM без заданного языка ответа тоже используют эту переменную (при отсутствии — zh-CN) как язык ответа по умолчанию
AUTO_MIGRATEtrueАвтоматически выполнять миграции базы данных при запуске
AUTO_RECOVER_DIRTYtrueАвтоматически исправлять состояние dirty в golang-migrate (оставшееся от прерванной миграции). При ручной диагностике проблем миграций следует временно установить false, иначе при запуске записи о версии миграции будут автоматически перезаписаны, см. База данных и миграции
WEKNORA_TRUSTED_PROXIESпустоДоверенные прокси gin в CIDR (через запятую)
MAX_SKILL_BUNDLE_SIZE_MB256 MiB (по умолчанию не меньше MAX_FILE_SIZE_MB, верхний предел 512 MiB)Ограничение загрузки ZIP-навыка и скачивания из источника; лимит тела запроса обратного прокси тоже должен быть достаточным
MAX_FILE_SIZE_MB50Ограничение размера загружаемого файла (общее для app/frontend/docreader); в развёртывании Helm используется global.maxFileSizeMB
CONCURRENCY_POOL_SIZE5Общий пул параллелизма
APP_EXTERNAL_URL / FRONTEND_BASE_URLпустоВнешне доступный URL для внешних ссылок на изображения/файлы каналов IM / внешний origin фронтенда
RESOURCE_URL_MODEhandleФорма ссылок на файлы в ответах API по умолчанию: handle возвращает внутренний resource://, public — загружаемую временную внешнюю ссылку. Для отдельного запроса можно переопределить через ?resource_urls=, подробнее — Обзор API

APP_EXTERNAL_URL влияет на то, сможет ли канал IM отображать изображения из базы знаний. Платформе IM нужен публичный http(s) URL; есть два варианта:

  1. сам бэкенд хранилища публично доступен (для объектного хранилища — публичный endpoint, либо задайте MINIO_ENDPOINT как публичный host); тогда resource:// откатывается к предподписанному URL бэкенда и эта переменная не нужна;
  2. задать APP_EXTERNAL_URL: изображения resource:// переписываются в <APP_EXTERNAL_URL>/r/<token> и идут через саму платформу (нужен прокси nginx для /r/, в официальном образе фронтенда этот location уже есть).

Стандартное внутреннее развёртывание MinIO и бэкенд local могут использовать только второй вариант. Если канал IM включён, а эта переменная пуста, при запуске сервис один раз выводит WARN; если результат переписывания не является http(s) URL, исходная ссылка сохраняется и записывается действенное предупреждение, а не отправляется ссылка, недоступная на стороне IM.

Четыре формы URL и их получение по каждому каналу — в разделе Внешний доступ к изображениям и файлам.

База данных и очереди ​

ИмяЗначение по умолчаниюОписание
DB_DRIVERpostgrespostgres / sqlite (Lite)
DB_HOST / DB_PORT / DB_USER / DB_PASSWORD / DB_NAMEpostgres / 5432 / пусто / пусто / пустоПодключение к PostgreSQL (обязательно)
DB_PATH—Путь к файлу базы данных при DB_DRIVER=sqlite
STREAM_MANAGER_TYPEпусто (в compose фактически используется redis)redis / memory
REDIS_ADDR / REDIS_USERNAME / REDIS_PASSWORD / REDIS_DB / REDIS_PREFIXredis:6379 / …Подключение к Redis
REDIS_USE_TLSfalseОбщий переключатель TLS; нужен для управляемого Redis (например, AWS ElastiCache); REDIS_TLS_SERVER_NAME задаёт имя сервера для проверки и SNI (полезно, когда адрес — IP), REDIS_TLS_INSECURE_SKIP_VERIFY пропускает проверку сертификата (небезопасно, только для сред разработки с самоподписанными сертификатами)
WEKNORA_REDIS_NAMESPACEпустоСуффикс пространства имён каналов при общем Redis для нескольких развёртываний
WEKNORA_ASYNQ_CORE_CONCURRENCY и др.8 / 2 / 12 / 4 / 6Параллелизм очередей Asynq (core/postprocess/enrichment/maintenance/shared), дополнительно WEKNORA_WIKI_ASYNQ_CONCURRENCY=8, WEKNORA_MODEL_MAX_CONCURRENCY=32

Поисковые движки и векторные базы ​

ИмяЗначение по умолчаниюОписание
RETRIEVE_DRIVERpostgresПоисковый движок: postgres / elasticsearch_v7 / elasticsearch_v8 / qdrant / milvus / weaviate / opensearch / doris / tencent_vectordb / sqlite (Lite); можно указать несколько через запятую для параллельной работы
ELASTICSEARCH_ADDR/USERNAME/PASSWORD/INDEXпустоElasticsearch
QDRANT_HOST/PORT/COLLECTION/API_KEY/USE_TLSqdrant / 6334 / weknora_embeddings / пусто / falseQdrant
MILVUS_ADDRESS/COLLECTION/METRIC_TYPE/...milvus:19530 / weknora_embeddings / IPMilvus
OPENSEARCH_ADDR/USERNAME/PASSWORD/INDEX/INSECURE_SKIP_VERIFYпустоOpenSearch
WEAVIATE_HOST/GRPC_ADDRESS/SCHEME/AUTH_ENABLED/API_KEYпустоWeaviate
DORIS_ADDR/HTTP_PORT/DATABASE/USERNAME/PASSWORD/TABLE_PREFIX/COMPAT_MODEпустоApache Doris 4.1+
TENCENT_VECTORDB_ADDR/USERNAME/API_KEY/DATABASE/COLLECTION/REPLICA_NUMBERпустоVectorDB
MULTI_STORE_RETRIEVE_TIMEOUT_SECпустоТайм-аут параллельного поиска по нескольким движкам
NEO4J_ENABLE / NEO4J_URI / NEO4J_USERNAME / NEO4J_PASSWORDпусто / bolt://neo4j:7687 / neo4j / passwordЕдинственный переключатель графа знаний (ENABLE_GRAPH_RAG устарел с v0.1.6)

Файловое хранилище ​

ИмяЗначение по умолчаниюОписание
STORAGE_TYPElocallocal / minio / cos / tos / s3 / obs / oss
STORAGE_ALLOW_LISTпустоБелый список типов хранилища, доступных пользователю (через запятую); допустимые значения local, minio, cos, tos, s3, oss, ks3, obs
LOCAL_STORAGE_BASE_DIR/data/filesКорневой каталог локального хранилища
MINIO_ENDPOINT/ACCESS_KEY_ID/SECRET_ACCESS_KEY/BUCKET_NAME/USE_SSLminio:9000 / minioadmin / minioadmin / пусто / falseMinIO
COS_SECRET_ID/SECRET_KEY/REGION/BUCKET_NAME/APP_ID/PATH_PREFIXпустоCOS (дополнительно TEMP_BUCKET/TEMP_REGION)
S3_* / OBS_* / OSS_* / TOS_*см. раздел B4 в .env.exampleAWS S3 / Huawei OBS / Alibaba OSS / Volcano TOS, все содержат ENDPOINT/REGION/KEY/BUCKET/PATH_PREFIX и др.

S3_ACCESS_KEY / S3_SECRET_KEY в AWS S3 можно оставить пустыми одновременно: тогда используется цепочка учётных данных AWS SDK по умолчанию, поддерживаются IAM Role EC2/ECS/EKS, IRSA/Web Identity, переменные окружения и общий файл конфигурации — при развёртывании в AWS не нужно класть долгоживущие ключи в переменные окружения. Оба значения должны быть заполнены или пусты одновременно. Если S3_ENDPOINT пуст, используется стандартный endpoint соответствующего Region.

Модели и инференс ​

ИмяЗначение по умолчаниюОписание
OLLAMA_BASE_URLhttp://host.docker.internal:11434Единственный адрес локального Ollama. Его совместно используют векторные и диалоговые модели с source=local; при отсутствии переменной процесс использует http://localhost:11434
OLLAMA_OPTIONALtrueПри недоступности Ollama только предупреждает и не блокирует запуск
BATCH_EMBED_SIZEпустоРазмер пакета embedding
VLM_HTTP_TIMEOUT_SECONDS180Тайм-аут одного запроса VLM
BUILTIN_MODELS_CONFIGconfig/builtin_models.yamlПуть к файлу объявлений встроенных моделей (см. ниже)
MODELS_CONFIGconfig/models.jsonПуть к файлу наложения каталога провайдеров моделей для развёртывания (дополнение провайдеров, переопределение адресов или параметров моделей); формат — в разделе Управление моделями
WEKNORA_LLM_STREAM_RAW_DUMP / _DIRпустоСырой дамп потока LLM (для диагностики)

Имя векторной модели не определяется переменной окружения. В записи модели задайте name для type=Embedding, source=local равным имени модели Ollama (в примере CLI nomic-embed-text, размерность 768; в быстром старте используется bge-m3, размерность 1024). Если имя пустое, локальный embedder откатывается к nomic-embed-text. EMBEDDING_MODEL_NAME действует только когда на него ссылается ${EMBEDDING_MODEL_NAME} в builtin_models.yaml (см. ниже раздел «config/builtin_models.yaml.example: декларативные встроенные модели» и файл config/builtin_models.yaml.example в репозитории). Отправная точка 8 ГБ из документации по установке не включает веса Ollama; Neo4j по умолчанию отключён (profile neo4j).

Аутентификация, тенанты и безопасность ​

ИмяЗначение по умолчаниюОписание
JWT_SECRETпустоКлюч подписи JWT (обязателен, можно сгенерировать openssl rand -hex 32). Если оставить пустым или использовать примерное значение, при каждом запуске генерируется случайный ключ, и после перезапуска вошедшим пользователям придётся войти снова; для нескольких реплик нужно задать одинаковое значение
SYSTEM_AES_KEYпустоМастер-ключ AES-256 для шифрования чувствительных полей на диске, обязательно 32 байта (можно сгенерировать openssl rand -hex 16); при потере зашифрованные данные (API Key тенанта, ключи моделей, учётные данные векторных баз и др.) восстановить нельзя, при обновлении используйте прежнее значение. Начиная с v0.4.0 заменяет TENANT_AES_KEY/CRYPTO_MASTER_KEY/CRYPTO_SALT
SYSTEM_SIGNING_KEYпусто (с откатом к SYSTEM_AES_KEY)Ключ подписи встроенных сессий и предподписанных ссылок на файлы (можно сгенерировать openssl rand -hex 32). Если не задан, используется SYSTEM_AES_KEY; если оба отсутствуют, короче 16 символов или являются примерными значениями, подписанные ссылки и встроенные сессии не выдаются. После смены уже выданные ссылки становятся недействительными; для нескольких реплик используйте одно значение
DISABLE_REGISTRATIONfalseПри true конфигурация при запуске использует invite_only (запрет регистрации по паролю, включая регистрацию по приглашению); сохранённая в базе данных настройка во время выполнения всё равно имеет приоритет
WEKNORA_AUTH_DEFAULT_TENANT_MODEcreate_personalПолитика создания пространства после регистрации (create_personal / tenantless)
WEKNORA_TENANT_ENABLE_RBAC(по умолчанию true)Переключатель обязательной проверки ролей пространства
WEKNORA_TENANT_ENABLE_CROSS_TENANT_ACCESSfalseДоступ между пространствами
WEKNORA_TENANT_SELF_SERVICE_CREATION_ENABLEDtrueСоздание собственных пространств обычными пользователями
WEKNORA_TENANT_MAX_OWNED_PER_USERпустоВерхний предел собственных пространств
WEKNORA_TENANT_AUTO_CREATE_API_KEYfalseАвтоматически выдавать API Key с full_access при создании пространства (совместимость со старым поведением)
WEKNORA_TENANT_DEFAULT_STORAGE_QUOTA_GB10Квота хранилища по умолчанию для нового пространства
WEKNORA_AUTH_COMPLEX_PASSWORD_ENABLEDfalseПолитика сложных паролей: заглавные и строчные буквы, цифры, специальные символы; системная настройка auth.complex_password_enabled имеет приоритет
WEKNORA_TENANT_AUTO_ACCEPT_INVITATIONfalseПриглашение по email: существующая учётная запись присоединяется сразу; системная настройка tenant.auto_accept_invitation имеет приоритет
OIDC_AUTH_JWKS_URIпустоНабор открытых ключей для проверки подписи id_token; может дополняться через discovery, проверяется вместе с issuer/audience/сроком действия
WEKNORA_INVITATION_TTL168hСрок действия ссылки-приглашения
WEKNORA_AUDIT_RETENTION_DAYS90Число дней хранения журнала аудита
WEKNORA_BOOTSTRAP_SYSTEM_ADMIN_EMAILпустоНазначение первого системного администратора. Пользователь не создаётся: этот email нужно сначала зарегистрировать самостоятельно; при следующем запуске, если в развёртывании ещё нет ни одного системного администратора, он будет назначен. После появления администратора переменная больше не действует. Подробнее — Тенанты, пользователи и аутентификация/авторизация
OIDC_AUTH_ENABLE и OIDC_AUTH_* / OIDC_USER_INFO_MAPPING_*false / пустоПолный набор настроек единого входа OIDC
SSRF_WHITELIST / SSRF_WHITELIST_EXTRAпусто / searxng,qdrant,milvus,weaviate,doris-fe,doris-be,minio (только app)Белый список SSRF для исходящих запросов. SSRF_WHITELIST общий для app и docreader; в compose значение по умолчанию задано только для SSRF_WHITELIST_EXTRA у app, а одноимённая переменная docreader по умолчанию пуста
SSRF_DNS_WHITELIST_ONLYfalseРазрешать исходящие только по белому списку (читают и app, и docreader). После включения хосты вне белого списка отклоняются до DNS-запроса, а прямые подключения по IP вне белого списка тоже отклоняются при проверке URL; домены сопоставляются только по имени, и CIDR в белом списке перестаёт действовать для доменов. Значение разбирается как булево (1/t/true — вкл., 0/f/false — выкл.), непустое неразбираемое значение считается включённым. Подготовка перед включением — ниже
IMAGE_HOST_KEEP_URLпустоБелый список доменов изображений, для которых сохраняется исходный URL

Перед включением SSRF_DNS_WHITELIST_ONLY ​

После включения белый список становится всей политикой исходящих запросов, поэтому нужно заранее внести все исходящие адреса в SSRF_WHITELIST или SSRF_WHITELIST_EXTRA. Если docreader тоже обращается к хостам внутри compose, добавьте их в общий для двух сервисов SSRF_WHITELIST (его SSRF_WHITELIST_EXTRA по умолчанию пуст). Обычно также нужно добавить:

  • адреса сервисов моделей (chat / embedding / rerank / VLM / ASR, включая localhost локального Ollama)
  • dex для входа OIDC (или домен вашего IdP), адреса сервисов MCP, docreader
  • объектное хранилище (внешние S3/COS/OSS и др.), внешние векторные базы, адрес Langfuse
  • адрес плоскости управления песочницы: после включения «разрешить частные endpoint» больше не обходит белый список

Пути исходящих запросов, которые всё ещё не покрыты, по убыванию влияния:

  1. Разрешение имён у gRPC-векторных баз во время выполнения: клиенты qdrant / milvus разрешают target собственным resolver'ом gRPC, и dialer получает уже готовый адрес, поэтому такие хосты проверяются по имени до создания клиента (конфигурация из переменных окружения — при запуске, конфигурация, сохранённая в консоли, — через проверку URL), а не перед каждым соединением.
  2. OTLP-экспортёр Langfuse имеет собственный HTTP-клиент и полностью обходит этот механизм. LANGFUSE_HOST по умолчанию указывает на адрес SaaS; при офлайн-развёртывании отключите трассировку или измените на внутренний адрес.
  3. HTTP(S)_PROXY: dialer пропускает хост прокси только если «адрес подключения и host из URL прокси полностью совпадают». При совпадении хост прокси разрешается и подключается, даже если его нет в белом списке; при несовпадении (например, в URL прокси не указан порт) он считается не в белом списке и отклоняется. При офлайн-развёртывании уберите прокси или внесите хост прокси в белый список.

Параметры сборки образов (при сборке из исходников) ​

Приведённые ниже переменные используются только при сборке образа frontend через docker compose build / make docker-build-frontend; при развёртывании из официального образа задавать их не нужно. Другие параметры сборки (прокси Go, зеркала apt и т. д.) — в разделе A1 файла .env.example.

ИмяЗначение по умолчаниюОписание
VITE_FRONTEND_COMMITunknownКороткий commit фронтенда, записывается на страницу «Системная информация». make docker-build-frontend и start_all.sh --no-pull заполняют его из git автоматически; при прямом docker compose build нужно экспортировать вручную
NPM_REGISTRYпусто (источник по умолчанию)npm registry на этапе сборки; при недоступности npmjs можно задать https://registry.npmmirror.com
NODE_MAX_OLD_SPACE_SIZE4096Верхний предел heap Node при сборке Vite (MB); при небольшой памяти Docker Desktop можно снизить до 2048

Разбор Docreader (контейнер docreader) ​

ИмяЗначение по умолчаниюОписание
DOCREADER_ADDR / DOCREADER_TRANSPORTdocreader:50051 / grpcАдрес и транспорт подключения со стороны app (grpc/http)
DOCREADER_GRPC_MAX_WORKERS / DOCREADER_GRPC_PORT / DOCREADER_GRPC_MAX_FILE_SIZE_MB4 / 50051 / следует за MAX_FILE_SIZE_MBПараметры сервиса gRPC
GRPC_TLS_ENABLED/CERT/KEY/CA/SERVER_NAME, GRPC_MTLS_REQUIRE_CLIENT_CERT, GRPC_AUTH_TOKENfalse / пустоTLS/mTLS и token-аутентификация канала app↔docreader
DOCREADER_PDF_RENDER_DPI / DOCREADER_PDF_JPEG_QUALITY / DOCREADER_PDF_RENDER_MAX_EDGE200 / 85 / 2000Рендеринг PDF
DOCREADER_PDF_FORCE_SCANNED / DOCREADER_PDF_SCAN_IMAGE_RATIO / DOCREADER_PDF_SCAN_MIN_CHARSfalse / значения по умолчанию кодаОпределение сканов
DOCREADER_ODL_HYBRID / DOCREADER_ODL_HYBRID_URL / DOCREADER_ODL_HYBRID_MODE / DOCREADER_ODL_HYBRID_FALLBACKoff / http://odl-hybrid:5002 / auto / falseГибридный разбор OpenDataLoader
Остальные DOCREADER_PDF_* (межсловные расстояния, боковые панели, скрытый текст, встроенные изображения, области диаграмм и др., более 20)см. комментарии к секции docreader в docker-compose.ymlТонкая настройка структуры и извлечения PDF
DOCREADER_EXTERNAL_HTTP_PROXY / _HTTPS_PROXYпустоПрокси исходящих запросов docreader

Описание генерации и исходящие подключения ​

Переменная окруженияПо умолчаниюНазначение
KNOWLEDGE_BASE_PROFILE_MAX_TOKENS2048Бюджет токенов дополнения при генерации описания базы знаний; при недопустимом или неположительном значении возвращается значение по умолчанию; если у модели с рассуждением появляется no gist, можно увеличить
WEKNORA_OUTBOUND_DIAL_TIMEOUT5sТайм-аут dial при исходящих соединениях в рамках защиты SSRF, используется длительность Go (например, 10s); это не общий тайм-аут запроса или генерации модели

Agent, Skills и вложения ​

ИмяЗначение по умолчаниюОписание
Настройки SandboxНастраиваются на странице настроек по пространствуБэкенд, учётные данные, шаблоны, тайм-ауты и политика доступа к частным сетям сохраняются по пространству
WEKNORA_SANDBOX_DOCKER_ENABLEDfalseПереключатель отката на бэкенд Docker-песочницы. Системный администратор также может включить его в «Настройки → Системные настройки → Сетевая безопасность» (приоритет у БД, действует сразу). По умолчанию выключен, так как локальный docker.sock равнозначен root на хосте
WEKNORA_AGENT_LLM_TIMEOUT120sТайм-аут одного вызова LLM агентом (Go duration или просто число секунд)
WEKNORA_AGENT_TOOL_APPROVAL_TIMEOUT / _FAIL_OPEN600s / fail-closeОжидание ручного подтверждения инструмента MCP и политика при сбое
WEKNORA_CHAT_ATTACHMENT_TTL_HOURS / _WAIT_TIMEOUT_SEC / _OCR_CONCURRENCY / _OCR_MAX_PAGES24 / 60 / 8 / 8Время хранения разбора вложений чата, тайм-аут ожидания и пределы параллелизма/страниц OCR; вложения, на которые больше не ссылается ни одно действующее сообщение диалога, удаляются по TTL, а отправленные вложения, на которые всё ещё ссылаются исходная или разветвлённая сессия, по TTL не удаляются
WEKNORA_HOUSEKEEPING_ENABLEDвключеноСбор «мусорных» данных, застрявших в processing
WEKNORA_DOCUMENT_PROCESS_TIMEOUT / WEKNORA_DOCREADER_CALL_TIMEOUT2h / 30mТайм-ауты задачи обработки документа и одного RPC
WEKNORA_PADDLEOCR_VL_TIMEOUT1000sТайм-аут HTTP-запроса к собственному PaddleOCR-VL; поддерживает положительное значение Go duration (например, 5400s, 90m); пустое, недопустимое или неположительное значение использует значение по умолчанию. У внешнего тайм-аута должен быть запас: например, здесь 90m, у DocReader 100m, у задачи документа 2h
WEKNORA_MINERU_TIMEOUT1000sТайм-аут одного разбора собственным MinerU (в API V1 — вся задача разбора, в старых версиях — запрос /file_parse), формат и правила значения по умолчанию такие же; для очень больших PDF также нужен запас внешнего тайм-аута
WEKNORA_MINERU_CLOUD_TIMEOUT600sМаксимальное время опроса результата разбора MinerU Cloud (mineru.net), формат и правила значения по умолчанию такие же
WEKNORA_PADDLEOCR_VL_CLOUD_TIMEOUT600sМаксимальное время опроса результата разбора PaddleOCR-VL Cloud (AI Studio), формат и правила значения по умолчанию такие же
WEKNORA_WEKNORACLOUD_TIMEOUT20mМаксимальное время опроса результата задачи managed docreader в aihelpme.ruCloud, формат и правила значения по умолчанию такие же; должно быть меньше WEKNORA_DOCREADER_CALL_TIMEOUT

Бэкенды песочницы, сетевые политики, переключатели скриптов и личные переменные окружения управляются через конфигурацию пространства/API, см. Навыки и песочница. Долговременная память и автоматические метки по умолчанию выключены и используют соответственно memory_config тенанта и auto_tag_config базы знаний; не заменяйте конфигурацию отдельных пространств глобальными переменными окружения.

Локальный браузер (BrowserSkill, опционально) ​

Пользователь подключает свой браузер к платформе через расширение Chrome. Образ app в Docker уже содержит bsk и сопутствующее расширение; адрес подключения по умолчанию строится по адресу страницы, к которой обращается пользователь, поэтому настройка обычно не требуется.

ИмяЗначение по умолчаниюОписание
BROWSERSKILL_BINARYВ образе Docker /opt/weknora/browserskill/bskАбсолютный путь к исполняемому файлу bsk; при нативном развёртывании нужно собрать и настроить самостоятельно; явно заданное пустое значение отключает эту функцию
BROWSERSKILL_EXTENSION_PATHВ образе Docker предустановленоПуть к ZIP-архиву расширения для скачивания в «Панель инструментов → Подключение браузера → Ручная установка (запасной вариант)»
BROWSERSKILL_PUBLIC_URLпусто (строится по адресу страницы)Переопределять только если шлюз использует отдельный домен или путь; при удалённом развёртывании обязательно wss://
BROWSERSKILL_MAX_CONNECTIONS32Верхний предел одновременно подключённых браузерных устройств на один экземпляр приложения
BROWSERSKILL_INTERNAL_URL / BROWSERSKILL_CLUSTER_SECRETпустоРазвёртывание с несколькими репликами: каждый узел указывает адрес, напрямую доступный другим узлам (не используйте адрес балансировщика), все реплики используют один случайный ключ (не менее 32 символов)

Способы развёртывания и ограничения — в разделе Локальный браузер.

Наблюдаемость (Langfuse) ​

Если задать одновременно LANGFUSE_PUBLIC_KEY + LANGFUSE_SECRET_KEY, функция включается автоматически; LANGFUSE_HOST (по умолчанию https://cloud.langfuse.com, для собственного стека — http://langfuse-web:3000), LANGFUSE_ENABLED, LANGFUSE_RELEASE, LANGFUSE_ENVIRONMENT, LANGFUSE_SAMPLE_RATE, LANGFUSE_FLUSH_AT/FLUSH_INTERVAL/QUEUE_SIZE/REQUEST_TIMEOUT/DEBUG — параметры тонкой настройки; в собственном стеке с --profile langfuse есть также LANGFUSE_SALT, LANGFUSE_ENCRYPTION_KEY, LANGFUSE_NEXTAUTH_SECRET, LANGFUSE_INIT_* (автосоздание организации/проекта/администратора при первом запуске) и др., см. разделы I1/I2 в .env.example.

Опциональные сервисы: SearXNG и MCP Server ​

Эти две группы переменных нужны только при включении соответствующего compose profile и не зависят от основного сервиса.

SearXNG (самостоятельный метапоиск, --profile searxng / full):

ИмяЗначение по умолчаниюОписание
SEARXNG_PORT8888Порт на хосте. Не должен совпадать с APP_PORT (по умолчанию 8080), иначе запросы к localhost могут сначала попасть в SearXNG и эндпоинт входа вернёт HTML 404
SEARXNG_BIND127.0.0.1По умолчанию слушает только локальный хост. Поставляемая с платформой конфигурация отключает собственное ограничение скорости SearXNG (иначе бэкенд был бы заторможен), поэтому не следует выставлять его напрямую в LAN; если всё же нужно открыть, явно измените на 0.0.0.0 и самостоятельно усильте защиту
SEARXNG_SECRETпустоВходной скрипт использует его для замены secret_key в settings.yml; при открытии наружу обязательно задать

При собственном развёртывании SearXNG не забудьте добавить 127.0.0.1 в SSRF_WHITELIST, иначе защита от SSRF на бэкенде отклонит локальный адрес. Использование — в разделе Веб-поиск и извлечение веб-страниц.

MCP Server (открывает платформу для MCP-клиентов вроде Claude Desktop, --profile full):

ИмяЗначение по умолчаниюОписание
WEKNORA_API_KEYпустоКлюч, которым mcp-server обращается к REST платформы; создаётся в «Настройки → API Keys»
MCP_SERVER_AUTH_TOKENпустоОбязателен для транспорта HTTP/SSE; при отсутствии процесс отказывается запускаться; клиент передаёт его как Authorization: Bearer
WEKNORA_CHAT_TIMEOUT300Тайм-аут чтения при вызове REST платформы (секунды)
WEKNORA_VERIFY_SSLtrueПроверять ли TLS-сертификат бэкенда; при самоподписанном сертификате можно задать false
MCP_ALLOWED_UPLOAD_DIRSпустоБелый список каталогов, разрешённых для загрузки (через запятую); пусто отключает инструмент загрузки файлов

Полное описание — в разделе Интеграция с MCP.

config/prompt_templates/: шаблоны промптов ​

Для каждого типа промпта — отдельный YAML-файл с единой структурой templates: (список); поля одного шаблона (структура PromptTemplate, internal/config/config.go):

ПолеОписание
idУникальный ID, на который ссылаются *_prompt_id в config.yaml, system_prompt_id встроенных Agent и пресеты типов
name / descriptionОтображаемое имя и описание
contentТекст промпта системной стороны (обязателен для всех шаблонов)
userПромпт пользовательской стороны (используется только в парных шаблонах system+user, например rewrite, keywords_extraction)
defaultЯвляется ли шаблоном по умолчанию для этого типа
modeРазличение подтипов (например, model в fallback означает промпт запасного ответа модели)
has_knowledge_base / has_web_searchОтметки применимости шаблона
i18nМногоязычные name/description (ключ — locale, например zh-CN)

Назначение файлов и содержащиеся в них ID шаблонов:

ФайлНазначениеID шаблонов
system_prompt.yamlСистемный промпт вопросов-ответов (quick-answer / RAG)default_kb (по умолчанию), expert_assistant, customer_service, technical_support, pure_chat, web_search_assistant
context_template.yamlШаблон сборки результатов поиска в контекстdefault_context, detailed_context, simple_context, qa_context
rewrite.yamlПереписывание запроса в многораундовом диалоге (пары content+user)default_rewrite, standard_rewrite, strict_rewrite
fallback.yamlЗапасной ответ при промахе (фиксированный ответ + запасной ответ модели mode:"model")default_fallback, polite_fallback, brief_fallback, model_fallback, default_fallback_prompt
generate_session_title.yamlГенерация заголовка сессииdefault_session_title
generate_summary.yamlГенерация резюме документаdefault_summary
generate_questions.yamlПредварительная генерация вопросов по документуdefault_generate_questions
keywords_extraction.yamlИзвлечение ключевых словdefault_keywords_extraction
graph_extraction.yamlИзвлечение сущностей/отношений графаdefault_extract_entities, default_extract_relationships
agent_system_prompt.yamlСистемный промпт Agent (smart-reasoning)pure_agent, progressive_rag_agent, data_analyst, wiki_researcher, wiki_fixer, hybrid_rag_wiki_agent
intent_prompts.yamlСистемные промпты по намерениям для маршрутизации намерений (ID шаблона = значение намерения)greeting, chitchat, follow_up, image_only, summarize, web_search, doc_only

Точки кастомизации: редактируйте content шаблона напрямую либо добавьте новую запись шаблона и измените соответствующий *_prompt_id в config.yaml на новый ID; изменения вступают в силу после перезапуска (в compose ./config/config.yaml уже смонтирован, каталог шаблонов идёт с образом/монтируется). Если ID не найден, в журнале запуска выводится Warning: xxx_prompt_id not found.

config/agent_type_presets.yaml: пресеты типов Agent ​

Для настраиваемого Agent в режиме smart-reasoning доступно «заполнение одним нажатием»: каждый пресет (AgentTypePresetEntry, internal/types/agent_type_preset.go) содержит id, i18n (многоязычные label/description), config (предзаполненные значения; нулевые значения не применяются) и опциональный kb_filter (предикаты возможностей any_of / all_of / none_of, ограничивающие доступные базы знаний; имена возможностей: vector, keyword, wiki, graph, faq). Фронтенд читает их через GET /agents/type-presets.

Встроено пять пресетов:

idСистемный промптБелый список инструментовПримечания
rag-qaprogressive_rag_agentsearch_knowledge, read_document, list_documentstemperature 0.7, max_iterations 30, приоритет FAQ
wiki-qawiki_researcherwiki_search, wiki_read_page, read_document, wiki_flag_issueНужна база знаний с включённым Wiki
hybrid-rag-wikihybrid_rag_wiki_agentПолный набор инструментов Wiki + RAGmax_iterations 40, самый гибкий пресет
data-analysisdata_analystdata_schema, data_analysistemperature 0.3; kb_filter: none_of: [faq]; поддерживаются csv/xlsx
customнетбез предзаполненияПолностью ручная настройка

Устаревшие имена инструментов, встречающиеся в сохранённых конфигурациях (knowledge_search, grep_chunks → search_knowledge; list_knowledge_chunks, get_document_info, wiki_read_source_doc → read_document), автоматически отображаются на новые инструменты во время выполнения; переписывать их вручную не нужно.

config/builtin_agents.yaml: встроенные Agent ​

Определяют Agent, поставляемые вместе с системой и видимые всем тенантам (BuiltinAgentEntry, internal/types/builtin_agent_config.go). Каждая запись содержит id, avatar, is_builtin: true, i18n (имя и описание для default/zh-CN/zh-TW/ja-JP/ko-KR) и полный config (CustomAgentConfig). В файле встроено пять Agent:

  • builtin-quick-answer: agent_mode: quick-answer, ссылается на system_prompt_id: default_kb и context_template_id: default_context, с полными параметрами поиска (embedding_top_k: 10, vector_threshold: 0.5, rerank_threshold: 0.3, порог прямого ответа FAQ 0.9 и др.);
  • builtin-smart-reasoning: agent_mode: smart-reasoning, agent_type: rag-qa, max_iterations: 50;
  • builtin-data-analyst, builtin-wiki-researcher, builtin-wiki-fixer: ориентированы соответственно на анализ таблиц и сценарии Wiki.

system_prompt_id в config при запуске разрешается функцией resolveBuiltinAgentPromptIDs в фактическое содержимое из agent_system_prompt.yaml. Чтобы изменить поведение встроенных Agent, отредактируйте этот файл и перезапустите систему.

config/builtin_models.yaml.example: декларативные встроенные модели ​

Скопируйте в config/builtin_models.yaml (или укажите путь через BUILTIN_MODELS_CONFIG); тогда его записи при каждом запуске записываются в таблицу models с пометкой is_builtin=true и видны всем тенантам (в compose раскомментируйте строку монтирования - ./config/builtin_models.yaml:/app/config/builtin_models.yaml:ro). Формат:

yaml
builtin_models:
  - id: builtin-llm-default        # стабильный ID; повторный запуск обновляет по ID идемпотентно
    type: KnowledgeQA              # KnowledgeQA | Embedding | Rerank | VLLM | ASR
    source: remote                 # remote (по умолчанию) | local
    is_default: true               # сделать ли моделью по умолчанию для этого типа
    name: ${LLM_MODEL_NAME}        # все строковые поля поддерживают ссылки ${ENV} (.env передаётся в контейнер через env_file)
    parameters:
      base_url: ${LLM_BASE_URL}
      api_key: ${LLM_API_KEY}
      provider: ${LLM_PROVIDER}    # openai | generic | aliyun | moonshot | ...
      embedding_parameters:        # только для типа Embedding
        dimension: 1536
        truncate_prompt_tokens: 0

Внимание: незаданные ${ENV} остаются литералами, чтобы было заметно ошибку конфигурации; нестроковые поля (type, source, is_default, dimension и др.) должны быть заданы литеральными значениями; удаление записи из файла не удаляет её из базы автоматически — нужно очистить вручную.

Локальный Ollama: укажите source как local, а в name — имя модели Ollama (на векторной стороне можно использовать ${EMBEDDING_MODEL_NAME}). Полный пример с комментариями — в секции «one local Ollama» файла config/builtin_models.yaml.example; dimension должен быть литералом (в примере CLI nomic-embed-text — 768).

Памятка по приоритету конфигурации ​

Для конфигураций с одним и тем же смыслом приоритет таков: таблица system_settings в базе данных (только ключи, зарегистрированные в таблице) > переменные окружения > config.yaml > встроенные значения по умолчанию в коде; конфигурации уровня тенанта/базы знаний (RetrievalConfig, ChunkingConfig и др., хранятся в базе данных) во время выполнения переопределяют глобальные значения по умолчанию. После изменения .env нужно перезапустить контейнер (docker compose up -d app); hot-reload air в режиме разработки не перечитывает .env, поэтому нужен перезапуск dev-скрипта.

Версия v0.8.3 · MIT License