chore(test): подтвердить безопасный импорт conf на стенде
This commit is contained in:
1 parent
479f2adc78
commit
f9980d7d7e
10 files changed
+1041
-7
No files matched your search
@@ -1,6 +1,6 @@
|
||||
# UX/UI: протокол внешней приёмки 12.5
|
||||
|
||||
Статус на2026-10-09: backend/frontend c16fc0c, backend healthy. В12.5.67 исправленный Peer .conf принят как клиентский шаблон: API6/6, browser4/4, server endpoint и placeholders; настоящий RSC roundtrip через UI/native/handshake/Ping принят в12.5.68, .conf и ошибки импорта открыты. Мобильная ширина 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).
|
||||
Статус на2026-10-09: backend/frontend479f2ad, backend healthy. В12.5.67 исправленный Peer .conf принят как клиентский шаблон: API6/6, browser4/4, server endpoint и placeholders; настоящий RSC roundtrip через UI/native/handshake/Ping принят в12.5.68, .conf с явнымName/отказы400/409/сохранение формы приняты в70; partial failures/rollback открыты. Мобильная ширина 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).
|
||||
|
||||
## Паспорт стенда
|
||||
|
||||
@@ -565,3 +565,21 @@ Backend/frontend RSC parsers больше не подставляют default ro
|
||||
Проверки: wireguard-import unit22/22 (готовый conf и explicit default route, template, Interface/Peer/key errors, CIDR, отсутствие маршрутов, несколькоAddress/PSK, числовые ошибки и RSC); настоящий Fastify inject4 invalid apply/dryRun случая →400, PUT mutations0. Backend test:wireguard теперь включает новые service/route tests; исходный codec passed. Client-template cross-layer5/5 passed. Browser3/3: доступ/неподтверждённый receipt, ожидание/повтор,400 incomplete conf с сохранением текста и выбранного сервера2. Последний test не попал в первый grep импорт; отдельно запущен и прошёл. Backend/scoped frontend TypeScript, ESLint и diff check passed. ReUI checklist checked; installed primitives не менялись.
|
||||
|
||||
Исправление локальное, стенд по-прежнему c16fc0c. Реальные preflight400/409, отсутствие native изменений при отказе, production build и новый .conf roundtrip ещё не приняты. Проверка коллизии409 добавлена в code, отдельно не доказана RouterOS fixture в этом блоке. Следующий12.5.70 — собрать/развернуть, проверить отказы и собственную пару на обоих CHR, native параметры/идентичность/связность, затем cleanup/baseline. Конкуренция, повторный import/partial failure/rollback, неизвестные/повторные поля .conf и остальные внешние ограничения остаются открытыми. Пароли и RouterOS настройки в этом блоке не менялись. Локальный коммит без push.
|
||||
|
||||
## 12.5.70 — deploy preflight и собственный .conf roundtrip WireGuard (2026-10-09)
|
||||
|
||||
Production Docker backend/frontend479f2ad успешно собраны и развёрнуты. Зафиксированный source commit479f2adc78b162d7694d9897d201704b51082968 передан Git archive, SHA25661e1dfeb413d80ee3b463f14abf539739203f31b886a1e248fce869fa4e9aba1. Backend src и frontend lib/components/app/contracts в staging совпали с source. OCI revision labels479f2ad,version1.0.0-test.479f2ad; backend image inspect IDsha256:48f85bf9863fcec8f3a1df39e2e9e06835b7a7aaf1c59a5e73f00e0181ab3eff7,frontend sha256:346c0df48cc49314045f54e3e6e6efe826524e279bb3652a515c2d37c7295678. Новый backend-образ без сети отклонил неполный conf/peers-only RSC; backend healthy, frontend HTTP200.
|
||||
|
||||
Перед обновлением сохранён private PG dump pre-479f2ad.dump,2343134bytes,mode0600; pg_restore --list passed. Предыдущая .env сохранена только на сервере, прежние c16fc0c images доступны для отката. SSH161.104.46.222 и RouterOS REST обоих CHR доступны с прежними доступами. Пароли устройств не менялись.
|
||||
|
||||
На каждом CHR настоящий API отклонил неполный conf шаблон с400 для dryRun=false иtrue: всего4 запроса, выбранные WG/peers/IP/routes/IPv4 Firewall ресурсы native не изменились. Затем создана собственная WG пара с уникальным name/comment,51879/1420 и198.18.255.241/30↔198.18.255.242/30; native handshake/Ping3/3 подтверждены. Private .conf exports получены только в памяти; в каждый добавлен явный Name для приложения. Валидный dry-run200 не изменил интерфейс/пир/IP, попытка применить конфиг поверх занятого собственного имени вернула409 на обоих CHR без native изменений. Остальные отрицательные варианты69 проверены локально, не объявлены всеми выполненными на RouterOS в70.
|
||||
|
||||
Обычный DELETE удалил исходную пару с peers/IP. UI восстановил conf наCHR1 при1280px иCHR2 при320px без HTTP mocks. Перед успешным import каждому серверу отправлен неполный шаблон → ожидаемый400; Sheet остался открыт, textarea и server selection сохранены, на выбранном устройстве не появились native объекты. Затем local preview показал CONF/явное имя/одного пира, apply200 подтвердил applied.interfaceName/peersCreated=1, Sheet закрылся и объект появился в таблице. В этих browser сценариях2 ожидаемых400 и0 неожиданных API/page errors, page overflow нет.
|
||||
|
||||
Native checks подтверждают name,ключевую идентичность,listen-port,MTU,адрес,peer public identity,allowed-address,configured endpoint/port/keepalive. Как в68, raw private encoding наCHR2 нормализован при импорте: Curve25519 scalar equivalent и public key unchanged; raw byte equality не требуется. Настоящий handshake иPing3/3 восстановленной пары прошли в обе стороны. Conf не сохраняет interface/peer comments и peer names; Name здесь расширение parser приложения, не стандартная директива wg-quick. Поэтому результат — network/key roundtrip с явно заданным именем, не побайтовое восстановление исходной RouterOS конфигурации. Для metadata-preserving восстановления ранее принят RSC68. Ключи и конфиги не сохранялись в отчёты/файлы/screenshots/traces.
|
||||
|
||||
[Native/API](ux-ui/acceptance/wg-import-conf-native-2026-10-09.json), [browser](ux-ui/acceptance/browser-wg-import-conf-479f2ad-2026-10-09.json), [smoke6 страниц](ux-ui/acceptance/deploy-browser-479f2ad-2026-10-09.json), [deploy/DB controls](ux-ui/acceptance/wg-import-conf-deploy-controls-2026-10-09.json). Первый browser run остановлен ошибочной проверкой harness: после importCHR1 она ожидала отсутствие объектов на обоих CHR перед отказомCHR2. Ошибка исправлена на проверку выбранного устройства; product source не менялся. [Прерванная попытка](ux-ui/acceptance/wg-import-conf-browser-check-aborted-2026-10-09.json) не объявлена принятой; её cleanup/baseline также passed. Финальный fixture exit0.
|
||||
|
||||
Все собственные объекты удалены; выбранные WG/peers/IP/routes/IPv4 filter/nat/mangle совпали с baseline на обоих CHR. Для imported conf без comment ownership подтверждалась уникальным fixture name и ожидаемой native public identity, используемой только в памяти. Остались3 основные службы, backend healthy. DB controls до/после:servers2,speedHistory9,retentionDays14,migrations9. Audit revisions намеренно сохранены. Production smoke /dashboard,/servers,/uptime?tab=speed,/settings,/filters,/wireguard →HTTP200,320px fits,0 page/API errors. Публичные JSON проверены на отсутствие ключей/конфигов/паролей. Дополнительная общая локальная регрессия не повторялась после уже проверенного69; production build/typecheck и реальные scoped сценарии выполнены.
|
||||
|
||||
Следующий12.5.71 — partial apply failures/компенсация и повторный import. Concurrent collision races, rollback/interrupted mutation, неизвестные/повторные поляconf,PSK/multi-address поддержка, ready Peer client template import,private-key UI download,IPv6/throughput/RBAC/multi-instance/Telegram/Portal и остальные внешние протоколы/интеграции остаются открытыми. Локальный коммит без push.
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# План реализации UX/UI по пятичасовым окнам
|
||||
|
||||
Актуальное продолжение 2026-10-09: 12.5.69 локально добавил проверки импорта WireGuard до применения: неполный .conf/неверные ключи и сети/неподдерживаемый PSK отклоняются, отсутствие AllowedIPs больше не создаёт default route; совпадение имени даёт409. Unit22/22, HTTP4 invalid cases, client-template5/5, import browser3/3, backend/frontend TypeScript и ESLint passed. Runtime остаётся backend/frontend c16fc0c. Следующий12.5.70 — Docker build/deploy, реальные400/409 без native изменений и собственный .conf roundtrip на обоих CHR с очисткой. Этап12.5 открыт.
|
||||
Актуальное продолжение 2026-10-09: 12.5.70 развернул backend/frontend479f2ad и принял реальные отказы400/409 без native изменений, .conf roundtrip с явным Name на собственной WG паре обоих CHR и browser сохранение формы. Handshake/Ping3/3 в обе стороны, cleanup/baseline, DB controls и smoke6 страниц passed. Все три сервера доступны с прежними доступами. Следующий12.5.71 — ошибки частичного применения и повторный импорт WireGuard: сначала профильные проверки компенсации/receipt, затем собственный real fixture. Этап12.5 открыт.
|
||||
|
||||
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-08. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
|
||||
|
||||
|
||||
+20
-2
@@ -1,6 +1,6 @@
|
||||
# UX/UI: журнал реализации
|
||||
|
||||
Актуальное продолжение 2026-10-09: 12.5.69 локально добавил проверки импорта WireGuard до применения: неполный .conf/неверные ключи и сети/неподдерживаемый PSK отклоняются, отсутствие AllowedIPs больше не создаёт default route; совпадение имени даёт409. Unit22/22, HTTP4 invalid cases, client-template5/5, import browser3/3, backend/frontend TypeScript и ESLint passed. Runtime остаётся backend/frontend c16fc0c. Следующий12.5.70 — Docker build/deploy, реальные400/409 без native изменений и собственный .conf roundtrip на обоих CHR с очисткой. Этап12.5 открыт.
|
||||
Актуальное продолжение 2026-10-09: 12.5.70 развернул backend/frontend479f2ad и принял реальные отказы400/409 без native изменений, .conf roundtrip с явным Name на собственной WG паре обоих CHR и browser сохранение формы. Handshake/Ping3/3 в обе стороны, cleanup/baseline, DB controls и smoke6 страниц passed. Все три сервера доступны с прежними доступами. Следующий12.5.71 — ошибки частичного применения и повторный импорт WireGuard: сначала профильные проверки компенсации/receipt, затем собственный real fixture. Этап12.5 открыт.
|
||||
|
||||
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md).
|
||||
|
||||
@@ -34,7 +34,25 @@
|
||||
| 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–69 и ограничения ниже. Runtime backend/frontend c16fc0c. |
|
||||
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–70 и ограничения ниже. Runtime backend/frontend479f2ad. |
|
||||
|
||||
## 12.5.70 — deploy preflight и собственный .conf roundtrip WireGuard (2026-10-09)
|
||||
|
||||
Production Docker backend/frontend479f2ad успешно собраны и развёрнуты. Зафиксированный source commit479f2adc78b162d7694d9897d201704b51082968 передан Git archive, SHA25661e1dfeb413d80ee3b463f14abf539739203f31b886a1e248fce869fa4e9aba1. Backend src и frontend lib/components/app/contracts в staging совпали с source. OCI revision labels479f2ad,version1.0.0-test.479f2ad; backend image inspect IDsha256:48f85bf9863fcec8f3a1df39e2e9e06835b7a7aaf1c59a5e73f00e0181ab3eff7,frontend sha256:346c0df48cc49314045f54e3e6e6efe826524e279bb3652a515c2d37c7295678. Новый backend-образ без сети отклонил неполный conf/peers-only RSC; backend healthy, frontend HTTP200.
|
||||
|
||||
Перед обновлением сохранён private PG dump pre-479f2ad.dump,2343134bytes,mode0600; pg_restore --list passed. Предыдущая .env сохранена только на сервере, прежние c16fc0c images доступны для отката. SSH161.104.46.222 и RouterOS REST обоих CHR доступны с прежними доступами. Пароли устройств не менялись.
|
||||
|
||||
На каждом CHR настоящий API отклонил неполный conf шаблон с400 для dryRun=false иtrue: всего4 запроса, выбранные WG/peers/IP/routes/IPv4 Firewall ресурсы native не изменились. Затем создана собственная WG пара с уникальным name/comment,51879/1420 и198.18.255.241/30↔198.18.255.242/30; native handshake/Ping3/3 подтверждены. Private .conf exports получены только в памяти; в каждый добавлен явный Name для приложения. Валидный dry-run200 не изменил интерфейс/пир/IP, попытка применить конфиг поверх занятого собственного имени вернула409 на обоих CHR без native изменений. Остальные отрицательные варианты69 проверены локально, не объявлены всеми выполненными на RouterOS в70.
|
||||
|
||||
Обычный DELETE удалил исходную пару с peers/IP. UI восстановил conf наCHR1 при1280px иCHR2 при320px без HTTP mocks. Перед успешным import каждому серверу отправлен неполный шаблон → ожидаемый400; Sheet остался открыт, textarea и server selection сохранены, на выбранном устройстве не появились native объекты. Затем local preview показал CONF/явное имя/одного пира, apply200 подтвердил applied.interfaceName/peersCreated=1, Sheet закрылся и объект появился в таблице. В этих browser сценариях2 ожидаемых400 и0 неожиданных API/page errors, page overflow нет.
|
||||
|
||||
Native checks подтверждают name,ключевую идентичность,listen-port,MTU,адрес,peer public identity,allowed-address,configured endpoint/port/keepalive. Как в68, raw private encoding наCHR2 нормализован при импорте: Curve25519 scalar equivalent и public key unchanged; raw byte equality не требуется. Настоящий handshake иPing3/3 восстановленной пары прошли в обе стороны. Conf не сохраняет interface/peer comments и peer names; Name здесь расширение parser приложения, не стандартная директива wg-quick. Поэтому результат — network/key roundtrip с явно заданным именем, не побайтовое восстановление исходной RouterOS конфигурации. Для metadata-preserving восстановления ранее принят RSC68. Ключи и конфиги не сохранялись в отчёты/файлы/screenshots/traces.
|
||||
|
||||
[Native/API](ux-ui/acceptance/wg-import-conf-native-2026-10-09.json), [browser](ux-ui/acceptance/browser-wg-import-conf-479f2ad-2026-10-09.json), [smoke6 страниц](ux-ui/acceptance/deploy-browser-479f2ad-2026-10-09.json), [deploy/DB controls](ux-ui/acceptance/wg-import-conf-deploy-controls-2026-10-09.json). Первый browser run остановлен ошибочной проверкой harness: после importCHR1 она ожидала отсутствие объектов на обоих CHR перед отказомCHR2. Ошибка исправлена на проверку выбранного устройства; product source не менялся. [Прерванная попытка](ux-ui/acceptance/wg-import-conf-browser-check-aborted-2026-10-09.json) не объявлена принятой; её cleanup/baseline также passed. Финальный fixture exit0.
|
||||
|
||||
Все собственные объекты удалены; выбранные WG/peers/IP/routes/IPv4 filter/nat/mangle совпали с baseline на обоих CHR. Для imported conf без comment ownership подтверждалась уникальным fixture name и ожидаемой native public identity, используемой только в памяти. Остались3 основные службы, backend healthy. DB controls до/после:servers2,speedHistory9,retentionDays14,migrations9. Audit revisions намеренно сохранены. Production smoke /dashboard,/servers,/uptime?tab=speed,/settings,/filters,/wireguard →HTTP200,320px fits,0 page/API errors. Публичные JSON проверены на отсутствие ключей/конфигов/паролей. Дополнительная общая локальная регрессия не повторялась после уже проверенного69; production build/typecheck и реальные scoped сценарии выполнены.
|
||||
|
||||
Следующий12.5.71 — partial apply failures/компенсация и повторный import. Concurrent collision races, rollback/interrupted mutation, неизвестные/повторные поляconf,PSK/multi-address поддержка, ready Peer client template import,private-key UI download,IPv6/throughput/RBAC/multi-instance/Telegram/Portal и остальные внешние протоколы/интеграции остаются открытыми. Локальный коммит без push.
|
||||
|
||||
## 12.5.69 — preflight импорта WireGuard без выдуманных маршрутов (2026-10-09)
|
||||
|
||||
|
||||
+19
-1
@@ -1,6 +1,6 @@
|
||||
# Этап 12: итоговая приёмка UX/UI
|
||||
|
||||
Актуальное продолжение 2026-10-09: 12.5.69 локально добавил проверки импорта WireGuard до применения: неполный .conf/неверные ключи и сети/неподдерживаемый PSK отклоняются, отсутствие AllowedIPs больше не создаёт default route; совпадение имени даёт409. Unit22/22, HTTP4 invalid cases, client-template5/5, import browser3/3, backend/frontend TypeScript и ESLint passed. Runtime остаётся backend/frontend c16fc0c. Следующий12.5.70 — Docker build/deploy, реальные400/409 без native изменений и собственный .conf roundtrip на обоих CHR с очисткой. Этап12.5 открыт.
|
||||
Актуальное продолжение 2026-10-09: 12.5.70 развернул backend/frontend479f2ad и принял реальные отказы400/409 без native изменений, .conf roundtrip с явным Name на собственной WG паре обоих CHR и browser сохранение формы. Handshake/Ping3/3 в обе стороны, cleanup/baseline, DB controls и smoke6 страниц passed. Все три сервера доступны с прежними доступами. Следующий12.5.71 — ошибки частичного применения и повторный импорт WireGuard: сначала профильные проверки компенсации/receipt, затем собственный real fixture. Этап12.5 открыт.
|
||||
|
||||
План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.
|
||||
|
||||
@@ -1730,3 +1730,21 @@ Backend/frontend RSC parsers больше не подставляют default ro
|
||||
Проверки: wireguard-import unit22/22 (готовый conf и explicit default route, template, Interface/Peer/key errors, CIDR, отсутствие маршрутов, несколькоAddress/PSK, числовые ошибки и RSC); настоящий Fastify inject4 invalid apply/dryRun случая →400, PUT mutations0. Backend test:wireguard теперь включает новые service/route tests; исходный codec passed. Client-template cross-layer5/5 passed. Browser3/3: доступ/неподтверждённый receipt, ожидание/повтор,400 incomplete conf с сохранением текста и выбранного сервера2. Последний test не попал в первый grep импорт; отдельно запущен и прошёл. Backend/scoped frontend TypeScript, ESLint и diff check passed. ReUI checklist checked; installed primitives не менялись.
|
||||
|
||||
Исправление локальное, стенд по-прежнему c16fc0c. Реальные preflight400/409, отсутствие native изменений при отказе, production build и новый .conf roundtrip ещё не приняты. Проверка коллизии409 добавлена в code, отдельно не доказана RouterOS fixture в этом блоке. Следующий12.5.70 — собрать/развернуть, проверить отказы и собственную пару на обоих CHR, native параметры/идентичность/связность, затем cleanup/baseline. Конкуренция, повторный import/partial failure/rollback, неизвестные/повторные поля .conf и остальные внешние ограничения остаются открытыми. Пароли и RouterOS настройки в этом блоке не менялись. Локальный коммит без push.
|
||||
|
||||
## 12.5.70 — deploy preflight и собственный .conf roundtrip WireGuard (2026-10-09)
|
||||
|
||||
Production Docker backend/frontend479f2ad успешно собраны и развёрнуты. Зафиксированный source commit479f2adc78b162d7694d9897d201704b51082968 передан Git archive, SHA25661e1dfeb413d80ee3b463f14abf539739203f31b886a1e248fce869fa4e9aba1. Backend src и frontend lib/components/app/contracts в staging совпали с source. OCI revision labels479f2ad,version1.0.0-test.479f2ad; backend image inspect IDsha256:48f85bf9863fcec8f3a1df39e2e9e06835b7a7aaf1c59a5e73f00e0181ab3eff7,frontend sha256:346c0df48cc49314045f54e3e6e6efe826524e279bb3652a515c2d37c7295678. Новый backend-образ без сети отклонил неполный conf/peers-only RSC; backend healthy, frontend HTTP200.
|
||||
|
||||
Перед обновлением сохранён private PG dump pre-479f2ad.dump,2343134bytes,mode0600; pg_restore --list passed. Предыдущая .env сохранена только на сервере, прежние c16fc0c images доступны для отката. SSH161.104.46.222 и RouterOS REST обоих CHR доступны с прежними доступами. Пароли устройств не менялись.
|
||||
|
||||
На каждом CHR настоящий API отклонил неполный conf шаблон с400 для dryRun=false иtrue: всего4 запроса, выбранные WG/peers/IP/routes/IPv4 Firewall ресурсы native не изменились. Затем создана собственная WG пара с уникальным name/comment,51879/1420 и198.18.255.241/30↔198.18.255.242/30; native handshake/Ping3/3 подтверждены. Private .conf exports получены только в памяти; в каждый добавлен явный Name для приложения. Валидный dry-run200 не изменил интерфейс/пир/IP, попытка применить конфиг поверх занятого собственного имени вернула409 на обоих CHR без native изменений. Остальные отрицательные варианты69 проверены локально, не объявлены всеми выполненными на RouterOS в70.
|
||||
|
||||
Обычный DELETE удалил исходную пару с peers/IP. UI восстановил conf наCHR1 при1280px иCHR2 при320px без HTTP mocks. Перед успешным import каждому серверу отправлен неполный шаблон → ожидаемый400; Sheet остался открыт, textarea и server selection сохранены, на выбранном устройстве не появились native объекты. Затем local preview показал CONF/явное имя/одного пира, apply200 подтвердил applied.interfaceName/peersCreated=1, Sheet закрылся и объект появился в таблице. В этих browser сценариях2 ожидаемых400 и0 неожиданных API/page errors, page overflow нет.
|
||||
|
||||
Native checks подтверждают name,ключевую идентичность,listen-port,MTU,адрес,peer public identity,allowed-address,configured endpoint/port/keepalive. Как в68, raw private encoding наCHR2 нормализован при импорте: Curve25519 scalar equivalent и public key unchanged; raw byte equality не требуется. Настоящий handshake иPing3/3 восстановленной пары прошли в обе стороны. Conf не сохраняет interface/peer comments и peer names; Name здесь расширение parser приложения, не стандартная директива wg-quick. Поэтому результат — network/key roundtrip с явно заданным именем, не побайтовое восстановление исходной RouterOS конфигурации. Для metadata-preserving восстановления ранее принят RSC68. Ключи и конфиги не сохранялись в отчёты/файлы/screenshots/traces.
|
||||
|
||||
[Native/API](ux-ui/acceptance/wg-import-conf-native-2026-10-09.json), [browser](ux-ui/acceptance/browser-wg-import-conf-479f2ad-2026-10-09.json), [smoke6 страниц](ux-ui/acceptance/deploy-browser-479f2ad-2026-10-09.json), [deploy/DB controls](ux-ui/acceptance/wg-import-conf-deploy-controls-2026-10-09.json). Первый browser run остановлен ошибочной проверкой harness: после importCHR1 она ожидала отсутствие объектов на обоих CHR перед отказомCHR2. Ошибка исправлена на проверку выбранного устройства; product source не менялся. [Прерванная попытка](ux-ui/acceptance/wg-import-conf-browser-check-aborted-2026-10-09.json) не объявлена принятой; её cleanup/baseline также passed. Финальный fixture exit0.
|
||||
|
||||
Все собственные объекты удалены; выбранные WG/peers/IP/routes/IPv4 filter/nat/mangle совпали с baseline на обоих CHR. Для imported conf без comment ownership подтверждалась уникальным fixture name и ожидаемой native public identity, используемой только в памяти. Остались3 основные службы, backend healthy. DB controls до/после:servers2,speedHistory9,retentionDays14,migrations9. Audit revisions намеренно сохранены. Production smoke /dashboard,/servers,/uptime?tab=speed,/settings,/filters,/wireguard →HTTP200,320px fits,0 page/API errors. Публичные JSON проверены на отсутствие ключей/конфигов/паролей. Дополнительная общая локальная регрессия не повторялась после уже проверенного69; production build/typecheck и реальные scoped сценарии выполнены.
|
||||
|
||||
Следующий12.5.71 — partial apply failures/компенсация и повторный import. Concurrent collision races, rollback/interrupted mutation, неизвестные/повторные поляconf,PSK/multi-address поддержка, ready Peer client template import,private-key UI download,IPv6/throughput/RBAC/multi-instance/Telegram/Portal и остальные внешние протоколы/интеграции остаются открытыми. Локальный коммит без push.
|
||||
@@ -1,6 +1,6 @@
|
||||
# Тестовый сервер UX/UI — 2026-10-09
|
||||
|
||||
Сервер161.104.46.222 предоставлен пользователем для временного тестирования с последующим удалением. Активные backend/frontend sourcec16fc0c5b53ba8fcb6690ef6f0a695f59875f171/version1.0.0-test.c16fc0c обновлены в12.5.67; backend healthy, frontend HTTP200. SSH и оба CHR доступны с прежними доступами. В12.5.68 RSC roundtrip принят на обоих CHR; исходный baseline восстановлен.
|
||||
Сервер161.104.46.222 предоставлен для временного тестирования. Backend/frontend source479f2adc78b162d7694d9897d201704b51082968/version1.0.0-test.479f2ad обновлены в12.5.70; backend healthy, frontend HTTP200. SSH и оба CHR доступны с прежними доступами. RSC68 и conf с явнымName70 приняты в описанных границах; baseline восстановлен.
|
||||
|
||||
| Параметр | Проверенное состояние |
|
||||
| --- | --- |
|
||||
@@ -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-c16fc0c и mmapp-test/frontend:ux-c16fc0c; запущены |
|
||||
| Образы приложения | mmapp-test/backend:ux-479f2ad и mmapp-test/frontend:ux-479f2ad; запущены |
|
||||
|
||||
Compose SHA256:3052bd6ab5d9865f97605cebfb5ff27a4410cd3357b81153a65a87fb7c92582f. OptionalBACKEND_IMAGE_TAG позволяетобновлятьbackendотдельно. Локальный и удалённый файлы совпали. Шаблоны: [Compose](../deploy/docker-compose.test.yml), [env без секретов](../deploy/env.test.example).
|
||||
|
||||
@@ -573,3 +573,21 @@ Backend/frontend RSC parsers больше не подставляют default ro
|
||||
Проверки: wireguard-import unit22/22 (готовый conf и explicit default route, template, Interface/Peer/key errors, CIDR, отсутствие маршрутов, несколькоAddress/PSK, числовые ошибки и RSC); настоящий Fastify inject4 invalid apply/dryRun случая →400, PUT mutations0. Backend test:wireguard теперь включает новые service/route tests; исходный codec passed. Client-template cross-layer5/5 passed. Browser3/3: доступ/неподтверждённый receipt, ожидание/повтор,400 incomplete conf с сохранением текста и выбранного сервера2. Последний test не попал в первый grep импорт; отдельно запущен и прошёл. Backend/scoped frontend TypeScript, ESLint и diff check passed. ReUI checklist checked; installed primitives не менялись.
|
||||
|
||||
Исправление локальное, стенд по-прежнему c16fc0c. Реальные preflight400/409, отсутствие native изменений при отказе, production build и новый .conf roundtrip ещё не приняты. Проверка коллизии409 добавлена в code, отдельно не доказана RouterOS fixture в этом блоке. Следующий12.5.70 — собрать/развернуть, проверить отказы и собственную пару на обоих CHR, native параметры/идентичность/связность, затем cleanup/baseline. Конкуренция, повторный import/partial failure/rollback, неизвестные/повторные поля .conf и остальные внешние ограничения остаются открытыми. Пароли и RouterOS настройки в этом блоке не менялись. Локальный коммит без push.
|
||||
|
||||
## 12.5.70 — deploy preflight и собственный .conf roundtrip WireGuard (2026-10-09)
|
||||
|
||||
Production Docker backend/frontend479f2ad успешно собраны и развёрнуты. Зафиксированный source commit479f2adc78b162d7694d9897d201704b51082968 передан Git archive, SHA25661e1dfeb413d80ee3b463f14abf539739203f31b886a1e248fce869fa4e9aba1. Backend src и frontend lib/components/app/contracts в staging совпали с source. OCI revision labels479f2ad,version1.0.0-test.479f2ad; backend image inspect IDsha256:48f85bf9863fcec8f3a1df39e2e9e06835b7a7aaf1c59a5e73f00e0181ab3eff7,frontend sha256:346c0df48cc49314045f54e3e6e6efe826524e279bb3652a515c2d37c7295678. Новый backend-образ без сети отклонил неполный conf/peers-only RSC; backend healthy, frontend HTTP200.
|
||||
|
||||
Перед обновлением сохранён private PG dump pre-479f2ad.dump,2343134bytes,mode0600; pg_restore --list passed. Предыдущая .env сохранена только на сервере, прежние c16fc0c images доступны для отката. SSH161.104.46.222 и RouterOS REST обоих CHR доступны с прежними доступами. Пароли устройств не менялись.
|
||||
|
||||
На каждом CHR настоящий API отклонил неполный conf шаблон с400 для dryRun=false иtrue: всего4 запроса, выбранные WG/peers/IP/routes/IPv4 Firewall ресурсы native не изменились. Затем создана собственная WG пара с уникальным name/comment,51879/1420 и198.18.255.241/30↔198.18.255.242/30; native handshake/Ping3/3 подтверждены. Private .conf exports получены только в памяти; в каждый добавлен явный Name для приложения. Валидный dry-run200 не изменил интерфейс/пир/IP, попытка применить конфиг поверх занятого собственного имени вернула409 на обоих CHR без native изменений. Остальные отрицательные варианты69 проверены локально, не объявлены всеми выполненными на RouterOS в70.
|
||||
|
||||
Обычный DELETE удалил исходную пару с peers/IP. UI восстановил conf наCHR1 при1280px иCHR2 при320px без HTTP mocks. Перед успешным import каждому серверу отправлен неполный шаблон → ожидаемый400; Sheet остался открыт, textarea и server selection сохранены, на выбранном устройстве не появились native объекты. Затем local preview показал CONF/явное имя/одного пира, apply200 подтвердил applied.interfaceName/peersCreated=1, Sheet закрылся и объект появился в таблице. В этих browser сценариях2 ожидаемых400 и0 неожиданных API/page errors, page overflow нет.
|
||||
|
||||
Native checks подтверждают name,ключевую идентичность,listen-port,MTU,адрес,peer public identity,allowed-address,configured endpoint/port/keepalive. Как в68, raw private encoding наCHR2 нормализован при импорте: Curve25519 scalar equivalent и public key unchanged; raw byte equality не требуется. Настоящий handshake иPing3/3 восстановленной пары прошли в обе стороны. Conf не сохраняет interface/peer comments и peer names; Name здесь расширение parser приложения, не стандартная директива wg-quick. Поэтому результат — network/key roundtrip с явно заданным именем, не побайтовое восстановление исходной RouterOS конфигурации. Для metadata-preserving восстановления ранее принят RSC68. Ключи и конфиги не сохранялись в отчёты/файлы/screenshots/traces.
|
||||
|
||||
[Native/API](ux-ui/acceptance/wg-import-conf-native-2026-10-09.json), [browser](ux-ui/acceptance/browser-wg-import-conf-479f2ad-2026-10-09.json), [smoke6 страниц](ux-ui/acceptance/deploy-browser-479f2ad-2026-10-09.json), [deploy/DB controls](ux-ui/acceptance/wg-import-conf-deploy-controls-2026-10-09.json). Первый browser run остановлен ошибочной проверкой harness: после importCHR1 она ожидала отсутствие объектов на обоих CHR перед отказомCHR2. Ошибка исправлена на проверку выбранного устройства; product source не менялся. [Прерванная попытка](ux-ui/acceptance/wg-import-conf-browser-check-aborted-2026-10-09.json) не объявлена принятой; её cleanup/baseline также passed. Финальный fixture exit0.
|
||||
|
||||
Все собственные объекты удалены; выбранные WG/peers/IP/routes/IPv4 filter/nat/mangle совпали с baseline на обоих CHR. Для imported conf без comment ownership подтверждалась уникальным fixture name и ожидаемой native public identity, используемой только в памяти. Остались3 основные службы, backend healthy. DB controls до/после:servers2,speedHistory9,retentionDays14,migrations9. Audit revisions намеренно сохранены. Production smoke /dashboard,/servers,/uptime?tab=speed,/settings,/filters,/wireguard →HTTP200,320px fits,0 page/API errors. Публичные JSON проверены на отсутствие ключей/конфигов/паролей. Дополнительная общая локальная регрессия не повторялась после уже проверенного69; production build/typecheck и реальные scoped сценарии выполнены.
|
||||
|
||||
Следующий12.5.71 — partial apply failures/компенсация и повторный import. Concurrent collision races, rollback/interrupted mutation, неизвестные/повторные поляconf,PSK/multi-address поддержка, ready Peer client template import,private-key UI download,IPv6/throughput/RBAC/multi-instance/Telegram/Portal и остальные внешние протоколы/интеграции остаются открытыми. Локальный коммит без push.
|
||||
@@ -0,0 +1,129 @@
|
||||
{
|
||||
"date": "2026-10-09",
|
||||
"backendSource": "479f2ad",
|
||||
"frontendSource": "479f2ad",
|
||||
"name": "mm-acceptance-wg-1791510576475",
|
||||
"httpMocks": false,
|
||||
"cases": [
|
||||
{
|
||||
"serverId": "1",
|
||||
"width": 1280,
|
||||
"format": "conf",
|
||||
"incompleteTemplateStatus": 400,
|
||||
"templateAndServerRetained": true,
|
||||
"rejectedTemplateNoNativeObjects": true,
|
||||
"localPreviewPassed": true,
|
||||
"selectedServerPreserved": true,
|
||||
"status": 200,
|
||||
"receiptConfirmed": true,
|
||||
"dialogClosedAfterReceipt": true,
|
||||
"noPageOverflow": true
|
||||
},
|
||||
{
|
||||
"serverId": "2",
|
||||
"width": 320,
|
||||
"format": "conf",
|
||||
"incompleteTemplateStatus": 400,
|
||||
"templateAndServerRetained": true,
|
||||
"rejectedTemplateNoNativeObjects": true,
|
||||
"localPreviewPassed": true,
|
||||
"selectedServerPreserved": true,
|
||||
"status": 200,
|
||||
"receiptConfirmed": true,
|
||||
"dialogClosedAfterReceipt": true,
|
||||
"noPageOverflow": true
|
||||
}
|
||||
],
|
||||
"native": {
|
||||
"ok": true,
|
||||
"handshakeConfirmed": true,
|
||||
"pings": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"received": 3
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"received": 3
|
||||
}
|
||||
],
|
||||
"roundtrip": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"format": "conf",
|
||||
"explicitNameAdded": true,
|
||||
"privateKeyPreservedInMemory": true,
|
||||
"dryRunStatus": 200,
|
||||
"dryRunNativeUnchanged": true,
|
||||
"checks": {
|
||||
"interfacePresent": true,
|
||||
"interfaceName": true,
|
||||
"interfaceCommentAbsent": true,
|
||||
"interfacePrivateScalarEquivalent": true,
|
||||
"interfacePublicIdentity": true,
|
||||
"listenPort": true,
|
||||
"mtu": true,
|
||||
"onePeer": true,
|
||||
"peerIdentity": true,
|
||||
"allowedAddresses": true,
|
||||
"configuredEndpointAddress": true,
|
||||
"configuredEndpointPort": true,
|
||||
"keepalive": true,
|
||||
"peerCommentAbsent": true,
|
||||
"address": true
|
||||
},
|
||||
"nativeParametersMatch": true,
|
||||
"interfacePublicIdentityUnchanged": true,
|
||||
"privateScalarEquivalent": true,
|
||||
"privateEncodingUnchanged": true,
|
||||
"linkedAddressAndPeerPresent": true
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"format": "conf",
|
||||
"explicitNameAdded": true,
|
||||
"privateKeyPreservedInMemory": true,
|
||||
"dryRunStatus": 200,
|
||||
"dryRunNativeUnchanged": true,
|
||||
"checks": {
|
||||
"interfacePresent": true,
|
||||
"interfaceName": true,
|
||||
"interfaceCommentAbsent": true,
|
||||
"interfacePrivateScalarEquivalent": true,
|
||||
"interfacePublicIdentity": true,
|
||||
"listenPort": true,
|
||||
"mtu": true,
|
||||
"onePeer": true,
|
||||
"peerIdentity": true,
|
||||
"allowedAddresses": true,
|
||||
"configuredEndpointAddress": true,
|
||||
"configuredEndpointPort": true,
|
||||
"keepalive": true,
|
||||
"peerCommentAbsent": true,
|
||||
"address": true
|
||||
},
|
||||
"nativeParametersMatch": true,
|
||||
"interfacePublicIdentityUnchanged": true,
|
||||
"privateScalarEquivalent": true,
|
||||
"privateEncodingUnchanged": false,
|
||||
"linkedAddressAndPeerPresent": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"pageErrors": [],
|
||||
"expectedApiRejections": [
|
||||
{
|
||||
"path": "/api/wireguard/import",
|
||||
"status": 400
|
||||
},
|
||||
{
|
||||
"path": "/api/wireguard/import",
|
||||
"status": 400
|
||||
}
|
||||
],
|
||||
"unexpectedApiErrors": [],
|
||||
"limits": [
|
||||
"Private CONF configs used only in memory; no traces/screenshots/config files persisted",
|
||||
"Own conf with explicit Name restored; comments/peer names not retained; no interrupted apply or RBAC tested"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"date": "2026-10-09",
|
||||
"backendSource": "479f2ad",
|
||||
"frontendSource": "479f2ad",
|
||||
"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": "/wireguard",
|
||||
"status": 200,
|
||||
"mobileFits": true
|
||||
}
|
||||
],
|
||||
"pageErrors": [],
|
||||
"badApiResponses": []
|
||||
}
|
||||
@@ -0,0 +1,330 @@
|
||||
{
|
||||
"date": "2026-10-09",
|
||||
"backendSource": "479f2ad",
|
||||
"frontendSource": "479f2ad",
|
||||
"name": "mm-acceptance-wg-1791510491772",
|
||||
"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/*17",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "PATCH",
|
||||
"path": "/api/wireguard/interfaces/1/*17",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "GET",
|
||||
"path": "/api/wireguard",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/api/wireguard/export",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/api/wireguard/import",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/api/wireguard/export",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/api/wireguard/import",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "DELETE",
|
||||
"path": "/api/wireguard/interfaces/1/*17",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "DELETE",
|
||||
"path": "/api/wireguard/interfaces/2/*13",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "DELETE",
|
||||
"path": "/api/wireguard/peers/1/*14",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "DELETE",
|
||||
"path": "/api/wireguard/interfaces/1/*18",
|
||||
"status": 200
|
||||
}
|
||||
],
|
||||
"pings": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"target": "198.18.255.242",
|
||||
"interface": "mm-acceptance-wg-1791510491772",
|
||||
"received": 3,
|
||||
"rows": [
|
||||
{
|
||||
"sent": "1",
|
||||
"received": "1",
|
||||
"packet-loss": "0",
|
||||
"time": "54ms644us",
|
||||
"avg-rtt": "54ms644us"
|
||||
},
|
||||
{
|
||||
"sent": "2",
|
||||
"received": "2",
|
||||
"packet-loss": "0",
|
||||
"time": "54ms579us",
|
||||
"avg-rtt": "54ms611us"
|
||||
},
|
||||
{
|
||||
"sent": "3",
|
||||
"received": "3",
|
||||
"packet-loss": "0",
|
||||
"time": "54ms658us",
|
||||
"avg-rtt": "54ms627us"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"target": "198.18.255.241",
|
||||
"interface": "mm-acceptance-wg-1791510491772",
|
||||
"received": 3,
|
||||
"rows": [
|
||||
{
|
||||
"sent": "1",
|
||||
"received": "1",
|
||||
"packet-loss": "0",
|
||||
"time": "54ms534us",
|
||||
"avg-rtt": "54ms534us"
|
||||
},
|
||||
{
|
||||
"sent": "2",
|
||||
"received": "2",
|
||||
"packet-loss": "0",
|
||||
"time": "54ms576us",
|
||||
"avg-rtt": "54ms555us"
|
||||
},
|
||||
{
|
||||
"sent": "3",
|
||||
"received": "3",
|
||||
"packet-loss": "0",
|
||||
"time": "55ms11us",
|
||||
"avg-rtt": "54ms707us"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"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
|
||||
}
|
||||
],
|
||||
"rejections": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"status": 400,
|
||||
"dryRun": false,
|
||||
"nativeUnchanged": true
|
||||
},
|
||||
{
|
||||
"serverId": 1,
|
||||
"status": 400,
|
||||
"dryRun": true,
|
||||
"nativeUnchanged": true
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"status": 400,
|
||||
"dryRun": false,
|
||||
"nativeUnchanged": true
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"status": 400,
|
||||
"dryRun": true,
|
||||
"nativeUnchanged": true
|
||||
}
|
||||
],
|
||||
"nativeKeyGenerationConfirmed": true,
|
||||
"connectedState": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"interface": {
|
||||
"rosId": "*17",
|
||||
"appId": "1:*17",
|
||||
"name": "mm-acceptance-wg-1791510491772",
|
||||
"listenPort": "51879",
|
||||
"mtu": "1420",
|
||||
"running": "true",
|
||||
"disabled": "false",
|
||||
"userComment": "Temporary UX acceptance mm-acceptance-wg-1791510491772"
|
||||
},
|
||||
"addresses": [
|
||||
"198.18.255.241/30"
|
||||
],
|
||||
"peers": [
|
||||
{
|
||||
"rosId": "*13",
|
||||
"name": "mm-acceptance-wg-1791510491772-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-1791510491772"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"interface": {
|
||||
"rosId": "*13",
|
||||
"appId": "2:*13",
|
||||
"name": "mm-acceptance-wg-1791510491772",
|
||||
"listenPort": "51879",
|
||||
"mtu": "1420",
|
||||
"running": "true",
|
||||
"disabled": "false",
|
||||
"userComment": "Temporary UX acceptance mm-acceptance-wg-1791510491772"
|
||||
},
|
||||
"addresses": [
|
||||
"198.18.255.242/30"
|
||||
],
|
||||
"peers": [
|
||||
{
|
||||
"rosId": "*10",
|
||||
"name": "mm-acceptance-wg-1791510491772-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-1791510491772"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"handshakeConfirmed": true,
|
||||
"bidirectionalPingPassed": true,
|
||||
"catalogMatchesNative": true,
|
||||
"roundtrip": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"format": "conf",
|
||||
"explicitNameAdded": true,
|
||||
"privateKeyPreservedInMemory": true,
|
||||
"dryRunStatus": 200,
|
||||
"dryRunNativeUnchanged": true
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"format": "conf",
|
||||
"explicitNameAdded": true,
|
||||
"privateKeyPreservedInMemory": true,
|
||||
"dryRunStatus": 200,
|
||||
"dryRunNativeUnchanged": true
|
||||
}
|
||||
],
|
||||
"collisions": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"status": 409,
|
||||
"nativeUnchanged": true
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"status": 409,
|
||||
"nativeUnchanged": true
|
||||
}
|
||||
],
|
||||
"afterBrowser": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"interface": {
|
||||
"rosId": "*18",
|
||||
"appId": "1:*18",
|
||||
"name": "mm-acceptance-wg-1791510491772",
|
||||
"listenPort": "51879",
|
||||
"mtu": "1420",
|
||||
"running": "true",
|
||||
"disabled": "false"
|
||||
},
|
||||
"addresses": [
|
||||
"198.18.255.241/30"
|
||||
],
|
||||
"peers": [
|
||||
{
|
||||
"rosId": "*14",
|
||||
"name": "peer20",
|
||||
"allowedAddresses": "198.18.255.242/32",
|
||||
"endpoint": "104.165.244.7:51879",
|
||||
"handshake": null,
|
||||
"rx": "0",
|
||||
"tx": "148",
|
||||
"disabled": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"interface": null,
|
||||
"addresses": [],
|
||||
"peers": []
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Only own WireGuard interface/peer/IP and connected route changed; no default routes/firewall changes",
|
||||
"Own private-key CONF used in memory; explicit Name app extension added, comments/peer names not preserved; no keys persisted",
|
||||
"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"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"date": "2026-10-09",
|
||||
"source": "479f2adc78b162d7694d9897d201704b51082968",
|
||||
"archiveSha256": "61e1dfeb413d80ee3b463f14abf539739203f31b886a1e248fce869fa4e9aba1",
|
||||
"ociRevision": "479f2ad",
|
||||
"backendImage": "sha256:48f85bf9863fcec8f3a1df39e2e9e06835b7a7aaf1c59a5e73f00e0181ab3eff7",
|
||||
"frontendImage": "sha256:346c0df48cc49314045f54e3e6e6efe826524e279bb3652a515c2d37c7295678",
|
||||
"backendHealthy": true,
|
||||
"backendVersion": "1.0.0-test.479f2ad",
|
||||
"frontendHttpStatus": 200,
|
||||
"networkNoneAssertions": true,
|
||||
"backup": {
|
||||
"bytes": 2343134,
|
||||
"mode": "0600",
|
||||
"pgRestoreListPassed": true,
|
||||
"retainedOnTestServerOnly": true
|
||||
},
|
||||
"before": {
|
||||
"servers": 2,
|
||||
"speedHistory": 9,
|
||||
"retentionDays": 14,
|
||||
"migrations": 9
|
||||
},
|
||||
"after": {
|
||||
"servers": 2,
|
||||
"speedHistory": 9,
|
||||
"retentionDays": 14,
|
||||
"migrations": 9
|
||||
},
|
||||
"mainServices": 3,
|
||||
"temporaryFixtureContainersRemaining": 0,
|
||||
"auditRevisionsIntentionallyRetained": true,
|
||||
"access": [
|
||||
{
|
||||
"host": "161.104.46.222",
|
||||
"available": true
|
||||
},
|
||||
{
|
||||
"host": "194.226.121.150",
|
||||
"available": true
|
||||
},
|
||||
{
|
||||
"host": "104.165.244.7",
|
||||
"available": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,416 @@
|
||||
{
|
||||
"date": "2026-10-09",
|
||||
"backendSource": "479f2ad",
|
||||
"frontendSource": "479f2ad",
|
||||
"name": "mm-acceptance-wg-1791510576475",
|
||||
"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/*19",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "PATCH",
|
||||
"path": "/api/wireguard/interfaces/1/*19",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "GET",
|
||||
"path": "/api/wireguard",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/api/wireguard/export",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/api/wireguard/import",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/api/wireguard/export",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/api/wireguard/import",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "DELETE",
|
||||
"path": "/api/wireguard/interfaces/1/*19",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "DELETE",
|
||||
"path": "/api/wireguard/interfaces/2/*14",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "DELETE",
|
||||
"path": "/api/wireguard/peers/1/*16",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "DELETE",
|
||||
"path": "/api/wireguard/interfaces/1/*1A",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "DELETE",
|
||||
"path": "/api/wireguard/peers/2/*12",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"method": "DELETE",
|
||||
"path": "/api/wireguard/interfaces/2/*15",
|
||||
"status": 200
|
||||
}
|
||||
],
|
||||
"pings": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"target": "198.18.255.242",
|
||||
"interface": "mm-acceptance-wg-1791510576475",
|
||||
"received": 3,
|
||||
"rows": [
|
||||
{
|
||||
"sent": "1",
|
||||
"received": "1",
|
||||
"packet-loss": "0",
|
||||
"time": "54ms393us",
|
||||
"avg-rtt": "54ms393us"
|
||||
},
|
||||
{
|
||||
"sent": "2",
|
||||
"received": "2",
|
||||
"packet-loss": "0",
|
||||
"time": "54ms755us",
|
||||
"avg-rtt": "54ms574us"
|
||||
},
|
||||
{
|
||||
"sent": "3",
|
||||
"received": "3",
|
||||
"packet-loss": "0",
|
||||
"time": "54ms619us",
|
||||
"avg-rtt": "54ms589us"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"target": "198.18.255.241",
|
||||
"interface": "mm-acceptance-wg-1791510576475",
|
||||
"received": 3,
|
||||
"rows": [
|
||||
{
|
||||
"sent": "1",
|
||||
"received": "1",
|
||||
"packet-loss": "0",
|
||||
"time": "54ms423us",
|
||||
"avg-rtt": "54ms423us"
|
||||
},
|
||||
{
|
||||
"sent": "2",
|
||||
"received": "2",
|
||||
"packet-loss": "0",
|
||||
"time": "54ms569us",
|
||||
"avg-rtt": "54ms496us"
|
||||
},
|
||||
{
|
||||
"sent": "3",
|
||||
"received": "3",
|
||||
"packet-loss": "0",
|
||||
"time": "54ms639us",
|
||||
"avg-rtt": "54ms543us"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"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
|
||||
}
|
||||
],
|
||||
"rejections": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"status": 400,
|
||||
"dryRun": false,
|
||||
"nativeUnchanged": true
|
||||
},
|
||||
{
|
||||
"serverId": 1,
|
||||
"status": 400,
|
||||
"dryRun": true,
|
||||
"nativeUnchanged": true
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"status": 400,
|
||||
"dryRun": false,
|
||||
"nativeUnchanged": true
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"status": 400,
|
||||
"dryRun": true,
|
||||
"nativeUnchanged": true
|
||||
}
|
||||
],
|
||||
"nativeKeyGenerationConfirmed": true,
|
||||
"connectedState": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"interface": {
|
||||
"rosId": "*19",
|
||||
"appId": "1:*19",
|
||||
"name": "mm-acceptance-wg-1791510576475",
|
||||
"listenPort": "51879",
|
||||
"mtu": "1420",
|
||||
"running": "true",
|
||||
"disabled": "false",
|
||||
"userComment": "Temporary UX acceptance mm-acceptance-wg-1791510576475"
|
||||
},
|
||||
"addresses": [
|
||||
"198.18.255.241/30"
|
||||
],
|
||||
"peers": [
|
||||
{
|
||||
"rosId": "*15",
|
||||
"name": "mm-acceptance-wg-1791510576475-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-1791510576475"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"interface": {
|
||||
"rosId": "*14",
|
||||
"appId": "2:*14",
|
||||
"name": "mm-acceptance-wg-1791510576475",
|
||||
"listenPort": "51879",
|
||||
"mtu": "1420",
|
||||
"running": "true",
|
||||
"disabled": "false",
|
||||
"userComment": "Temporary UX acceptance mm-acceptance-wg-1791510576475"
|
||||
},
|
||||
"addresses": [
|
||||
"198.18.255.242/30"
|
||||
],
|
||||
"peers": [
|
||||
{
|
||||
"rosId": "*11",
|
||||
"name": "mm-acceptance-wg-1791510576475-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-1791510576475"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"handshakeConfirmed": true,
|
||||
"bidirectionalPingPassed": true,
|
||||
"catalogMatchesNative": true,
|
||||
"roundtrip": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"format": "conf",
|
||||
"explicitNameAdded": true,
|
||||
"privateKeyPreservedInMemory": true,
|
||||
"dryRunStatus": 200,
|
||||
"dryRunNativeUnchanged": true,
|
||||
"checks": {
|
||||
"interfacePresent": true,
|
||||
"interfaceName": true,
|
||||
"interfaceCommentAbsent": true,
|
||||
"interfacePrivateScalarEquivalent": true,
|
||||
"interfacePublicIdentity": true,
|
||||
"listenPort": true,
|
||||
"mtu": true,
|
||||
"onePeer": true,
|
||||
"peerIdentity": true,
|
||||
"allowedAddresses": true,
|
||||
"configuredEndpointAddress": true,
|
||||
"configuredEndpointPort": true,
|
||||
"keepalive": true,
|
||||
"peerCommentAbsent": true,
|
||||
"address": true
|
||||
},
|
||||
"nativeParametersMatch": true,
|
||||
"interfacePublicIdentityUnchanged": true,
|
||||
"privateScalarEquivalent": true,
|
||||
"privateEncodingUnchanged": true,
|
||||
"linkedAddressAndPeerPresent": true
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"format": "conf",
|
||||
"explicitNameAdded": true,
|
||||
"privateKeyPreservedInMemory": true,
|
||||
"dryRunStatus": 200,
|
||||
"dryRunNativeUnchanged": true,
|
||||
"checks": {
|
||||
"interfacePresent": true,
|
||||
"interfaceName": true,
|
||||
"interfaceCommentAbsent": true,
|
||||
"interfacePrivateScalarEquivalent": true,
|
||||
"interfacePublicIdentity": true,
|
||||
"listenPort": true,
|
||||
"mtu": true,
|
||||
"onePeer": true,
|
||||
"peerIdentity": true,
|
||||
"allowedAddresses": true,
|
||||
"configuredEndpointAddress": true,
|
||||
"configuredEndpointPort": true,
|
||||
"keepalive": true,
|
||||
"peerCommentAbsent": true,
|
||||
"address": true
|
||||
},
|
||||
"nativeParametersMatch": true,
|
||||
"interfacePublicIdentityUnchanged": true,
|
||||
"privateScalarEquivalent": true,
|
||||
"privateEncodingUnchanged": false,
|
||||
"linkedAddressAndPeerPresent": true
|
||||
}
|
||||
],
|
||||
"collisions": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"status": 409,
|
||||
"nativeUnchanged": true
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"status": 409,
|
||||
"nativeUnchanged": true
|
||||
}
|
||||
],
|
||||
"importedHandshakeConfirmed": true,
|
||||
"importedPings": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"received": 3
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"received": 3
|
||||
}
|
||||
],
|
||||
"afterBrowser": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"interface": {
|
||||
"rosId": "*1A",
|
||||
"appId": "1:*1A",
|
||||
"name": "mm-acceptance-wg-1791510576475",
|
||||
"listenPort": "51879",
|
||||
"mtu": "1420",
|
||||
"running": "true",
|
||||
"disabled": "false"
|
||||
},
|
||||
"addresses": [
|
||||
"198.18.255.241/30"
|
||||
],
|
||||
"peers": [
|
||||
{
|
||||
"rosId": "*16",
|
||||
"name": "peer22",
|
||||
"allowedAddresses": "198.18.255.242/32",
|
||||
"endpoint": "104.165.244.7:51879",
|
||||
"handshake": "2s",
|
||||
"rx": "756",
|
||||
"tx": "848",
|
||||
"disabled": "false"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"interface": {
|
||||
"rosId": "*15",
|
||||
"appId": "2:*15",
|
||||
"name": "mm-acceptance-wg-1791510576475",
|
||||
"listenPort": "51879",
|
||||
"mtu": "1420",
|
||||
"running": "true",
|
||||
"disabled": "false"
|
||||
},
|
||||
"addresses": [
|
||||
"198.18.255.242/30"
|
||||
],
|
||||
"peers": [
|
||||
{
|
||||
"rosId": "*12",
|
||||
"name": "peer18",
|
||||
"allowedAddresses": "198.18.255.241/32",
|
||||
"endpoint": "194.226.121.150:51879",
|
||||
"handshake": "3s",
|
||||
"rx": "700",
|
||||
"tx": "756",
|
||||
"disabled": "false"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"Only own WireGuard interface/peer/IP and connected route changed; no default routes/firewall changes",
|
||||
"Own private-key CONF used in memory; explicit Name app extension added, comments/peer names not preserved; no keys persisted",
|
||||
"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"
|
||||
]
|
||||
}
|
||||
Reference in new issue
Block a user