Changelog

История изменений продукта и сайта.

v0.7.0

Полоса истории сигнала в строке каждой ONU и сортировка проблемных сверху

История сигнала с одного взгляда

В строке каждой ONU — и в таблице порта, и в общем списке устройств — появилась компактная полоса из цветных квадратов. Каждый квадрат — отрезок времени за последний месяц; цвет отражает качество сигнала в этот период: зелёный — норма, жёлто-красный — ослабление вплоть до потери, синий — пересвет, серый — данных за период не было. Полоса читается слева направо: левый квадрат — состояние прямо сейчас, дальше — всё более ранние периоды.

Это «гид активности» для оптики: видно, как сигнал у абонента вёл себя последний месяц. Неделю был красным, потом позеленел — линию починили; начал желтеть к правому краю — деградация развивается. При разборе жалобы «у меня периодически пропадает» не нужно открывать отдельный график — тренд виден прямо в строке.

Сортировка «худшие сигналы сверху»

На странице списка ONU добавлена сортировка по текущему качеству сигнала — клик по столбцу История сигнала поднимает наверх самые проблемные подключения. Важно: наверх попадают и слишком слабые, и пересвеченные ONU — обе крайности одинаково требуют внимания, поэтому ранжирование идёт по отклонению от нормы, а не просто по величине Rx.

Под капотом

  • Полоса строится по уже накопленной истории сигнала — продукт собирает её при штатном опросе, дополнительной нагрузки на OLT нет.
  • Только просмотр: никаких новых настроек, доступ — как у остальной таблицы ONU. Тёмная тема поддержана.

Документация: Анализ сигнала, UI: основные сценарии.

v0.6.0

Ручное редактирование города и названия OLT и данных абонента у ONU

Город и название OLT вручную

Раньше «Название» подтягивалось только из биллинга, а «Город» вычислялся автоматически по адресам абонентов. Теперь администратор правит оба поля прямо в карточке OLT — клик по значению, ввод, готово.

  • При вводе города всплывают подсказки из справочника населённых пунктов (города, посёлки, станицы, сёла) — меньше опечаток, единое написание по всему парку.
  • Заполненное вручную значение помечается ручным и автоматический пересчёт города его больше не трогает.
  • Очистили поле — оно снова под управлением автоматики. Никакого «вечного» переопределения.

Данные абонента у ONU вручную

В таблице ONU рядом с кнопкой обновления появился карандаш. По нему открывается окно правки данных абонента: номер договора, логин, ФИО, адрес, идентификаторы услуги и договора.

  • Полезно там, где источника обогащения нет или данные пришли неполными — можно дозаполнить руками.
  • Отредактированная ONU помечается значком замка и исключается из автоматического обогащения — ваши правки не затрутся при следующем прогоне источника.
  • Галочка «Защитить от автообогащения» в окне правки управляет этим: снимите её и сохраните, чтобы вернуть ONU под автоматику.

Под капотом

v0.5.0

Обогащение ONU: расписание по умолчанию, стабильный ключ шифрования и блок расписаний на «Планировщиках»

Добавлено

  • Автоматическое расписание у источников обогащения. При создании, изменении или запуске источника без заданного cron он получает ежедневное расписание (01:00) и автоматически включается. Больше не нужно вручную прописывать cron, чтобы обогащение ONU шло регулярно — достаточно сохранить источник.
  • Блок расписаний модулей на странице «Планировщики». Внизу страницы появился отдельный блок «Расписания модулей (только просмотр)»: показывает активные расписания обогащения (модуль, название, cron, следующий запуск) со ссылкой «Открыть раздел» на «Обогащение». Управление расписанием — в самом разделе обогащения; здесь только просмотр.

Исправлено

  • Открытие источника обогащения на редактирование больше не завершается ошибкой, если сменился ключ шифрования. Сообщения об ошибках секретов теперь на русском и подсказывают, что делать — открыть источник и ввести секреты заново.
  • Со страницы «Планировщики» убран нерабочий на self-hosted планировщик «синхронизация с биллингом» (показывается только если интеграция явно включена).

