Что изменилось
Список доработок дашборда — на человеческом языке. Каждый блок отвечает на вопрос «что это даёт вам как пользователю / администратору».
Полная переработка денежного потока, архитектуры и тестового покрытия. Внешне ничего не поменялось — внутри дашборд стал в разы надёжнее.
💰 Деньги
- Платежи и реферальные комиссии теперь атомарны. Когда клиент оплачивает счёт, его баланс, журнал движений и комиссия реферера обновляются в одной транзакции БД. Если что-то прервётся посередине (сетевой сбой, рестарт процесса) — ничего не сохранится частично. Раньше реферальная комиссия писалась отдельным запросом за пределами транзакции — при крайне редком, но возможном падении между ними бухгалтерия расходилась.
- Журнал движений (
billing_ledger) стал единственным источником истины. Старая таблица payments переведена в режим «только чтение» — все новые платежи попадают через журнал, дубликатов больше нет.
- Защита от стирания свежих клиентских записей. Раньше сохранение списка клиентов работало по принципу «снести всё и записать заново» — в редкой ситуации могла затереться только что записанная строка устаревшим in-memory снапшотом. Теперь сохранение идёт аддитивно — только новые/изменённые поля.
- Дубликаты ежедневных списаний защищены индексом. Уникальный индекс на
(client_id, date, type='charge') — повторное списание за тот же день возвращает {duplicate: true} вместо двойного снятия.
Зачем это: деньги — это то, где ошибиться нельзя. Раньше при определённых стечениях обстоятельств можно было получить расхождение между балансом клиента, журналом и комиссией партнёра. Теперь это невозможно — либо все три записи прошли, либо ни одна.
🤖 ИИ-сводка в Telegram
- Ежедневный анализ от Claude Opus 4.7. Каждое утро в 08:00 МСК после обычной сводки прилетает блок «🔍 ИИ-анализ за день» — с интерпретацией ключевых метрик, конкретными проблемами и рекомендациями.
- Защита от пустых сводок. Бюджет токенов поднят с 4К до 32К — adaptive thinking успевает рассуждать. Раньше при сложных днях модель тратила весь бюджет на размышления и возвращала пустой ответ.
- Диагностика причин ошибок. Если ИИ вернул пустой ответ — в логи теперь пишется ровно почему (упёрся в лимит, ошибка авторизации, перегрузка API).
🏗 Архитектура
- Единый файл
server.js (11 тыс. строк) разбит на 18 модулей-роутеров. Раньше всё лежало в одном месте, любая правка задевала случайные участки. Теперь auth / clients / billing / tochka / traffic / analytics / sla / proxies / simulator живут отдельно — править проще и риск зацепить чужое ушёл.
- SQL-запросы вынесены в 5 репозиториев
src/db/*. Все обращения к БД проходят через осмысленные функции вместо инлайн-SQL по всему коду.
- Состояние централизовано в
src/state/index.js. Раньше клиенты лежали в одной переменной, реферальные карты в другой, in-memory mirror журнала — в третьей. Любое расхождение давало баги вида «в БД одно, в ответе API другое».
- 168 HTTP-эндпоинтов зафиксированы snapshot-тестом. Случайно удалить или переименовать ручку теперь не выйдет — тест падает.
🔒 Безопасность и качество
- Восстановлен Content Security Policy. Браузер разрешает выполнять только наши скрипты + Chart.js, всё остальное блокируется на уровне политики — защита от XSS.
- Ключ шифрования Tochka теперь обязателен. Раньше при отсутствии переменной
$TOCHKA_CONFIG_KEY сервер делал производный ключ из имени хоста — при переезде на новый хост шифрование могло порваться. Теперь сервер просто откажется стартовать без явного ключа.
- Все 44 «глухих»
catch получили реакцию. Раньше ошибки могли молча проглатываться, теперь либо обрабатываются, либо пишутся в лог с уровнем warn/error.
- ESLint 9 в строгом режиме, 0 ошибок. Кодовая база автоматически проверяется на типичные опасные паттерны.
- 102 регрессионных теста. Покрывают денежный поток, аутентификацию, клиентский портал, веб-хуки Точки, миграции схемы.
⚙️ Эксплуатация
- Безопасная запись файлов. Утечек состояния через unhandled promise rejection больше нет — все записи проходят через
safeWriteFile.
- Документация эксплуатации. Добавлен
OPERATIONS.md с полной картой состояния: что в SQLite, что в JSON-файлах, как делать бэкап, что нельзя коммитить в git.
- Совместимость с Node 20. Зависимости перепинованы под прод-окружение (Node 20.20),
engine-strict в .npmrc блокирует установку несовместимых пакетов.
Симулятор нагрузки, ИИ-инсайты, перестройка вкладки аналитики, защита от потери данных.
🧪 Симулятор нагрузки
- Имитация наплыва трафика на выбранные модемы: режимы ramp (плавный рост), burst (резкий всплеск), breaking-point (поиск предельной нагрузки).
- Сравнение прогонов между собой, экспорт результатов, разбивка по каждому модему.
- История запусков сохраняется — можно посмотреть как менялась устойчивость инфраструктуры со временем.
📊 Перестройка вкладки «Аналитика»
- 5 подвкладок: Трафик, Инфраструктура (ротации + ёмкость + IP в одном месте), Доходность и др.
- Удалены лишние блоки: «Планирование», «Логи доменов», «Последние неудачи в ротации».
- Системный лог переехал в «Настройки» → «Состояние сервера».
- Единая таблица модемов с разделителями по серверам + bulk-выбор по серверу через одну галочку.
❤️ Здоровье модемов
- Новый health-score с порогом 5% ошибок, ступенчатой шкалой латентности, учётом длительности ротации.
- Колонка «Здоровье» в общей таблице модемов + детальный разбор в модалке модема.
- Аптайм считается по поллингу tracking'а (а не по UDEV драйверов ядра) — точнее.
- Сглаживание неоднозначных часовых записей (uncertain=2) в часовом агрегаторе.
- Сброс счётчиков в 03:00 МСК больше не даёт ложных нулей.
🛡 Защита от потери данных серверов
- Метаданные серверов (S1, S2 и др.) теперь имеют версионную историю в
kv_store_history.
- Помощник
kvSetCritical блокирует случайное уменьшение списка серверов (защита от ситуации «случайно стерли S2»).
- Стартовая проверка целостности с baseline-сравнением — если в БД пропали критичные ключи, сервер сообщит.
💸 Биллинг + SLA
- Исправлено race condition в начислении дневных списаний.
- Добавлен SLA-tracking — учёт нарушений по доступности.
- Аудит-лог использования API + системная вкладка с обзором процессов.
Расширенный мониторинг прокси, авто-восстановление модемов, развёрнутая документация.
📡 Мониторинг
- Замер задержки прокси. Через каждый порт регулярно прогоняется проверка — фиксируется connect-time и общее время ответа.
- Аналитика по латентности: P75, P99, распределение, percentile cards в детальной модалке модема.
- Bulk-операции: массовый сброс IP, ребут, OS Spoofing, ротация, экспорт — для выбранных модемов сразу.
🔧 Авто-восстановление
- Авто-USB-reset для модемов, ушедших в оффлайн (вместо ручного дёрганья портов).
- 9 точечных багфиксов: ротация, парсинг трафика, IP-история.
📝 Логирование
- Полное логирование всех автоматических процессов (cron, билинг, ротация, ребуты) — теперь видно когда и почему сработал каждый автомат.
- Развёрнутый README с описанием всех функций дашборда.
Конфигурация серверов переехала из .env в базу — управление через UI без перезапусков.
🗄 Изменения
- Список серверов и стран хранится в SQLite (
kv_store) — добавлять/убирать серверы можно из настроек без правки .env и рестарта.
- Часовой агрегатор трафика версии 2 — корректнее работает с пропусками и поздними записями.
- Поддержка серверов S3 и S4 в клиентском портале (прокси-креды, IP-адреса, фильтры).
- Динамические COUNTRIES — флаги стран и группировки автоматически подтягиваются из объектов сервера.
UI для управления серверами + поддержка переименования портов на разных моделях.
🛠 Изменения
- Раздел «Серверы» в настройках — добавление/редактирование/удаление прямо из UI.
- Переменная
PORTNAME_OVERRIDE для серверов без поддержки переименования портов.
- Слияние конфигурации порта при
store_port — не теряет ранее заданные поля.
- Корректная инвалидация кэша после изменения конфигурации модема.