Компоненты стека
Детальное описание каждого компонента: что делает, какие функции покрывает, ключевые модули и примеры конфигурации.
Kamailio — SIP-прокси
Kamailio — высокопроизводительный SIP-прокси-сервер, написанный на C. Способен обрабатывать тысячи вызовов в секунду на одном ядре. Работает исключительно с сигнализацией (SIP) — голосовые потоки (RTP) через него не проходят.
| Модуль | Назначение |
|---|---|
| usrloc | Хранение регистраций (кто где онлайн) |
| auth_db | Аутентификация SIP из PostgreSQL |
| dispatcher | Балансировка между FreeSWITCH нодами |
| pike | Защита от brute-force (rate limiting) |
| permissions | ACL — белые/чёрные списки IP |
| tls | Шифрование SIP-сигнализации |
| nathelper | Исправление NAT в SIP-заголовках |
| websocket | SIP поверх WebSocket для WebRTC |
| rtpengine | Управление RTPEngine для медиа-проксирования |
| dmq | Синхронизация данных между нодами кластера |
| dialog | Отслеживание активных диалогов |
| htable | In-memory хеш-таблицы для кеширования |
Kamailio не работает с голосом. Его задача — быстро решить КУДА отправить вызов и сделать это надёжно. Думайте о нём как о «маршрутизаторе для SIP-пакетов».
FreeSWITCH — Медиа-сервер
FreeSWITCH — медиа-сервер и «мозг» обработки вызовов. Написан на C, обрабатывает голос, IVR-меню, очереди, конференции и запись разговоров. Именно здесь вызов «оживает» — FreeSWITCH отвечает, проигрывает приветствие, соединяет абонентов и записывает разговор.
| Модуль | Назначение |
|---|---|
| mod_sofia | SIP-стек (регистрация, вызовы) |
| mod_callcenter | Очереди вызовов (ACD) |
| mod_conference | Конференц-связь |
| mod_voicemail | Голосовая почта |
| mod_dptools | Инструменты диалплана (bridge, transfer, record) |
| mod_ivr | Интерактивное голосовое меню |
| mod_lua | Lua-скрипты для логики вызовов |
| mod_event_socket | ESL — внешнее управление (Go, Python) |
| mod_verto | WebRTC-протокол (альтернатива SIP.js) |
| mod_local_stream | Музыка ожидания (MOH) |
| mod_spandsp | Факс T.38, DTMF detection |
| mod_unimrcp | ASR/TTS через MRCP-протокол |
FreeSWITCH управляется извне через ESL (Event Socket). Ваш Go-сервис подключается к ESL и командует: «ответь», «переведи», «запиши». Это позволяет вынести всю бизнес-логику из конфигов FreeSWITCH в нормальный код.
RTPEngine — Медиа-прокси
RTPEngine — медиа-прокси, разработанный компанией Sipwise. Проксирует RTP/SRTP-потоки между клиентами, обеспечивая NAT traversal, конвертацию шифрования и транскодирование кодеков. Не обрабатывает логику вызовов — только пропускает и трансформирует медиа-потоки.
| Функция | Назначение |
|---|---|
| NAT traversal | Проксирование медиа для клиентов за NAT |
| SRTP ↔ RTP | Конвертация шифрованного в нешифрованный поток |
| WebRTC bridge | DTLS-SRTP (браузер) ↔ plain RTP (IP-телефон) |
| Codec transcode | Перекодирование (Opus ↔ G.711) при необходимости |
| Media recording | Запись RTP-потока в файл |
| ICE handling | Обработка ICE candidates для WebRTC |
Без RTPEngine WebRTC-клиенты не смогут разговаривать с обычными SIP-телефонами — разные протоколы шифрования и кодеки. RTPEngine выступает «переводчиком» между мирами.
Go Backend — API и бизнес-логика
Go Backend — ваш кастомный сервис, «клей» между всеми компонентами системы. Предоставляет REST API для фронтенда, управляет вызовами через ESL, обрабатывает CDR-события, управляет кампаниями автообзвона и рассылает вебхуки во внешние системы.
| Функция | Назначение |
|---|---|
| REST API | CRUD пользователей, очередей, IVR, маршрутов |
| ESL Client | Управление вызовами через FreeSWITCH |
| WebSocket Hub | Реалтайм-события для React-дашборда |
| CDR Processor | Приём событий → запись в PostgreSQL |
| Dialer Engine | Управление кампаниями автообзвона |
| Webhook Dispatcher | Отправка событий во внешние системы (CRM) |
| Provisioning Server | Автонастройка IP-телефонов по MAC |
| Auth & RBAC | JWT-аутентификация, роли и права |
Ключевые Go-библиотеки:
Go идеален для телефонии: горутины для тысяч одновременных ESL-событий, низкая задержка, простой деплой одним бинарником. Вся бизнес-логика живёт здесь, а не в конфигах Kamailio или FreeSWITCH.
PostgreSQL — Основная БД
PostgreSQL — основное постоянное хранилище всех данных системы. Содержит информацию о пользователях, маршрутизации, CDR-записях, конфигурации IVR, очередей и кампаний. Используется как Go-сервисом (бизнес-данные), так и Kamailio (аутентификация SIP).
| Группа | Таблицы / Назначение |
|---|---|
| Мультитенантность | tenants — компании, домены, лимиты |
| Пользователи | users, extensions, sip_credentials, devices |
| Маршрутизация | dialplans, did_numbers, trunks, outbound_routes |
| IVR | ivr_menus — дерево меню в JSON |
| Очереди | queues, queue_members — настройки и агенты |
| CDR | cdr — журнал всех вызовов |
| Записи | recordings — метаданные файлов записей |
| Voicemail | voicemail_boxes, voicemail_msgs |
| Конференции | conference_rooms |
| Автообзвон | campaigns, campaign_numbers |
| Аудит | audit_log — история изменений |
PostgreSQL используется и Kamailio (для аутентификации), и Go (для бизнес-данных). Это единый источник правды (single source of truth) для всей системы.
Redis — Кеш и реалтайм
Redis — in-memory хранилище для эфемерного состояния реального времени. Здесь живут данные, которые нужны «прямо сейчас»: активные вызовы, статусы операторов, метрики очередей, API-сессии и счётчики rate limiting.
| Ключ (key pattern) | Хранимые данные |
|---|---|
| call:{uuid} | Активный вызов: caller, callee, state, start_time |
| agent:{id}:status | Статус оператора: ready/busy/break/offline |
| presence:{ext} | Presence: available/dnd/away |
| queue:{id}:stats | Очередь: waiting, talking, avg_wait, sla% |
| session:{token} | API-сессия: user_id, tenant_id, role, expires |
| rate:{ip} | Rate limiting: counter + TTL |
| location:{aor} | Кеш регистраций из Kamailio |
Redis — это «оперативная память» системы. Всё что нужно знать ПРЯМО СЕЙЧАС (кто онлайн, кто свободен, сколько в очереди) — здесь. Данные эфемерны: перезапуск Redis не сломает систему, только временно обнулит метрики.
NATS — Шина событий
NATS — легковесный брокер сообщений, написанный на Go. Быстрее RabbitMQ, проще Kafka. Обеспечивает асинхронную связь между компонентами: FreeSWITCH генерирует события, Go обрабатывает их и рассылает подписчикам — дашборду, CDR-процессору, вебхук-диспетчеру.
| Subject (тема) | Данные события |
|---|---|
| call.started | uuid, caller, callee, direction, queue |
| call.answered | uuid, agent_id, wait_time |
| call.ended | uuid, duration, disposition, recording_path |
| agent.status.changed | agent_id, old_status, new_status |
| queue.stats.updated | queue_id, waiting, talking, sla |
| voicemail.new | box_id, caller, duration, file_path |
| cdr.ready | cdr_id, complete record |
| webhook.dispatch | url, payload, event_type |
NATS развязывает компоненты. FreeSWITCH не знает о React-дашборде, Go не знает о CRM — они просто публикуют события. Каждый подписчик получает то, что ему нужно, не создавая связности.
React Frontend — Панель управления
React Frontend — одностраничное приложение (SPA) для администрирования системы, панели оператора и реалтайм-дашбордов. Включает встроенный WebRTC-телефон на базе SIP.js и визуальный конструктор IVR на React Flow.
| Страница | Назначение |
|---|---|
| Dashboard | Реалтайм: активные вызовы, очереди, агенты |
| Users | CRUD пользователей и расширений |
| Queues | Настройка очередей, стратегий, агентов |
| IVR Builder | Визуальный drag-n-drop конструктор меню |
| CDR | Журнал вызовов с фильтрами и экспортом |
| Recordings | Прослушивание записей, скачивание |
| Reports | Графики, SLA, heatmap нагрузки |
| WebPhone | Встроенный SIP.js-телефон |
| Campaigns | Управление автообзвоном |
| Settings | Транки, маршруты, безопасность |
Ключевые библиотеки:
React Flow позволяет строить IVR визуально — перетаскивая блоки. Это намного удобнее чем XML/Lua конфиги. Пользователь рисует меню мышкой, а система генерирует конфигурацию автоматически.
Homer — SIP-мониторинг
Homer — специализированный инструмент захвата и анализа SIP-трафика. Перехватывает все SIP-пакеты через HEP-протокол, строит визуальные диаграммы вызовов и помогает диагностировать проблемы с сигнализацией. Незаменим при отладке «звонок не проходит».
| Функция | Назначение |
|---|---|
| SIP Capture | Захват всех SIP-пакетов через HEP-протокол |
| Call Flow | Визуальная диаграмма: INVITE → 180 → 200 → BYE |
| Search | Поиск по номеру, Call-ID, времени, статусу |
| Alerts | Уведомления при SIP-ошибках, высоком % отказов |
| Statistics | Графики: calls/sec, response codes, latency |
Homer — ваш «Wireshark для SIP». Когда звонок не проходит, Homer покажет ТОЧНО где он застрял: на Kamailio? На FreeSWITCH? Получил 403? Таймаут? Визуальная диаграмма call flow экономит часы отладки.
AI/ML-сервисы — Распознавание и аналитика
AI/ML-сервисы — набор внешних сервисов для обработки речи и интеллектуальной аналитики. Распознавание речи (ASR), синтез речи (TTS), анализ транскрипций через LLM и определение тональности. Могут быть как self-hosted, так и облачными.
| Сервис | Назначение |
|---|---|
| Vosk | Self-hosted ASR (Speech-to-Text), поддержка русского |
| Whisper | OpenAI ASR, высокое качество, можно self-host |
| Piper | Self-hosted TTS (Text-to-Speech), нейросетевой |
| LLM (Claude/GPT) | Анализ транскрипций, суммаризация, классификация |
| Sentiment | Определение тональности: позитивная/негативная |
Поток обработки (integration flow):
Вызов → FreeSWITCH записывает → WAV-файл → Whisper STT → текст транскрипции → LLM-анализ (суммаризация, классификация, тональность) → результаты в БД
Vosk работает оффлайн и бесплатно. Для реалтайм-распознавания в IVR — идеальный выбор. Whisper лучше для post-call анализа, где важно качество, а не скорость.
Инфраструктура — DevOps-компоненты
Инфраструктура — набор DevOps-инструментов, обеспечивающих контейнеризацию, мониторинг, логирование, хранение файлов и автоматизацию развёртывания. Без этого слоя невозможно надёжно эксплуатировать систему в продакшене.
| Инструмент | Назначение |
|---|---|
| Docker / Compose | Контейнеризация всех компонентов |
| Nginx | Reverse proxy, TLS, балансировка HTTP |
| Prometheus | Сбор метрик (CPU, RAM, calls, queue depth) |
| Grafana | Визуализация метрик, алерты |
| Loki | Агрегация логов из всех контейнеров |
| MinIO | S3-совместимое хранилище для записей разговоров |
| Certbot | Автоматическое обновление SSL-сертификатов |
| Ansible | Автоматизация развёртывания и конфигурации |
Docker Compose — ваш лучший друг на старте. Один файл docker-compose.yml поднимает ВСЮ систему. Для продакшена — переходите на Docker Swarm или Kubernetes, но начинайте с Compose.