Безопасность

  • Стабильный ключ шифрования секретов обогащения (GETOLT_SECRET_KEY). Теперь он сохраняется между перезапусками и обновлениями: новые установки генерируют его автоматически и кладут в /opt/getolt/.env, bare-metal-установщик исправлен (раньше записывал ключ под другим именем, и приложение его не видело). Благодаря этому сохранённые пароли внешних БД в источниках обогащения переживают рестарт и обновление.
  • В разделе «Резервное копирование» уточнено: файл .env теперь критичен для бэкапа — без GETOLT_SECRET_KEY пароли источников обогащения не восстановить.

Важно для существующих Docker-установок

Чтобы новый ключ дошёл до контейнера, после обновления один раз обновите compose-файл:

Окно терминала
curl -fsSL -A "getolt-installer/1.0" https://get.getolt.online/docker-compose.client.yml -o /opt/getolt/docker-compose.yml
cd /opt/getolt && docker compose up -d --force-recreate app

update.sh теперь сам предупредит, если в текущем compose-файле не хватает проброса GETOLT_SECRET_KEY. После обновления у источников обогащения, созданных ранее, скорее всего потребуется один раз заново ввести пароли: прежние секреты были зашифрованы временным ключом и не восстанавливаются.

v0.4.2

Self-hosted без биллинга: флаги billing.*.enabled теперь честно отключают интеграции

Исправлено

  • Self-hosted без биллинга: фоновое обновление данных по OLT теперь действительно уважает флаги отключения биллинговых интеграций (billing.*.enabled=false). Раньше на установках без подключения к внешней биллинговой системе OLT, у которых в legacy-настройках был указан оператор, каждый цикл обновления уезжали в статус «ошибка» — сама связь по Telnet к железу была в порядке, но попытка обогатить данные ONU абонентскими записями падала на чтении конфига отключённой интеграции. Теперь, если интеграция выключена флагом, сервис обогащения просто возвращает пустой результат, а сам цикл обновления не прерывается. Пилоты, у которых билинг не подключён, увидят, что подобные OLT перестали мигать «ошибкой».

Интерфейс

  • На карточке OLT убрана дублирующая вкладка «Информация» в шапке — те же поля уже отображаются в верхнем блоке карточки.

Под капотом

  • Прошлись по кодовой базе и убрали накопившиеся предупреждения IDE (неиспользуемые импорты, лишние подавления, raw types) в нескольких десятках файлов. На внешнее поведение не влияет — улучшение читаемости и подготовка к более строгим статическим проверкам.
v0.4.1

Инфраструктура UI-driven обновлений готова (Phase 2)

Что нового

  • Docker канал: новый sidecar-контейнер getolt-updater слушает запросы на обновление и при появлении сигнала запускает update.sh (полный цикл: snapshot текущего образа, pull нового, online-бэкап БД, recreate, health-check, авто-rollback при неудаче).
  • Bare-metal канал: добавлена пара systemd-юнитов getolt-grade-updater.path + getolt-grade-updater.service.path следит за файлом-триггером, .service запускает upgrade.sh атомарно (jar swap с .bak, health-check, авто-rollback за 90 секунд).
  • На странице /update: блок «Статус обновления» показывает фазу (idle → downloading → applying → restarting → success/failed/rollback) с автообновлением каждые 3 секунды. Если обновление зависло — UI подскажет команду для проверки логов под ваш канал.
  • Защита от чужой инъекции: версия из запроса сверяется с записью на сервере лицензий и валидируется по формату; .update-request пишется только Java-приложением в root-owned каталог.

Поддержка платформ

  • Bare-metal на Debian 12 теперь устанавливается из коробки — install.sh сам подключает Eclipse Temurin для Java 21 и использует default-mysql-server (MariaDB-совместимый, drop-in для MySQL JDBC).
  • Ubuntu 22.04+ продолжает работать как прежде.

Сама кнопка пока выключена

Кнопка «Обновить сейчас» на странице /update по умолчанию disabled — в .env стоит UPDATE_AUTO_ENABLED=false. Это сделано осознанно: новый механизм должен сначала пройти этап dogfooding на нашей инфраструктуре, прежде чем разрешать его пилотам.

