diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index dc5bc2a4..ab64a272 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-08: backendbd3f996/frontend731803b, backend healthy. Устойчивость меню GRE при live refresh на обоих CHR принята в12.5.55. GRE peer metadata и реальный lifecycle/API/UI/двусторонний Ping подтверждены в12.5.53. Browser retry/checkpoint на реальном HTTP/PG принят в границах12.5.43–45; Telegram sender responses подменены, реальная доставка не проверена. PG-1/2/3/4/5 приняты в описанных границах, PG-6 integrated для одного isolated instance, PG-7 real JWT/processcounts и browser restore passed. PG-8 real PG/native и browser unknown→history done приняты с fault injection после настоящего COMMIT. ROS-8/9 real API/SQL/native приняты в границах12.5.23; browser pair/duration change и delete приняты в12.5.24. ROS-2 authentication failure принят в12.5.25. PortalSSO, физический TCP disconnect, мультиэкземпляры и остальные ROS/Q/интеграции остаются открытыми. [Паспорт](ux-ui-test-server.md), [журнал](ux-ui-progress.md). +Статус на2026-10-08: backendbd3f996/frontendfd521f6, backend healthy. Мобильная GRE форма и native сохранение на обоих CHR приняты в12.5.57. Устойчивость меню GRE при live refresh на обоих CHR принята в12.5.55. GRE peer metadata и реальный lifecycle/API/UI/двусторонний Ping подтверждены в12.5.53. Browser retry/checkpoint на реальном HTTP/PG принят в границах12.5.43–45; Telegram sender responses подменены, реальная доставка не проверена. PG-1/2/3/4/5 приняты в описанных границах, PG-6 integrated для одного isolated instance, PG-7 real JWT/processcounts и browser restore passed. PG-8 real PG/native и browser unknown→history done приняты с fault injection после настоящего COMMIT. ROS-8/9 real API/SQL/native приняты в границах12.5.23; browser pair/duration change и delete приняты в12.5.24. ROS-2 authentication failure принят в12.5.25. PortalSSO, физический TCP disconnect, мультиэкземпляры и остальные ROS/Q/интеграции остаются открытыми. [Паспорт](ux-ui-test-server.md), [журнал](ux-ui-progress.md). ## Паспорт стенда @@ -405,3 +405,15 @@ DELETE200/200, own интерфейсы/IP и connected routes удалены; Итоговая профильная регрессия gre-form.spec.ts + gre-menu-refresh.spec.ts —4/4 passed: create/DTO/edit, API ошибки и неподтверждённые ответы, сохранение ввода, защита от повторной отправки, открытое меню после refresh. Scoped TypeScript (tmp/tsconfig-speed-check.json), ESLint изменённого page и ReUI checklist passed. Общая регрессия не повторялась для одной адаптивной сетки. Изменение локальное, удалённый runtime backendbd3f996/frontend731803b не менялся. Следующий12.5.57 — frontend production Docker build/deploy и мобильная форма на новой собственной реальной GRE паре/API/RouterOS, затем очистка и baseline. Пользовательское требование настоящих VPN объектов сохраняется. Telegram/Portal/multi-instance и остальные внешние ограничения остаются открытыми. Локальный коммит без push. + +## 12.5.57 — развёртывание мобильной формы и реальная GRE приёмка (2026-10-08) + +[Развёртывание](ux-ui/acceptance/deployed-fd521f6-2026-10-08.json): frontendfd521f6ef892ff3f7e8bc25878d80fb13817dda8/version1.0.0-test.fd521f6, backendbd3f996 healthy. Архив Git SHA2563187feed4f9346045ccf5d878b2965093b4b115f305d1da183523d1b7988204a совпал после передачи. В main-совместимом staging предыдущей сборки обновлён единственный изменённый production input — app/(main)/gre/page.tsx; package-lock и Dockerfile совпали. Docker build exit0/production TypeScript passed. Изменена только MMAPP_IMAGE_TAG, compose validation passed; перезапущен только frontend, предыдущий731803b образ сохранён для rollback. Контрольные значения БД до/после: servers2/speedHistory9/retention14/migrations9 совпали. Push не выполнялся. + +[GRE lifecycle](ux-ui/acceptance/gre-real-mobile-fd521f6-2026-10-08.json): новая собственная пара mm-acceptance-gre-1791469984747, исходные GRE разделы пусты,198.18.255.248/30 не пересекается с недефолтными маршрутами/адресами. POST201/201, native peer metadata, MTU/disable/enable/clear и snapshot restore подтверждены; Ping3/3 в обе стороны,0%loss. Это plain GRE и ICMP, не IPsec/throughput. + +[Production browser](ux-ui/acceptance/browser-gre-mobile-fd521f6-2026-10-08.json): оба CHR × две темы ×320/640/1280px —12 комбинаций без HTTP mocks. Native local/remote inner IP читаются полностью; на320px одна колонка, на640/1280 две; Tab local→remote и отсутствие page overflow подтверждены. Меню сохраняется после live GET200 при1280/320px, повторных открытий0. В тёмной теме формы обоих CHR сохранены с неизменёнными значениями: PATCH200/200, независимое native чтение подтвердило адреса, peer IP и comment. Светлая тема проверена без записи. Server URL context/reload сохранён. JS/API errors0. Browser refresh вызывается без outside pointer event; локальная проверка pending/прав остаётся доказательством54. + +Скриншоты320px: [CHR1 dark](ux-ui/screens/gre-mobile-real-server1-dark-320-2026-10-08.png), [CHR1 light](ux-ui/screens/gre-mobile-real-server1-light-320-2026-10-08.png), [CHR2 dark](ux-ui/screens/gre-mobile-real-server2-dark-320-2026-10-08.png), [CHR2 light](ux-ui/screens/gre-mobile-real-server2-light-320-2026-10-08.png). CHR1 dark и CHR2 light визуально просмотрены: внутренние IP целиком видны. [Smoke](ux-ui/acceptance/deploy-browser-fd521f6-2026-10-08.json): dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0. + +DELETE200/200, собственные GRE/IP/connected routes удалены; выбранные GRE/IP/routes/IPv4 Firewall поля совпали с baseline, CHR1 — одно повторное чтение маршрутов через250ms. Эфемерный контейнер удалён; остались три основные Compose-службы. GRE revisions намеренно сохранены как история операций. Следующий12.5.58 — реальная собственная WireGuard пара, API/native/UI, handshake/связность, очистка и baseline; private/preshared keys не включать в публичные отчёты. Требование пользователя о настоящих VPN объектах сохраняется. Telegram/Portal/multi-instance и другие внешние ограничения остаются открытыми. Локальный коммит без push. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index b1a2aabc..216eb6a7 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,12 +1,12 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-08: 12.5.56 локально улучшил мобильную форму GRE: внутренние IP расположены друг под другом до640px, отsm — в две колонки. Полный IPv4/CIDR читается при320px; обе темы/320/640/1280px/Tab/overflow проверены, профильные Playwright4/4, scoped TypeScript/ESLint passed. На сервере backendbd3f996/frontend731803b: новая сетка ещё не развёрнута. Следующий12.5.57 — Docker deploy frontend и проверка мобильной формы на собственной реальной GRE паре с очисткой; затем остальные VPN. Этап12.5 открыт. +Актуальное продолжение 2026-10-08: 12.5.57 развернул frontendfd521f6, backendbd3f996 healthy. Мобильная GRE форма подтверждена без HTTP mocks на новой собственной паре CHR: две темы/320/640/1280px, полный native IPv4/CIDR, Tab, меню refresh и сохранение PATCH200/200 с независимым чтением RouterOS. Ping3/3 в обе стороны; own GRE/IP удалены, выбранный baseline и DB controls совпали. Smoke6 экранов passed. Следующий12.5.58 — настоящая WireGuard пара: API/native/UI, handshake/связность и очистка собственных объектов; секреты в отчёты не включать. Этап12.5 открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-08. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. ## Актуальная точка продолжения — 2026-10-08 -Этапы0–11 завершены в описанных локальных границах. Этап12 открыт. На тестовом сервере161.104.46.222 работают backendbd3f996/frontend731803b и два CHR. Внешние проверки подтвердили PG backup/restore/rollback, остановку фоновой работы для одного экземпляра, API JWT/RBAC и браузерные состояния восстановления. Native TCP/UDP speed, история и UI проверены в границах журнала; доступ ко второму CHR восстановлен пользователем. Очередь Telegram проверена на реальном PG: dedupe, конкурентный claim, retry/version, ошибки сохранения и неопределённый исход; ответы отправителя подменялись, реальной доставки это не доказывает. Блоки12.5.43–45 подтвердили browser retry/checkpoint и развернули понятное пояснение HTTP500. 12.5.46 подтвердил browser JWT/RBAC очереди на реальном HTTP/PG; 12.5.47 подтвердил изоляцию checkpoint при смене двух реальных HTTP/PG источников в конфигурации local; 12.5.48 подтвердил scoped axe/клавиатуру в обеих темах и320px; 12.5.49 собрал Q-матрицу и подтвердил отсутствие настройки Telegram; 12.5.50 подтвердил GET-only инвентаризацию: VPN/BGP/OSPF пусты, роли home-router/home-router; По уточнению пользователя12.5.51 создал реальные GRE туннели и подтвердил lifecycle/связность; обнаружена потеря peer IP, 12.5.52 локально исправил сохранение peer metadata, профильные проверки passed; 12.5.53 развернул исправление и подтвердил его на реальной GRE паре/API/UI; 12.5.54 локально исправил устойчивость меню GRE, профильные проверки passed; 12.5.55 развернул frontend731803b и подтвердил устойчивость меню на реальной GRE паре; 12.5.56 локально адаптировал внутренние IP поля GRE для320px, обе темы и профильные проверки passed; следующий12.5.57 — frontend deploy и настоящая мобильная GRE проверка. Реальная Telegram доставка, Portal SSO, физический TCP disconnect, multi-instance и остальные профильные сетевые сценарии остаются открытыми. [Протокол](ux-ui-external-acceptance.md) и [журнал](ux-ui-stage-12.md) содержат доказательства и ограничения. +Этапы0–11 завершены в описанных локальных границах. Этап12 открыт. На тестовом сервере161.104.46.222 работают backendbd3f996/frontendfd521f6 и два CHR. Внешние проверки подтвердили PG backup/restore/rollback, остановку фоновой работы для одного экземпляра, API JWT/RBAC и браузерные состояния восстановления. Native TCP/UDP speed, история и UI проверены в границах журнала; доступ ко второму CHR восстановлен пользователем. Очередь Telegram проверена на реальном PG: dedupe, конкурентный claim, retry/version, ошибки сохранения и неопределённый исход; ответы отправителя подменялись, реальной доставки это не доказывает. Блоки12.5.43–45 подтвердили browser retry/checkpoint и развернули понятное пояснение HTTP500. 12.5.46 подтвердил browser JWT/RBAC очереди на реальном HTTP/PG; 12.5.47 подтвердил изоляцию checkpoint при смене двух реальных HTTP/PG источников в конфигурации local; 12.5.48 подтвердил scoped axe/клавиатуру в обеих темах и320px; 12.5.49 собрал Q-матрицу и подтвердил отсутствие настройки Telegram; 12.5.50 подтвердил GET-only инвентаризацию: VPN/BGP/OSPF пусты, роли home-router/home-router; По уточнению пользователя12.5.51 создал реальные GRE туннели и подтвердил lifecycle/связность; обнаружена потеря peer IP, 12.5.52 локально исправил сохранение peer metadata, профильные проверки passed; 12.5.53 развернул исправление и подтвердил его на реальной GRE паре/API/UI; 12.5.54 локально исправил устойчивость меню GRE, профильные проверки passed; 12.5.55 развернул frontend731803b и подтвердил устойчивость меню на реальной GRE паре; 12.5.56 локально адаптировал внутренние IP поля GRE для320px, обе темы и профильные проверки passed; 12.5.57 развернул frontendfd521f6 и подтвердил мобильную GRE форму на реальной паре CHR; следующий12.5.58 — собственная настоящая WireGuard пара с handshake/связностью и очисткой. Реальная Telegram доставка, Portal SSO, физический TCP disconnect, multi-instance и остальные профильные сетевые сценарии остаются открытыми. [Протокол](ux-ui-external-acceptance.md) и [журнал](ux-ui-stage-12.md) содержат доказательства и ограничения. Выполненные внешние сценарии не заменяют приёмку оставшихся интеграций и условий эксплуатации. Датированные продолжения ниже — история; точный следующий шаг указан в начале [журнала](ux-ui-progress.md). diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index e15c1806..d9300930 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-08: 12.5.56 локально улучшил мобильную форму GRE: внутренние IP расположены друг под другом до640px, отsm — в две колонки. Полный IPv4/CIDR читается при320px; обе темы/320/640/1280px/Tab/overflow проверены, профильные Playwright4/4, scoped TypeScript/ESLint passed. На сервере backendbd3f996/frontend731803b: новая сетка ещё не развёрнута. Следующий12.5.57 — Docker deploy frontend и проверка мобильной формы на собственной реальной GRE паре с очисткой; затем остальные VPN. Этап12.5 открыт. +Актуальное продолжение 2026-10-08: 12.5.57 развернул frontendfd521f6, backendbd3f996 healthy. Мобильная GRE форма подтверждена без HTTP mocks на новой собственной паре CHR: две темы/320/640/1280px, полный native IPv4/CIDR, Tab, меню refresh и сохранение PATCH200/200 с независимым чтением RouterOS. Ping3/3 в обе стороны; own GRE/IP удалены, выбранный baseline и DB controls совпали. Smoke6 экранов passed. Следующий12.5.58 — настоящая WireGuard пара: API/native/UI, handshake/связность и очистка собственных объектов; секреты в отчёты не включать. Этап12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -34,7 +34,19 @@ | 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–56 и ограничения ниже. Runtime backendbd3f996/frontend731803b. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–57 и ограничения ниже. Runtime backendbd3f996/frontendfd521f6. | + +## 12.5.57 — развёртывание мобильной формы и реальная GRE приёмка (2026-10-08) + +[Развёртывание](ux-ui/acceptance/deployed-fd521f6-2026-10-08.json): frontendfd521f6ef892ff3f7e8bc25878d80fb13817dda8/version1.0.0-test.fd521f6, backendbd3f996 healthy. Архив Git SHA2563187feed4f9346045ccf5d878b2965093b4b115f305d1da183523d1b7988204a совпал после передачи. В main-совместимом staging предыдущей сборки обновлён единственный изменённый production input — app/(main)/gre/page.tsx; package-lock и Dockerfile совпали. Docker build exit0/production TypeScript passed. Изменена только MMAPP_IMAGE_TAG, compose validation passed; перезапущен только frontend, предыдущий731803b образ сохранён для rollback. Контрольные значения БД до/после: servers2/speedHistory9/retention14/migrations9 совпали. Push не выполнялся. + +[GRE lifecycle](ux-ui/acceptance/gre-real-mobile-fd521f6-2026-10-08.json): новая собственная пара mm-acceptance-gre-1791469984747, исходные GRE разделы пусты,198.18.255.248/30 не пересекается с недефолтными маршрутами/адресами. POST201/201, native peer metadata, MTU/disable/enable/clear и snapshot restore подтверждены; Ping3/3 в обе стороны,0%loss. Это plain GRE и ICMP, не IPsec/throughput. + +[Production browser](ux-ui/acceptance/browser-gre-mobile-fd521f6-2026-10-08.json): оба CHR × две темы ×320/640/1280px —12 комбинаций без HTTP mocks. Native local/remote inner IP читаются полностью; на320px одна колонка, на640/1280 две; Tab local→remote и отсутствие page overflow подтверждены. Меню сохраняется после live GET200 при1280/320px, повторных открытий0. В тёмной теме формы обоих CHR сохранены с неизменёнными значениями: PATCH200/200, независимое native чтение подтвердило адреса, peer IP и comment. Светлая тема проверена без записи. Server URL context/reload сохранён. JS/API errors0. Browser refresh вызывается без outside pointer event; локальная проверка pending/прав остаётся доказательством54. + +Скриншоты320px: [CHR1 dark](ux-ui/screens/gre-mobile-real-server1-dark-320-2026-10-08.png), [CHR1 light](ux-ui/screens/gre-mobile-real-server1-light-320-2026-10-08.png), [CHR2 dark](ux-ui/screens/gre-mobile-real-server2-dark-320-2026-10-08.png), [CHR2 light](ux-ui/screens/gre-mobile-real-server2-light-320-2026-10-08.png). CHR1 dark и CHR2 light визуально просмотрены: внутренние IP целиком видны. [Smoke](ux-ui/acceptance/deploy-browser-fd521f6-2026-10-08.json): dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0. + +DELETE200/200, собственные GRE/IP/connected routes удалены; выбранные GRE/IP/routes/IPv4 Firewall поля совпали с baseline, CHR1 — одно повторное чтение маршрутов через250ms. Эфемерный контейнер удалён; остались три основные Compose-службы. GRE revisions намеренно сохранены как история операций. Следующий12.5.58 — реальная собственная WireGuard пара, API/native/UI, handshake/связность, очистка и baseline; private/preshared keys не включать в публичные отчёты. Требование пользователя о настоящих VPN объектах сохраняется. Telegram/Portal/multi-instance и другие внешние ограничения остаются открытыми. Локальный коммит без push. ## 12.5.56 — читаемые внутренние IP в мобильной форме GRE (2026-10-08) diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 7faae857..d5818ce8 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-08: 12.5.56 локально улучшил мобильную форму GRE: внутренние IP расположены друг под другом до640px, отsm — в две колонки. Полный IPv4/CIDR читается при320px; обе темы/320/640/1280px/Tab/overflow проверены, профильные Playwright4/4, scoped TypeScript/ESLint passed. На сервере backendbd3f996/frontend731803b: новая сетка ещё не развёрнута. Следующий12.5.57 — Docker deploy frontend и проверка мобильной формы на собственной реальной GRE паре с очисткой; затем остальные VPN. Этап12.5 открыт. +Актуальное продолжение 2026-10-08: 12.5.57 развернул frontendfd521f6, backendbd3f996 healthy. Мобильная GRE форма подтверждена без HTTP mocks на новой собственной паре CHR: две темы/320/640/1280px, полный native IPv4/CIDR, Tab, меню refresh и сохранение PATCH200/200 с независимым чтением RouterOS. Ping3/3 в обе стороны; own GRE/IP удалены, выбранный baseline и DB controls совпали. Smoke6 экранов passed. Следующий12.5.58 — настоящая WireGuard пара: API/native/UI, handshake/связность и очистка собственных объектов; секреты в отчёты не включать. Этап12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -1570,3 +1570,15 @@ DELETE200/200, own интерфейсы/IP и connected routes удалены; Итоговая профильная регрессия gre-form.spec.ts + gre-menu-refresh.spec.ts —4/4 passed: create/DTO/edit, API ошибки и неподтверждённые ответы, сохранение ввода, защита от повторной отправки, открытое меню после refresh. Scoped TypeScript (tmp/tsconfig-speed-check.json), ESLint изменённого page и ReUI checklist passed. Общая регрессия не повторялась для одной адаптивной сетки. Изменение локальное, удалённый runtime backendbd3f996/frontend731803b не менялся. Следующий12.5.57 — frontend production Docker build/deploy и мобильная форма на новой собственной реальной GRE паре/API/RouterOS, затем очистка и baseline. Пользовательское требование настоящих VPN объектов сохраняется. Telegram/Portal/multi-instance и остальные внешние ограничения остаются открытыми. Локальный коммит без push. + +## 12.5.57 — развёртывание мобильной формы и реальная GRE приёмка (2026-10-08) + +[Развёртывание](ux-ui/acceptance/deployed-fd521f6-2026-10-08.json): frontendfd521f6ef892ff3f7e8bc25878d80fb13817dda8/version1.0.0-test.fd521f6, backendbd3f996 healthy. Архив Git SHA2563187feed4f9346045ccf5d878b2965093b4b115f305d1da183523d1b7988204a совпал после передачи. В main-совместимом staging предыдущей сборки обновлён единственный изменённый production input — app/(main)/gre/page.tsx; package-lock и Dockerfile совпали. Docker build exit0/production TypeScript passed. Изменена только MMAPP_IMAGE_TAG, compose validation passed; перезапущен только frontend, предыдущий731803b образ сохранён для rollback. Контрольные значения БД до/после: servers2/speedHistory9/retention14/migrations9 совпали. Push не выполнялся. + +[GRE lifecycle](ux-ui/acceptance/gre-real-mobile-fd521f6-2026-10-08.json): новая собственная пара mm-acceptance-gre-1791469984747, исходные GRE разделы пусты,198.18.255.248/30 не пересекается с недефолтными маршрутами/адресами. POST201/201, native peer metadata, MTU/disable/enable/clear и snapshot restore подтверждены; Ping3/3 в обе стороны,0%loss. Это plain GRE и ICMP, не IPsec/throughput. + +[Production browser](ux-ui/acceptance/browser-gre-mobile-fd521f6-2026-10-08.json): оба CHR × две темы ×320/640/1280px —12 комбинаций без HTTP mocks. Native local/remote inner IP читаются полностью; на320px одна колонка, на640/1280 две; Tab local→remote и отсутствие page overflow подтверждены. Меню сохраняется после live GET200 при1280/320px, повторных открытий0. В тёмной теме формы обоих CHR сохранены с неизменёнными значениями: PATCH200/200, независимое native чтение подтвердило адреса, peer IP и comment. Светлая тема проверена без записи. Server URL context/reload сохранён. JS/API errors0. Browser refresh вызывается без outside pointer event; локальная проверка pending/прав остаётся доказательством54. + +Скриншоты320px: [CHR1 dark](ux-ui/screens/gre-mobile-real-server1-dark-320-2026-10-08.png), [CHR1 light](ux-ui/screens/gre-mobile-real-server1-light-320-2026-10-08.png), [CHR2 dark](ux-ui/screens/gre-mobile-real-server2-dark-320-2026-10-08.png), [CHR2 light](ux-ui/screens/gre-mobile-real-server2-light-320-2026-10-08.png). CHR1 dark и CHR2 light визуально просмотрены: внутренние IP целиком видны. [Smoke](ux-ui/acceptance/deploy-browser-fd521f6-2026-10-08.json): dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0. + +DELETE200/200, собственные GRE/IP/connected routes удалены; выбранные GRE/IP/routes/IPv4 Firewall поля совпали с baseline, CHR1 — одно повторное чтение маршрутов через250ms. Эфемерный контейнер удалён; остались три основные Compose-службы. GRE revisions намеренно сохранены как история операций. Следующий12.5.58 — реальная собственная WireGuard пара, API/native/UI, handshake/связность, очистка и baseline; private/preshared keys не включать в публичные отчёты. Требование пользователя о настоящих VPN объектах сохраняется. Telegram/Portal/multi-instance и другие внешние ограничения остаются открытыми. Локальный коммит без push. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index 9e5bd81b..c7d1a90d 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -1,6 +1,6 @@ # Тестовый сервер UX/UI — 2026-10-08 -Сервер161.104.46.222 предоставлен пользователем для временного тестирования с последующим удалением. Подготовка выполнена по структуре deploy/docker-compose.yml из main. Приложение собрано и запущено. Активный backend sourcebd3f996f55cccd312dfe5861900849ca21791be8/version1.0.0-test.bd3f996 healthy. Frontend source731803bade672e4e5bd58ffbc223563f3318d4a9/version1.0.0-test.731803b обновлён в12.5.55. +Сервер161.104.46.222 предоставлен пользователем для временного тестирования с последующим удалением. Подготовка выполнена по структуре deploy/docker-compose.yml из main. Приложение собрано и запущено. Активный backend sourcebd3f996f55cccd312dfe5861900849ca21791be8/version1.0.0-test.bd3f996 healthy. Frontend sourcefd521f6ef892ff3f7e8bc25878d80fb13817dda8/version1.0.0-test.fd521f6 обновлён в12.5.57. | Параметр | Проверенное состояние | | --- | --- | @@ -413,3 +413,15 @@ DELETE200/200, own интерфейсы/IP и connected routes удалены; Итоговая профильная регрессия gre-form.spec.ts + gre-menu-refresh.spec.ts —4/4 passed: create/DTO/edit, API ошибки и неподтверждённые ответы, сохранение ввода, защита от повторной отправки, открытое меню после refresh. Scoped TypeScript (tmp/tsconfig-speed-check.json), ESLint изменённого page и ReUI checklist passed. Общая регрессия не повторялась для одной адаптивной сетки. Изменение локальное, удалённый runtime backendbd3f996/frontend731803b не менялся. Следующий12.5.57 — frontend production Docker build/deploy и мобильная форма на новой собственной реальной GRE паре/API/RouterOS, затем очистка и baseline. Пользовательское требование настоящих VPN объектов сохраняется. Telegram/Portal/multi-instance и остальные внешние ограничения остаются открытыми. Локальный коммит без push. + +## 12.5.57 — развёртывание мобильной формы и реальная GRE приёмка (2026-10-08) + +[Развёртывание](ux-ui/acceptance/deployed-fd521f6-2026-10-08.json): frontendfd521f6ef892ff3f7e8bc25878d80fb13817dda8/version1.0.0-test.fd521f6, backendbd3f996 healthy. Архив Git SHA2563187feed4f9346045ccf5d878b2965093b4b115f305d1da183523d1b7988204a совпал после передачи. В main-совместимом staging предыдущей сборки обновлён единственный изменённый production input — app/(main)/gre/page.tsx; package-lock и Dockerfile совпали. Docker build exit0/production TypeScript passed. Изменена только MMAPP_IMAGE_TAG, compose validation passed; перезапущен только frontend, предыдущий731803b образ сохранён для rollback. Контрольные значения БД до/после: servers2/speedHistory9/retention14/migrations9 совпали. Push не выполнялся. + +[GRE lifecycle](ux-ui/acceptance/gre-real-mobile-fd521f6-2026-10-08.json): новая собственная пара mm-acceptance-gre-1791469984747, исходные GRE разделы пусты,198.18.255.248/30 не пересекается с недефолтными маршрутами/адресами. POST201/201, native peer metadata, MTU/disable/enable/clear и snapshot restore подтверждены; Ping3/3 в обе стороны,0%loss. Это plain GRE и ICMP, не IPsec/throughput. + +[Production browser](ux-ui/acceptance/browser-gre-mobile-fd521f6-2026-10-08.json): оба CHR × две темы ×320/640/1280px —12 комбинаций без HTTP mocks. Native local/remote inner IP читаются полностью; на320px одна колонка, на640/1280 две; Tab local→remote и отсутствие page overflow подтверждены. Меню сохраняется после live GET200 при1280/320px, повторных открытий0. В тёмной теме формы обоих CHR сохранены с неизменёнными значениями: PATCH200/200, независимое native чтение подтвердило адреса, peer IP и comment. Светлая тема проверена без записи. Server URL context/reload сохранён. JS/API errors0. Browser refresh вызывается без outside pointer event; локальная проверка pending/прав остаётся доказательством54. + +Скриншоты320px: [CHR1 dark](ux-ui/screens/gre-mobile-real-server1-dark-320-2026-10-08.png), [CHR1 light](ux-ui/screens/gre-mobile-real-server1-light-320-2026-10-08.png), [CHR2 dark](ux-ui/screens/gre-mobile-real-server2-dark-320-2026-10-08.png), [CHR2 light](ux-ui/screens/gre-mobile-real-server2-light-320-2026-10-08.png). CHR1 dark и CHR2 light визуально просмотрены: внутренние IP целиком видны. [Smoke](ux-ui/acceptance/deploy-browser-fd521f6-2026-10-08.json): dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0. + +DELETE200/200, собственные GRE/IP/connected routes удалены; выбранные GRE/IP/routes/IPv4 Firewall поля совпали с baseline, CHR1 — одно повторное чтение маршрутов через250ms. Эфемерный контейнер удалён; остались три основные Compose-службы. GRE revisions намеренно сохранены как история операций. Следующий12.5.58 — реальная собственная WireGuard пара, API/native/UI, handshake/связность, очистка и baseline; private/preshared keys не включать в публичные отчёты. Требование пользователя о настоящих VPN объектах сохраняется. Telegram/Portal/multi-instance и другие внешние ограничения остаются открытыми. Локальный коммит без push. diff --git a/docs/ux-ui/acceptance/browser-gre-mobile-fd521f6-2026-10-08.json b/docs/ux-ui/acceptance/browser-gre-mobile-fd521f6-2026-10-08.json new file mode 100644 index 00000000..d690c97f --- /dev/null +++ b/docs/ux-ui/acceptance/browser-gre-mobile-fd521f6-2026-10-08.json @@ -0,0 +1,298 @@ +{ + "date": "2026-10-08", + "frontendSource": "fd521f6", + "backendSource": "bd3f996", + "name": "mm-acceptance-gre-1791469984747", + "httpMocks": false, + "actualCreatedGre": true, + "cases": [ + { + "serverId": 1, + "theme": "dark", + "layouts": [ + { + "width": 320, + "columns": 1, + "fullNativeIpv4CidrFits": true, + "fieldWidths": [ + { + "value": "198.18.255.249/30", + "textWidth": 163.19984436035156, + "availableWidth": 249 + }, + { + "value": "198.18.255.250/30", + "textWidth": 163.19984436035156, + "availableWidth": 249 + } + ], + "keyboardOrder": true, + "noPageOverflow": true + }, + { + "width": 640, + "columns": 2, + "fullNativeIpv4CidrFits": true, + "fieldWidths": [ + { + "value": "198.18.255.249/30", + "textWidth": 163.19984436035156, + "availableWidth": 204 + }, + { + "value": "198.18.255.250/30", + "textWidth": 163.19984436035156, + "availableWidth": 204 + } + ], + "keyboardOrder": true, + "noPageOverflow": true + }, + { + "width": 1280, + "columns": 2, + "fullNativeIpv4CidrFits": true, + "fieldWidths": [ + { + "value": "198.18.255.249/30", + "textWidth": 142.79989624023438, + "availableWidth": 204 + }, + { + "value": "198.18.255.250/30", + "textWidth": 142.79989624023438, + "availableWidth": 204 + } + ], + "keyboardOrder": true, + "noPageOverflow": true + } + ], + "menuReopens": 0, + "liveRefreshMenuStable": true, + "formMatchesNative": true, + "sameValuesSavedViaBrowser": true, + "nativeSaveConfirmed": true, + "urlContextPreserved": true + }, + { + "serverId": 1, + "theme": "light", + "layouts": [ + { + "width": 320, + "columns": 1, + "fullNativeIpv4CidrFits": true, + "fieldWidths": [ + { + "value": "198.18.255.249/30", + "textWidth": 163.19984436035156, + "availableWidth": 249 + }, + { + "value": "198.18.255.250/30", + "textWidth": 163.19984436035156, + "availableWidth": 249 + } + ], + "keyboardOrder": true, + "noPageOverflow": true + }, + { + "width": 640, + "columns": 2, + "fullNativeIpv4CidrFits": true, + "fieldWidths": [ + { + "value": "198.18.255.249/30", + "textWidth": 163.19984436035156, + "availableWidth": 204 + }, + { + "value": "198.18.255.250/30", + "textWidth": 163.19984436035156, + "availableWidth": 204 + } + ], + "keyboardOrder": true, + "noPageOverflow": true + }, + { + "width": 1280, + "columns": 2, + "fullNativeIpv4CidrFits": true, + "fieldWidths": [ + { + "value": "198.18.255.249/30", + "textWidth": 142.79989624023438, + "availableWidth": 204 + }, + { + "value": "198.18.255.250/30", + "textWidth": 142.79989624023438, + "availableWidth": 204 + } + ], + "keyboardOrder": true, + "noPageOverflow": true + } + ], + "menuReopens": 0, + "liveRefreshMenuStable": true, + "formMatchesNative": true, + "sameValuesSavedViaBrowser": false, + "nativeSaveConfirmed": false, + "urlContextPreserved": true + }, + { + "serverId": 2, + "theme": "dark", + "layouts": [ + { + "width": 320, + "columns": 1, + "fullNativeIpv4CidrFits": true, + "fieldWidths": [ + { + "value": "198.18.255.250/30", + "textWidth": 163.19984436035156, + "availableWidth": 249 + }, + { + "value": "198.18.255.249/30", + "textWidth": 163.19984436035156, + "availableWidth": 249 + } + ], + "keyboardOrder": true, + "noPageOverflow": true + }, + { + "width": 640, + "columns": 2, + "fullNativeIpv4CidrFits": true, + "fieldWidths": [ + { + "value": "198.18.255.250/30", + "textWidth": 163.19984436035156, + "availableWidth": 204 + }, + { + "value": "198.18.255.249/30", + "textWidth": 163.19984436035156, + "availableWidth": 204 + } + ], + "keyboardOrder": true, + "noPageOverflow": true + }, + { + "width": 1280, + "columns": 2, + "fullNativeIpv4CidrFits": true, + "fieldWidths": [ + { + "value": "198.18.255.250/30", + "textWidth": 142.79989624023438, + "availableWidth": 204 + }, + { + "value": "198.18.255.249/30", + "textWidth": 142.79989624023438, + "availableWidth": 204 + } + ], + "keyboardOrder": true, + "noPageOverflow": true + } + ], + "menuReopens": 0, + "liveRefreshMenuStable": true, + "formMatchesNative": true, + "sameValuesSavedViaBrowser": true, + "nativeSaveConfirmed": true, + "urlContextPreserved": true + }, + { + "serverId": 2, + "theme": "light", + "layouts": [ + { + "width": 320, + "columns": 1, + "fullNativeIpv4CidrFits": true, + "fieldWidths": [ + { + "value": "198.18.255.250/30", + "textWidth": 163.19984436035156, + "availableWidth": 249 + }, + { + "value": "198.18.255.249/30", + "textWidth": 163.19984436035156, + "availableWidth": 249 + } + ], + "keyboardOrder": true, + "noPageOverflow": true + }, + { + "width": 640, + "columns": 2, + "fullNativeIpv4CidrFits": true, + "fieldWidths": [ + { + "value": "198.18.255.250/30", + "textWidth": 163.19984436035156, + "availableWidth": 204 + }, + { + "value": "198.18.255.249/30", + "textWidth": 163.19984436035156, + "availableWidth": 204 + } + ], + "keyboardOrder": true, + "noPageOverflow": true + }, + { + "width": 1280, + "columns": 2, + "fullNativeIpv4CidrFits": true, + "fieldWidths": [ + { + "value": "198.18.255.250/30", + "textWidth": 142.79989624023438, + "availableWidth": 204 + }, + { + "value": "198.18.255.249/30", + "textWidth": 142.79989624023438, + "availableWidth": 204 + } + ], + "keyboardOrder": true, + "noPageOverflow": true + } + ], + "menuReopens": 0, + "liveRefreshMenuStable": true, + "formMatchesNative": true, + "sameValuesSavedViaBrowser": false, + "nativeSaveConfirmed": false, + "urlContextPreserved": true + } + ], + "browserPatchStatuses": [ + 200, + 200 + ], + "pageErrors": [], + "badApiResponses": [], + "limits": [ + "Own live GRE pair; no HTTP mocks", + "Browser saved unchanged inner IP values on both CHRs; helper read native results", + "Menu refresh invoked without outside pointer event; no claim for other VPN or encryption", + "Harness owns cleanup and checks selected baseline fields" + ] +} diff --git a/docs/ux-ui/acceptance/deploy-browser-fd521f6-2026-10-08.json b/docs/ux-ui/acceptance/deploy-browser-fd521f6-2026-10-08.json new file mode 100644 index 00000000..eb575079 --- /dev/null +++ b/docs/ux-ui/acceptance/deploy-browser-fd521f6-2026-10-08.json @@ -0,0 +1,40 @@ +{ + "date": "2026-10-08", + "backendSource": "bd3f996f55cccd312dfe5861900849ca21791be8", + "frontendSource": "fd521f6ef892ff3f7e8bc25878d80fb13817dda8", + "httpMocks": false, + "pages": [ + { + "path": "/dashboard", + "status": 200, + "mobileFits": true + }, + { + "path": "/servers", + "status": 200, + "mobileFits": true + }, + { + "path": "/uptime?tab=speed", + "status": 200, + "mobileFits": true + }, + { + "path": "/settings", + "status": 200, + "mobileFits": true + }, + { + "path": "/filters", + "status": 200, + "mobileFits": true + }, + { + "path": "/alerts", + "status": 200, + "mobileFits": true + } + ], + "pageErrors": [], + "badApiResponses": [] +} diff --git a/docs/ux-ui/acceptance/deployed-fd521f6-2026-10-08.json b/docs/ux-ui/acceptance/deployed-fd521f6-2026-10-08.json new file mode 100644 index 00000000..018f9cac --- /dev/null +++ b/docs/ux-ui/acceptance/deployed-fd521f6-2026-10-08.json @@ -0,0 +1,41 @@ +{ + "date": "2026-10-08", + "frontendSource": "fd521f6ef892ff3f7e8bc25878d80fb13817dda8", + "backendSource": "bd3f996f55cccd312dfe5861900849ca21791be8", + "frontendImageId": "sha256:6623b35b9679fd0797b309f68534ed3494f191ed2ae0f5280a3983a380d61bfc", + "backendImageId": "sha256:6bb78eaeb922de577d399633ed6fcc821a47ae8abbb947ce6971bb453bfcf6d8", + "frontendVersion": "1.0.0-test.fd521f6", + "backendHealthy": true, + "sourceArchiveSha256": "3187feed4f9346045ccf5d878b2965093b4b115f305d1da183523d1b7988204a", + "buildExit": 0, + "productionTypeScriptPassed": true, + "frontendOnlyRestart": true, + "rollbackImageRetained": true, + "controlBefore": { + "servers": 2, + "speedHistory": 9, + "retentionDays": 14, + "migrations": 9 + }, + "health": { + "status": "ok", + "timestamp": "2026-10-08T14:33:29.005Z", + "version": "1.0.0-test.bd3f996", + "eventLoopDelayMs": 20, + "flowWorker": { + "alive": false, + "bound": false, + "pendingSize": 0, + "dropped": 0, + "packetsReceived": 0 + } + }, + "push": false, + "controlAfter": { + "servers": 2, + "speedHistory": 9, + "retentionDays": 14, + "migrations": 9 + }, + "controlsUnchanged": true +} diff --git a/docs/ux-ui/acceptance/gre-real-mobile-fd521f6-2026-10-08.json b/docs/ux-ui/acceptance/gre-real-mobile-fd521f6-2026-10-08.json new file mode 100644 index 00000000..45583fbf --- /dev/null +++ b/docs/ux-ui/acceptance/gre-real-mobile-fd521f6-2026-10-08.json @@ -0,0 +1,250 @@ +{ + "date": "2026-10-08", + "backendSource": "bd3f996", + "frontendSource": "fd521f6", + "name": "mm-acceptance-gre-1791469984747", + "subnet": "198.18.255.248/30", + "changes": [ + { + "method": "POST", + "path": "/api/gre/tunnels", + "status": 201 + }, + { + "method": "POST", + "path": "/api/gre/tunnels", + "status": 201 + }, + { + "method": "GET", + "path": "/api/gre/revisions?serverId=1", + "status": 200 + }, + { + "method": "PATCH", + "path": "/api/gre/tunnels", + "status": 200 + }, + { + "method": "PATCH", + "path": "/api/gre/tunnels", + "status": 200 + }, + { + "method": "PATCH", + "path": "/api/gre/tunnels", + "status": 200 + }, + { + "method": "PATCH", + "path": "/api/gre/tunnels", + "status": 200 + }, + { + "method": "POST", + "path": "/api/gre/revisions/1ce3aacf-eb9f-4f71-a2a9-48f199e9db5d/restore", + "status": 200 + }, + { + "method": "DELETE", + "path": "/api/gre/tunnels", + "status": 200 + }, + { + "method": "DELETE", + "path": "/api/gre/tunnels", + "status": 200 + } + ], + "pings": [ + { + "serverId": 1, + "target": "198.18.255.250", + "interface": "mm-acceptance-gre-1791469984747", + "rows": [ + { + "sent": "1", + "received": "1", + "packet-loss": "0", + "time": "54ms717us", + "avg-rtt": "54ms717us" + }, + { + "sent": "2", + "received": "2", + "packet-loss": "0", + "time": "55ms29us", + "avg-rtt": "54ms873us" + }, + { + "sent": "3", + "received": "3", + "packet-loss": "0", + "time": "54ms379us", + "avg-rtt": "54ms708us" + } + ], + "received": 3 + }, + { + "serverId": 2, + "target": "198.18.255.249", + "interface": "mm-acceptance-gre-1791469984747", + "rows": [ + { + "sent": "1", + "received": "1", + "packet-loss": "0", + "time": "54ms367us", + "avg-rtt": "54ms367us" + }, + { + "sent": "2", + "received": "2", + "packet-loss": "0", + "time": "54ms753us", + "avg-rtt": "54ms560us" + }, + { + "sent": "3", + "received": "3", + "packet-loss": "0", + "time": "54ms251us", + "avg-rtt": "54ms457us" + } + ], + "received": 3 + } + ], + "realRouterOs": true, + "creates": [ + { + "serverId": 1, + "status": 201, + "name": "mm-acceptance-gre-1791469984747", + "returnedRemoteInnerIp": "198.18.255.250/30", + "requestedRemoteInnerIp": "198.18.255.250/30" + }, + { + "serverId": 2, + "status": 201, + "name": "mm-acceptance-gre-1791469984747", + "returnedRemoteInnerIp": "198.18.255.249/30", + "requestedRemoteInnerIp": "198.18.255.249/30" + } + ], + "snapshotPeerPersisted": true, + "createdState": [ + { + "serverId": 1, + "interface": { + "rosId": "*4", + "name": "mm-acceptance-gre-1791469984747", + "localAddress": "194.226.121.150", + "remoteAddress": "104.165.244.7", + "mtu": "1400", + "keepalive": "2s,3", + "remoteInnerIp": "198.18.255.250/30", + "userComment": "Temporary UX acceptance mm-acceptance-gre-1791469984747", + "running": "false", + "disabled": "false" + }, + "addresses": [ + "198.18.255.249/30" + ] + }, + { + "serverId": 2, + "interface": { + "rosId": "*9", + "name": "mm-acceptance-gre-1791469984747", + "localAddress": "104.165.244.7", + "remoteAddress": "194.226.121.150", + "mtu": "1400", + "keepalive": "2s,3", + "remoteInnerIp": "198.18.255.249/30", + "userComment": "Temporary UX acceptance mm-acceptance-gre-1791469984747", + "running": "false", + "disabled": "false" + }, + "addresses": [ + "198.18.255.250/30" + ] + } + ], + "runningBeforePing": true, + "bidirectionalPingPassed": true, + "updatedState": [ + { + "serverId": 1, + "interface": { + "rosId": "*4", + "name": "mm-acceptance-gre-1791469984747", + "localAddress": "194.226.121.150", + "remoteAddress": "104.165.244.7", + "mtu": "1360", + "keepalive": "2s,3", + "remoteInnerIp": "198.18.255.250/30", + "userComment": "Temporary UX acceptance mm-acceptance-gre-1791469984747", + "running": "true", + "disabled": "false" + }, + "addresses": [ + "198.18.255.249/30" + ] + }, + { + "serverId": 2, + "interface": { + "rosId": "*9", + "name": "mm-acceptance-gre-1791469984747", + "localAddress": "104.165.244.7", + "remoteAddress": "194.226.121.150", + "mtu": "1400", + "keepalive": "2s,3", + "remoteInnerIp": "198.18.255.249/30", + "userComment": "Temporary UX acceptance mm-acceptance-gre-1791469984747", + "running": "true", + "disabled": "false" + }, + "addresses": [ + "198.18.255.250/30" + ] + } + ], + "explicitClearConfirmed": true, + "snapshotRestoreConfirmed": true, + "routeConvergence": [ + { + "serverId": 1, + "polls": 1, + "matched": true + } + ], + "cleanup": [ + { + "serverId": 1, + "/interface/gre": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/filter": true, + "/ip/firewall/nat": true, + "/ip/firewall/mangle": true + }, + { + "serverId": 2, + "/interface/gre": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/filter": true, + "/ip/firewall/nat": true, + "/ip/firewall/mangle": true + } + ], + "limits": [ + "Plain GRE, not encrypted IPsec; no throughput test", + "Only own interface/IPs and generated connected route changed; no default routes or firewall changes", + "Application GRE revisions intentionally remain as audit history", + "Ping success establishes tested point-to-point traffic only" + ] +} diff --git a/docs/ux-ui/screens/gre-mobile-real-server1-dark-320-2026-10-08.png b/docs/ux-ui/screens/gre-mobile-real-server1-dark-320-2026-10-08.png new file mode 100644 index 00000000..88092747 Binary files /dev/null and b/docs/ux-ui/screens/gre-mobile-real-server1-dark-320-2026-10-08.png differ diff --git a/docs/ux-ui/screens/gre-mobile-real-server1-light-320-2026-10-08.png b/docs/ux-ui/screens/gre-mobile-real-server1-light-320-2026-10-08.png new file mode 100644 index 00000000..9f3b4971 Binary files /dev/null and b/docs/ux-ui/screens/gre-mobile-real-server1-light-320-2026-10-08.png differ diff --git a/docs/ux-ui/screens/gre-mobile-real-server2-dark-320-2026-10-08.png b/docs/ux-ui/screens/gre-mobile-real-server2-dark-320-2026-10-08.png new file mode 100644 index 00000000..6644dcd7 Binary files /dev/null and b/docs/ux-ui/screens/gre-mobile-real-server2-dark-320-2026-10-08.png differ diff --git a/docs/ux-ui/screens/gre-mobile-real-server2-light-320-2026-10-08.png b/docs/ux-ui/screens/gre-mobile-real-server2-light-320-2026-10-08.png new file mode 100644 index 00000000..a708ee1d Binary files /dev/null and b/docs/ux-ui/screens/gre-mobile-real-server2-light-320-2026-10-08.png differ