diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index a08c97fe..630cb991 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: backend3722fad/frontendbf43263, backend healthy. Мобильная ширина WireGuard Sheets принята на реальных CHR в12.5.64, применение импорта не проверено. Мобильная GRE форма и native сохранение на обоих CHR приняты в12.5.57. WireGuard handshake/короткий Ping/native API/read-only UI приняты в границах12.5.58; 12.5.59 воспроизвёл оставшиеся peers/IP; 12.5.60 развернул исправление и принял обычное удаление own WG интерфейса с peer/IPv4 адресом на обоих CHR. 12.5.62 принял полный WireGuard UI create/peer/disable/enable/Ping/delete на обоих CHR; устойчивое меню развёрнуто. Устойчивость меню 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: backend3722fad/frontendbf43263, backend healthy. Мобильная ширина WireGuard Sheets принята на реальных CHR в12.5.64. API экспорт безprivate keys подтверждён в65; peer-conf default endpoint ошибочен, client template и применение импорта не приняты. Мобильная GRE форма и native сохранение на обоих CHR приняты в12.5.57. WireGuard handshake/короткий Ping/native API/read-only UI приняты в границах12.5.58; 12.5.59 воспроизвёл оставшиеся peers/IP; 12.5.60 развернул исправление и принял обычное удаление own WG интерфейса с peer/IPv4 адресом на обоих CHR. 12.5.62 принял полный WireGuard UI create/peer/disable/enable/Ping/delete на обоих CHR; устойчивое меню развёрнуто. Устойчивость меню 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). ## Паспорт стенда @@ -501,3 +501,15 @@ Profile wireguard-links.spec.ts --grep импорт/создание сохра СкриншотыCHR2/320px: [create dark](ux-ui/screens/wg-live-create-dark-bf43263-320-2026-10-08.png), [create light](ux-ui/screens/wg-live-create-light-bf43263-320-2026-10-08.png), [peer dark](ux-ui/screens/wg-live-peer-dark-bf43263-320-2026-10-08.png), [peer light](ux-ui/screens/wg-live-peer-light-bf43263-320-2026-10-08.png), [import dark](ux-ui/screens/wg-live-import-dark-bf43263-320-2026-10-08.png), [import light](ux-ui/screens/wg-live-import-light-bf43263-320-2026-10-08.png). Create dark/import light визуально просмотрены: панель и footer занимают доступную ширину, текст действий виден целиком. [Smoke](ux-ui/acceptance/deploy-browser-bf43263-2026-10-08.json): dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0. Следующий12.5.65 — настоящий экспорт WireGuard без private keys на новой собственной паре: RSC/CONF, выбранный interface/peer и независимое сравнение параметров; ключи/конфиги с секретами в публичные отчёты не включать. Настоящий import roundtrip — отдельный блок. Throughput, IPv6, внешние failures/RBAC/multi-instance, Telegram/Portal и другие протоколы/интеграции остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push. + +## 12.5.65 — экспорт WireGuard без приватных ключей и ошибка client endpoint (2026-10-08) + +[Реальный API export/native](ux-ui/acceptance/wg-export-native-2026-10-08.json): новая собственная пара mm-acceptance-wg-1791475605238 на двух CHR, свободные UDP51879/198.18.255.240/30. До export подтверждены API creation/native peer key association/handshake/Ping. Для каждого устройства POST /api/wireguard/export запрошены rsc/conf/peer-conf с includePrivateKey:false и явным собственным peerId —6 ответов200. Содержимое разобрано и сверено в памяти, реальные native private keys и активные private-key/PrivateKey assignments не обнаружены. Конфиги, публичные/приватные ключи и содержимое export в отчёты/файлы не записывались. + +RSC/CONF совпали с native address/listenPort/MTU и выбранным peer(public-key association,allowed address,endpoint,keepalive). Это конфигурационные снимки без приватного ключа, не заявленные готовые импортируемые туннели. Peer-conf подтвердил выбранный interface public key и peer selection, однако клиентская конфигурация не принята: endpoint равен адресу удалённого пира, а не экспортирующего устройства, client Address отсутствует без client metadata. В fixture A→B клиентский шаблон дляB использует keyA, но endpointB — разные стороны соединения. В [официальной документации](https://help.mikrotik.com/docs/spaces/ROS/pages/69664792/WireGuard) client-endpoint обозначает адрес/порт WireGuard устройства, к которому подключается клиент; клиентские metadata нужно отличать от серверного peer endpoint/allowed-address. + +Кодовая причина подтверждена чтением backend WireGuard export route и frontend wg-export-sheet.tsx: fallback peer.clientEndpoint || peer.endpoint. API и локальный preview требуют согласованного исправления; отсутствие client Address/явных client маршрутов нельзя скрывать готовым конфигом. Следующий12.5.66 — корректный client endpoint/defaults, явные поля/состояние шаблона, сохранение client metadata overrides, профильная регрессия. Точное правило client routes/address определить из имеющихся metadata; не выводить клиентские маршруты автоматически из server allowed-address. + +UI live export не запускался: его текущий handler запрашивает includePrivateKey:true дляRSC/CONF. Этот блок доказывает API false redaction и выбранные параметры, не безопасность всех UI/export режимов. Native/API snapshot GET, plaintext memory сравнения и отсутствие чувствительных полей в публичном JSON проверены. Product source не менялся, общая регрессия не запускалась для внешней read-only проверки. + +Финальный fixture cleanup exit0, selected WG/peers/IP/routes/IPv4 Firewall baseline совпал. Own peers/IP явно удалялись harness перед интерфейсом; полное обычное UI удаление уже отдельно подтверждено в60/62/64. Эфемерный контейнер удалён, остались три основные службы, backend healthy. [DB controls](ux-ui/acceptance/wg-export-db-controls-2026-10-08.json) до/после servers2/speedHistory9/retention14/migrations9 совпали, audit revisions намеренно сохранены. Runtime backend3722fad/frontendbf43263 не менялся. Настоящий import roundtrip, export private-key modes/UI download, throughput/IPv6/RBAC/внешние failures/multi-instance/Telegram/Portal и остальные протоколы/интеграции остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index e3813fad..bab29e3e 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,12 +1,12 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-08: 12.5.64 развернул frontendbf43263 (backend3722fad healthy). Live create/peer/import Sheets: оба CHR × две темы ×1280/320px —24 комбинации ширины/footer passed без HTTP mocks. UI create/peer/toggle/Ping/delete повторён успешно, own остатки отсутствуют, selected baseline и DB controls совпали; observer exit0/readRetries0, smoke6 passed. Применение импорта не выполнялось. Следующий12.5.65 — настоящий экспорт WireGuard без private keys на собственной паре; import roundtrip отдельным блоком. Этап12.5 открыт. +Актуальное продолжение 2026-10-08: 12.5.65 проверил API export includePrivateKey=false на новой собственной WG паре: RSC/CONF/native поля совпали, все6 ответов200 без приватных ключей, конфиги/ключи не сохранены. Peer-conf содержит выбранный server key, но при отсутствии client metadata ошибочно использует endpoint удалённого пира; клиентский шаблон не принят как готовый. Own объекты удалены, selected baseline/DB controls совпали, backend healthy. Следующий12.5.66 — исправить client endpoint/defaults и явное состояние шаблона в API/preview, профильные тесты; import roundtrip после этого. Runtime backend3722fad/frontendbf43263. Этап12.5 открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-08. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. ## Актуальная точка продолжения — 2026-10-08 -Этапы0–11 завершены в описанных локальных границах. Этап12 открыт. На тестовом сервере161.104.46.222 работают backend3722fad/frontendbf43263 и два 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/Ping/native/UI и финальную очистку; 12.5.59 подтвердил оставшиеся peers/IP после удаления WG и локально исправил backend; 12.5.60 развернул backend/frontend3722fad и подтвердил полное обычное удаление WG; 12.5.61 подтвердил UI создание WG и локально исправил remount меню; переключение осталось открытым. 12.5.62 развернул frontend6a46fb1 и подтвердил полный WG UI lifecycle; 12.5.63 локально адаптировал ширину трёх WireGuard Sheets и подтвердил footer/клавиатуру в обеих темах; 12.5.64 развернул frontendbf43263 и подтвердил live mobile Sheets/UI lifecycle; следующий12.5.65 — настоящий экспорт WG без private keys, затем import roundtrip отдельным блоком. Реальная Telegram доставка, Portal SSO, физический TCP disconnect, multi-instance и остальные профильные сетевые сценарии остаются открытыми. [Протокол](ux-ui-external-acceptance.md) и [журнал](ux-ui-stage-12.md) содержат доказательства и ограничения. +Этапы0–11 завершены в описанных локальных границах. Этап12 открыт. На тестовом сервере161.104.46.222 работают backend3722fad/frontendbf43263 и два 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/Ping/native/UI и финальную очистку; 12.5.59 подтвердил оставшиеся peers/IP после удаления WG и локально исправил backend; 12.5.60 развернул backend/frontend3722fad и подтвердил полное обычное удаление WG; 12.5.61 подтвердил UI создание WG и локально исправил remount меню; переключение осталось открытым. 12.5.62 развернул frontend6a46fb1 и подтвердил полный WG UI lifecycle; 12.5.63 локально адаптировал ширину трёх WireGuard Sheets и подтвердил footer/клавиатуру в обеих темах; 12.5.64 развернул frontendbf43263 и подтвердил live mobile Sheets/UI lifecycle; 12.5.65 подтвердил API export false redaction/RSC-CONF параметры и нашёл ошибочный client endpoint вpeer-conf; следующий12.5.66 — исправить client template defaults/API/preview, import roundtrip после этого. Реальная 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 d538904d..4ebc6b17 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-08: 12.5.64 развернул frontendbf43263 (backend3722fad healthy). Live create/peer/import Sheets: оба CHR × две темы ×1280/320px —24 комбинации ширины/footer passed без HTTP mocks. UI create/peer/toggle/Ping/delete повторён успешно, own остатки отсутствуют, selected baseline и DB controls совпали; observer exit0/readRetries0, smoke6 passed. Применение импорта не выполнялось. Следующий12.5.65 — настоящий экспорт WireGuard без private keys на собственной паре; import roundtrip отдельным блоком. Этап12.5 открыт. +Актуальное продолжение 2026-10-08: 12.5.65 проверил API export includePrivateKey=false на новой собственной WG паре: RSC/CONF/native поля совпали, все6 ответов200 без приватных ключей, конфиги/ключи не сохранены. Peer-conf содержит выбранный server key, но при отсутствии client metadata ошибочно использует endpoint удалённого пира; клиентский шаблон не принят как готовый. Own объекты удалены, selected baseline/DB controls совпали, backend healthy. Следующий12.5.66 — исправить client endpoint/defaults и явное состояние шаблона в API/preview, профильные тесты; import roundtrip после этого. Runtime backend3722fad/frontendbf43263. Этап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–64 и ограничения ниже. Runtime backend3722fad/frontendbf43263. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–65 и ограничения ниже. Runtime backend3722fad/frontendbf43263. | + +## 12.5.65 — экспорт WireGuard без приватных ключей и ошибка client endpoint (2026-10-08) + +[Реальный API export/native](ux-ui/acceptance/wg-export-native-2026-10-08.json): новая собственная пара mm-acceptance-wg-1791475605238 на двух CHR, свободные UDP51879/198.18.255.240/30. До export подтверждены API creation/native peer key association/handshake/Ping. Для каждого устройства POST /api/wireguard/export запрошены rsc/conf/peer-conf с includePrivateKey:false и явным собственным peerId —6 ответов200. Содержимое разобрано и сверено в памяти, реальные native private keys и активные private-key/PrivateKey assignments не обнаружены. Конфиги, публичные/приватные ключи и содержимое export в отчёты/файлы не записывались. + +RSC/CONF совпали с native address/listenPort/MTU и выбранным peer(public-key association,allowed address,endpoint,keepalive). Это конфигурационные снимки без приватного ключа, не заявленные готовые импортируемые туннели. Peer-conf подтвердил выбранный interface public key и peer selection, однако клиентская конфигурация не принята: endpoint равен адресу удалённого пира, а не экспортирующего устройства, client Address отсутствует без client metadata. В fixture A→B клиентский шаблон дляB использует keyA, но endpointB — разные стороны соединения. В [официальной документации](https://help.mikrotik.com/docs/spaces/ROS/pages/69664792/WireGuard) client-endpoint обозначает адрес/порт WireGuard устройства, к которому подключается клиент; клиентские metadata нужно отличать от серверного peer endpoint/allowed-address. + +Кодовая причина подтверждена чтением backend WireGuard export route и frontend wg-export-sheet.tsx: fallback peer.clientEndpoint || peer.endpoint. API и локальный preview требуют согласованного исправления; отсутствие client Address/явных client маршрутов нельзя скрывать готовым конфигом. Следующий12.5.66 — корректный client endpoint/defaults, явные поля/состояние шаблона, сохранение client metadata overrides, профильная регрессия. Точное правило client routes/address определить из имеющихся metadata; не выводить клиентские маршруты автоматически из server allowed-address. + +UI live export не запускался: его текущий handler запрашивает includePrivateKey:true дляRSC/CONF. Этот блок доказывает API false redaction и выбранные параметры, не безопасность всех UI/export режимов. Native/API snapshot GET, plaintext memory сравнения и отсутствие чувствительных полей в публичном JSON проверены. Product source не менялся, общая регрессия не запускалась для внешней read-only проверки. + +Финальный fixture cleanup exit0, selected WG/peers/IP/routes/IPv4 Firewall baseline совпал. Own peers/IP явно удалялись harness перед интерфейсом; полное обычное UI удаление уже отдельно подтверждено в60/62/64. Эфемерный контейнер удалён, остались три основные службы, backend healthy. [DB controls](ux-ui/acceptance/wg-export-db-controls-2026-10-08.json) до/после servers2/speedHistory9/retention14/migrations9 совпали, audit revisions намеренно сохранены. Runtime backend3722fad/frontendbf43263 не менялся. Настоящий import roundtrip, export private-key modes/UI download, throughput/IPv6/RBAC/внешние failures/multi-instance/Telegram/Portal и остальные протоколы/интеграции остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push. ## 12.5.64 — развёртывание и live приёмка мобильных WireGuard панелей (2026-10-08) diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index a3d2f339..c08e1fc8 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.64 развернул frontendbf43263 (backend3722fad healthy). Live create/peer/import Sheets: оба CHR × две темы ×1280/320px —24 комбинации ширины/footer passed без HTTP mocks. UI create/peer/toggle/Ping/delete повторён успешно, own остатки отсутствуют, selected baseline и DB controls совпали; observer exit0/readRetries0, smoke6 passed. Применение импорта не выполнялось. Следующий12.5.65 — настоящий экспорт WireGuard без private keys на собственной паре; import roundtrip отдельным блоком. Этап12.5 открыт. +Актуальное продолжение 2026-10-08: 12.5.65 проверил API export includePrivateKey=false на новой собственной WG паре: RSC/CONF/native поля совпали, все6 ответов200 без приватных ключей, конфиги/ключи не сохранены. Peer-conf содержит выбранный server key, но при отсутствии client metadata ошибочно использует endpoint удалённого пира; клиентский шаблон не принят как готовый. Own объекты удалены, selected baseline/DB controls совпали, backend healthy. Следующий12.5.66 — исправить client endpoint/defaults и явное состояние шаблона в API/preview, профильные тесты; import roundtrip после этого. Runtime backend3722fad/frontendbf43263. Этап12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -1666,3 +1666,15 @@ Profile wireguard-links.spec.ts --grep импорт/создание сохра СкриншотыCHR2/320px: [create dark](ux-ui/screens/wg-live-create-dark-bf43263-320-2026-10-08.png), [create light](ux-ui/screens/wg-live-create-light-bf43263-320-2026-10-08.png), [peer dark](ux-ui/screens/wg-live-peer-dark-bf43263-320-2026-10-08.png), [peer light](ux-ui/screens/wg-live-peer-light-bf43263-320-2026-10-08.png), [import dark](ux-ui/screens/wg-live-import-dark-bf43263-320-2026-10-08.png), [import light](ux-ui/screens/wg-live-import-light-bf43263-320-2026-10-08.png). Create dark/import light визуально просмотрены: панель и footer занимают доступную ширину, текст действий виден целиком. [Smoke](ux-ui/acceptance/deploy-browser-bf43263-2026-10-08.json): dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0. Следующий12.5.65 — настоящий экспорт WireGuard без private keys на новой собственной паре: RSC/CONF, выбранный interface/peer и независимое сравнение параметров; ключи/конфиги с секретами в публичные отчёты не включать. Настоящий import roundtrip — отдельный блок. Throughput, IPv6, внешние failures/RBAC/multi-instance, Telegram/Portal и другие протоколы/интеграции остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push. + +## 12.5.65 — экспорт WireGuard без приватных ключей и ошибка client endpoint (2026-10-08) + +[Реальный API export/native](ux-ui/acceptance/wg-export-native-2026-10-08.json): новая собственная пара mm-acceptance-wg-1791475605238 на двух CHR, свободные UDP51879/198.18.255.240/30. До export подтверждены API creation/native peer key association/handshake/Ping. Для каждого устройства POST /api/wireguard/export запрошены rsc/conf/peer-conf с includePrivateKey:false и явным собственным peerId —6 ответов200. Содержимое разобрано и сверено в памяти, реальные native private keys и активные private-key/PrivateKey assignments не обнаружены. Конфиги, публичные/приватные ключи и содержимое export в отчёты/файлы не записывались. + +RSC/CONF совпали с native address/listenPort/MTU и выбранным peer(public-key association,allowed address,endpoint,keepalive). Это конфигурационные снимки без приватного ключа, не заявленные готовые импортируемые туннели. Peer-conf подтвердил выбранный interface public key и peer selection, однако клиентская конфигурация не принята: endpoint равен адресу удалённого пира, а не экспортирующего устройства, client Address отсутствует без client metadata. В fixture A→B клиентский шаблон дляB использует keyA, но endpointB — разные стороны соединения. В [официальной документации](https://help.mikrotik.com/docs/spaces/ROS/pages/69664792/WireGuard) client-endpoint обозначает адрес/порт WireGuard устройства, к которому подключается клиент; клиентские metadata нужно отличать от серверного peer endpoint/allowed-address. + +Кодовая причина подтверждена чтением backend WireGuard export route и frontend wg-export-sheet.tsx: fallback peer.clientEndpoint || peer.endpoint. API и локальный preview требуют согласованного исправления; отсутствие client Address/явных client маршрутов нельзя скрывать готовым конфигом. Следующий12.5.66 — корректный client endpoint/defaults, явные поля/состояние шаблона, сохранение client metadata overrides, профильная регрессия. Точное правило client routes/address определить из имеющихся metadata; не выводить клиентские маршруты автоматически из server allowed-address. + +UI live export не запускался: его текущий handler запрашивает includePrivateKey:true дляRSC/CONF. Этот блок доказывает API false redaction и выбранные параметры, не безопасность всех UI/export режимов. Native/API snapshot GET, plaintext memory сравнения и отсутствие чувствительных полей в публичном JSON проверены. Product source не менялся, общая регрессия не запускалась для внешней read-only проверки. + +Финальный fixture cleanup exit0, selected WG/peers/IP/routes/IPv4 Firewall baseline совпал. Own peers/IP явно удалялись harness перед интерфейсом; полное обычное UI удаление уже отдельно подтверждено в60/62/64. Эфемерный контейнер удалён, остались три основные службы, backend healthy. [DB controls](ux-ui/acceptance/wg-export-db-controls-2026-10-08.json) до/после servers2/speedHistory9/retention14/migrations9 совпали, audit revisions намеренно сохранены. Runtime backend3722fad/frontendbf43263 не менялся. Настоящий import roundtrip, export private-key modes/UI download, throughput/IPv6/RBAC/внешние failures/multi-instance/Telegram/Portal и остальные протоколы/интеграции остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index b8ca176b..00222321 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -509,3 +509,15 @@ Profile wireguard-links.spec.ts --grep импорт/создание сохра СкриншотыCHR2/320px: [create dark](ux-ui/screens/wg-live-create-dark-bf43263-320-2026-10-08.png), [create light](ux-ui/screens/wg-live-create-light-bf43263-320-2026-10-08.png), [peer dark](ux-ui/screens/wg-live-peer-dark-bf43263-320-2026-10-08.png), [peer light](ux-ui/screens/wg-live-peer-light-bf43263-320-2026-10-08.png), [import dark](ux-ui/screens/wg-live-import-dark-bf43263-320-2026-10-08.png), [import light](ux-ui/screens/wg-live-import-light-bf43263-320-2026-10-08.png). Create dark/import light визуально просмотрены: панель и footer занимают доступную ширину, текст действий виден целиком. [Smoke](ux-ui/acceptance/deploy-browser-bf43263-2026-10-08.json): dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0. Следующий12.5.65 — настоящий экспорт WireGuard без private keys на новой собственной паре: RSC/CONF, выбранный interface/peer и независимое сравнение параметров; ключи/конфиги с секретами в публичные отчёты не включать. Настоящий import roundtrip — отдельный блок. Throughput, IPv6, внешние failures/RBAC/multi-instance, Telegram/Portal и другие протоколы/интеграции остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push. + +## 12.5.65 — экспорт WireGuard без приватных ключей и ошибка client endpoint (2026-10-08) + +[Реальный API export/native](ux-ui/acceptance/wg-export-native-2026-10-08.json): новая собственная пара mm-acceptance-wg-1791475605238 на двух CHR, свободные UDP51879/198.18.255.240/30. До export подтверждены API creation/native peer key association/handshake/Ping. Для каждого устройства POST /api/wireguard/export запрошены rsc/conf/peer-conf с includePrivateKey:false и явным собственным peerId —6 ответов200. Содержимое разобрано и сверено в памяти, реальные native private keys и активные private-key/PrivateKey assignments не обнаружены. Конфиги, публичные/приватные ключи и содержимое export в отчёты/файлы не записывались. + +RSC/CONF совпали с native address/listenPort/MTU и выбранным peer(public-key association,allowed address,endpoint,keepalive). Это конфигурационные снимки без приватного ключа, не заявленные готовые импортируемые туннели. Peer-conf подтвердил выбранный interface public key и peer selection, однако клиентская конфигурация не принята: endpoint равен адресу удалённого пира, а не экспортирующего устройства, client Address отсутствует без client metadata. В fixture A→B клиентский шаблон дляB использует keyA, но endpointB — разные стороны соединения. В [официальной документации](https://help.mikrotik.com/docs/spaces/ROS/pages/69664792/WireGuard) client-endpoint обозначает адрес/порт WireGuard устройства, к которому подключается клиент; клиентские metadata нужно отличать от серверного peer endpoint/allowed-address. + +Кодовая причина подтверждена чтением backend WireGuard export route и frontend wg-export-sheet.tsx: fallback peer.clientEndpoint || peer.endpoint. API и локальный preview требуют согласованного исправления; отсутствие client Address/явных client маршрутов нельзя скрывать готовым конфигом. Следующий12.5.66 — корректный client endpoint/defaults, явные поля/состояние шаблона, сохранение client metadata overrides, профильная регрессия. Точное правило client routes/address определить из имеющихся metadata; не выводить клиентские маршруты автоматически из server allowed-address. + +UI live export не запускался: его текущий handler запрашивает includePrivateKey:true дляRSC/CONF. Этот блок доказывает API false redaction и выбранные параметры, не безопасность всех UI/export режимов. Native/API snapshot GET, plaintext memory сравнения и отсутствие чувствительных полей в публичном JSON проверены. Product source не менялся, общая регрессия не запускалась для внешней read-only проверки. + +Финальный fixture cleanup exit0, selected WG/peers/IP/routes/IPv4 Firewall baseline совпал. Own peers/IP явно удалялись harness перед интерфейсом; полное обычное UI удаление уже отдельно подтверждено в60/62/64. Эфемерный контейнер удалён, остались три основные службы, backend healthy. [DB controls](ux-ui/acceptance/wg-export-db-controls-2026-10-08.json) до/после servers2/speedHistory9/retention14/migrations9 совпали, audit revisions намеренно сохранены. Runtime backend3722fad/frontendbf43263 не менялся. Настоящий import roundtrip, export private-key modes/UI download, throughput/IPv6/RBAC/внешние failures/multi-instance/Telegram/Portal и остальные протоколы/интеграции остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push. diff --git a/docs/ux-ui/acceptance/wg-export-db-controls-2026-10-08.json b/docs/ux-ui/acceptance/wg-export-db-controls-2026-10-08.json new file mode 100644 index 00000000..e0935927 --- /dev/null +++ b/docs/ux-ui/acceptance/wg-export-db-controls-2026-10-08.json @@ -0,0 +1,16 @@ +{ + "date": "2026-10-08", + "before": { + "servers": 2, + "speedHistory": 9, + "retentionDays": 14, + "migrations": 9 + }, + "after": { + "servers": 2, + "speedHistory": 9, + "retentionDays": 14, + "migrations": 9 + }, + "unchanged": true +} diff --git a/docs/ux-ui/acceptance/wg-export-native-2026-10-08.json b/docs/ux-ui/acceptance/wg-export-native-2026-10-08.json new file mode 100644 index 00000000..96004019 --- /dev/null +++ b/docs/ux-ui/acceptance/wg-export-native-2026-10-08.json @@ -0,0 +1,386 @@ +{ + "date": "2026-10-08", + "backendSource": "3722fad", + "frontendSource": "bf43263", + "name": "mm-acceptance-wg-1791475605238", + "subnet": "198.18.255.240/30", + "listenPort": 51879, + "realRouterOs": true, + "changes": [ + { + "method": "POST", + "path": "/api/wireguard/interfaces", + "status": 201 + }, + { + "method": "POST", + "path": "/api/wireguard/interfaces", + "status": 201 + }, + { + "method": "POST", + "path": "/api/wireguard/peers", + "status": 201 + }, + { + "method": "POST", + "path": "/api/wireguard/peers", + "status": 201 + }, + { + "method": "PATCH", + "path": "/api/wireguard/interfaces/1/*D", + "status": 200 + }, + { + "method": "PATCH", + "path": "/api/wireguard/interfaces/1/*D", + "status": 200 + }, + { + "method": "GET", + "path": "/api/wireguard", + "status": 200 + }, + { + "method": "POST", + "path": "/api/wireguard/export", + "status": 200 + }, + { + "method": "POST", + "path": "/api/wireguard/export", + "status": 200 + }, + { + "method": "POST", + "path": "/api/wireguard/export", + "status": 200 + }, + { + "method": "POST", + "path": "/api/wireguard/export", + "status": 200 + }, + { + "method": "POST", + "path": "/api/wireguard/export", + "status": 200 + }, + { + "method": "POST", + "path": "/api/wireguard/export", + "status": 200 + }, + { + "method": "DELETE", + "path": "/api/wireguard/peers/1/*9", + "status": 200 + }, + { + "method": "DELETE", + "path": "/api/wireguard/interfaces/1/*D", + "status": 200 + }, + { + "method": "DELETE", + "path": "/api/wireguard/peers/2/*6", + "status": 200 + }, + { + "method": "DELETE", + "path": "/api/wireguard/interfaces/2/*9", + "status": 200 + } + ], + "pings": [ + { + "serverId": 1, + "target": "198.18.255.242", + "interface": "mm-acceptance-wg-1791475605238", + "received": 3, + "rows": [ + { + "sent": "1", + "received": "1", + "packet-loss": "0", + "time": "54ms786us", + "avg-rtt": "54ms786us" + }, + { + "sent": "2", + "received": "2", + "packet-loss": "0", + "time": "54ms652us", + "avg-rtt": "54ms719us" + }, + { + "sent": "3", + "received": "3", + "packet-loss": "0", + "time": "62ms502us", + "avg-rtt": "57ms313us" + } + ] + }, + { + "serverId": 2, + "target": "198.18.255.241", + "interface": "mm-acceptance-wg-1791475605238", + "received": 3, + "rows": [ + { + "sent": "1", + "received": "1", + "packet-loss": "0", + "time": "58ms714us", + "avg-rtt": "58ms714us" + }, + { + "sent": "2", + "received": "2", + "packet-loss": "0", + "time": "56ms781us", + "avg-rtt": "57ms747us" + }, + { + "sent": "3", + "received": "3", + "packet-loss": "0", + "time": "56ms597us", + "avg-rtt": "57ms364us" + } + ] + } + ], + "cleanup": [ + { + "serverId": 1, + "/interface/wireguard": true, + "/interface/wireguard/peers": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/filter": true, + "/ip/firewall/nat": true, + "/ip/firewall/mangle": true + }, + { + "serverId": 2, + "/interface/wireguard": true, + "/interface/wireguard/peers": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/filter": true, + "/ip/firewall/nat": true, + "/ip/firewall/mangle": true + } + ], + "nativeKeyGenerationConfirmed": true, + "connectedState": [ + { + "serverId": 1, + "interface": { + "rosId": "*D", + "appId": "1:*D", + "name": "mm-acceptance-wg-1791475605238", + "listenPort": "51879", + "mtu": "1420", + "running": "true", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791475605238" + }, + "addresses": [ + "198.18.255.241/30" + ], + "peers": [ + { + "rosId": "*9", + "name": "mm-acceptance-wg-1791475605238-peer", + "allowedAddresses": "198.18.255.242/32", + "endpoint": "104.165.244.7:51879", + "handshake": "1s", + "rx": "180", + "tx": "272", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791475605238" + } + ] + }, + { + "serverId": 2, + "interface": { + "rosId": "*9", + "appId": "2:*9", + "name": "mm-acceptance-wg-1791475605238", + "listenPort": "51879", + "mtu": "1420", + "running": "true", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791475605238" + }, + "addresses": [ + "198.18.255.242/30" + ], + "peers": [ + { + "rosId": "*6", + "name": "mm-acceptance-wg-1791475605238-peer", + "allowedAddresses": "198.18.255.241/32", + "endpoint": "194.226.121.150:51879", + "handshake": "1s", + "rx": "124", + "tx": "180", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791475605238" + } + ] + } + ], + "handshakeConfirmed": true, + "bidirectionalPingPassed": true, + "catalogMatchesNative": true, + "exports": [ + { + "serverId": 1, + "format": "rsc", + "status": 200, + "privateKeyAbsent": true, + "selectedParametersMatch": true, + "configurationNotPersisted": true + }, + { + "serverId": 1, + "format": "conf", + "status": 200, + "privateKeyAbsent": true, + "selectedParametersMatch": true, + "configurationNotPersisted": true + }, + { + "serverId": 1, + "format": "peer-conf", + "status": 200, + "privateKeyAbsent": true, + "configurationNotPersisted": true, + "selectedPeerAndServerKeyMatch": true, + "clientEndpointCorrect": false, + "clientTemplateReady": false + }, + { + "serverId": 2, + "format": "rsc", + "status": 200, + "privateKeyAbsent": true, + "selectedParametersMatch": true, + "configurationNotPersisted": true + }, + { + "serverId": 2, + "format": "conf", + "status": 200, + "privateKeyAbsent": true, + "selectedParametersMatch": true, + "configurationNotPersisted": true + }, + { + "serverId": 2, + "format": "peer-conf", + "status": 200, + "privateKeyAbsent": true, + "configurationNotPersisted": true, + "selectedPeerAndServerKeyMatch": true, + "clientEndpointCorrect": false, + "clientTemplateReady": false + } + ], + "peerClientDefaults": [ + { + "serverId": 1, + "endpointIsRemotePeer": true, + "endpointIsExportingServer": false, + "clientAddressPresent": false, + "allowedAddressIsRemotePeer": true + }, + { + "serverId": 2, + "endpointIsRemotePeer": true, + "endpointIsExportingServer": false, + "clientAddressPresent": false, + "allowedAddressIsRemotePeer": true + } + ], + "afterBrowserDelete": [ + { + "serverId": 1, + "interface": { + "rosId": "*D", + "appId": "1:*D", + "name": "mm-acceptance-wg-1791475605238", + "listenPort": "51879", + "mtu": "1420", + "running": "true", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791475605238" + }, + "addresses": [ + "198.18.255.241/30" + ], + "peers": [ + { + "rosId": "*9", + "name": "mm-acceptance-wg-1791475605238-peer", + "allowedAddresses": "198.18.255.242/32", + "endpoint": "104.165.244.7:51879", + "handshake": "1m48s", + "rx": "1396", + "tx": "912", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791475605238" + } + ] + }, + { + "serverId": 2, + "interface": { + "rosId": "*9", + "appId": "2:*9", + "name": "mm-acceptance-wg-1791475605238", + "listenPort": "51879", + "mtu": "1420", + "running": "true", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791475605238" + }, + "addresses": [ + "198.18.255.242/30" + ], + "peers": [ + { + "rosId": "*6", + "name": "mm-acceptance-wg-1791475605238-peer", + "allowedAddresses": "198.18.255.241/32", + "endpoint": "194.226.121.150:51879", + "handshake": "1m48s", + "rx": "764", + "tx": "1396", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791475605238" + } + ] + } + ], + "limits": [ + "Only own WireGuard interface/peer/IP and connected route changed; no default routes/firewall changes", + "Export verification is read-only; fixture interfaces and linked objects removed by harness", + "Private/public/preshared keys omitted from report; native generation and peer association checked in memory", + "Handshake and short ICMP connectivity, not throughput, RBAC or interrupted mutation", + "WireGuard audit revisions intentionally retained", + "Only API export includePrivateKey=false tested; UI live export currently requests private keys for RSC/CONF and was not invoked" + ], + "finding": { + "kind": "peer-conf defaults", + "endpointPointsToRemotePeerInsteadOfExportingServer": true, + "clientAddressMissingWithoutClientMetadata": true, + "clientReadyAcceptanceOpen": true + } +}