Сейчас доступно ровно то же что и раньше — ручной запуск update.sh (Docker) или upgrade.sh (bare-metal). Когда включим — отдельным минорным апдейтом, без вашего участия (флаг переключится у новых установок, существующие — продолжат работать как есть пока не поменяете .env вручную).

Если уже установлено

Существующие инсталляции получат новый sidecar при следующем запуске update.sh — он скачает обновлённый docker-compose.yml, добавит env-переменные GETOLT_CHANNEL / UPDATE_AUTO_ENABLED, поднимет sidecar. Если на старой инсталляции не было update.sh локально — install.sh либо ручной docker compose pull && up -d после обновления docker-compose.yml справятся одинаково.

Bare-metal: новые systemd-юниты приедут при следующем запуске upgrade.sh (он добавит их идемпотентно), либо командой curl -A "getolt-installer/1.0" -fsSL https://get.getolt.online/baremetal/upgrade.sh | sudo bash.

Откатиться к предыдущей версии можно одной командой — образ помечен как :rollback-prev, путь к команде в выводе update.sh.

v0.4.0

Уведомление о новой версии прямо в интерфейсе

Что нового

  • В шапке слева от плашки лицензии теперь появляется teal-плашка «↑ 2026.05.22…», когда сервер лицензий зарегистрировал релиз новее установленного.
  • Клик по плашке ведёт на страницу /update: текущая версия, доступная, дата выхода, ссылка на release notes (если есть) и точная команда обновления — update.sh для Docker compose или upgrade.sh для bare-metal.
  • Проверка идёт раз в сутки в составе phone-home heartbeat’а. Никаких внешних соединений сверх существующих.

Почему так

Self-hosted без сигнала «вышло обновление» = клиент залипает на старой версии месяцами. Раньше об апгрейде сообщали по почте после фактической установки у пилота — это плохой UX и не масштабируется.

Теперь баг-фиксы и улучшения видны без чтения changelog’а: появилась плашка → перешли по ссылке → запустили update.sh. Никакого автозапуска и принудительной перезагрузки — обновляете когда удобно.

Когда не показывается

  • На локальном dev-запуске (mvn spring-boot:run) — приложение само определяет себя как dev и не сравнивает версии.
  • Если сервер лицензий не отвечает — плашки нет (silent degradation).
  • Если установлено через старый installer без переменной GETOLT_CHANNEL — плашка появится, инструкция покажет команды для обоих каналов.

Что дальше

Авто-обновление по нажатию кнопки «Обновить сейчас» — отдельный релиз. Сейчас кнопка disabled, обновление запускается командой из инструкции на странице /update. Подробности — Обновление версий.

v0.3.1

Обновление self-hosted одной командой с автобэкапом и откатом

Обновление одной командой

  • curl -fsSL https://get.getolt.online/update.sh | sudo bash — официальный путь обновления self-hosted установки между релизами.
  • Скрипт идемпотентен: если образ в реестре не менялся с момента последнего апдейта, выходит без побочных эффектов. Безопасно вызывать по расписанию (cron) или в составе автоматизации.

Что делает скрипт

  • Снимает образ запущенного контейнера и тегает его как :rollback-prev — откат до прошлой версии одной командой, без правок YAML.
  • Делает онлайн-бэкап БД через mysqldump --single-transaction в /opt/getolt/backups/getolt-YYYY-MM-DD-HHMM.sql.gz, без даунтайма. Ротация — последние 7 снимков по умолчанию (override KEEP_BACKUPS=N).
  • Тянет новый образ, пересоздаёт только контейнер приложения (БД и reverse-proxy не трогаются).
  • Ждёт health-check на https://127.0.0.1/login до 3 минут.
  • При failure — автоматически разворачивает контейнер обратно на :rollback-prev, ждёт что прежний URL снова отдаёт 200, и сообщает где лежит снимок БД для ручного восстановления.

Откат вручную

Если обновление прошло, но через некоторое время понадобился откат:

Окно терминала
cd /opt/getolt
GETOLT_IMAGE=registry.getolt.online/getolt/getolt-grade:rollback-prev docker compose up -d app

