Масштаб задачи: от станций к потоку данных
85 000 станций — это не «85 тысяч графиков», а миллионы одновременных потоков телеметрии в секунду. Именно способность кода держать такой объём — ядро предложения. Ниже — проектная оценка нагрузки установившегося режима.
Архитектура высоких нагрузок
Платформа спроектирована «ячейками»: страна делится на региональные контуры, каждый обрабатывает свой поток независимо и горизонтально масштабируется. Никакого единого узкого места — добавляем узлы, а не переписываем систему.
MQTT-кластер
Брокер масштабируется горизонтально (EMQX-класс); шлюзы станций подключаются по TLS 8883 с индивидуальными учётными данными. Компактный протокол (CBOR) снижает трафик в разы.
Stateless-воркеры
Приём, нормализация, пороги и правила — на масштабируемых воркерах без состояния. Батч-запись, обратное давление (backpressure) и очереди сглаживают пики без потерь.
Временные ряды
TimescaleDB: гипертаблицы, колоночное сжатие ×10–20, непрерывные агрегаты (1 мин/1 ч/1 сут). Горячие данные — быстро, холодные — дёшево, годы истории под контролем объёма.
Шлюз со store-and-forward
Полевой шлюз читает инверторы локально (Modbus/RS-485) и копит данные при обрыве связи, досылая после восстановления. Ни одна точка не теряется при сбое канала.
Живой поток (SSE)
Диспетчер видит состояние в реальном времени; сервер шлёт только изменения. Рейтинг объектов, карта, алерты и отчёты — из одного потока.
Ячейки по регионам
Каждая область — отдельный контур. Нагрузка одного региона не влияет на другой; охват наращивается добавлением ячеек на дешёвом железе.
Проектная пропускная способность (иллюстрация сайзинга)
Отказоустойчивость
Национальный контур не имеет права «упасть целиком». Заложены резервирование на каждом слое, автоматический переход на резерв и защита от потери данных при любом сбое — сети, узла или ЦОД.
Active-active узлы
Каждый слой — брокер, воркеры, БД — дублирован. Падение узла не роняет сервис: нагрузка перетекает на резерв автоматически.
Store-and-forward + репликация
Шлюзы копят при обрыве, БД реплицируется, тиражные бэкапы — в контуре РУз. Обрыв канала или узла = задержка, а не потеря.
Региональные ячейки
Инцидент в одном регионе локализован в его ячейке; остальные области работают штатно. «Взрывной радиус» ограничен.
Самомониторинг
Платформа следит за собой: связь шлюзов (LWT), задержки, очереди, здоровье узлов — с алертами оператору до того, как заметит пользователь.
Региональные ячейки — пример охвата
Безопасность и суверенитет данных
Ключевое требование — данные и управление энергообъектами остаются в Республике. Мы буквально строим «не как у Solarman/Deye»: без облака зарубежного вендора, с защитой по слоям и полным аудитом.
Периметр — серверы Узбекистана
Развёртывание on-premise в ЦОД Республики. Телеметрия, координаты станций и персональные данные не покидают страну — соответствие требованиям локализации данных РУз. Возможен изолированный (air-gapped) контур для критичных объектов.
Шифрование в канале и на диске
MQTT-TLS 8883 от шлюза до брокера, HTTPS для интерфейса, шифрование БД at-rest. Компрометация канала или носителя не раскрывает данные.
Доступ по ролям и объектам
RBAC: министерство видит агрегат по стране, регион — свою область, владелец — свои станции. Никаких API-ответов с координатами вне зоны доступа (именно на этом «погорел» Solarman).
Управление — с двойной защитой
Команды на объект — только для роли с правом, с подтверждением, ack и read-back; никогда «вслепую» при потере связи. Полный журнал команд и событий для аудита.
Без хардкод-учёток и предсказуемых токенов
Сессии с криптоподписью, пароли — стойкий хэш, индивидуальные учётные данные на каждый шлюз, одноразовые приглашения. Регулярный аудит и пентест до ввода в промышленную эксплуатацию.
Что проверено в бою и что разворачиваем под контракт
Честная граница. Ядро платформы уже работает и управляет реальным железом — это фундамент. Национальный отказоустойчивый контур на 85 000 объектов строится под задачу по описанной выше архитектуре.
- ядро: MQTT-приём, хранение, REST/SSE, роли и мультитенант;
- реальные BMS/энергообъекты через мост, живые дашборды;
- сквозное управление реле на боевой плате (< 1 с);
- пороги/алерты, движок правил ЕСЛИ..ТО, астро-автоматика;
- прогноз разряда АКБ, рейтинг объектов, отчёты в мессенджер;
- суверенность как принцип: данные на наших серверах, локальный шлюз.
- переход node:sqlite → TimescaleDB (гипертаблицы, сжатие, агрегаты);
- MQTT-кластер + TLS 8883, компактный протокол (CBOR);
- active-active узлы, автоматический failover, репликация;
- региональные ячейки и шардинг по областям;
- бэкапы в контуре РУз, самомониторинг, runbook;
- нагрузочные испытания на профиле 85 000 станций, пентест.
План развёртывания: от пилота к нации
Снижаем риск поэтапно: сначала доказываем на пилотном регионе и нагрузочном стенде, затем масштабируем ячейками до полного охвата. Каждая фаза — измеримый результат.
Пилотный регион + стенд
- развёртывание в ЦОД РУз, одна региональная ячейка;
- подключение первых парков и кровельных СЭС через шлюзы;
- нагрузочный стенд с эмуляцией 85 000 станций.
Отказоустойчивый контур
- TimescaleDB, MQTT-кластер, active-active, репликация, бэкапы;
- TLS 8883 на боевых шлюзах, шифрование at-rest;
- пентест и приёмо-сдаточные нагрузочные испытания.
Региональное масштабирование
- развёртывание ячеек по областям, шардинг;
- ролевой доступ: министерство / регион / владелец;
- интеграция с диспетчерскими и отчётность генерации.
Национальный охват + развитие
- полный охват до 85 000 станций, единая картина по стране;
- прогнозы генерации, предиктивное ТО, авто-сценарии;
- интеграция ERP/SCADA, мобильный доступ владельцам.
Почему мы
Данные в Узбекистане
Не облако вендора, а платформа на серверах Республики. Прямой ответ на риски утечки координат и удалённого отключения через чужое облако (уроки Solarman/Deye, 2024).
Спроектировано на миллионы
Лёгкое ядро + ячеистая архитектура: горизонтальный рост на дешёвом железе вместо дорогой проектной SCADA «под ключ».
Работающее ядро, не слайды
Платформа уже в проде и управляет реальным железом. Национальный контур — инженерное масштабирование доказанной основы, а не разработка с нуля.