diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index c10cf61d..79d961b4 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -1,6 +1,6 @@ # UX/UI: протокол внешней приёмки 12.5 -Актуальное продолжение 2026-10-11: завершён12.5.144 — исправлен dual-stack IPFIX при zero IPv4 placeholders; реальный UDP→worker→SQL passed:6 IPv6 rows,25200B/42 packets raw/minute,7200B/12 Internet facts.21 local scripts exit0 с честными skips;984 outputs matched. Backend ux-ipfix144/frontend ux-traffic141. Далее145 — native RouterOS IPv6 exporter и populated API/UI, если конфигурация стенда позволяет.12.5 открыт. +Актуальное продолжение 2026-10-11: завершён12.5.145 — native CHR IPv6 ULA→IPFIX→production worker/SQL/API→frontend Sessions подтверждён; Ping5/5×2, PC/mobile DOM/API/no-overflow passed. Initial cleanup GET401 сохранён, recovery удалил2 exact-owned objects;12 collections×2/configs restored, own DB/container/ports/tunnel удалены. Backend ux-ipfix144/frontend ux-traffic141. Далее146 — понятные ICMPv6/IPv6 endpoint labels;12.5 открыт. IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md). @@ -696,7 +696,7 @@ flowchart LR ## 12.5.77 — основной блок IPsec (2026-10-09) -Актуальное продолжение 2026-10-11: завершён12.5.144 — исправлен dual-stack IPFIX при zero IPv4 placeholders; реальный UDP→worker→SQL passed:6 IPv6 rows,25200B/42 packets raw/minute,7200B/12 Internet facts.21 local scripts exit0 с честными skips;984 outputs matched. Backend ux-ipfix144/frontend ux-traffic141. Далее145 — native RouterOS IPv6 exporter и populated API/UI, если конфигурация стенда позволяет.12.5 открыт. +Актуальное продолжение 2026-10-11: завершён12.5.145 — native CHR IPv6 ULA→IPFIX→production worker/SQL/API→frontend Sessions подтверждён; Ping5/5×2, PC/mobile DOM/API/no-overflow passed. Initial cleanup GET401 сохранён, recovery удалил2 exact-owned objects;12 collections×2/configs restored, own DB/container/ports/tunnel удалены. Backend ux-ipfix144/frontend ux-traffic141. Далее146 — понятные ICMPv6/IPv6 endpoint labels;12.5 открыт. Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md). @@ -1553,3 +1553,17 @@ Unknown0/0 policy основана на наблюдённом live ответе Backend ux-ipfix144 развёрнут, health healthy; frontend ux-traffic141 сохранён. Live traffic1440/320 passed без initial srv1/400, page errors/overflow. Rollback env/image оставлены. [Все попытки и границы](ux-ui/acceptance/ipv6-ipfix-worker-sql-2026-10-11.json), [browser smoke](ux-ui/acceptance/traffic-ipfix-smoke-2026-10-11.json). Это real UDP/worker/SQL path с синтетическим exporter через IPv4 loopback transport, не native RouterOS IPv6 export/outer transport и не maximum throughput. CHR configuration/passwords не менялись. Следующий145 — проверить возможность native RouterOS IPv6 exporter и populated API/UI на собственных objects/DB.12.5 открыт. + +## 12.5.145 — настоящий RouterOS IPv6 IPFIX и заполненный интерфейс (2026-10-11) + +Оба CHR доступны с прежними credentials, RouterOS7.24.5. Исходно Traffic Flow disabled/targets empty. Созданы собственные GRE-пара с allow-fast-path=false и fd00:145:1::1/2/64, advertise=no. CHR1 временно экспортирует IPFIX только своего GRE, с short timeouts/one owned target. Native Ping прошёл5/5 в обе стороны; CPU/input-output path и IPv6 support сверены с [официальным Traffic Flow manual](https://manual.mikrotik.com/docs/diagnostics-monitoring-and-troubleshooting/traffic-flow/), версия manual7.26, фактическая проверка7.24.5. + +На Debian запущен отдельный application/production collector worker в own temporary PostgreSQL DB. Скопирована конфигурация только CHR1 без публикации credentials; worker слушает UDP48145, HTTP API доступен только через localhost18145/SSH. Native RouterOS sender, не synthetic fixture, передал IPv6 IPFIX records: production API содержит реальные ULA source/destination и positive bytes/packets. Deployed frontend ux-traffic141 проверен через явный relay реальных ответов отдельного backend: Sessions DOM содержит IPv6, PC1440/mobile320 API200/pageerror0/no document overflow. Screenshots сохраняют frame/current scroll position, не все строки одновременно. Initial UI attempts искали адрес на Applications summary и ошибочно выбирали button вместо actual tab; исправлено только обращение к существующей вкладке. + +Тест не использовал main DB для seeded fixtures; обычный background polling главного приложения оставался активным, поэтому абсолютное отсутствие background writes не заявляется. IPsec/WireGuard keys, пароли, исходные public/default/metadata routes не менялись. Native objects/GRE/IPv6 inputs принадлежат одному unique tag. + +Автоматическая очистка восстановила Traffic Flow и удалила objects CHR1, но GET собственного GRE по ID на CHR2 вернул401. Child drain прошёл, own DB удалена. Read-only resource и полный каталог обоих CHR снова доступны с теми же credentials; причина одиночного GET401 не установлена, пароль не менялся. Recovery по свежему полному каталогу проверил exact comment/name/local-remote/address и отсутствие IDs в baseline; удалены только два оставшихся objects CHR2 обычным DELETE. Все12 collection projections×2 и Traffic Flow/IPFIX fields/IPv6 settings совпали с исходными. Initial failure и recovery сохранены, не заменены гладким success. + +Own container удалён после проверки exact container ID; UDP48145/HTTP18145 и отдельный SSH tunnel закрыты, основной стенд backend ux-ipfix144/frontend ux-traffic141 healthy. Начальный неверный host port81245 был отвергнут до запуска/изменений, исправлен18145. [Native/API/cleanup receipt](ux-ui/acceptance/native-ipv6-ipfix-2026-10-11.json), [UI receipt](ux-ui/acceptance/native-ipv6-ipfix-ui-2026-10-11.json), [PC screenshot](ux-ui/screens/native-ipv6-ipfix145-1440-2026-10-11.png), [mobile screenshot](ux-ui/screens/native-ipv6-ipfix145-320-2026-10-11.png). + +Доказан IPv6 ULA inner/native IPFIX поверх IPv4 GRE/export transport, не public IPv6 WAN/outer или throughput/произвольные clients. На live UI ICMPv6 подписан numeric58, IPv6 endpoints с портом требуют однозначного bracket format; следующий146 — улучшить эти подписи, сохранив ReUI/Frame/base-nova.12.5 открыт. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 2a72bcb8..7dae719b 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,12 +1,12 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-11: завершён12.5.144 — исправлен dual-stack IPFIX при zero IPv4 placeholders; реальный UDP→worker→SQL passed:6 IPv6 rows,25200B/42 packets raw/minute,7200B/12 Internet facts.21 local scripts exit0 с честными skips;984 outputs matched. Backend ux-ipfix144/frontend ux-traffic141. Далее145 — native RouterOS IPv6 exporter и populated API/UI, если конфигурация стенда позволяет.12.5 открыт. +Актуальное продолжение 2026-10-11: завершён12.5.145 — native CHR IPv6 ULA→IPFIX→production worker/SQL/API→frontend Sessions подтверждён; Ping5/5×2, PC/mobile DOM/API/no-overflow passed. Initial cleanup GET401 сохранён, recovery удалил2 exact-owned objects;12 collections×2/configs restored, own DB/container/ports/tunnel удалены. Backend ux-ipfix144/frontend ux-traffic141. Далее146 — понятные ICMPv6/IPv6 endpoint labels;12.5 открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-10. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. ## Актуальная точка продолжения — 2026-10-10 -Актуальное продолжение 2026-10-11: завершён12.5.144 — исправлен dual-stack IPFIX при zero IPv4 placeholders; реальный UDP→worker→SQL passed:6 IPv6 rows,25200B/42 packets raw/minute,7200B/12 Internet facts.21 local scripts exit0 с честными skips;984 outputs matched. Backend ux-ipfix144/frontend ux-traffic141. Далее145 — native RouterOS IPv6 exporter и populated API/UI, если конфигурация стенда позволяет.12.5 открыт. +Актуальное продолжение 2026-10-11: завершён12.5.145 — native CHR IPv6 ULA→IPFIX→production worker/SQL/API→frontend Sessions подтверждён; Ping5/5×2, PC/mobile DOM/API/no-overflow passed. Initial cleanup GET401 сохранён, recovery удалил2 exact-owned objects;12 collections×2/configs restored, own DB/container/ports/tunnel удалены. Backend ux-ipfix144/frontend ux-traffic141. Далее146 — понятные ICMPv6/IPv6 endpoint labels;12.5 открыт. Этапы0–11 завершены в локальных границах журнала. История выполненных внешних блоков и доказательства сохранены в [журнале](ux-ui-stage-12.md) и [протоколе](ux-ui-external-acceptance.md). Реальная Telegram доставка, Portal SSO, multi-instance и оставшиеся профильные сетевые ограничения открыты. @@ -371,6 +371,6 @@ flowchart LR ## 12.5.77 — основной блок IPsec (2026-10-09) -Актуальное продолжение 2026-10-11: завершён12.5.144 — исправлен dual-stack IPFIX при zero IPv4 placeholders; реальный UDP→worker→SQL passed:6 IPv6 rows,25200B/42 packets raw/minute,7200B/12 Internet facts.21 local scripts exit0 с честными skips;984 outputs matched. Backend ux-ipfix144/frontend ux-traffic141. Далее145 — native RouterOS IPv6 exporter и populated API/UI, если конфигурация стенда позволяет.12.5 открыт. +Актуальное продолжение 2026-10-11: завершён12.5.145 — native CHR IPv6 ULA→IPFIX→production worker/SQL/API→frontend Sessions подтверждён; Ping5/5×2, PC/mobile DOM/API/no-overflow passed. Initial cleanup GET401 сохранён, recovery удалил2 exact-owned objects;12 collections×2/configs restored, own DB/container/ports/tunnel удалены. Backend ux-ipfix144/frontend ux-traffic141. Далее146 — понятные ICMPv6/IPv6 endpoint labels;12.5 открыт. Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md). diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 1f74ff47..33736850 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-11: завершён12.5.144 — исправлен dual-stack IPFIX при zero IPv4 placeholders; реальный UDP→worker→SQL passed:6 IPv6 rows,25200B/42 packets raw/minute,7200B/12 Internet facts.21 local scripts exit0 с честными skips;984 outputs matched. Backend ux-ipfix144/frontend ux-traffic141. Далее145 — native RouterOS IPv6 exporter и populated API/UI, если конфигурация стенда позволяет.12.5 открыт. +Актуальное продолжение 2026-10-11: завершён12.5.145 — native CHR IPv6 ULA→IPFIX→production worker/SQL/API→frontend Sessions подтверждён; Ping5/5×2, PC/mobile DOM/API/no-overflow passed. Initial cleanup GET401 сохранён, recovery удалил2 exact-owned objects;12 collections×2/configs restored, own DB/container/ports/tunnel удалены. Backend ux-ipfix144/frontend ux-traffic141. Далее146 — понятные ICMPv6/IPv6 endpoint labels;12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -36,7 +36,21 @@ | 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 | | 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 | | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | -| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–144 и ограничения ниже. Runtime backend ux-ipfix144/frontend ux-traffic141. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–145 и ограничения ниже. Runtime backend ux-ipfix144/frontend ux-traffic141. | + +## 12.5.145 — настоящий RouterOS IPv6 IPFIX и заполненный интерфейс (2026-10-11) + +Оба CHR доступны с прежними credentials, RouterOS7.24.5. Исходно Traffic Flow disabled/targets empty. Созданы собственные GRE-пара с allow-fast-path=false и fd00:145:1::1/2/64, advertise=no. CHR1 временно экспортирует IPFIX только своего GRE, с short timeouts/one owned target. Native Ping прошёл5/5 в обе стороны; CPU/input-output path и IPv6 support сверены с [официальным Traffic Flow manual](https://manual.mikrotik.com/docs/diagnostics-monitoring-and-troubleshooting/traffic-flow/), версия manual7.26, фактическая проверка7.24.5. + +На Debian запущен отдельный application/production collector worker в own temporary PostgreSQL DB. Скопирована конфигурация только CHR1 без публикации credentials; worker слушает UDP48145, HTTP API доступен только через localhost18145/SSH. Native RouterOS sender, не synthetic fixture, передал IPv6 IPFIX records: production API содержит реальные ULA source/destination и positive bytes/packets. Deployed frontend ux-traffic141 проверен через явный relay реальных ответов отдельного backend: Sessions DOM содержит IPv6, PC1440/mobile320 API200/pageerror0/no document overflow. Screenshots сохраняют frame/current scroll position, не все строки одновременно. Initial UI attempts искали адрес на Applications summary и ошибочно выбирали button вместо actual tab; исправлено только обращение к существующей вкладке. + +Тест не использовал main DB для seeded fixtures; обычный background polling главного приложения оставался активным, поэтому абсолютное отсутствие background writes не заявляется. IPsec/WireGuard keys, пароли, исходные public/default/metadata routes не менялись. Native objects/GRE/IPv6 inputs принадлежат одному unique tag. + +Автоматическая очистка восстановила Traffic Flow и удалила objects CHR1, но GET собственного GRE по ID на CHR2 вернул401. Child drain прошёл, own DB удалена. Read-only resource и полный каталог обоих CHR снова доступны с теми же credentials; причина одиночного GET401 не установлена, пароль не менялся. Recovery по свежему полному каталогу проверил exact comment/name/local-remote/address и отсутствие IDs в baseline; удалены только два оставшихся objects CHR2 обычным DELETE. Все12 collection projections×2 и Traffic Flow/IPFIX fields/IPv6 settings совпали с исходными. Initial failure и recovery сохранены, не заменены гладким success. + +Own container удалён после проверки exact container ID; UDP48145/HTTP18145 и отдельный SSH tunnel закрыты, основной стенд backend ux-ipfix144/frontend ux-traffic141 healthy. Начальный неверный host port81245 был отвергнут до запуска/изменений, исправлен18145. [Native/API/cleanup receipt](ux-ui/acceptance/native-ipv6-ipfix-2026-10-11.json), [UI receipt](ux-ui/acceptance/native-ipv6-ipfix-ui-2026-10-11.json), [PC screenshot](ux-ui/screens/native-ipv6-ipfix145-1440-2026-10-11.png), [mobile screenshot](ux-ui/screens/native-ipv6-ipfix145-320-2026-10-11.png). + +Доказан IPv6 ULA inner/native IPFIX поверх IPv4 GRE/export transport, не public IPv6 WAN/outer или throughput/произвольные clients. На live UI ICMPv6 подписан numeric58, IPv6 endpoints с портом требуют однозначного bracket format; следующий146 — улучшить эти подписи, сохранив ReUI/Frame/base-nova.12.5 открыт. ## 12.5.144 — IPv6 IPFIX через UDP, production worker и PostgreSQL (2026-10-11) diff --git a/docs/ux-ui-remaining-acceptance.md b/docs/ux-ui-remaining-acceptance.md index 113e88e9..3bbdac43 100644 --- a/docs/ux-ui-remaining-acceptance.md +++ b/docs/ux-ui-remaining-acceptance.md @@ -1,6 +1,6 @@ # Оставшаяся внешняя приёмка — 2026-10-11 -Это актуальная матрица после 12.5.144. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. +Это актуальная матрица после 12.5.145. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-ipfix144`, frontend `ux-traffic141`; production lab использует AUTH_REQUIRED=false. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. @@ -17,8 +17,8 @@ | BGP | Established83, exact /32 exchange/API/UI/administrative withdrawal92, BFD primary GRE loss/alternate/recovery93 | Hold timer/TCP loss безBFD принят104; packet loss в переходе, разные внешние peers/WAN policy, IPv6/scale. Два логических пути используют тот же public WAN; physical redundancy не принята | | Recursive routes | Production PUT/change/own history restore88, disabled guards, partial/unknown/applied outcomes, live формы/контекст | Автоматический rollback/retry, durable receipts и несколько экземпляров отсутствуют; PUT не является idempotent noop. Полная произвольная legacy catalog миграция не принята | | Diagnostics/terminal | Allowlist/native reads, Ping/trace/route/MTU/DNS, actual avg-rtt, disabled guards, JWT/live PC/mobile89; real default memory tail/log limits/API/UI133 | DNS использует backend resolver; MTU — ограниченная оценка, не гарантированный максимум. Stop ожидания не доказывает остановку RouterOS команды; arbitrary CLI и physical disconnect не приняты | -| Portal/интеграции | Локальные и isolated JWT guards; UI/API error states в границах журналов | Настоящий Portal issuer/login/отзыв прав; RIPE SDK two-IP/no-fetch passed140, полный flow pipeline/local licensed MaxMind/S3/container/certificate jobs и Gitea delivery требуют отдельных тестовых endpoints/аккаунтов. Не отправлять сообщения и не публиковать релиз без соответствующего поручения | -| Общая приёмка | Локальная12.3.83; UI1244/context221/compiled984 parity139; профильные build/E2E/live проверки последующих блоков | Traffic initial live mock-id gate passed141; IPv6 special ranges/cache passed142; unknown RIPE coordinates passed143; IPv6 synthetic UDP/worker/SQL passed144; native exporter/API/UI145; последующие изменения проверять отдельно; scoped axe не означает полную WCAG сертификацию | +| Portal/интеграции | Локальные и isolated JWT guards; UI/API error states в границах журналов | Настоящий Portal issuer/login/отзыв прав; RIPE SDK two-IP/no-fetch passed140, native IPv6 ULA flow pipeline passed145 (IPv4 transport), public IPv6 WAN/local licensed MaxMind/S3/container/certificate jobs и Gitea delivery требуют отдельных тестовых endpoints/аккаунтов. Не отправлять сообщения и не публиковать релиз без соответствующего поручения | +| Общая приёмка | Локальная12.3.83; UI1244/context221/compiled984 parity139; профильные build/E2E/live проверки последующих блоков | Traffic initial live mock-id gate passed141; IPv6 special ranges/cache passed142; unknown RIPE coordinates passed143; IPv6 synthetic UDP/worker/SQL passed144; native CHR ULA/IPFIX/API/UI passed145; ICMPv6/IPv6 endpoint labels146; последующие изменения проверять отдельно; scoped axe не означает полную WCAG сертификацию | Доказательства и точные ограничения: [полная история этапа12](ux-ui-stage-12.md), [внешний протокол](ux-ui-external-acceptance.md), [BGP93](ux-ui/acceptance/bgp-failover-2026-10-10.json), [паспорт стенда](ux-ui-test-server.md). Невыполненные пункты не являются все блокерами данного лабораторного сценария: для выпуска необходимо явно определить требуемые конфигурации и принять их либо согласовать ограничение. @@ -468,3 +468,17 @@ Unknown0/0 policy основана на наблюдённом live ответе Backend ux-ipfix144 развёрнут, health healthy; frontend ux-traffic141 сохранён. Live traffic1440/320 passed без initial srv1/400, page errors/overflow. Rollback env/image оставлены. [Все попытки и границы](ux-ui/acceptance/ipv6-ipfix-worker-sql-2026-10-11.json), [browser smoke](ux-ui/acceptance/traffic-ipfix-smoke-2026-10-11.json). Это real UDP/worker/SQL path с синтетическим exporter через IPv4 loopback transport, не native RouterOS IPv6 export/outer transport и не maximum throughput. CHR configuration/passwords не менялись. Следующий145 — проверить возможность native RouterOS IPv6 exporter и populated API/UI на собственных objects/DB.12.5 открыт. + +## 12.5.145 — настоящий RouterOS IPv6 IPFIX и заполненный интерфейс (2026-10-11) + +Оба CHR доступны с прежними credentials, RouterOS7.24.5. Исходно Traffic Flow disabled/targets empty. Созданы собственные GRE-пара с allow-fast-path=false и fd00:145:1::1/2/64, advertise=no. CHR1 временно экспортирует IPFIX только своего GRE, с short timeouts/one owned target. Native Ping прошёл5/5 в обе стороны; CPU/input-output path и IPv6 support сверены с [официальным Traffic Flow manual](https://manual.mikrotik.com/docs/diagnostics-monitoring-and-troubleshooting/traffic-flow/), версия manual7.26, фактическая проверка7.24.5. + +На Debian запущен отдельный application/production collector worker в own temporary PostgreSQL DB. Скопирована конфигурация только CHR1 без публикации credentials; worker слушает UDP48145, HTTP API доступен только через localhost18145/SSH. Native RouterOS sender, не synthetic fixture, передал IPv6 IPFIX records: production API содержит реальные ULA source/destination и positive bytes/packets. Deployed frontend ux-traffic141 проверен через явный relay реальных ответов отдельного backend: Sessions DOM содержит IPv6, PC1440/mobile320 API200/pageerror0/no document overflow. Screenshots сохраняют frame/current scroll position, не все строки одновременно. Initial UI attempts искали адрес на Applications summary и ошибочно выбирали button вместо actual tab; исправлено только обращение к существующей вкладке. + +Тест не использовал main DB для seeded fixtures; обычный background polling главного приложения оставался активным, поэтому абсолютное отсутствие background writes не заявляется. IPsec/WireGuard keys, пароли, исходные public/default/metadata routes не менялись. Native objects/GRE/IPv6 inputs принадлежат одному unique tag. + +Автоматическая очистка восстановила Traffic Flow и удалила objects CHR1, но GET собственного GRE по ID на CHR2 вернул401. Child drain прошёл, own DB удалена. Read-only resource и полный каталог обоих CHR снова доступны с теми же credentials; причина одиночного GET401 не установлена, пароль не менялся. Recovery по свежему полному каталогу проверил exact comment/name/local-remote/address и отсутствие IDs в baseline; удалены только два оставшихся objects CHR2 обычным DELETE. Все12 collection projections×2 и Traffic Flow/IPFIX fields/IPv6 settings совпали с исходными. Initial failure и recovery сохранены, не заменены гладким success. + +Own container удалён после проверки exact container ID; UDP48145/HTTP18145 и отдельный SSH tunnel закрыты, основной стенд backend ux-ipfix144/frontend ux-traffic141 healthy. Начальный неверный host port81245 был отвергнут до запуска/изменений, исправлен18145. [Native/API/cleanup receipt](ux-ui/acceptance/native-ipv6-ipfix-2026-10-11.json), [UI receipt](ux-ui/acceptance/native-ipv6-ipfix-ui-2026-10-11.json), [PC screenshot](ux-ui/screens/native-ipv6-ipfix145-1440-2026-10-11.png), [mobile screenshot](ux-ui/screens/native-ipv6-ipfix145-320-2026-10-11.png). + +Доказан IPv6 ULA inner/native IPFIX поверх IPv4 GRE/export transport, не public IPv6 WAN/outer или throughput/произвольные clients. На live UI ICMPv6 подписан numeric58, IPv6 endpoints с портом требуют однозначного bracket format; следующий146 — улучшить эти подписи, сохранив ReUI/Frame/base-nova.12.5 открыт. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index e0e5da11..1f7fdde9 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-11: завершён12.5.144 — исправлен dual-stack IPFIX при zero IPv4 placeholders; реальный UDP→worker→SQL passed:6 IPv6 rows,25200B/42 packets raw/minute,7200B/12 Internet facts.21 local scripts exit0 с честными skips;984 outputs matched. Backend ux-ipfix144/frontend ux-traffic141. Далее145 — native RouterOS IPv6 exporter и populated API/UI, если конфигурация стенда позволяет.12.5 открыт. +Актуальное продолжение 2026-10-11: завершён12.5.145 — native CHR IPv6 ULA→IPFIX→production worker/SQL/API→frontend Sessions подтверждён; Ping5/5×2, PC/mobile DOM/API/no-overflow passed. Initial cleanup GET401 сохранён, recovery удалил2 exact-owned objects;12 collections×2/configs restored, own DB/container/ports/tunnel удалены. Backend ux-ipfix144/frontend ux-traffic141. Далее146 — понятные ICMPv6/IPv6 endpoint labels;12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -2858,3 +2858,17 @@ Unknown0/0 policy основана на наблюдённом live ответе Backend ux-ipfix144 развёрнут, health healthy; frontend ux-traffic141 сохранён. Live traffic1440/320 passed без initial srv1/400, page errors/overflow. Rollback env/image оставлены. [Все попытки и границы](ux-ui/acceptance/ipv6-ipfix-worker-sql-2026-10-11.json), [browser smoke](ux-ui/acceptance/traffic-ipfix-smoke-2026-10-11.json). Это real UDP/worker/SQL path с синтетическим exporter через IPv4 loopback transport, не native RouterOS IPv6 export/outer transport и не maximum throughput. CHR configuration/passwords не менялись. Следующий145 — проверить возможность native RouterOS IPv6 exporter и populated API/UI на собственных objects/DB.12.5 открыт. + +## 12.5.145 — настоящий RouterOS IPv6 IPFIX и заполненный интерфейс (2026-10-11) + +Оба CHR доступны с прежними credentials, RouterOS7.24.5. Исходно Traffic Flow disabled/targets empty. Созданы собственные GRE-пара с allow-fast-path=false и fd00:145:1::1/2/64, advertise=no. CHR1 временно экспортирует IPFIX только своего GRE, с short timeouts/one owned target. Native Ping прошёл5/5 в обе стороны; CPU/input-output path и IPv6 support сверены с [официальным Traffic Flow manual](https://manual.mikrotik.com/docs/diagnostics-monitoring-and-troubleshooting/traffic-flow/), версия manual7.26, фактическая проверка7.24.5. + +На Debian запущен отдельный application/production collector worker в own temporary PostgreSQL DB. Скопирована конфигурация только CHR1 без публикации credentials; worker слушает UDP48145, HTTP API доступен только через localhost18145/SSH. Native RouterOS sender, не synthetic fixture, передал IPv6 IPFIX records: production API содержит реальные ULA source/destination и positive bytes/packets. Deployed frontend ux-traffic141 проверен через явный relay реальных ответов отдельного backend: Sessions DOM содержит IPv6, PC1440/mobile320 API200/pageerror0/no document overflow. Screenshots сохраняют frame/current scroll position, не все строки одновременно. Initial UI attempts искали адрес на Applications summary и ошибочно выбирали button вместо actual tab; исправлено только обращение к существующей вкладке. + +Тест не использовал main DB для seeded fixtures; обычный background polling главного приложения оставался активным, поэтому абсолютное отсутствие background writes не заявляется. IPsec/WireGuard keys, пароли, исходные public/default/metadata routes не менялись. Native objects/GRE/IPv6 inputs принадлежат одному unique tag. + +Автоматическая очистка восстановила Traffic Flow и удалила objects CHR1, но GET собственного GRE по ID на CHR2 вернул401. Child drain прошёл, own DB удалена. Read-only resource и полный каталог обоих CHR снова доступны с теми же credentials; причина одиночного GET401 не установлена, пароль не менялся. Recovery по свежему полному каталогу проверил exact comment/name/local-remote/address и отсутствие IDs в baseline; удалены только два оставшихся objects CHR2 обычным DELETE. Все12 collection projections×2 и Traffic Flow/IPFIX fields/IPv6 settings совпали с исходными. Initial failure и recovery сохранены, не заменены гладким success. + +Own container удалён после проверки exact container ID; UDP48145/HTTP18145 и отдельный SSH tunnel закрыты, основной стенд backend ux-ipfix144/frontend ux-traffic141 healthy. Начальный неверный host port81245 был отвергнут до запуска/изменений, исправлен18145. [Native/API/cleanup receipt](ux-ui/acceptance/native-ipv6-ipfix-2026-10-11.json), [UI receipt](ux-ui/acceptance/native-ipv6-ipfix-ui-2026-10-11.json), [PC screenshot](ux-ui/screens/native-ipv6-ipfix145-1440-2026-10-11.png), [mobile screenshot](ux-ui/screens/native-ipv6-ipfix145-320-2026-10-11.png). + +Доказан IPv6 ULA inner/native IPFIX поверх IPv4 GRE/export transport, не public IPv6 WAN/outer или throughput/произвольные clients. На live UI ICMPv6 подписан numeric58, IPv6 endpoints с портом требуют однозначного bracket format; следующий146 — улучшить эти подписи, сохранив ReUI/Frame/base-nova.12.5 открыт. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index 171c169a..4d8cd884 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -1,6 +1,6 @@ # Тестовый сервер UX/UI — 2026-10-10 -Сервер161.104.46.222: завершён12.5.144 — исправлен dual-stack IPFIX при zero IPv4 placeholders; реальный UDP→worker→SQL passed:6 IPv6 rows,25200B/42 packets raw/minute,7200B/12 Internet facts.21 local scripts exit0 с честными skips;984 outputs matched. Backend ux-ipfix144/frontend ux-traffic141. Далее145 — native RouterOS IPv6 exporter и populated API/UI, если конфигурация стенда позволяет.12.5 открыт. +Сервер161.104.46.222: завершён12.5.145 — native CHR IPv6 ULA→IPFIX→production worker/SQL/API→frontend Sessions подтверждён; Ping5/5×2, PC/mobile DOM/API/no-overflow passed. Initial cleanup GET401 сохранён, recovery удалил2 exact-owned objects;12 collections×2/configs restored, own DB/container/ports/tunnel удалены. Backend ux-ipfix144/frontend ux-traffic141. Далее146 — понятные ICMPv6/IPv6 endpoint labels;12.5 открыт. | Параметр | Проверенное состояние | | --- | --- | @@ -1284,3 +1284,17 @@ Unknown0/0 policy основана на наблюдённом live ответе Backend ux-ipfix144 развёрнут, health healthy; frontend ux-traffic141 сохранён. Live traffic1440/320 passed без initial srv1/400, page errors/overflow. Rollback env/image оставлены. [Все попытки и границы](ux-ui/acceptance/ipv6-ipfix-worker-sql-2026-10-11.json), [browser smoke](ux-ui/acceptance/traffic-ipfix-smoke-2026-10-11.json). Это real UDP/worker/SQL path с синтетическим exporter через IPv4 loopback transport, не native RouterOS IPv6 export/outer transport и не maximum throughput. CHR configuration/passwords не менялись. Следующий145 — проверить возможность native RouterOS IPv6 exporter и populated API/UI на собственных objects/DB.12.5 открыт. + +## 12.5.145 — настоящий RouterOS IPv6 IPFIX и заполненный интерфейс (2026-10-11) + +Оба CHR доступны с прежними credentials, RouterOS7.24.5. Исходно Traffic Flow disabled/targets empty. Созданы собственные GRE-пара с allow-fast-path=false и fd00:145:1::1/2/64, advertise=no. CHR1 временно экспортирует IPFIX только своего GRE, с short timeouts/one owned target. Native Ping прошёл5/5 в обе стороны; CPU/input-output path и IPv6 support сверены с [официальным Traffic Flow manual](https://manual.mikrotik.com/docs/diagnostics-monitoring-and-troubleshooting/traffic-flow/), версия manual7.26, фактическая проверка7.24.5. + +На Debian запущен отдельный application/production collector worker в own temporary PostgreSQL DB. Скопирована конфигурация только CHR1 без публикации credentials; worker слушает UDP48145, HTTP API доступен только через localhost18145/SSH. Native RouterOS sender, не synthetic fixture, передал IPv6 IPFIX records: production API содержит реальные ULA source/destination и positive bytes/packets. Deployed frontend ux-traffic141 проверен через явный relay реальных ответов отдельного backend: Sessions DOM содержит IPv6, PC1440/mobile320 API200/pageerror0/no document overflow. Screenshots сохраняют frame/current scroll position, не все строки одновременно. Initial UI attempts искали адрес на Applications summary и ошибочно выбирали button вместо actual tab; исправлено только обращение к существующей вкладке. + +Тест не использовал main DB для seeded fixtures; обычный background polling главного приложения оставался активным, поэтому абсолютное отсутствие background writes не заявляется. IPsec/WireGuard keys, пароли, исходные public/default/metadata routes не менялись. Native objects/GRE/IPv6 inputs принадлежат одному unique tag. + +Автоматическая очистка восстановила Traffic Flow и удалила objects CHR1, но GET собственного GRE по ID на CHR2 вернул401. Child drain прошёл, own DB удалена. Read-only resource и полный каталог обоих CHR снова доступны с теми же credentials; причина одиночного GET401 не установлена, пароль не менялся. Recovery по свежему полному каталогу проверил exact comment/name/local-remote/address и отсутствие IDs в baseline; удалены только два оставшихся objects CHR2 обычным DELETE. Все12 collection projections×2 и Traffic Flow/IPFIX fields/IPv6 settings совпали с исходными. Initial failure и recovery сохранены, не заменены гладким success. + +Own container удалён после проверки exact container ID; UDP48145/HTTP18145 и отдельный SSH tunnel закрыты, основной стенд backend ux-ipfix144/frontend ux-traffic141 healthy. Начальный неверный host port81245 был отвергнут до запуска/изменений, исправлен18145. [Native/API/cleanup receipt](ux-ui/acceptance/native-ipv6-ipfix-2026-10-11.json), [UI receipt](ux-ui/acceptance/native-ipv6-ipfix-ui-2026-10-11.json), [PC screenshot](ux-ui/screens/native-ipv6-ipfix145-1440-2026-10-11.png), [mobile screenshot](ux-ui/screens/native-ipv6-ipfix145-320-2026-10-11.png). + +Доказан IPv6 ULA inner/native IPFIX поверх IPv4 GRE/export transport, не public IPv6 WAN/outer или throughput/произвольные clients. На live UI ICMPv6 подписан numeric58, IPv6 endpoints с портом требуют однозначного bracket format; следующий146 — улучшить эти подписи, сохранив ReUI/Frame/base-nova.12.5 открыт. diff --git a/docs/ux-ui/acceptance/native-ipv6-ipfix-2026-10-11.json b/docs/ux-ui/acceptance/native-ipv6-ipfix-2026-10-11.json new file mode 100644 index 00000000..973fa8c1 --- /dev/null +++ b/docs/ux-ui/acceptance/native-ipv6-ipfix-2026-10-11.json @@ -0,0 +1,910 @@ +{ + "date": "2026-10-11", + "block": "12.5.145", + "runtime": { + "backend": "ux-ipfix144", + "frontend": "ux-traffic141", + "backendHealthy": true + }, + "native": { + "date": "2026-10-11", + "block": "12.5.145", + "name": "mm-flow145-1791712666652", + "runtime": { + "backend": "ux-ipfix144", + "frontend": "ux-traffic141" + }, + "devices": [ + { + "serverId": 1, + "host": "194.226.121.150", + "version": "7.24.5 (stable)", + "reachable": true + }, + { + "serverId": 2, + "host": "104.165.244.7", + "version": "7.24.5 (stable)", + "reachable": true + } + ], + "pings": [ + { + "serverId": 1, + "sent": 5, + "received": 5, + "rows": [ + { + "avg-rtt": "54ms548us", + "host": "fd00:145:1::2", + "max-rtt": "54ms548us", + "min-rtt": "54ms548us", + "packet-loss": "0", + "received": "1", + "sent": "1", + "seq": "0", + "size": "128", + "status": "echo reply", + "time": "54ms548us", + "ttl": "64" + }, + { + "avg-rtt": "54ms427us", + "host": "fd00:145:1::2", + "max-rtt": "54ms548us", + "min-rtt": "54ms307us", + "packet-loss": "0", + "received": "2", + "sent": "2", + "seq": "1", + "size": "128", + "status": "echo reply", + "time": "54ms307us", + "ttl": "64" + }, + { + "avg-rtt": "54ms515us", + "host": "fd00:145:1::2", + "max-rtt": "54ms692us", + "min-rtt": "54ms307us", + "packet-loss": "0", + "received": "3", + "sent": "3", + "seq": "2", + "size": "128", + "status": "echo reply", + "time": "54ms692us", + "ttl": "64" + }, + { + "avg-rtt": "54ms492us", + "host": "fd00:145:1::2", + "max-rtt": "54ms692us", + "min-rtt": "54ms307us", + "packet-loss": "0", + "received": "4", + "sent": "4", + "seq": "3", + "size": "128", + "status": "echo reply", + "time": "54ms423us", + "ttl": "64" + }, + { + "avg-rtt": "54ms440us", + "host": "fd00:145:1::2", + "max-rtt": "54ms692us", + "min-rtt": "54ms231us", + "packet-loss": "0", + "received": "5", + "sent": "5", + "seq": "4", + "size": "128", + "status": "echo reply", + "time": "54ms231us", + "ttl": "64" + } + ] + }, + { + "serverId": 2, + "sent": 5, + "received": 5, + "rows": [ + { + "avg-rtt": "53ms466us", + "host": "fd00:145:1::1", + "max-rtt": "53ms466us", + "min-rtt": "53ms466us", + "packet-loss": "0", + "received": "1", + "sent": "1", + "seq": "0", + "size": "128", + "status": "echo reply", + "time": "53ms466us", + "ttl": "64" + }, + { + "avg-rtt": "53ms480us", + "host": "fd00:145:1::1", + "max-rtt": "53ms494us", + "min-rtt": "53ms466us", + "packet-loss": "0", + "received": "2", + "sent": "2", + "seq": "1", + "size": "128", + "status": "echo reply", + "time": "53ms494us", + "ttl": "64" + }, + { + "avg-rtt": "53ms498us", + "host": "fd00:145:1::1", + "max-rtt": "53ms534us", + "min-rtt": "53ms466us", + "packet-loss": "0", + "received": "3", + "sent": "3", + "seq": "2", + "size": "128", + "status": "echo reply", + "time": "53ms534us", + "ttl": "64" + }, + { + "avg-rtt": "53ms469us", + "host": "fd00:145:1::1", + "max-rtt": "53ms534us", + "min-rtt": "53ms383us", + "packet-loss": "0", + "received": "4", + "sent": "4", + "seq": "3", + "size": "128", + "status": "echo reply", + "time": "53ms383us", + "ttl": "64" + }, + { + "avg-rtt": "53ms467us", + "host": "fd00:145:1::1", + "max-rtt": "53ms534us", + "min-rtt": "53ms383us", + "packet-loss": "0", + "received": "5", + "sent": "5", + "seq": "4", + "size": "128", + "status": "echo reply", + "time": "53ms460us", + "ttl": "64" + } + ] + } + ], + "cleanup": [], + "limits": [ + "Own GRE IPv6 ULA over IPv4 outer; native IPFIX over IPv4 WAN UDP; not IPv6 outer/WAN or throughput acceptance", + "Dedicated database/application process, main database not seeded with fixture rows; ordinary background polling remains active; preview UI uses explicit real API relay to isolated backend" + ], + "controlledTrafficFlow": { + "active-flow-timeout": "10s", + "cache-entries": "256k", + "enabled": "true", + "inactive-flow-timeout": "3s", + "interfaces": "mm-flow145-1791712666652-g", + "packet-sampling": "false", + "sampling-interval": "0", + "sampling-space": "0" + }, + "apiTalkers": { + "exportersOnline": 1, + "bytesPerMin": 844.8, + "uniqueSrc": 4, + "uniqueDst": 4, + "topProto": "58", + "talkers": [ + { + "serverId": "1", + "serverName": "CHR · native145", + "src": "194.226.121.150", + "dst": "104.165.244.7", + "proto": 47, + "protoName": "GRE", + "srcPort": 0, + "dstPort": 0, + "bytes": 1616, + "packets": 12, + "bps": 43.093333333333334, + "inIface": "#144", + "inIfaceIndex": "144", + "application": "GRE" + }, + { + "serverId": "1", + "serverName": "CHR · native145", + "src": "fd00:145:1::2", + "dst": "fd00:145:1::1", + "proto": 58, + "protoName": "58", + "srcPort": 0, + "dstPort": 0, + "bytes": 1280, + "packets": 10, + "bps": 34.13333333333333, + "inIface": "#144", + "inIfaceIndex": "144", + "application": "58/—" + }, + { + "serverId": "1", + "serverName": "CHR · native145", + "src": "fd00:145:1::1", + "dst": "fd00:145:1::2", + "proto": 58, + "protoName": "58", + "srcPort": 0, + "dstPort": 0, + "bytes": 1280, + "packets": 10, + "bps": 34.13333333333333, + "inIface": "—", + "inIfaceIndex": "0", + "application": "58/—" + }, + { + "serverId": "1", + "serverName": "CHR · native145", + "src": "fe80::2:68a5:f407", + "dst": "ff02::2", + "proto": 58, + "protoName": "58", + "srcPort": 0, + "dstPort": 0, + "bytes": 48, + "packets": 1, + "bps": 1.28, + "inIface": "—", + "inIfaceIndex": "0", + "application": "58/—" + } + ], + "lastExporterIp": "194.226.121.150", + "lastError": null, + "packetsReceived": 6, + "lastDatagramAt": "2026-10-11T09:58:07.508Z", + "listenerBound": true, + "listenerAddress": "0.0.0.0:48145" + }, + "apiAnalytics": { + "bpsNow": 112.64, + "bytes": 4224, + "packets": 33, + "conversations": 4, + "conversationsRaw": 4, + "uniqueSrc": 4, + "uniqueDst": 4, + "topProto": "58", + "topCategory": "Прочее", + "rxSeries": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.000192, + 0, + 0.01024, + 0, + 0, + 0, + 0 + ], + "txSeries": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "applications": [ + { + "id": "58/—", + "label": "58/—", + "bytes": 2608, + "packets": 21, + "bps": 69.54666666666667, + "percent": 61.74242424242424 + }, + { + "id": "GRE", + "label": "GRE", + "bytes": 1616, + "packets": 12, + "bps": 43.093333333333334, + "percent": 38.25757575757576 + } + ], + "protocols": [ + { + "id": "58", + "label": "58", + "bytes": 2608, + "packets": 21, + "bps": 69.54666666666667, + "percent": 61.74242424242424 + }, + { + "id": "GRE", + "label": "GRE", + "bytes": 1616, + "packets": 12, + "bps": 43.093333333333334, + "percent": 38.25757575757576 + } + ], + "sources": [ + { + "id": "194.226.121.150", + "label": "194.226.121.150", + "bytes": 1616, + "packets": 12, + "bps": 43.093333333333334, + "percent": 38.25757575757576 + }, + { + "id": "fd00:145:1::2", + "label": "fd00:145:1::2", + "bytes": 1280, + "packets": 10, + "bps": 34.13333333333333, + "percent": 30.303030303030305 + }, + { + "id": "fd00:145:1::1", + "label": "fd00:145:1::1", + "bytes": 1280, + "packets": 10, + "bps": 34.13333333333333, + "percent": 30.303030303030305 + }, + { + "id": "fe80::2:68a5:f407", + "label": "fe80::2:68a5:f407", + "bytes": 48, + "packets": 1, + "bps": 1.28, + "percent": 1.1363636363636365 + } + ], + "destinations": [ + { + "id": "104.165.244.7", + "label": "104.165.244.7", + "bytes": 1616, + "packets": 12, + "bps": 43.093333333333334, + "percent": 38.25757575757576 + }, + { + "id": "fd00:145:1::1", + "label": "fd00:145:1::1", + "bytes": 1280, + "packets": 10, + "bps": 34.13333333333333, + "percent": 30.303030303030305 + }, + { + "id": "fd00:145:1::2", + "label": "fd00:145:1::2", + "bytes": 1280, + "packets": 10, + "bps": 34.13333333333333, + "percent": 30.303030303030305 + }, + { + "id": "ff02::2", + "label": "ff02::2", + "bytes": 48, + "packets": 1, + "bps": 1.28, + "percent": 1.1363636363636365 + } + ], + "interfaces": [ + { + "id": "#144", + "label": "#144", + "bytes": 2896, + "packets": 22, + "bps": 77.22666666666667, + "percent": 68.56060606060606 + }, + { + "id": "—", + "label": "—", + "bytes": 1328, + "packets": 11, + "bps": 35.413333333333334, + "percent": 31.439393939393938 + } + ], + "asns": [], + "countries": [], + "categories": [ + { + "id": "Прочее", + "label": "Прочее", + "bytes": 2608, + "packets": 21, + "bps": 69.54666666666667, + "percent": 61.74242424242424 + }, + { + "id": "Туннель", + "label": "Туннель", + "bytes": 1616, + "packets": 12, + "bps": 43.093333333333334, + "percent": 38.25757575757576 + } + ], + "services": [ + { + "id": "Прочее", + "label": "Прочее", + "bytes": 4224, + "packets": 33, + "bps": 112.64, + "percent": 100 + } + ], + "mapEdges": [], + "conversationsList": [ + { + "serverId": "1", + "serverName": "CHR · native145", + "src": "194.226.121.150", + "dst": "104.165.244.7", + "proto": 47, + "protoName": "GRE", + "srcPort": 0, + "dstPort": 0, + "bytes": 1616, + "packets": 12, + "bps": 2260.13986013986, + "inIface": "#144", + "inIfaceIndex": "144", + "outIface": "#2", + "nextHop": "194.226.121.1", + "application": "GRE", + "category": "Туннель", + "service": "Прочее", + "internetPeer": "104.165.244.7", + "direction": "transit", + "plane": "overlay" + }, + { + "serverId": "1", + "serverName": "CHR · native145", + "src": "fd00:145:1::2", + "dst": "fd00:145:1::1", + "proto": 58, + "protoName": "58", + "srcPort": 0, + "dstPort": 0, + "bytes": 1280, + "packets": 10, + "bps": 2509.8039215686276, + "inIface": "#144", + "inIfaceIndex": "144", + "nextHop": "::1:8000:0:0:0", + "application": "58/—", + "category": "Прочее", + "service": "Прочее", + "clientIp": "fd00:145:1::2", + "internetPeer": "fd00:145:1::1", + "direction": "from_client", + "plane": "payload" + }, + { + "serverId": "1", + "serverName": "CHR · native145", + "src": "fd00:145:1::1", + "dst": "fd00:145:1::2", + "proto": 58, + "protoName": "58", + "srcPort": 0, + "dstPort": 0, + "bytes": 1280, + "packets": 10, + "bps": 2479.418886198547, + "inIface": "—", + "inIfaceIndex": "0", + "outIface": "#144", + "nextHop": "::4000:0:0:0", + "application": "58/—", + "category": "Прочее", + "service": "Прочее", + "clientIp": "fd00:145:1::1", + "internetPeer": "fd00:145:1::2", + "direction": "from_client", + "plane": "payload" + }, + { + "serverId": "1", + "serverName": "CHR · native145", + "src": "fe80::2:68a5:f407", + "dst": "ff02::2", + "proto": 58, + "protoName": "58", + "srcPort": 0, + "dstPort": 0, + "bytes": 48, + "packets": 1, + "bps": 1.28, + "inIface": "—", + "inIfaceIndex": "0", + "outIface": "#144", + "nextHop": "::800:0:0:0", + "application": "58/—", + "category": "Прочее", + "service": "Прочее", + "clientIp": "fe80::2:68a5:f407", + "internetPeer": "ff02::2", + "direction": "from_client", + "plane": "payload" + } + ], + "paths": [ + { + "id": "unknown|1||104.165.244.7|#144", + "clientId": "unknown", + "clientName": "Неизвестный клиент", + "ifaces": "#144", + "serverId": "1", + "serverName": "CHR · native145", + "inIface": "#144", + "outIface": "#2", + "enId": "", + "enName": "", + "dst": "104.165.244.7", + "service": "Прочее", + "category": "Туннель", + "plane": "overlay", + "bytes": 1616, + "packets": 12, + "bps": 43.093333333333334 + }, + { + "id": "unknown|1||fd00:145:1::1|#144", + "clientId": "unknown", + "clientName": "Неизвестный клиент", + "ifaces": "#144", + "serverId": "1", + "serverName": "CHR · native145", + "inIface": "#144", + "outIface": "", + "enId": "", + "enName": "", + "dst": "fd00:145:1::1", + "service": "Прочее", + "category": "Прочее", + "plane": "payload", + "bytes": 1280, + "packets": 10, + "bps": 34.13333333333333 + }, + { + "id": "unknown|1||fd00:145:1::2|—", + "clientId": "unknown", + "clientName": "Неизвестный клиент", + "ifaces": "—", + "serverId": "1", + "serverName": "CHR · native145", + "inIface": "—", + "outIface": "#144", + "enId": "", + "enName": "", + "dst": "fd00:145:1::2", + "service": "Прочее", + "category": "Прочее", + "plane": "payload", + "bytes": 1280, + "packets": 10, + "bps": 34.13333333333333 + }, + { + "id": "unknown|1||ff02::2|—", + "clientId": "unknown", + "clientName": "Неизвестный клиент", + "ifaces": "—", + "serverId": "1", + "serverName": "CHR · native145", + "inIface": "—", + "outIface": "#144", + "enId": "", + "enName": "", + "dst": "ff02::2", + "service": "Прочее", + "category": "Прочее", + "plane": "payload", + "bytes": 48, + "packets": 1, + "bps": 1.28 + } + ], + "ifaces": [ + { + "name": "#144", + "index": "144", + "bps": 77.22666666666667 + }, + { + "name": "—", + "index": "0", + "bps": 35.413333333333334 + } + ], + "live": true, + "dedupApplied": false, + "degraded": false, + "bytesPayload": 2608, + "bytesOverlay": 1616, + "bytesMesh": 0, + "bytesWire": 0, + "bpsOverlay": 43.093333333333334, + "bpsWire": 0, + "excludeMeshApplied": false, + "excludeOverlayApplied": false + }, + "nativeDataReceived": true, + "browserCheckpoint": true, + "cleanupError": "RouterOS API error 401 on /interface/gre/*71: {\"error\":401,\"message\":\"Unauthorized\"}", + "childDrained": true, + "childExit": 0, + "databaseRemoved": true, + "childDiagnostic": "Private child stderr retained separately; no credential-bearing error text published" + }, + "postFailureReadOnlyInspect": { + "date": "2026-10-11", + "name": "mm-flow145-1791712666652", + "readOnly": true, + "devices": [ + { + "serverId": 1, + "host": "194.226.121.150", + "gre": [], + "addresses": [], + "systemReadSucceeded": true + }, + { + "serverId": 2, + "host": "104.165.244.7", + "gre": [ + { + ".id": "*71", + "actual-mtu": "1400", + "allow-fast-path": "false", + "clamp-tcp-mss": "true", + "comment": "mm-flow145-1791712666652", + "disabled": "false", + "dont-fragment": "no", + "dscp": "inherit", + "keepalive": "10s,10", + "local-address": "104.165.244.7", + "mtu": "1400", + "name": "mm-flow145-1791712666652-g", + "remote-address": "194.226.121.150", + "running": "false" + } + ], + "addresses": [ + { + ".id": "*73", + "actual-interface": "mm-flow145-1791712666652-g", + "address": "fd00:145:1::2/64", + "advertise": "false", + "auto-link-local": "true", + "comment": "mm-flow145-1791712666652", + "deprecated": "false", + "disabled": "false", + "dynamic": "false", + "eui-64": "false", + "from-pool": "", + "global": "true", + "interface": "mm-flow145-1791712666652-g", + "invalid": "false", + "no-dad": "false", + "slave": "false", + "vrf": "main" + } + ], + "systemReadSucceeded": true + } + ] + }, + "recoveryCleanup": { + "date": "2026-10-11", + "name": "mm-flow145-1791712666652", + "actions": [ + { + "serverId": 2, + "path": "/ipv6/address", + "id": "*73", + "method": "DELETE", + "removed": true + }, + { + "serverId": 2, + "path": "/interface/gre", + "id": "*71", + "method": "DELETE", + "removed": true + } + ], + "cleanup": [ + { + "serverId": 1, + "/interface/gre": true, + "/ipv6/address": true, + "/ipv6/route": true, + "/ipv6/nd": true, + "/ipv6/firewall/filter": true, + "/ipv6/firewall/raw": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/filter": true, + "/ip/firewall/nat": true, + "/ip/firewall/mangle": true, + "/ip/traffic-flow/target": true, + "trafficFlowRestored": true, + "ipfixFieldsUnchanged": true, + "ipv6SettingsUnchanged": true + }, + { + "serverId": 2, + "/interface/gre": true, + "/ipv6/address": true, + "/ipv6/route": true, + "/ipv6/nd": true, + "/ipv6/firewall/filter": true, + "/ipv6/firewall/raw": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/filter": true, + "/ip/firewall/nat": true, + "/ip/firewall/mangle": true, + "/ip/traffic-flow/target": true, + "trafficFlowRestored": true, + "ipfixFieldsUnchanged": true, + "ipv6SettingsUnchanged": true + } + ], + "success": true + }, + "infrastructureCleanup": { + "ownedContainerId": "ce12762cb132ced5dba28b28443eb0327d135dcd8e751e719b562b4ef606d73f", + "removedAfterIdentityCheck": true, + "udp48145Closed": true, + "isolatedHttp18145Closed": true, + "ssh18145TunnelClosed": true + }, + "bounds": [ + "Two native CHR RouterOS7.24.5; own GRE ULA addresses and allow-fast-path=false; native IPFIX from CHR1 through IPv4 WAN to real production listener", + "Traffic Flow was initially disabled with no targets; enabled only on own GRE, short timers, one own target; restored exact original settings", + "Owned isolated DB cloned only CHR1 configuration for a separate application/worker; credentials never published; ordinary main-app background polling stayed active, so no claim of zero background DB writes", + "Ping5/5 both directions, actual native IPv6 fields and positive bytes/packets observed through production API and frontend Sessions DOM; no synthetic IPFIX sender for this block", + "UI relay used real isolated HTTP backend responses, not mocked JSON; screenshots show current frame/scroll position, not every row; initial wrong tab/role selectors retained in UI protocol", + "Initial invalid host port81245 was rejected before container launch/native changes, corrected18145", + "Automatic cleanup on CHR2 hit one401 reading own GRE by id; credentials still permitted system/full-catalog reads. Two exact-owned remaining objects deleted by DELETE after fresh catalog ownership checks; all12 static collection projections per device and three config groups restored", + "Cause of the isolated GET-by-id401 not determined; do not infer password rotation or full permission failure", + "Own DB removed and child drain acknowledged; temporary receiver/API/container/tunnel closed; public/metadata/default routes and original settings preserved by baseline checks", + "IPv6 inner over IPv4 GRE outer/export transport; no public IPv6 WAN, arbitrary client OS, maximum throughput or all configurations acceptance" + ] +} diff --git a/docs/ux-ui/acceptance/native-ipv6-ipfix-ui-2026-10-11.json b/docs/ux-ui/acceptance/native-ipv6-ipfix-ui-2026-10-11.json new file mode 100644 index 00000000..118c87f6 --- /dev/null +++ b/docs/ux-ui/acceptance/native-ipv6-ipfix-ui-2026-10-11.json @@ -0,0 +1,155 @@ +{ + "date": "2026-10-11", + "block": "12.5.145", + "runtime": { + "backend": "ux-ipfix144", + "frontend": "ux-traffic141" + }, + "transport": "Deployed frontend assets; explicit real HTTP API relay through SSH to owned isolated backend18145; no mocked JSON", + "cases": [ + { + "width": 1440, + "api": [ + { + "path": "/api/auth/config", + "status": 200 + }, + { + "path": "/api/traffic/servers", + "status": 200 + }, + { + "path": "/api/traffic/bound-interfaces", + "status": 200 + }, + { + "path": "/api/traffic/users", + "status": 200 + }, + { + "path": "/api/servers", + "status": 200 + }, + { + "path": "/api/filters/gre-tunnels", + "status": 200 + }, + { + "path": "/api/traffic/flow/clients", + "status": 200 + }, + { + "path": "/api/traffic/flows", + "status": 200 + }, + { + "path": "/api/evobgp/settings", + "status": 200 + }, + { + "path": "/api/sidebar-counts", + "status": 200 + }, + { + "path": "/api/traffic/flow/exporters", + "status": 200 + }, + { + "path": "/api/sidebar-counts", + "status": 200 + }, + { + "path": "/api/traffic/flow/analytics", + "status": 200 + }, + { + "path": "/api/traffic/flow/live", + "status": 200 + } + ], + "pageErrors": [], + "noOverflow": true, + "screenshot": "docs/ux-ui/screens/native-ipv6-ipfix145-1440-2026-10-11.png", + "nativeIpv6RenderedInSessions": true + }, + { + "width": 320, + "api": [ + { + "path": "/api/auth/config", + "status": 200 + }, + { + "path": "/api/traffic/servers", + "status": 200 + }, + { + "path": "/api/traffic/users", + "status": 200 + }, + { + "path": "/api/traffic/bound-interfaces", + "status": 200 + }, + { + "path": "/api/filters/gre-tunnels", + "status": 200 + }, + { + "path": "/api/sidebar-counts", + "status": 200 + }, + { + "path": "/api/servers", + "status": 200 + }, + { + "path": "/api/sidebar-counts", + "status": 200 + }, + { + "path": "/api/evobgp/settings", + "status": 200 + }, + { + "path": "/api/traffic/flows", + "status": 200 + }, + { + "path": "/api/traffic/flow/exporters", + "status": 200 + }, + { + "path": "/api/traffic/flow/clients", + "status": 200 + }, + { + "path": "/api/traffic/flow/analytics", + "status": 200 + }, + { + "path": "/api/traffic/flow/live", + "status": 200 + } + ], + "pageErrors": [], + "noOverflow": true, + "screenshot": "docs/ux-ui/screens/native-ipv6-ipfix145-320-2026-10-11.png", + "nativeIpv6RenderedInSessions": true + } + ], + "bounds": [ + "Own native GRE ULA flows displayed; not public IPv6 WAN connectivity, IPv6 outer or real Internet application traffic", + "IPv6 text presence asserted in Sessions DOM; screenshots capture the current scroll position, not every data-grid row" + ], + "initialAttempts": [ + { + "passed": false, + "reason": "Address search attempted on default applications summary, before selecting Sessions tab" + }, + { + "passed": false, + "reason": "Sessions selector incorrectly used button instead of actual tab role" + } + ] +} diff --git a/docs/ux-ui/screens/native-ipv6-ipfix145-1440-2026-10-11.png b/docs/ux-ui/screens/native-ipv6-ipfix145-1440-2026-10-11.png new file mode 100644 index 00000000..c0bf77e8 Binary files /dev/null and b/docs/ux-ui/screens/native-ipv6-ipfix145-1440-2026-10-11.png differ diff --git a/docs/ux-ui/screens/native-ipv6-ipfix145-320-2026-10-11.png b/docs/ux-ui/screens/native-ipv6-ipfix145-320-2026-10-11.png new file mode 100644 index 00000000..d2144f3b Binary files /dev/null and b/docs/ux-ui/screens/native-ipv6-ipfix145-320-2026-10-11.png differ