From d13c773856207c92de5090a0d9895f85310f6d57 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Fri, 9 Oct 2026 08:19:26 +0700 Subject: [PATCH] =?UTF-8?q?chore(test):=20=D0=BF=D0=BE=D0=B4=D1=82=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=B4=D0=B8=D1=82=D1=8C=20=D1=8D=D0=BA=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=20WireGuard=20=D0=BD=D0=B0=20=D1=81=D1=82=D0=B5=D0=BD=D0=B4?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ux-ui-external-acceptance.md | 16 +- docs/ux-ui-plan.md | 2 +- docs/ux-ui-progress.md | 18 +- docs/ux-ui-stage-12.md | 16 +- docs/ux-ui-test-server.md | 20 +- ...ser-wg-peer-export-c16fc0c-2026-10-09.json | 59 +++ .../wg-export-deploy-controls-2026-10-09.json | 42 ++ .../wg-export-native-2026-10-09.json | 377 ++++++++++++++++++ ...-create-server2-bf43263-320-2026-10-08.png | Bin 0 -> 62212 bytes 9 files changed, 542 insertions(+), 8 deletions(-) create mode 100644 docs/ux-ui/acceptance/browser-wg-peer-export-c16fc0c-2026-10-09.json create mode 100644 docs/ux-ui/acceptance/wg-export-deploy-controls-2026-10-09.json create mode 100644 docs/ux-ui/acceptance/wg-export-native-2026-10-09.json create mode 100644 docs/ux-ui/screens/wg-ui-create-server2-bf43263-320-2026-10-08.png diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index 43180309..4e8d7c84 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. 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). +Статус на2026-10-09: backend/frontend c16fc0c, backend healthy. В12.5.67 исправленный Peer .conf принят как клиентский шаблон: API6/6, browser4/4, server endpoint и placeholders; настоящий import ещё не принят. Мобильная ширина WireGuard Sheets принята в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). ## Паспорт стенда @@ -525,3 +525,17 @@ Server allowed-address не обозначает клиентские маршр Проверки lib/wg-client-template.test.ts —5/5: endpoint exporting server/явный override/hostname/IPv6/неизвестные значения, одинаковые backend/frontend placeholders, отсутствие активного Address/AllowedIPs и default route без явных данных, сохранение явно заданных client параметров. Existing backend wireguard-config.test.ts passed; contracts build, backend TypeScript, scoped frontend TypeScript и ESLint всех изменённых файлов passed. Profile wireguard-links.spec.ts --grep экспорт —4/4: late response isolation/error, неправильный формат, выбор второго peer/ROS ID, его client-address/client-endpoint и отсутствие remote endpoint/server allowed-address в preview. Первый запуск старого теста ожидал ошибочно скопированные peer.allowedIps; fixture и assertions заменены на отличающиеся client metadata, защита выбора второго пира сохранена. ReUI checklist checked. Исправление локальное: runtime backend3722fad/frontendbf43263 не менялся. Следующий12.5.67 — production Docker build/deploy backend и frontend с обновлённым contracts source, новая собственная WG пара, native/API export false redaction и правильный endpoint/шаблон, browser preview соответствие, cleanup/baseline. Поддержка client-allowed-address, настоящий client import/connectivity, import roundtrip/private-key modes, throughput/IPv6/RBAC/внешние failures/multi-instance/Telegram/Portal и другие протоколы/интеграции остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push. + +## 12.5.67 — Docker deploy и реальный экспорт клиентского шаблона WireGuard (2026-10-09) + +Обе production Docker сборки c16fc0c завершились успешно. Межслойный unit test перенесён из lib в tests/unit/wg-client-template.test.ts отдельным локальным коммитом c16fc0c: frontend Docker context не содержит backend source. Предварительный frontend staging c82e8fa не включал этот новый тест и не используется как доказательство чистой сборки исходного c82e8fa. Окончательные staging lib/backend src/contracts совпали с архивом c16fc0c; финальные образы обеих частей имеют OCI revision c16fc0c5b53ba8fcb6690ef6f0a695f59875f171. Network-none assertion backend образа проверил общий resolver и отсутствие активных клиентских Address/AllowedIPs без явных данных. + +Перед обновлением сохранён приватный PG dump pre-c16fc0c.dump,2314923bytes,mode0600; pg_restore --list passed. Backend/frontend обновлены до1.0.0-test.c16fc0c, backend healthy, frontend /wireguard HTTP200. Образы: backend sha256:fb9f9279df07481d960f5799338e15a0fc9162a8baca3be7789a89f28a5f56dc, frontend sha256:bc70ee3203b4fd3f269ab6554493f0fb1ec2e60ef515ced2dcd6c6c7428064bc. Резервная .env хранится только на сервере. SSH161.104.46.222 и RouterOS REST194.226.121.150/104.165.244.7 доступны с прежними учётными данными; пароли не изменялись. + +Создана собственная временная WG пара с адресами198.18.255.241/30 и198.18.255.242/30,port51879,MTU1420,уникальными name/comment. Native key generation/peer association проверены в памяти, handshake и Ping3/3 в обе стороны passed. Шесть настоящих API export запросов (rsc/conf/peer-conf на обоих устройствах) вернули200 с includePrivateKey=false. RSC/CONF параметры совпали с native; ключи и конфигурации не сохранялись. Peer .conf содержит PublicKey экспортирующего интерфейса и Endpoint экспортирующего устройства:51879; client Address/AllowedIPs остаются comment placeholders, активного default route нет. Это шаблон, готовность к импорту клиента не заявлена. + +[Native/API evidence](ux-ui/acceptance/wg-export-native-2026-10-09.json), [browser evidence](ux-ui/acceptance/browser-wg-peer-export-c16fc0c-2026-10-09.json), [deploy/DB controls](ux-ui/acceptance/wg-export-deploy-controls-2026-10-09.json). Четыре настоящих browser сценария без HTTP mocks: оба CHR ×1280/320px. Local preview и live Peer export совпали по server endpoint/client placeholders; POST включает выбранный ROS peer ID и includePrivateKey=false. Нет page errors/API errors/page overflow. Export содержимое и ключи не попали в отчёты/скриншоты; UI download не выполнялся. + +Fixture завершён exit0 и удалён. Проверенные WG interfaces/peers/IP/routes/IPv4 filter/nat/mangle совпали с baseline на обоих CHR. Очистка только собственных объектов; audit revisions намеренно сохранены. DB controls до/после совпали:servers2,speedHistory9,retentionDays14,migrations9. Дополнительно сохранён ранее полученный screenshot создания на CHR2 в12.5.64 с исходной датой2026-10-08. Product code в этом блоке не менялся после уже проверенного c16fc0c; общая регрессия не повторялась. + +Следующий12.5.68 — import roundtrip собственного конфигурационного файла с независимой проверкой параметров и очисткой. Client-allowed-address/готовый client import, private-key export modes/UI download,throughput/IPv6/RBAC/внешние failures/multi-instance/Telegram/Portal и остальные протоколы/интеграции остаются открытыми. Локальный коммит без push. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index a12bd8a8..0a09b098 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,6 +1,6 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-08: 12.5.66 локально исправил Peer .conf: общий resolver использует client-endpoint или host/listenPort экспортирующего сервера; remote peer endpoint и server allowed-address не подставляются как клиентские значения. Недостающие Address/AllowedIPs/Endpoint явно отмечены шаблоном, UI поясняет ручное заполнение. Unit5/5, codec, export UI4/4, contracts/backend/frontend TypeScript и ESLint passed. Runtime backend3722fad/frontendbf43263 ещё прежний. Следующий12.5.67 — Docker build/deploy обеих частей с обновлённым contracts, реальный API/preview Peer .conf на собственной WG паре с очисткой; import после этого. Этап12.5 открыт. +Актуальное продолжение 2026-10-09: 12.5.67 развернул backend/frontend c16fc0c и подтвердил исправленный Peer .conf на собственной WireGuard паре двух CHR. API export6/6 и browser preview/live4/4 на1280/320px passed; endpoint экспортирующего сервера, client placeholders и отсутствие private-key подтверждены. Handshake, Ping3/3 в обе стороны, cleanup/baseline и DB controls passed. Все три сервера доступны с прежними доступами. Следующий12.5.68 — безопасный import roundtrip собственного WG конфига с проверкой native параметров и очисткой. Этап12.5 открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-08. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 457d3351..52336c01 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-08: 12.5.66 локально исправил Peer .conf: общий resolver использует client-endpoint или host/listenPort экспортирующего сервера; remote peer endpoint и server allowed-address не подставляются как клиентские значения. Недостающие Address/AllowedIPs/Endpoint явно отмечены шаблоном, UI поясняет ручное заполнение. Unit5/5, codec, export UI4/4, contracts/backend/frontend TypeScript и ESLint passed. Runtime backend3722fad/frontendbf43263 ещё прежний. Следующий12.5.67 — Docker build/deploy обеих частей с обновлённым contracts, реальный API/preview Peer .conf на собственной WG паре с очисткой; import после этого. Этап12.5 открыт. +Актуальное продолжение 2026-10-09: 12.5.67 развернул backend/frontend c16fc0c и подтвердил исправленный Peer .conf на собственной WireGuard паре двух CHR. API export6/6 и browser preview/live4/4 на1280/320px passed; endpoint экспортирующего сервера, client placeholders и отсутствие private-key подтверждены. Handshake, Ping3/3 в обе стороны, cleanup/baseline и DB controls passed. Все три сервера доступны с прежними доступами. Следующий12.5.68 — безопасный import roundtrip собственного WG конфига с проверкой native параметров и очисткой. Этап12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -34,7 +34,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–66 и ограничения ниже. Runtime backend3722fad/frontendbf43263. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–67 и ограничения ниже. Runtime backend/frontend c16fc0c. | + +## 12.5.67 — Docker deploy и реальный экспорт клиентского шаблона WireGuard (2026-10-09) + +Обе production Docker сборки c16fc0c завершились успешно. Межслойный unit test перенесён из lib в tests/unit/wg-client-template.test.ts отдельным локальным коммитом c16fc0c: frontend Docker context не содержит backend source. Предварительный frontend staging c82e8fa не включал этот новый тест и не используется как доказательство чистой сборки исходного c82e8fa. Окончательные staging lib/backend src/contracts совпали с архивом c16fc0c; финальные образы обеих частей имеют OCI revision c16fc0c5b53ba8fcb6690ef6f0a695f59875f171. Network-none assertion backend образа проверил общий resolver и отсутствие активных клиентских Address/AllowedIPs без явных данных. + +Перед обновлением сохранён приватный PG dump pre-c16fc0c.dump,2314923bytes,mode0600; pg_restore --list passed. Backend/frontend обновлены до1.0.0-test.c16fc0c, backend healthy, frontend /wireguard HTTP200. Образы: backend sha256:fb9f9279df07481d960f5799338e15a0fc9162a8baca3be7789a89f28a5f56dc, frontend sha256:bc70ee3203b4fd3f269ab6554493f0fb1ec2e60ef515ced2dcd6c6c7428064bc. Резервная .env хранится только на сервере. SSH161.104.46.222 и RouterOS REST194.226.121.150/104.165.244.7 доступны с прежними учётными данными; пароли не изменялись. + +Создана собственная временная WG пара с адресами198.18.255.241/30 и198.18.255.242/30,port51879,MTU1420,уникальными name/comment. Native key generation/peer association проверены в памяти, handshake и Ping3/3 в обе стороны passed. Шесть настоящих API export запросов (rsc/conf/peer-conf на обоих устройствах) вернули200 с includePrivateKey=false. RSC/CONF параметры совпали с native; ключи и конфигурации не сохранялись. Peer .conf содержит PublicKey экспортирующего интерфейса и Endpoint экспортирующего устройства:51879; client Address/AllowedIPs остаются comment placeholders, активного default route нет. Это шаблон, готовность к импорту клиента не заявлена. + +[Native/API evidence](ux-ui/acceptance/wg-export-native-2026-10-09.json), [browser evidence](ux-ui/acceptance/browser-wg-peer-export-c16fc0c-2026-10-09.json), [deploy/DB controls](ux-ui/acceptance/wg-export-deploy-controls-2026-10-09.json). Четыре настоящих browser сценария без HTTP mocks: оба CHR ×1280/320px. Local preview и live Peer export совпали по server endpoint/client placeholders; POST включает выбранный ROS peer ID и includePrivateKey=false. Нет page errors/API errors/page overflow. Export содержимое и ключи не попали в отчёты/скриншоты; UI download не выполнялся. + +Fixture завершён exit0 и удалён. Проверенные WG interfaces/peers/IP/routes/IPv4 filter/nat/mangle совпали с baseline на обоих CHR. Очистка только собственных объектов; audit revisions намеренно сохранены. DB controls до/после совпали:servers2,speedHistory9,retentionDays14,migrations9. Дополнительно сохранён ранее полученный screenshot создания на CHR2 в12.5.64 с исходной датой2026-10-08. Product code в этом блоке не менялся после уже проверенного c16fc0c; общая регрессия не повторялась. + +Следующий12.5.68 — import roundtrip собственного конфигурационного файла с независимой проверкой параметров и очисткой. Client-allowed-address/готовый client import, private-key export modes/UI download,throughput/IPv6/RBAC/внешние failures/multi-instance/Telegram/Portal и остальные протоколы/интеграции остаются открытыми. Локальный коммит без push. ## 12.5.66 — правильный client endpoint и явный шаблон Peer .conf (2026-10-08) diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 2e081183..9e18d770 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.66 локально исправил Peer .conf: общий resolver использует client-endpoint или host/listenPort экспортирующего сервера; remote peer endpoint и server allowed-address не подставляются как клиентские значения. Недостающие Address/AllowedIPs/Endpoint явно отмечены шаблоном, UI поясняет ручное заполнение. Unit5/5, codec, export UI4/4, contracts/backend/frontend TypeScript и ESLint passed. Runtime backend3722fad/frontendbf43263 ещё прежний. Следующий12.5.67 — Docker build/deploy обеих частей с обновлённым contracts, реальный API/preview Peer .conf на собственной WG паре с очисткой; import после этого. Этап12.5 открыт. +Актуальное продолжение 2026-10-09: 12.5.67 развернул backend/frontend c16fc0c и подтвердил исправленный Peer .conf на собственной WireGuard паре двух CHR. API export6/6 и browser preview/live4/4 на1280/320px passed; endpoint экспортирующего сервера, client placeholders и отсутствие private-key подтверждены. Handshake, Ping3/3 в обе стороны, cleanup/baseline и DB controls passed. Все три сервера доступны с прежними доступами. Следующий12.5.68 — безопасный import roundtrip собственного WG конфига с проверкой native параметров и очисткой. Этап12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -1690,3 +1690,17 @@ Server allowed-address не обозначает клиентские маршр Проверки lib/wg-client-template.test.ts —5/5: endpoint exporting server/явный override/hostname/IPv6/неизвестные значения, одинаковые backend/frontend placeholders, отсутствие активного Address/AllowedIPs и default route без явных данных, сохранение явно заданных client параметров. Existing backend wireguard-config.test.ts passed; contracts build, backend TypeScript, scoped frontend TypeScript и ESLint всех изменённых файлов passed. Profile wireguard-links.spec.ts --grep экспорт —4/4: late response isolation/error, неправильный формат, выбор второго peer/ROS ID, его client-address/client-endpoint и отсутствие remote endpoint/server allowed-address в preview. Первый запуск старого теста ожидал ошибочно скопированные peer.allowedIps; fixture и assertions заменены на отличающиеся client metadata, защита выбора второго пира сохранена. ReUI checklist checked. Исправление локальное: runtime backend3722fad/frontendbf43263 не менялся. Следующий12.5.67 — production Docker build/deploy backend и frontend с обновлённым contracts source, новая собственная WG пара, native/API export false redaction и правильный endpoint/шаблон, browser preview соответствие, cleanup/baseline. Поддержка client-allowed-address, настоящий client import/connectivity, import roundtrip/private-key modes, throughput/IPv6/RBAC/внешние failures/multi-instance/Telegram/Portal и другие протоколы/интеграции остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push. + +## 12.5.67 — Docker deploy и реальный экспорт клиентского шаблона WireGuard (2026-10-09) + +Обе production Docker сборки c16fc0c завершились успешно. Межслойный unit test перенесён из lib в tests/unit/wg-client-template.test.ts отдельным локальным коммитом c16fc0c: frontend Docker context не содержит backend source. Предварительный frontend staging c82e8fa не включал этот новый тест и не используется как доказательство чистой сборки исходного c82e8fa. Окончательные staging lib/backend src/contracts совпали с архивом c16fc0c; финальные образы обеих частей имеют OCI revision c16fc0c5b53ba8fcb6690ef6f0a695f59875f171. Network-none assertion backend образа проверил общий resolver и отсутствие активных клиентских Address/AllowedIPs без явных данных. + +Перед обновлением сохранён приватный PG dump pre-c16fc0c.dump,2314923bytes,mode0600; pg_restore --list passed. Backend/frontend обновлены до1.0.0-test.c16fc0c, backend healthy, frontend /wireguard HTTP200. Образы: backend sha256:fb9f9279df07481d960f5799338e15a0fc9162a8baca3be7789a89f28a5f56dc, frontend sha256:bc70ee3203b4fd3f269ab6554493f0fb1ec2e60ef515ced2dcd6c6c7428064bc. Резервная .env хранится только на сервере. SSH161.104.46.222 и RouterOS REST194.226.121.150/104.165.244.7 доступны с прежними учётными данными; пароли не изменялись. + +Создана собственная временная WG пара с адресами198.18.255.241/30 и198.18.255.242/30,port51879,MTU1420,уникальными name/comment. Native key generation/peer association проверены в памяти, handshake и Ping3/3 в обе стороны passed. Шесть настоящих API export запросов (rsc/conf/peer-conf на обоих устройствах) вернули200 с includePrivateKey=false. RSC/CONF параметры совпали с native; ключи и конфигурации не сохранялись. Peer .conf содержит PublicKey экспортирующего интерфейса и Endpoint экспортирующего устройства:51879; client Address/AllowedIPs остаются comment placeholders, активного default route нет. Это шаблон, готовность к импорту клиента не заявлена. + +[Native/API evidence](ux-ui/acceptance/wg-export-native-2026-10-09.json), [browser evidence](ux-ui/acceptance/browser-wg-peer-export-c16fc0c-2026-10-09.json), [deploy/DB controls](ux-ui/acceptance/wg-export-deploy-controls-2026-10-09.json). Четыре настоящих browser сценария без HTTP mocks: оба CHR ×1280/320px. Local preview и live Peer export совпали по server endpoint/client placeholders; POST включает выбранный ROS peer ID и includePrivateKey=false. Нет page errors/API errors/page overflow. Export содержимое и ключи не попали в отчёты/скриншоты; UI download не выполнялся. + +Fixture завершён exit0 и удалён. Проверенные WG interfaces/peers/IP/routes/IPv4 filter/nat/mangle совпали с baseline на обоих CHR. Очистка только собственных объектов; audit revisions намеренно сохранены. DB controls до/после совпали:servers2,speedHistory9,retentionDays14,migrations9. Дополнительно сохранён ранее полученный screenshot создания на CHR2 в12.5.64 с исходной датой2026-10-08. Product code в этом блоке не менялся после уже проверенного c16fc0c; общая регрессия не повторялась. + +Следующий12.5.68 — import roundtrip собственного конфигурационного файла с независимой проверкой параметров и очисткой. Client-allowed-address/готовый client import, private-key export modes/UI download,throughput/IPv6/RBAC/внешние failures/multi-instance/Telegram/Portal и остальные протоколы/интеграции остаются открытыми. Локальный коммит без push. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index cb18170d..d1446766 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -1,6 +1,6 @@ -# Тестовый сервер UX/UI — 2026-10-08 +# Тестовый сервер UX/UI — 2026-10-09 -Сервер161.104.46.222 предоставлен пользователем для временного тестирования с последующим удалением. Подготовка выполнена по структуре deploy/docker-compose.yml из main. Приложение собрано и запущено. Активный backend source3722fad329a68a8721ebfda8e044ab6cb5830cca/version1.0.0-test.3722fad healthy; frontend sourcebf43263e43ae375651237e019fe1aae55e848308/version1.0.0-test.bf43263 обновлён в12.5.64. +Сервер161.104.46.222 предоставлен пользователем для временного тестирования с последующим удалением. Активные backend/frontend sourcec16fc0c5b53ba8fcb6690ef6f0a695f59875f171/version1.0.0-test.c16fc0c обновлены в12.5.67; backend healthy, frontend HTTP200. SSH и оба CHR доступны с прежними доступами. | Параметр | Проверенное состояние | | --- | --- | @@ -14,7 +14,7 @@ | PostgreSQL | postgres:18-alpine,18.6;mmapp-test-postgres healthy;SELECT version() passed | | Данные | Отдельный Compose project mmapp-test,том mmapp-test_mmapp-pgdata и каталог ./data | | Доступ | PostgreSQL не публикуется;frontend3000/backend8000 привязаны к127.0.0.1 после запуска | -| Образы приложения | mmapp-test/backend:ux-bd3f996 и mmapp-test/frontend:ux-bd3f996;запущены | +| Образы приложения | mmapp-test/backend:ux-c16fc0c и mmapp-test/frontend:ux-c16fc0c; запущены | Compose SHA256:3052bd6ab5d9865f97605cebfb5ff27a4410cd3357b81153a65a87fb7c92582f. OptionalBACKEND_IMAGE_TAG позволяетобновлятьbackendотдельно. Локальный и удалённый файлы совпали. Шаблоны: [Compose](../deploy/docker-compose.test.yml), [env без секретов](../deploy/env.test.example). @@ -533,3 +533,17 @@ Server allowed-address не обозначает клиентские маршр Проверки lib/wg-client-template.test.ts —5/5: endpoint exporting server/явный override/hostname/IPv6/неизвестные значения, одинаковые backend/frontend placeholders, отсутствие активного Address/AllowedIPs и default route без явных данных, сохранение явно заданных client параметров. Existing backend wireguard-config.test.ts passed; contracts build, backend TypeScript, scoped frontend TypeScript и ESLint всех изменённых файлов passed. Profile wireguard-links.spec.ts --grep экспорт —4/4: late response isolation/error, неправильный формат, выбор второго peer/ROS ID, его client-address/client-endpoint и отсутствие remote endpoint/server allowed-address в preview. Первый запуск старого теста ожидал ошибочно скопированные peer.allowedIps; fixture и assertions заменены на отличающиеся client metadata, защита выбора второго пира сохранена. ReUI checklist checked. Исправление локальное: runtime backend3722fad/frontendbf43263 не менялся. Следующий12.5.67 — production Docker build/deploy backend и frontend с обновлённым contracts source, новая собственная WG пара, native/API export false redaction и правильный endpoint/шаблон, browser preview соответствие, cleanup/baseline. Поддержка client-allowed-address, настоящий client import/connectivity, import roundtrip/private-key modes, throughput/IPv6/RBAC/внешние failures/multi-instance/Telegram/Portal и другие протоколы/интеграции остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push. + +## 12.5.67 — Docker deploy и реальный экспорт клиентского шаблона WireGuard (2026-10-09) + +Обе production Docker сборки c16fc0c завершились успешно. Межслойный unit test перенесён из lib в tests/unit/wg-client-template.test.ts отдельным локальным коммитом c16fc0c: frontend Docker context не содержит backend source. Предварительный frontend staging c82e8fa не включал этот новый тест и не используется как доказательство чистой сборки исходного c82e8fa. Окончательные staging lib/backend src/contracts совпали с архивом c16fc0c; финальные образы обеих частей имеют OCI revision c16fc0c5b53ba8fcb6690ef6f0a695f59875f171. Network-none assertion backend образа проверил общий resolver и отсутствие активных клиентских Address/AllowedIPs без явных данных. + +Перед обновлением сохранён приватный PG dump pre-c16fc0c.dump,2314923bytes,mode0600; pg_restore --list passed. Backend/frontend обновлены до1.0.0-test.c16fc0c, backend healthy, frontend /wireguard HTTP200. Образы: backend sha256:fb9f9279df07481d960f5799338e15a0fc9162a8baca3be7789a89f28a5f56dc, frontend sha256:bc70ee3203b4fd3f269ab6554493f0fb1ec2e60ef515ced2dcd6c6c7428064bc. Резервная .env хранится только на сервере. SSH161.104.46.222 и RouterOS REST194.226.121.150/104.165.244.7 доступны с прежними учётными данными; пароли не изменялись. + +Создана собственная временная WG пара с адресами198.18.255.241/30 и198.18.255.242/30,port51879,MTU1420,уникальными name/comment. Native key generation/peer association проверены в памяти, handshake и Ping3/3 в обе стороны passed. Шесть настоящих API export запросов (rsc/conf/peer-conf на обоих устройствах) вернули200 с includePrivateKey=false. RSC/CONF параметры совпали с native; ключи и конфигурации не сохранялись. Peer .conf содержит PublicKey экспортирующего интерфейса и Endpoint экспортирующего устройства:51879; client Address/AllowedIPs остаются comment placeholders, активного default route нет. Это шаблон, готовность к импорту клиента не заявлена. + +[Native/API evidence](ux-ui/acceptance/wg-export-native-2026-10-09.json), [browser evidence](ux-ui/acceptance/browser-wg-peer-export-c16fc0c-2026-10-09.json), [deploy/DB controls](ux-ui/acceptance/wg-export-deploy-controls-2026-10-09.json). Четыре настоящих browser сценария без HTTP mocks: оба CHR ×1280/320px. Local preview и live Peer export совпали по server endpoint/client placeholders; POST включает выбранный ROS peer ID и includePrivateKey=false. Нет page errors/API errors/page overflow. Export содержимое и ключи не попали в отчёты/скриншоты; UI download не выполнялся. + +Fixture завершён exit0 и удалён. Проверенные WG interfaces/peers/IP/routes/IPv4 filter/nat/mangle совпали с baseline на обоих CHR. Очистка только собственных объектов; audit revisions намеренно сохранены. DB controls до/после совпали:servers2,speedHistory9,retentionDays14,migrations9. Дополнительно сохранён ранее полученный screenshot создания на CHR2 в12.5.64 с исходной датой2026-10-08. Product code в этом блоке не менялся после уже проверенного c16fc0c; общая регрессия не повторялась. + +Следующий12.5.68 — import roundtrip собственного конфигурационного файла с независимой проверкой параметров и очисткой. Client-allowed-address/готовый client import, private-key export modes/UI download,throughput/IPv6/RBAC/внешние failures/multi-instance/Telegram/Portal и остальные протоколы/интеграции остаются открытыми. Локальный коммит без push. diff --git a/docs/ux-ui/acceptance/browser-wg-peer-export-c16fc0c-2026-10-09.json b/docs/ux-ui/acceptance/browser-wg-peer-export-c16fc0c-2026-10-09.json new file mode 100644 index 00000000..5667cdd0 --- /dev/null +++ b/docs/ux-ui/acceptance/browser-wg-peer-export-c16fc0c-2026-10-09.json @@ -0,0 +1,59 @@ +{ + "date": "2026-10-09", + "backendSource": "c16fc0c", + "frontendSource": "c16fc0c", + "name": "mm-acceptance-wg-1791508569068", + "httpMocks": false, + "cases": [ + { + "serverId": 1, + "width": 1280, + "localPreviewEndpointCorrect": true, + "liveEndpointCorrect": true, + "clientPlaceholders": true, + "includePrivateKey": false, + "selectedPeerConfirmed": true, + "status": 200, + "noPageOverflow": true + }, + { + "serverId": 1, + "width": 320, + "localPreviewEndpointCorrect": true, + "liveEndpointCorrect": true, + "clientPlaceholders": true, + "includePrivateKey": false, + "selectedPeerConfirmed": true, + "status": 200, + "noPageOverflow": true + }, + { + "serverId": 2, + "width": 1280, + "localPreviewEndpointCorrect": true, + "liveEndpointCorrect": true, + "clientPlaceholders": true, + "includePrivateKey": false, + "selectedPeerConfirmed": true, + "status": 200, + "noPageOverflow": true + }, + { + "serverId": 2, + "width": 320, + "localPreviewEndpointCorrect": true, + "liveEndpointCorrect": true, + "clientPlaceholders": true, + "includePrivateKey": false, + "selectedPeerConfirmed": true, + "status": 200, + "noPageOverflow": true + } + ], + "pageErrors": [], + "badApi": [], + "limits": [ + "No configuration or keys persisted", + "Peer .conf remains a manual client template; no import or throughput tested" + ] +} diff --git a/docs/ux-ui/acceptance/wg-export-deploy-controls-2026-10-09.json b/docs/ux-ui/acceptance/wg-export-deploy-controls-2026-10-09.json new file mode 100644 index 00000000..9683e699 --- /dev/null +++ b/docs/ux-ui/acceptance/wg-export-deploy-controls-2026-10-09.json @@ -0,0 +1,42 @@ +{ + "date": "2026-10-09", + "revision": "c16fc0c5b53ba8fcb6690ef6f0a695f59875f171", + "backendHealthy": true, + "frontendHttpStatus": 200, + "networkNoneAssertions": true, + "backup": { + "bytes": 2314923, + "mode": "0600", + "pgRestoreListPassed": true, + "retainedOnTestServerOnly": true + }, + "before": { + "servers": 2, + "speedHistory": 9, + "retentionDays": 14, + "migrations": 9 + }, + "after": { + "servers": 2, + "speedHistory": 9, + "retentionDays": 14, + "migrations": 9 + }, + "access": [ + { + "host": "161.104.46.222", + "protocol": "SSH", + "available": true + }, + { + "host": "194.226.121.150", + "protocol": "RouterOS REST", + "available": true + }, + { + "host": "104.165.244.7", + "protocol": "RouterOS REST", + "available": true + } + ] +} diff --git a/docs/ux-ui/acceptance/wg-export-native-2026-10-09.json b/docs/ux-ui/acceptance/wg-export-native-2026-10-09.json new file mode 100644 index 00000000..3fa1bb2a --- /dev/null +++ b/docs/ux-ui/acceptance/wg-export-native-2026-10-09.json @@ -0,0 +1,377 @@ +{ + "date": "2026-10-09", + "backendSource": "c16fc0c", + "frontendSource": "c16fc0c", + "name": "mm-acceptance-wg-1791508569068", + "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/*E", + "status": 200 + }, + { + "method": "PATCH", + "path": "/api/wireguard/interfaces/1/*E", + "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/*A", + "status": 200 + }, + { + "method": "DELETE", + "path": "/api/wireguard/interfaces/1/*E", + "status": 200 + }, + { + "method": "DELETE", + "path": "/api/wireguard/peers/2/*7", + "status": 200 + }, + { + "method": "DELETE", + "path": "/api/wireguard/interfaces/2/*A", + "status": 200 + } + ], + "pings": [ + { + "serverId": 1, + "target": "198.18.255.242", + "interface": "mm-acceptance-wg-1791508569068", + "received": 3, + "rows": [ + { + "sent": "1", + "received": "1", + "packet-loss": "0", + "time": "54ms498us", + "avg-rtt": "54ms498us" + }, + { + "sent": "2", + "received": "2", + "packet-loss": "0", + "time": "54ms500us", + "avg-rtt": "54ms499us" + }, + { + "sent": "3", + "received": "3", + "packet-loss": "0", + "time": "54ms546us", + "avg-rtt": "54ms514us" + } + ] + }, + { + "serverId": 2, + "target": "198.18.255.241", + "interface": "mm-acceptance-wg-1791508569068", + "received": 3, + "rows": [ + { + "sent": "1", + "received": "1", + "packet-loss": "0", + "time": "54ms503us", + "avg-rtt": "54ms503us" + }, + { + "sent": "2", + "received": "2", + "packet-loss": "0", + "time": "54ms689us", + "avg-rtt": "54ms596us" + }, + { + "sent": "3", + "received": "3", + "packet-loss": "0", + "time": "54ms570us", + "avg-rtt": "54ms587us" + } + ] + } + ], + "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": "*E", + "appId": "1:*E", + "name": "mm-acceptance-wg-1791508569068", + "listenPort": "51879", + "mtu": "1420", + "running": "true", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791508569068" + }, + "addresses": [ + "198.18.255.241/30" + ], + "peers": [ + { + "rosId": "*A", + "name": "mm-acceptance-wg-1791508569068-peer", + "allowedAddresses": "198.18.255.242/32", + "endpoint": "104.165.244.7:51879", + "handshake": "0s", + "rx": "180", + "tx": "272", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791508569068" + } + ] + }, + { + "serverId": 2, + "interface": { + "rosId": "*A", + "appId": "2:*A", + "name": "mm-acceptance-wg-1791508569068", + "listenPort": "51879", + "mtu": "1420", + "running": "true", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791508569068" + }, + "addresses": [ + "198.18.255.242/30" + ], + "peers": [ + { + "rosId": "*7", + "name": "mm-acceptance-wg-1791508569068-peer", + "allowedAddresses": "198.18.255.241/32", + "endpoint": "194.226.121.150:51879", + "handshake": "0s", + "rx": "124", + "tx": "180", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791508569068" + } + ] + } + ], + "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, + "selectedParametersMatch": true, + "configurationNotPersisted": true + }, + { + "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, + "selectedParametersMatch": true, + "configurationNotPersisted": true + } + ], + "peerClientDefaults": [ + { + "serverId": 1, + "endpointIsExportingServer": true, + "clientAddressPlaceholder": true, + "clientRoutesPlaceholder": true, + "noImplicitDefaultRoute": true, + "readyForClientImport": false + }, + { + "serverId": 2, + "endpointIsExportingServer": true, + "clientAddressPlaceholder": true, + "clientRoutesPlaceholder": true, + "noImplicitDefaultRoute": true, + "readyForClientImport": false + } + ], + "afterBrowser": [ + { + "serverId": 1, + "interface": { + "rosId": "*E", + "appId": "1:*E", + "name": "mm-acceptance-wg-1791508569068", + "listenPort": "51879", + "mtu": "1420", + "running": "true", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791508569068" + }, + "addresses": [ + "198.18.255.241/30" + ], + "peers": [ + { + "rosId": "*A", + "name": "mm-acceptance-wg-1791508569068-peer", + "allowedAddresses": "198.18.255.242/32", + "endpoint": "104.165.244.7:51879", + "handshake": "1m5s", + "rx": "1140", + "tx": "848", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791508569068" + } + ] + }, + { + "serverId": 2, + "interface": { + "rosId": "*A", + "appId": "2:*A", + "name": "mm-acceptance-wg-1791508569068", + "listenPort": "51879", + "mtu": "1420", + "running": "true", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791508569068" + }, + "addresses": [ + "198.18.255.242/30" + ], + "peers": [ + { + "rosId": "*7", + "name": "mm-acceptance-wg-1791508569068-peer", + "allowedAddresses": "198.18.255.241/32", + "endpoint": "194.226.121.150:51879", + "handshake": "1m5s", + "rx": "700", + "tx": "1140", + "disabled": "false", + "userComment": "Temporary UX acceptance mm-acceptance-wg-1791508569068" + } + ] + } + ], + "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" + ] +} diff --git a/docs/ux-ui/screens/wg-ui-create-server2-bf43263-320-2026-10-08.png b/docs/ux-ui/screens/wg-ui-create-server2-bf43263-320-2026-10-08.png new file mode 100644 index 0000000000000000000000000000000000000000..6291b6298f4196d8eb3f511dfe502f876fa1d68f GIT binary patch literal 62212 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%0Agqw#7E!ST#&T_LHoF~i+)6j+dg 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 JE>(mD{u_DQ{8<11 literal 0 HcmV?d00001