This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Базовая инфраструктура (через Dockge/docker-compose)
Cтек сервисов:
Postgres → основная БД.
MinIO → S3-хранилище для файлов.
Metabase → визуализация/аналитика.
Ollama → локальные LLM-модели (LLM-движок).
RabbitMQ → очередь задач.
NocoDB → low-code UI к базе.
Nginx Proxy Manager (NPM) → проксирование и домены с SSL.
UI (Next.js) → наш интерфейс для админки/авторизации.
Все сервисы описаны в compose.yaml с restart: unless-stopped, так что они поднимаются сами после старта docker-демона.
UI (Next.js) — авторизация и защита
Next.js 15 + TypeScript + Tailwind.
Credentials provider (логин/пароль из Postgres).
План разработки
Этап 1. Каркас данных и ingestion (MVP-поток)
Задачи
Схема БД (минимум):
channels (id, type: asterisk|mobile|tg|wa|web, status, meta)
contacts (id, phone/email/username, source, last_seen)
interactions (id, channel_id, contact_id, started_at, ended_at, status: new|in_progress|done|lost, assignee, tags[])
calls (id, interaction_id, direction, asterisk_uniqueid, mobile_device_id?, cdr_json, recording_uri, duration_sec)
transcripts (id, call_id, lang, text, segments_json, qa_scores_json)
sales_1c (id, external_id, doc_date, amount, items_json, contact_key)
match_sales (interaction_id, sale_id, match_score, method, note)
events_audit (id, actor, action, resource, diff, ts)
API (FastAPI) — первый набор эндпоинтов:
/ingest/asterisk/cdr (POST) — приём CDR/AMI событий (или периодическая выгрузка CDR через скрипт).
/ingest/call-recording (S3 PUT webhook или локальный uploader) — складировать в MinIO и возвращать recording_uri.
/ingest/1c/upload (CSV) — загрузка отчёта продаж.
/interactions (GET/POST/PATCH) — базовый CRUD.
/calls/:id/transcribe (POST) — постановка в очередь на транскрипцию.
/config/* — чтение/запись настроек (через таблицу settings, с аудитом).
Воркеры (ASR, синхронизация):
asr_worker: берёт задачи из Rabbit → качает запись из MinIO → транскрибирует (Whisper-cpp/ffmpeg) → пишет в transcripts.
sales_linker: после каждого нового interaction/call и после загрузки 1С прогоняет matching (по телефону, времени, сумме) → создаёт/обновляет match_sales.
UI (Next.js):
Страницы:
/calls — список (фильтры: дата, длительность, статус ASR).
/calls/[id] — карточка звонка (аудио-плеер из MinIO, транскрипт, авто-теги).
/review — очередь «недозакрытых» обращений (status != done).
/settings — форма с настройками (Asterisk, MinIO, 1С, ASR, фичфлаги) → работает с API /config.
Результат/критерии
Звонок из Asterisk превращается в запись в БД + файл в MinIO + транскрипт в transcripts.
CSV из 1С грузится → sales_1c заполнена → есть связи match_sales.
UI показывает звонки, транскрипцию, статус обработки; настройки меняются без config.yaml.
Metabase: 2 дашборда — «Воронка обращений» и «Утечки (lost vs sold)».
Этап 2. Мобильные SIM (минимально жизнеспособно)
Задачи
Android-клиент (реалистично; iOS ограничена):
Запрос READ_CALL_LOG (или интеграция с системным журналом) + отправка метаданных вызовов (вход/выход, номер, длительность) → в API /ingest/mobile/call.
Опционально запись аудио: для Android 10+ нужно Legal/Accessibility подход (не всегда возможно). Если запись нельзя — хотя бы журнал + обязательный «после-звонка» чек-лист (кнопки «лид создан/закрыт/отложен»).
Личный ключ сотрудника в приложении: device_id → users_devices.
Сопоставление с контактами/интеракциями: номер → contacts → interactions/calls с channel=mobile.
Результат
Хоть и без аудио, но все мобильные звонки попадают в систему как факт обращения (время, номер, длительность, менеджер).
На дашбордах видно долю мобильных, их исход, и их вклад в утечки.
Комментарий: iOS практически не даёт доступ к журналу/записи. Рассматриваем workaround: «после-звонка» форма в приложении + привязка по пушам/уведомлениям. Для малого объёма звонков у вас это ок.
Этап 3. Речевая аналитика и «умные» теги
Задачи
ASR улучшение:
Whisper-cpp «medium» RU или WhisperX (если GPU тянет) + VAD.
Выход: segments_json (таймкоды).
LLM-разметка (Ollama → llama3:8b/qwen):
Суммаризация, субъективные метрики (вежливость, конфликт), детект intent (цель клиента), авто-теги (товары/услуги), выявление upsell-возможностей.
Складировать в transcripts.qa_scores_json и interactions.tags.
UI:
На /calls/[id] — боковые метрики (авто-теги, intent, рекомендации).
На /review — фильтры по тегам/рискам («эскалация», «повторный звонок», «нет ответа»).
Результат
Каждому звонку автоприсваиваются теги/инсайты. Видно, что упустили/что продали.
Этап 4. 1С интеграция (операционализация)
Задачи
Cron-интеграция (в отдельном контейнере scheduler):
Раз в день: GET/PUT отчёта 1С (или SFTP/почта) → /ingest/1c/upload.
Логи: в events_audit.
Правила матчинга (настраиваемые в /settings):
окно времени (±N дней),
mapping полей телефона/контакта,
веса для match_score.
Отчёт «реализация vs обращения» в Metabase:
матрица: канал × статус × реализация.
Результат
Автосверка обращений и реальных продаж. Видно потери >45% на уровне фактов.
Этап 5. База знаний и эксперт-контур (LLM-ассистент)
Задачи
Хранилище знаний:
kb_docs (id, source: web|internal|manual, title, content, meta, tags, updated_at)
b_vectors (doc_id, chunk, embedding) — можно pgvector/Chroma.
kb_cases (принятые экспертами вопросы/ответы/решения).
Пайплайн пополнения:
Импорт каталога авто/оборудования (официальные источники, YAML/CSV).
Импорт внутренних регламентов/кейсов.
(Опционально) web-scrape производителей (этично и с кэшем).
Чат для установщиков/менеджеров:
/qa — RAG: поиск по kb_vectors + ответ LLM + источники.
Кнопка «Отправить на ревью эксперту» → kb_cases (статус pending → approved).
Результат
Рабочий ассистент-эксперт: отвечает по автоэлектронике и ассортименту, срастается с вашей базой.
Этап 6. UI-настройки и анти-саботаж
Задачи
/settings:
Вкладки: Интеграции (Asterisk, 1С, MinIO), ASR/LLM, Правила матчинга, Фичфлаги.
Валидация + тест соединения (ping к Asterisk, S3 put/get).
Роли:
admin, expert, reviewer, user (менеджер).
RBAC в UI и API.
Протоколирование:
Любая правка настроек → в events_audit.
Метки невыполненных действий менеджера (например, пропущенный callback) → в interactions.
Результат
Все настройки меняются из UI; есть история; права разграничены; виден саботаж как факт.
Этап 7. Дашборды контроля (Metabase + алерты)
Задачи
Метрики:
Утечки: % обращений без статуса «done» и без матчинга с 1С.
SLA звонка: среднее время ответа/перезвона.
Инсайты ASR/LLM: топ-причины отказов, частота «нет товара», частота upsell-окна.
Алерты:
Порог очереди ASR (настройка в settings.alerts.thresholds).
Пики пропущенных/коротких звонков.
Результат
Регулярные отчёты + e-mail/Telegram-уведомления о провалах/рисках.
Технические детали и стандарты
API: FastAPI, CORS только на ui.домен. Swagger для эндпоинтов.
Файлы: все записи/CSV → MinIO (S3) с логикой TTL/retention.
Очереди: RabbitMQ (prefetch, dead-letter для падений ASR).
ASR: для вашей нагрузки (≤30 звонков/день) хватит CPU Whisper-cpp; при апгрейде GPU — WhisperX.
LLM: Ollama локально (llama3:8b/qwen) для тэггинга/саммаризации; RAG для Q&A.
Безопасность: секреты в secrets (шифрование/переменные окружения), роль-бэйзд доступ, аудит. NPM — закрыть админку наружу по IP/паролю.
Резервные копии: pg_dump по крону + минус-диффы MinIO; хранение на отдельном диске/облаке.
Развёртывание: все сервисы в одном compose.yaml, у ui — build: ./ui, restart: unless-stopped. Прокси через NPM на домены.