К документации
Руководство 12
Troubleshooting
Типичные симптомы, причина, решение. Ссылки file:line и cross-link к docs.
5 мин чтения
Типичные симптомы, причина, решение. Ссылки file:line и cross-link к docs.
Запуск и config
Сервер сразу завершается с process.exit(1)
- Причина: провал Zod-валидации env (
src/config/env.ts). - Fix: смотри логи - там указана невалидная переменная. Проверь
JWT_SECRET(обяз.),COLLECTOR_SECRET(обяз.),DATABASE_URL, порты. Сравни с.env.example.
COLLECTOR_SECRET mismatch между server и collector
- Симптом: collector не может уведомить о статусе документа; загрузка остаётся "processing".
- Fix: задай тот же
COLLECTOR_SECRETв корневом.env(единый config - слой per-package.envудалён в v0.22). Constant-time сравнение → тихая ошибка 401.
WIDGET_API_KEY mismatch widget↔server
- Симптом: виджет не загружает config / chat 401 от сервера.
- Fix: тот же key в корневом
.env(единый config). Без key cache-bust push - no-op (TTL 5 min).
Config, изменённый из UI, не действует
- Причина: ключи
ALWAYS_READONLY(JWT_SECRET,DATABASE_URL, порты, URL) отклоняются bulk settings; остальные следуютDB > ENV > Default. - Fix: для readonly-ключей меняй
.env+ restart.PUT /api/system/settingsвозвращает{ rejected: [...] }- проверь этот массив.
Database
Конфликтующие миграции / dev reset
- Fix: в dev с одноразовой DB reset через
pnpm db:migrate:reset:guard(требуетPRISMA_MIGRATE_RESET_CONFIRM=yesили--force-accept-data-loss- никогда в продакшене). Deploy с guard:pnpm db:migrate:guard(отклоняет деструктивные миграции без явного согласия). Проверь PostgreSQL 16 и корректныйDATABASE_URL.
Restore backup не атомарен / частичные данные
- Причина: restore использует
psql --single-transaction --set ON_ERROR_STOP=on; при сбое делает полный rollback. - Fix: проверь логи psql; safety backup pre-restore (
runSafetyBackup). Используй/restore/:logId/dry-runперед реальным restore.
RAG и embedding
Vector search возвращает 0 результатов, но FTS работает
- Причина: guard D-01 - текущий
EMBEDDING_MODEL≠embeddingModelуDocument(например, модель сменена после загрузки): vector leg пропускается, поиск деградирует до FTS-only. - Fix: re-embed через
POST /api/system/reembed-documents(admin, опциональноworkspaceId/documentIds) для повторного embed chunk'ов текущей моделью; если нужно только перестроить FTS-индекс из vector DB:POST /api/system/reindex-documents. Оба admin-only, также из Settings → Maintenance.
RAG деградирован в виджете (status: rag-degraded)
- Причина: RAG pre-search упал (collector down, пустой whitelist workspace) или 0 результатов поиска по связанным workspace.
- Fix: проверь
GET /api/health/rag; проверьWidgetWorkspaceдля виджета (GET /api/widgets/:id/workspaces); подтверди collector up (GET :3210/api/health).
LanceDB table missing / query error
- Причина: таблица per-workspace
ws_<name>_<shortId>не создана или storage перемещён. - Fix: проверь, что
STORAGE_PATHcollector не изменён; reindex wiki/документов.
Agent и LLM
Agent abort: unknown_tool_breaker
- Причина: circuit breaker BOT-03 - 3 неизвестных skill подряд / 5 всего. Часто модель галлюцинирует незарегистрированные tool.
- Fix: используй более способную модель или уменьши включённые skill; проверь MCP connection enabled и зарегистрированные skill (
mcp_<conn>_<tool>).
Agent abort: wallclock / token_budget / context_overflow
- Fix: подними env
AGENT_WALLCLOCK_TIMEOUT_MS(дефолт 600000),AGENT_MAX_TOTAL_TOKENS(200000),AGENT_MAX_CONTEXT_BYTES(500000). Для простых задач понизь, чтобы избежать stall. См. 03 - Configuration § Agent watchdog.
Модель не отвечает / timeout локальной LLM
- Причина: Ollama down или модель не загружена;
LLM_TIMEOUT=0= нет timeout (медленные локальные LLM). - Fix:
ollama list/ollama pull gemma4:latest; проверьOLLAMA_BASE_URL(http://ollama:11434в compose). Fallback provider: проверьProvider.isAvailable(polling 30s).
Fallback provider не срабатывает
- Причина: нет доступного альтернативного provider (
isAvailable=false) или не задан глобальный default. - Fix: добавь provider (
POST /api/providers), set default (PUT /:id/set-default), проверь тегderiveCapabilities. Frontend fallback 3-tier с toast Undo.
Widget
Виджет не загружается / пустой iframe
- Причина:
allowedOriginsне содержит origin хоста → динамический CORS fail-closed. - Fix: добавь origin в
Widget.allowedOrigins(CSV-строка, максимум 2000 символов). Проверь, чтоGET /api/config/:widgetIdотвечает.
Lead capture 403
- Причина:
config.leadCaptureEnabled=falseдля этого виджета. - Fix: включи в модели
Widget(admin UI или API).
Rate limit 429 на виджете
- Причина: цепочка limiter - widgetDailyMessageLimiter (5/24h на widget+IP, override
sessionLimitPerDay), widgetChatLimiter (30/min на widgetId, overriderateLimitPerMinute), widgetSessionLimiter (50 созданий сессий/день на IP), widgetLeadLimiter (3/h на IP). - Fix: оцени per-widget override (rateLimitPerMinute/sessionLimitPerDay); проверь, какой limiter сработал (header
Retry-After/ bodyerror).
MCP
Установка из marketplace 201, но tool недоступны
- Причина:
connectMCPServer- fire-and-forget; сбой логируется, но не пробрасывается. - Fix:
POST /api/mcp-connections/:id/test(10s, возвращает{success, toolCount, error}). Проверь transport fallback D-09; проверьactiveConnectionsчерезGET /api/mcp-connections/statuses.
MCP автоматически отключён
- Причина: auto-disable в стиле webhook? Нет - MCP connection остаётся enabled; это webhook само-отключается после 10 последовательных сбоев. Для MCP 30-минутный health check устанавливает
healthStatus(stale/down), но не отключает подключение. - Fix: для webhook включи вручную; для MCP health badge информативен.
Tool MCP не используется в чате
- Причина: активные per-chat pin, исключающие подключение, или connection disabled.
- Fix:
GET /api/chats/:chatId/pins; проверьresolveSkillsForChat(нет pin → все enabled подключения workspace).
Лицензия
402 Payment Required на функцию
- Причина:
requireFeature(flag)илиrequireFeatureLimitсработал gating (Community). - Fix: задай Enterprise
LICENSE_KEYили оставайся на Community с лимитами. Body ошибки включаетfeature,tier,limit?,current?.
Enterprise истёк в runtime
- Поведение: graceful degradation до Community (без restart); warn в логах.
- Fix: обнови
LICENSE_KEY;getLicenseInfo()перечитывает в runtime.
Безопасность и audit
Audit log не пишет
- Причина: audit log - модуль Enterprise; в Community
logEvent- no-op (write delegate не зарегистрирован), поэтому события не записываются. - Fix: Enterprise для audit log + immutability (
audit_log_immutable). Проверь корректныйentityTypeв фильтрах (GET /api/event-logs). Event-webhook'и в Community всё равно отправляются (fire-and-forget).
DLP не редактирует PII
- Причина:
DLP_ENABLED=falseчерез settings (дефолт в v0.22 -"true"- кто-то отключил), или роль вDLP_BYPASS_ROLES, освобождающая от scan. - Fix: проверь/задай
DLP_ENABLED=trueчерез settings. Redaction по 10 встроенным database-backed паттернам: 6 оригинальных (email, credit_card, ssn, api_key, aws_key, private_key) плюс 4 EU/IT (it_vat_iva,it_codice_fiscale,iban,eu_phone- последний seeds DISABLED для admin review); кастомные паттерны до 50 через панель DLP Patterns. SSEdone→dlp_matches(frontend показывает DLPNotice под сообщением).
Backup
Job backup вечно в "running"
- Причина: worker умер без cleanup; DB mutex
BackupLog.status="running". - Fix:
cleanStaleLocksпомечает running >2h как failed при следующем bootstrap. Перезапусти сервер для триггера или обнови status вручную.
Checksum mismatch при restore
- Причина: повреждённый архив / частичная загрузка.
- Fix: SHA-256 streaming вычисляется при загрузке; проверь файл назначения. Восстанови из следующего log.
Известные расхождения документации
| Doc говорит | Код говорит | Источник истины |
|---|---|---|
| "28 permissions" / "27" | 31 разрешение (PERMISSION_NAMES) | код |
| "12 menu sections" | 13 (MENU_SECTIONS, +uploads) | код |
| "7" languages i18n | 8 app locale (en, it, ru, de, fr, es, zh, pt) | i18n/locales/ |
| API-key auth (старая схема) | HMAC-SHA256 sk- keys (key_hash + API_KEY_HMAC_SECRET) | services/apiKeyService.ts |
--profile enterprise compose | не определён явно | LICENSE_KEY активирует Enterprise |
Быстрый health check
bash
curl localhost:3000/api/health # { database, collector, disk }
curl localhost:3000/api/health/rag # статус RAG
curl localhost:3210/api/health # collector
curl localhost:3211/health # widgetCross-link
- Config/env: 03 - Configuration
- Internals: 05 - Feature Guide
- Deploy: 09 - Deployment