Под капотом

  • Скрипт раздаётся через тот же CI-пайплайн что install.sh, ставится рядом в /var/www/getolt-releases/.
  • Перед каждым релизом артефакт прогоняется через bash -n и публичный curl-smoke — клиент не получит ломаный скрипт.
  • Документация: Обновление версий, Production-deploy → Обновление.
v0.3.0

Self-hosted установка готова к публичному запуску

Установка одной командой

  • Опубликован готовый Docker-образ в публичном реестре проекта — docker compose up -d поднимает приложение и базу без сборки из исходников.
  • Образ теги: плавающий :latest и фиксированный по коммиту — можно закрепиться на конкретной версии и обновляться по контролируемому графику.
  • Сценарий «развернул и забыл»: один сервер, один docker-compose, никаких внешних SaaS-зависимостей.

Первый вход без внешних каталогов

  • Учётная запись администратора — локальная, задаётся переменными GETOLT_ADMIN_USERNAME / GETOLT_ADMIN_PASSWORD в .env.
  • Если пароль не задан, GetOLT сгенерирует одноразовый при первом запуске и напечатает его в лог — удобно для первой обкатки без подготовки секретов.
  • Подключение к корпоративному каталогу пользователей по-прежнему доступно, но больше не является обязательным условием для запуска — можно начать пилот в изолированном контуре и подключить SSO позже.

Лицензирование

  • При первом старте экземпляр регистрируется на сервере лицензий проекта и получает ознакомительный период — функциональность доступна полностью, без отдельных шагов активации.
  • Состояние лицензии обновляется в фоне, не требует ручного действия инженера; для перехода на постоянную лицензию достаточно связаться с командой GetOLT.

Под капотом

  • Образ собирается и публикуется через CI/CD проекта — каждый зелёный pipeline на основной ветке готов к развёртыванию.
v0.2.0

История сигнала по абоненту и редизайн страницы OLT

История сигнала ONU

  • Append-only история Rx/Tx с привязкой к номеру договора (numDogovor), а не к MAC. Когда абонент меняет ONU — история не разрывается.
  • Запись пишется только при значимом изменении (|Δrx| ≥ 1.0 dBm или переход LOS↔значение) — не раздувает БД, видны только реальные события.
  • Доступно в UI карточки абонента, через REST API и через MCP-tool onu.signal_history для LLM-ассистента — типовой запрос «покажи как менялся сигнал у абонента N за неделю» теперь обрабатывается одним вызовом.
  • Кроме сэмплов отдаётся агрегат: minRx / maxRx / avgRx / losTransitions и классификация уровня (good / medium / poor / los / overexposed). Видно, как сигнал просел перед отключением — для опережающей диагностики.

Редизайн страницы /olts

  • Foundation: единая палитра, типографика и токены — отвязались от унаследованных стилей предыдущей версии сервиса.
  • Карточки качества сигнала сверху страницы — мгновенно видно сколько OLT в зелёной / жёлтой / красной зоне, без скролла по таблице.
  • Sticky-поиск при прокрутке длинного списка.
  • Тёмная тема: подсветка строк ONU по уровню Rx (warning / error / overexposed) согласована со светлой палитрой; td:hover больше не «вспыхивает» белой подложкой.
  • Чистка action-кнопок в config-history: ghost-стиль вместо «карточных» групп — меньше визуального шума на странице с десятками версий конфига.

LLM-ассистент

  • Реже промахивается мимо config.search для запросов вида «где настроен VLAN N» — раньше уходил в olt.list и не находил.
  • Защита от пустого data.export после транслитерации параметров — больше не возвращает пустой ответ при опечатке в имени поля.

Под капотом

  • Миграции схемы БД — single source через DatabaseInitializer (Flyway убран). Меньше движущихся частей при первом старте.
v0.1.3

Рабочая форма обратной связи + новый знак GetOLT(*);

Что изменилось

  • Контактная форма заработала по-настоящему: вместо редиректа-заглушки /thanks теперь POST /api/contact с серверной валидацией и отправкой через SMTP. Письма падают на корпоративный ящик, в Reply-To — email отправителя, чтобы отвечать одним нажатием. Видны успех/ошибка и пер-полевые подсказки прямо в форме, без перезагрузки страницы.
  • Логотип в шапке и футере заменён: вместо пустого бирюзового квадрата — сам знак-марк (тот, что во вкладке-фавиконе) рядом с моно-вордмарком GetOLT(*);. В шапке справа от лого — медленно мерцающий зелёный индикатор ● online, как лампочка статуса на сетевом устройстве.

Под капотом

  • Лендинг переключён на Astro hybrid SSR (@astrojs/node standalone). Статические страницы остались статикой, серверный — только эндпоинт формы.
  • Образ Docker пересобран: вместо nginx — Node 24, внутренний порт 3000. Внешняя точка входа (reverse-proxy на хосте) не меняется.
v0.1.2

A11y-фикс палитры и настоящий OG-image

Что изменилось

  • Палитра: brand #0EA5A4#0F766E (teal-700). Контраст белого текста на брендовых кнопках/бейджах — 5.34:1 (было 3.02:1, ниже WCAG AA). brand-hover#115E59. brand-accent (#5EEAD4) для тёмных фонов оставлен.
  • Starlight ссылки: добавлено text-decoration: underline для inline-ссылок в docs — раньше link-in-text-block падал на любом цвете. Переопределены --sl-color-accent для light/dark тем под бренд.
  • Тёмные секции: text-ink-500text-ink-400/300 в ContactForm-дисклеймере и Screenshot-плейсхолдере (контраст 3.07/3.75:1 → 4.7/8.6:1).
  • Тест a11y ужесточён: блокирует critical + serious (раньше — только critical), параметризован по 3 страницам (/, /intro/what-is-getolt/, /changelog). Все зелёные.
  • OG-image: 1×1 placeholder PNG → реальная карточка 1200×630 через scripts/gen-og.mjs (Sharp + SVG, без ImageMagick).

Документация

  • docs/lighthouse-targets.md переписан: вместо «известных contrast-проблем» — таблица «было/стало».
  • docs/learnings.md — раздел про contrast обновлён (отмечено «РЕШЕНО»), добавлен раздел про OG-image и про workflow Playwright-скриншотов авторизованных сервисов.
  • docs/visual-language.md — палитра пересобрана с явными контрастами и контраст-правилами.
  • Новые файлы: docs/olt-service-redesign-brief.md (ТЗ на правки дизайна основного сервиса OLT), docs/todo.md (хвосты после редизайна, Lighthouse-прогон, mobile-проверка).
v0.1.1

Чистка публичного контента

Что изменилось

  • Убраны конкретные имена LLM-движков (Ollama, OpenAI, ChatGPT) из лендинга, FAQ, документации и Hero. На сайте — только обобщённое «LLM», «AI-ассистент». Параметры подключения движка согласуются индивидуально при внедрении.
  • Удалены устаревшие границы по числу абонентов (1 000 – 30 000, до 50 OLT и 30 000 ONU). На лендинге — «для FTTH-операторов любого размера»; в FAQ — «реальные инсталляции обслуживают 100 000+ абонентов».
  • Скрыты конкретные API-лимиты в документации (200 OLT и 50 совпадений за запрос → «лимиты задаются в конфигурации»).
  • Расширено решение в первой паре «боль → решение»: подсветка REST-интеграции в биллинг и поиска ONU по телефону, когда подгружены биллинговые данные.

Документация для разработчиков

  • Добавлен docs/learnings.md — версионная матрица Astro 4 ↔ интеграции, Starlight gotchas, контентные правила.
  • Расширен docs/content-strategy.md разделом «Запрещённое в публичном контенте».
v0.1.0

Публикация лендинга и документации

Что добавилось

  • Публичный лендинг с описанием продукта, поддерживаемого железа, цен и FAQ
  • Документация по разделам: Введение, Установка, Настройка, Эксплуатация, Интеграции, Для разработчиков
  • Форма обратной связи

Что внутри продукта на этот момент

  • Поддержка GateRay, BdCom, CData EPON/GPON
  • REST API + MCP-сервер
  • LLM-чат поверх данных
  • Тепловая карта сигнала ONU