160 KiB
Тестовый сервер UX/UI — 2026-10-09
Сервер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 восстановлен.
| Параметр | Проверенное состояние |
|---|---|
| ОС / архитектура | Debian13 trixie13.7 / x86_64 |
| Ресурсы | 1CPU,1973MiB RAM,4GiB swap; исходно23GiB свободного диска |
| Docker Engine | 29.8.2;systemd enabled/active;hello-world passed |
| Compose / Buildx | v5.6.0 / v0.37.1 |
| Каталог | /opt/mmapp-test;0700 |
| Конфигурация | /opt/mmapp-test/compose.yaml;0600;docker compose config --quiet passed |
| Секреты | Сгенерированы только на сервере в /opt/mmapp-test/.env;0600;в Git не сохранены |
| 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-479f2ad и mmapp-test/frontend:ux-479f2ad; запущены |
Compose SHA256:3052bd6ab5d9865f97605cebfb5ff27a4410cd3357b81153a65a87fb7c92582f. OptionalBACKEND_IMAGE_TAG позволяетобновлятьbackendотдельно. Локальный и удалённый файлы совпали. Шаблоны: Compose, env без секретов.
Развёртывание приложения
Чистые frontend/backend build contexts подготовлены по .gitea/workflows/docker.yml из закреплённого Git HEAD;образы собраны на сервере без push. Локально docker CLI сейчас отсутствует, на сервере доступен Docker. В корневом .dockerignore исключён backend, поэтому обычный backend build из корня не повторяет CI: использовать отдельный backend context, как main workflow. Не передавать .env.local,backend/.env,ключи и локальные node_modules/.next.
После сборки/загрузки образов выполнить на сервере:
cd /opt/mmapp-test
docker compose config --quiet
docker compose up -d --wait --wait-timeout 300 postgres backend frontend
docker compose ps
curl -fsS http://127.0.0.1:8000/health
curl -fsS http://127.0.0.1:3000/health
Для браузера на рабочем ПК открыть SSH-туннель в отдельном терминале:
ssh -N -L 3000:127.0.0.1:3000 -L 8000:127.0.0.1:8000 root@161.104.46.222
После запуска frontend открыть http://localhost:3000. AUTH_REQUIRED=false допустим для этого доступа через loopback/SSH; при приёмке прав включить AUTH_REQUIRED и согласованный тестовый issuer/Portal, используя серверный JWT secret. Конфигурация фиксирует конкретный image tag; автообновление main:latest не используется.
Границы результата
Выполнены подготовка12.5.1,сборка/запуск12.5.2 и исправление обнаруженной live ошибки12.5.3. На реальном PG применились9миграций0000–0009 (без0001),проверены0008/0009 и CHECK статусов/resolution_version;restart сохранил контрольную настройкуuptime_settings(id1/retention14) и список миграций. Пустые API каталоги прочитаны успешно. Это PG-1 в границе bootstrap/restart/schema/control-row,не проверка backup/restore или транзакционных отказов.
Первый smoke обнаружил PostgreSQL timestamp в outer sampledAt Internet path. Исправлено producer ISO преобразование,без ослабленияfrontend. Итоговый smoke:3экрана200,54чтенияAPI200,безJSerrors,320px fits,Internet path подтверждён. HTTP-моков нет. Первое повторное ожидание подписи свежести исправлено раскрытием штатного блока;ошибка данных послеpatch отсутствует. Дашборд320px просмотрен.
Image IDs при первом smoke12.5.3 (исторический снимок):
- backend: sha256:57878e320b7272edcc6efe1f6f5c140295510c85cb79b8ca12a900f7654cd917
- frontend: sha256:bfba2785b33a72965a029a3692178ba69c80eca75a12934c1dcc04c7970db53f
После пересборки контрольныйid1/retention14 и9миграций сохранились. Подробные build logs и контрольные файлы расположены в /opt/mmapp-test/artifacts. Секреты остаются только в серверном.env0600. Временный SSH-туннель3000/8000 открыт в этой задаче;если процесс остановится,повторить команду выше.
Продолжение PG проверок записано в блоке 12.5.7 ниже. Следующий 12.5.8 — lifecycle jobs/flush/worker перед API restore по протоколу. Для Telegram/Portal и других интеграций нужны тестовые endpoints/учётные записи. 1CPU/2GiB не представляют production performance.
Первый тестовый CHR — 2026-10-07
194.226.121.150 добавлен в приложение,serverId1,имяCHR,typehome-router(default). По явному выбору пользователя используетсяHTTP REST80,useSsl=false;HTTPS443 отключён наCHR. RouterOS7.24.5 stable;identityCHR,модельCHR OpenStack Foundation OpenStack Nova. Test-connection/poll/GET200,statusonline,строка видна вUI. КонфигурацияRouterOS не изменялась. Очищенный результат. Пароль в паспорт/отчёт/Git не включён. Дляspeed-test нужно второе отдельное устройство;VPN/маршрутизация/изменениясети пока не проверены.
Второй тестовый CHR — 2026-10-07
104.165.244.7,serverId2,HTTPREST80,имяCHR,typehome-router(default),RouterOS7.24.5 stable;test-connection/poll/GET200,statusonline. Паспорт пары без учётных данных. Пароль не включён в документы/Git. Следующий12.5.6 — короткиеTCP bandwidth-test по3сек,transmit/receive/both. Имена одинаковые;использоватьIP/id для выбора устройства.
Native TCP speed — 2026-10-07
НаобоихCHR поразрешениюпользователя включёнbandwidth-server(enabled=true,authenticate=true,max-sessions100),независимымGET подтверждено;служба остаётся активной для последующих тестов. ВзаимныйPing3/3,0%loss. Триad-hocTCP runs id1→id2 по3s/transmit/receive/both завершеныdone testing,HTTP200,история/GUI подтверждены. Настройки,результаты,предыдущий отказ при выключенной службе. Это функциональная проверка,неbenchmark;UDP/WANbinding/probe-races/остальнойROS иPG-протокол не закрыты.
PostgreSQL backup/RBAC/concurrency — 2026-10-07
Отчёт 12.5.7: admin backup200/475225bytes, pg_restore18.6 прочитал907TOC entries и восстановил отдельную mmapp_acceptance_20261007. Контрольные записи/9миграций/5speed rows/servers sequence совпали с исходной БД. Приложение не подключено к проверочной БД; она сохранена для дальнейшей приёмки. Дамп только в /opt/mmapp-test/data/acceptance-private (0700), файл0600, содержит приватные учётные данные и не копируется в Git.
При AUTH_REQUIRED=true подтверждены401/403 на backup/restore; JWT сформированы в памяти, реальный Portal SSO не проверен. Конкурирующий restore409 при наблюдаемом активном pg_dump, первый backup200 после снятия контрольного SQL lock. AUTH_REQUIRED=false восстановлен, API auth/config и health подтвердили состояние. PG-3/4/6 остаются открытыми: ожидание завершения текущих scheduler jobs/flush/worker пока не обеспечено.
Локальный lifecycle patch — 2026-10-07
Блок12.5.8 исправляет ожидание scheduler jobs и запрещает новые запуски во время database operation;17scheduler tests,7pure database tests,HTTP/JWT scripts и build прошли. На этом стенде patch пока не развёрнут: активный source673e5ba сохраняется. Следующий12.5.9 — graceful NetFlow worker stop/flush; только после этого перейти к сборке/развёртыванию и внешней проверкеPG-6. Восстановление основной тестовой БД ещё не выполнялось.
Локальный NetFlow shutdown patch — 2026-10-07
В12.5.9 добавлена командаshutdown с подтверждением послеflush/pool.end и ожиданиемexit0;4pure/protocol tests, database HTTP/JWT и build passed. На стенд ещё не развёрнуто, source673e5ba остаётся активным. Реальный collector/UDP/длительный SQL и прочие writers требуют отдельной проверки12.5.10 в mmapp_acceptance_20261007. Подтверждение завершения flush не гарантирует сохранение всех пакетов при прежних best-effort ошибках engine; PG-6/restore не приняты.
Настоящий isolated collector — 2026-10-07
12.5.10 evidence: актуальныйworker изf8da3e0 в отдельном временном контейнере, выделеннаяmmapp_acceptance_20261007, UDP4749 только внутриконтейнера. Shutdown дождался blocked SQL/освободилsocket, ack+exit0, delta1500bytes,0worker connections. Контейнер удалён--rm. ПроверочнаяБД теперь содержит синтетические flow rows/counters; архив12.5.7 остаётся исходным snapshot. Основной runtime673e5ba/healthok/serverID1–2/retention14 сохранён. App-wide PG-6/ручные API writers/restore ещё открыты; следующий12.5.11 — аудит и admission остальных писателей.
Локальный HTTP drain patch — 2026-10-07
12.5.11 добавляет instance-local gate для всех API handlers/GET, exclusive backup/restore иabort/drain traffic live streams.4gate tests,15lifecycle/database tests,HTTP/JWT scripts иbuild passed. Основнойruntime673e5ba остаётсяактивным. Detached backup jobs/audit иRIPE persistence ещёнеохвачены; следующий12.5.12 закрываетэтотпробел. PG-6/restore не приняты.
Локальный detached work drain — 2026-10-07
12.5.12 добавляетучётbackground backup/audit/certificate/partition maintenance/cache work иpause RIPE enqueue сdrain текущихresolver/writes.19lifecycle/database tests,HTTP/JWT,backup/RIPE,10certificate tests иbuild прошли. На стенднеразвёрнуто; source673e5ba сохраняется. Следующий12.5.13 — integrated quiescence иcache invalidation передrestore/deployment. PG-6/3/4 остаютсяоткрытыми.
Локальный cache invalidation patch — 2026-10-07
12.5.13 сбрасываетDB-зависимыеNetFlow caches/live buffers/partition memo послеуспешногоrestore доconsumer restart, сохраняяRIPE pause.22различныхlifecycle/database tests,HTTP/JWT,RIPE/ifindex/classify иbuild прошли. Runtime673e5ba не обновлён; следующий12.5.14 — integrated real-PG quiescence/restore ввыделеннойБД иdeployment. PG-6/3/4 остаютсяоткрытыми. Dump не включаетвнешниеbackup/certificate/MMDB files.
Реальный API restore failure — 2026-10-07
12.5.14 evidence: isolatedsourcef1aac49/API againstmmapp_acceptance_20261007, backup200, activewrite drain/GET409. Restore400:inheritedpartitionPK нельзяудалитьсуществующим--clean. Контрольrollback прошёл (servers/speed/migrations/sequence/retention16/constraint). ПроверочнаяБДretention16,основнаяretention14/source673e5ba/healthok сохранены. Runtimeнеобновлён,PG-3 иполныйPG-6 открыты. Следующий12.5.15 — транзакционноеисправлениеclean иповторнаяприёмка.
Partition-safe API restore — 2026-10-07
12.5.15:isolatedf1aac49+compiledpatch, realAPIrestore200/новыйID3/injectedSQL400/rollback1587constraints. ПроверочнаяБДmmapp_acceptance_20261007 содержитserver3 disabled192.0.2.250/retention19. ОсновнаяБДserver1–2/retention14/source673e5ba/healthok сохранена.25localtests,HTTP/JWT иbuild passed. Patchещёнеразвёрнут; следующий12.5.16 — disabled-server collector defect, integratedPG-6/deployment.
Enabled-only мониторинг — 2026-10-07
По явномувыборупользователя12.5.16 исключаетdisabledвсетипыизuptime/RESTping/scheduledspeed, manualspeedпроверяетобасерверадосети. Realматрица3типов/0новыхdisabledсэмплов прошла. ВпроверочнойБДserver3 сноваhome-router/enabledfalse, temporaryspeedprobesудалены. Основнойruntime673e5ba не обновлён,healthok. Следующий12.5.17 — integratedPG-6/deployment.
Обновление backend иPG-6 — 2026-10-07
12.5.17 integratedquiescence/restore/restart passedдляодногоisolatedbackend. Основнойbackend4c12c55 собран/развёрнут,healthy/sourcefullrevision/version1.0.0-test.4c12c55. Frontend673e5ba прежний. BACKEND_IMAGE_TAG=ux-4c12c55,MMAPP_IMAGE_TAG=ux-673e5ba. Приватныйpre-updatebackup вdata/acceptance-private,контрольосновнойБДserver1–2/retention14/9миграций совпал. 3realbrowser screens 200/320fits/безJS/APIerrors. Полный12.5 иmulti-instanceприёмкаещёоткрыты.
RealRBAC иbrowserrestore — 2026-10-08
12.5.18 RBAC16denials/childprocess0/adminbackup200,browserrestore200/архивныйcontrol/400guardreload passedнавыделеннойБД. Временныеfrontend/backend использовалиизолированнуюDocker network,посколькуNextrewritesфиксированыприbuild; guardпредотвратилwritesприошибкемаршрутизации. Temporarycontainers/network/3018tunnelудалены,основнойbackend4c12c55/frontend673e5ba/server1–2/retention14/AUTHfalse сохранены. PortalSSO иполный12.5 ещёоткрыты.
Isolated PG-8 speed — 2026-10-08
12.5.19 INSERTfailure/realCOMMITackfault/scheduledreceipt passedнаmmapp_acceptance_20261007/source4c12c55+worktreepatch среальнымиCHRtransmit3s. Temporaryprobe/trigger/function удалены,историческиетестовыерезультатыосталисьвпроверочнойБД. Основнойruntime4c12c55healthy/БДнеизменена;patchещёнеразвёрнут. Следующий12.5.20 — deployment/browserunknown-speed.
Локальный snapshot guard — 2026-10-08
12.5.20 сохраняетlastconfirmedspeed snapshot дляunknown502/совпадающегоrunId.2unit tests/frontendtypecheck passed;browserunknownUX ещёнепроверен,patchнеразвёрнут. Backend4c12c55/frontend673e5ba прежние. Следующий12.5.21 — build/browserunknown/deploymentобоихобразов.
Локальный unknown UX — 2026-10-08
12.5.21: отдельная строка unknown/runId, сохранение snapshot и сверка по идентификатору при чтении истории. 13 браузерных тестов с HTTP-моками/typecheck/ESLint прошли; это не приёмка real browser/PG. Основной backend4c12c55/frontend673e5ba прежний. Следующий 12.5.22 — сборка и проверка обновлённых образов. Полный 12.5 открыт.
Локальный unknown UX — 2026-10-08
12.5.21: отдельная строка unknown/runId, сохранение snapshot и сверка по идентификатору при чтении истории. 13 браузерных тестов с HTTP-моками/typecheck/ESLint прошли; это не приёмка real browser/PG. Основной backend4c12c55/frontend673e5ba прежний. Следующий 12.5.22 — сборка и проверка обновлённых образов. Полный 12.5 открыт.
Обновление обоих образов — 2026-10-08
12.5.22: deployment, real browser speed unknown, пять экранов. Backend/frontend8782054, backend healthy. MMAPP_IMAGE_TAG и BACKEND_IMAGE_TAG равны ux-8782054. Приватный pre-update backup и конфигурация сохранены только на сервере; основная БД не восстанавливалась, контроль совпал. Temporarycontainers/network/3018 закрыты; основной SSH-туннель3000/8000 восстановлен. AUTHfalse/loopback ports сохранены. Следующий12.5.23 — ROS-8/9 на выделенной БД.
Real speed context — 2026-10-08
12.5.23 ROS-8/9 API/SQL/native evidence: семь preflight409/bandwidth0, enable/reorder сохраняют fixture0; три TCPtransmit3s теста при late change/delete/row lock. Фактическая history done сохранена без stale probe association, новый snapshot null. Scheduler admission закрыт в isolated process до fixture setup; основной backend8782054healthy/история5 сохранены, testprobes0/containerудалён. Browser race и multi-instance открыты. Следующий12.5.24 — browser-смена контекста вторым клиентом.
Browser speed context — 2026-10-08
12.5.24 real browser/native: смена пары/длительности и удаление независимым HTTP-клиентом до native response; UI refresh/reload сохраняет новый контекст без старых скоростей, history done остаётся. Принятые native2/POST[200,200]/JS0/320fits, без HTTP/RouterOS-моков. Ещё один native command выполнен в подготовительном прогоне с неверным UI selector expectation; application auto retry отсутствует. Temporarycontainers/network/3018 закрыты, testprobe удалена; runtime8782054/основнаяhistory5 сохранены. Следующий12.5.25 — ROS-2 authentication failure.
Реальный отказ bandwidth-аутентификации — 2026-10-08
12.5.25 native/API/browser evidence: authentication failed→HTTP502/русская UI-ошибка, history error/TXRXnull; probe previousTX42 сохранён. Native1/POST[502]/refresh/reload/320fits/JS0, без HTTP/RouterOS-моков. Тестовое имя изменялось только в выделенной app DB и восстановлено; RouterOS accounts не менялись. Temporarycontainers/network/3018 закрыты, testprobe удалена; основнаяhistory5/runtime8782054 сохранены. Подготовительный слишком длинныйuser отклонён по длине; accepted run отдельно. ROS-2 authentication failure принят; остальные native failures ещё открыты. Следующий12.5.26 — unreachable destination.
Исправление Next proxy timeout — 2026-10-08
12.5.26 real frontend500/backend error-history выявил30s proxy timeout. Локально proxyTimeout180s; реальная Next proxy regression31s/TypeScript/ESLint passed. Backend сохраняет предыдущий TX42; native can not connect не подтверждён. Runtime8782054 прежний; destination восстановлен/testprobe удалена/temporarycontainers-network-3018 закрыты. Следующий12.5.27 — build/real browser retry/deployment исправленного frontend.
Новый frontend proxy timeout — 2026-10-08
12.5.27 real browser timeout502, frontend deployment, пять экранов passed. Frontendaa7dbdf/proxy180s, backend8782054healthy прежний; MMAPP_IMAGE_TAG=ux-aa7dbdf/BACKEND_IMAGE_TAG=ux-8782054. Основной DBcontrol совпал. Isolatedhost/probe восстановлены/удалены, temporarycontainers/network/3018 закрыты. Это transport timeout, не native can not connect; техническая подпись timeout остаётся ограничением UX. Следующий12.5.28 — ROS-3 interface/address/after-ping.
Интерфейс native test и Ping — 2026-10-08
12.5.28 real ROS-3: reverse2→1 done, bandwidth194.226.121.150/nointerfacebinding, Pingether1/0%loss; metadata source195 не доказываетsourceIPpackets. CHR2 имеет dynamic104/static195, явныйdstinterface предпочитаетstatic. Три1→2 попыткиtimeout, причинаauto-path не установлена; они не приняты. КонфигурацияRouterOS не менялась. Основнойruntimebackend8782054/frontendaa7dbdf/history5 сохранён. UIhint/CLIwhereinterface исправлены локально; browserfixture/typecheck/ESLint passed, не развёрнуты. Следующий12.5.29 — real browserform/deploymentподсказок.
Форма интерфейсов развёрнута — 2026-10-08
12.5.29 real browser form, deployment, пять экранов passed. Frontendf194e72, backend8782054healthy прежний; MMAPP_IMAGE_TAG=ux-f194e72/BACKEND_IMAGE_TAG=ux-8782054. Настоящий inventory/static-IP195, правильныйCLIinterfacefilter/пояснение/320fits/JS0, без моков/native-команд. Основнойcontrol совпал; fixtureprobe/temporarycontainers/network/3018 удалены. Следующий12.5.30 — read-only forward-native диагностика; timeout1→2 не исправлен этим UI-изменением.
Read-only forward диагностика — 2026-10-08
12.5.30 settings/state, jobs, TCP2000 сDebian. Server enabled/authtrue/session0, filter/NAT/mangle0, active main default routes, CPU0; TCP2000 reachable сDebian. ПричинаCHR1→CHR2timeout не установлена. Поздние REST401/CHR2-500 ограничивают дополнительные чтения. Native0/configchanges0, temporarycontainers завершены, mainruntimebackend8782054/frontendf194e72/history5 сохранены. Следующий12.5.31 — CLI/REST/соединения1→2, без изменения адресов и маршрутов.
Текущий доступ CHR2 требует проверки — 2026-10-08
12.5.31 CLI/REST/SSH comparison: CLI3.5s/REST3.0s nativeauthenticationfailed; GETconnections401, SSH2AuthenticationException. Main/testcredentials совпадают, значения не раскрыты. Текущий отказ авторизации подтверждён; причина прежнегоtimeout не доказана. Запрошены актуальные данные или проверкаadmin на104.165.244.7, зависимаяприёмка ожидает ответа. RouterOSconfiguration не менялась, mainruntimebackend8782054/frontendf194e72/history5 сохранён. Независимые12.5 сценарии остаются открытыми.
Доступ восстановлен пользователем — 2026-10-08
12.5.32 API/native1→2, realbrowserdashboard passed. Пользователь восстановил парольCHR2; агентне менялRouterOSaccounts/credentialsприложения. Четыре каталога200/failures0, прежниеошибкиUI отсутствуют; nativeTCPtransmit3s1→2 done/HTTP200/53ms0%loss/однаhistorydone. Mainhistory5→6 намеренно; runtimebackend8782054/frontendf194e72 прежний. Старыеисторическиеошибкине переписаны; источник измененияпароля/все прежниеtimeouts не установлены. ОжиданиедоступаCHR2 снято, следующие12.5сценарии ещёоткрыты.
TCP directions после восстановления — 2026-10-08
12.5.33 receive/both native/API/history passed: две TCP3s команды1→2, HTTP200/done testing, receiveTXnull/RXmeasured, bothTXRXmeasured, Ping53ms0%loss. УникальныеGEThistory строки совпали сAPI; mainhistory6→8 намеренно. Это функциональные значения, неbenchmark. Runtimebackend8782054/frontendf194e72/RouterOSconfiguration прежние. Следующий12.5.34 — ограниченныйUDPtest; остальные12.5сценарии открыты.
UDP native/API/history/UI — 2026-10-08
12.5.34 UDPtransmit3s passed: HTTP200/native done testing, TXmeasured/RXnull, Ping53ms0%loss; independenthistory/realbrowserUDP/done/unknownRX/320fits/JS0. Mainhistory8→9 намеренно. Rate cap не задавался, ограничение поduration3s; packet-deliveryratio/benchmark не заявлены. КонфигурацияRouterOS/пароли/runtimebackend8782054/frontendf194e72 прежние. Следующий12.5.35 — Q-6 PostgreSQL dedupe без реальнойотправки сообщений. Остальной12.5 открыт.
Q-6 dedupe — 2026-10-08
12.5.35 productionenqueue/PG race passed:2blockedINSERTs/receipts true-false/однаpendingстрока/повторfalse. Fixtureудалена/countbaseline восстановлен; dispatcherне запускался/сообщений0, mainruntime прежний. Q-6 принят; следующий12.5.36 — Q-4 unknownretry/version без отправки.
Q-4 retry/version — 2026-10-08
12.5.36 realHTTP/PG passed:2blockedUPDATE/200-409/version0→1; stale409, processing409, ackfalse400, отказанныезапросыне меняютстроку. Fixtureудалена/baselinecount восстановлен, app/pool/containerзакрыты, dispatcherне вызывался/сообщений0. Q-4 принят; Q-5 толькоprocessing-refusal. Runtime/mainhistory9 прежние. Следующий12.5.37 — конкурентныйclaimQ-1; реальныеTelegramdelivery scenarios требуютсогласованногочата/разрешенияна сообщения.
Malformed retry receipt rollback — 2026-10-08
12.5.36.1 realPGtrigger/HTTP500/SQLrollback passed: version2 отклонена, unknown/version0 сохранены. Fixture/trigger/functionудалены, app/pool/containerзакрыты, сообщений0. Runtimeпрежний; полнаяQ-7/Telegramприёмка открыта. Следующий12.5.37 — Q-1claim после проверкилимита.
Q-1 production claim — 2026-10-08
12.5.37 realPG/productiondispatcher passed:2blockedclaims/interceptedsender1/sentfixture1/history1/no duplicatecall. Реальныхсообщений0; fakeTelegramsettings/fetchзамена сняты, fixtureудалена/DBcountbaseline восстановлен. Q-1принятдляодногопроцесса/несколькихPGconnections, не реальнаяTelegramдоставка. Runtimeпрежний. Следующий12.5.38 — SQLsettlementfailure послеfixtureacceptedresponse.
12.5.38 — ошибки сохранения после принятого ответа отправителя (2026-10-08)
Отчёт PostgreSQL: production dispatchPendingOutbox из backend8782054, отдельная БД mmapp_acceptance_20261007. Telegram fetch перехвачен внутри изолированного процесса и возвращает ok=true; реальных сообщений не отправлено.
Реальный BEFORE INSERT trigger отклонил запись истории: транзакция settlement откатилась, outbox перешёл в unknown, история отсутствует. Повторный dispatcher не вызывает отправителя. После явно подтверждённого повторения синтетической записи проверена другая граница: PostgreSQL действительно выполнил COMMIT, затем обёртка node-pg ввела ошибку получения подтверждения. Outbox остался sent с resolution_version=1, история содержит ровно одну строку sent_ok=true; попытка hold не перезаписала подтверждённое состояние. Следующий dispatcher не повторил отправку. Поле result.sent=1 отражает принятый подменённый API-ответ и само по себе не подтверждает сохранение или реальную доставку.
Тестовые outbox/history/trigger/function удалены; исходные настройки Telegram восстановлены из памяти, fetch возвращён, pool и контейнер завершены. Основная БД и runtime не менялись. Это проверка SQL rollback и границы подтверждения COMMIT в одном процессе; физический разрыв соединения и реальная доставка Telegram не проверены.
Следующий блок 12.5.39 — неопределённый ответ отправителя и отказ записи unknown, без реальных сообщений. План, журнал этапа и протокол синхронизированы; локальный коммит без push.
12.5.39 — неопределённый ответ отправителя и отказ записи unknown (2026-10-08)
Отчёт PostgreSQL: production dispatchPendingOutbox из backend8782054, отдельная БД mmapp_acceptance_20261007. Fetch вместо внешнего запроса бросает исключение: это управляемая проверка отсутствия ответа, а не физический сетевой timeout и не доказательство доставки в Telegram.
В первом случае dispatcher вернул sent=0/failed=0/held=1, строка стала unknown без увеличения retry_count, история отсутствует. Повторный dispatcher не вызывает отправителя. Во втором случае реальный PostgreSQL trigger отклонил UPDATE unknown: строка осталась processing, API результата сообщает, что сохранение не подтверждено и автоматического повтора нет. После удаления триггера повторный dispatcher тоже не отправил сообщение. Два вызова перехваченного отправителя соответствуют двум явно подготовленным синтетическим сценариям; реальных сообщений — ноль.
Тестовые записи и объекты БД удалены, исходные настройки Telegram восстановлены из памяти с сохранением точного updated_at, fetch восстановлен, pool и контейнер закрыты. Отдельный SQL-запрос подтвердил ноль fixture-записей, ноль тестовых триггеров и функций для блоков 38–39. Основной стенд не затрагивался. Q-3 принят только на границе поведения production sender/PG; реальный чат, UI этого состояния и многопроцессное восстановление отдельно не проверены.
Следующий блок 12.5.40 — явный отказ отправителя, задержка повтора и исчерпание попыток, без реальных сообщений. Документы синхронизированы; локальный коммит без push.
12.5.40 — подтверждённый отказ и исчерпание попыток отправки (2026-10-08)
Отчёт PostgreSQL: production dispatchPendingOutbox из backend8782054, отдельная БД mmapp_acceptance_20261007. Внешний fetch возвращал явный Telegram отказ ok=false/error_code=400; реального запроса и сообщений не было.
Первая отклонённая попытка сохранила pending/retry_count=1, историю не создала и назначила next_attempt_at через 15 секунд. SQL timestamp проверен относительно времени до и после вызова; немедленный dispatcher не отправил повторный запрос. Чтобы не ждать таймер, только в fixture срок следующей попытки затем перенесён на now(). Вторая отклонённая попытка исчерпала maxRetries=2: failed/retry_count=2, одна история с sent_ok=false; последующий dispatcher больше не отправлял. Синтетический токен в description скрыт как [TOKEN] в сохранённой ошибке и ответе dispatcher.
Fixture outbox/history удалены, исходные настройки Telegram восстановлены из памяти с точным updated_at, fetch восстановлен, pool и контейнер завершены. Основной стенд не затрагивался. Это приёмка реального SQL и production-кода с перехваченным отказом; реальный Telegram отказ, нагрузка и многопроцессная работа не заявлены.
Следующий блок 12.5.41 — браузерная проверка unknown/processing через реальные HTTP и PostgreSQL, без отправки сообщений. Документы синхронизированы; локальный коммит без push.
12.5.41 — браузерная очередь через реальные HTTP и PostgreSQL (2026-10-08)
Отчёт браузера: production backend8782054/frontendf194e72, отдельная БД mmapp_acceptance_20261007. Пять синтетических SQL-состояний pending/processing/unknown/sent/failed, по одной строке; настоящий GET overview возвращает согласованные counts/items. HTTP-ответы в браузере не подменялись. Dispatcher не запускался, scheduler admission закрыт; внешний Telegram fetch дополнительно запрещён.
UI показывает понятные подписи и предупреждение об отсутствии автоматического повтора. Для unknown кнопка доступна, для processing отсутствует. Подтверждение риска требуется до постановки в очередь; отмена и Escape не отправляют POST и возвращают фокус. Управляемое исключение backend overview дало настоящий HTTP500: последний снимок сохранился, после восстановления ошибка исчезла. Reload сохранил SQL-состояния. Панель и диалог помещаются в 320px; итоговые снимки сделаны после завершения обновления и просмотрены: ПК, телефон, подтверждение. Queue HTTP statuses: 200/500/200/200; JS errors=0, retry POST=0, external sender calls=0.
Первый запуск остановлен проверкой маркера БД: Next rewrites закреплены во время сборки, runtime BACKEND_INTERNAL_URL не изменяет их. Для корректной изоляции frontend подключён только к отдельной Docker-сети с alias backend, разрешающим исключительно тестовый backend. Основной backend/БД не менялись. Временные контейнеры и сеть удалены; backend завершился с exitCode=0, журнал очистки подтвердил senderCalls=0/retryPosts=0, независимый SQL подтвердил ноль fixture-строк. Дополнительный SSH-туннель3018 закрыт; основной3000 сохранён.
Границы: AUTH_REQUIRED=false на изолированном loopback стенде; реальные Portal SSO, доставка Telegram, физический отказ PG и успешный UI retry не проверены этим блоком. Следующий 12.5.42 — настоящие JWT/RBAC чтения и повтора очереди на PostgreSQL. Локальный коммит без push.
12.5.42 — настоящие JWT/RBAC очереди на PostgreSQL (2026-10-08)
Отчёт JWT/RBAC: production buildApp/handlers/auth из backend8782054, AUTH_REQUIRED=true только внутри изолированного процесса, отдельная БД mmapp_acceptance_20261007. JWT HS256 подписаны серверным ключом в памяти; подпись, issuer и exp проверяет штатный middleware. Fastify inject проходит настоящий путь приложения и SQL, но не является браузерным запросом или удалённым сокетом.
GET outbox: anonymous, неверные issuer/signature, expired и malformed дают401; отсутствие разрешений, settings:admin без alerts и отсутствие доступа к приложению дают403; alerts:read/write/admin дают200 и реальные counts. Все GET сохраняют строки. Девять отказанных POST дают401/403, не меняют snapshot БД и не вызывают production retry boundary. Неподтверждённый риск даёт400 до boundary; неверная ожидаемая версия даёт409 без изменения. Разрешённые write и admin получают200, две fixture-строки становятся pending/retry_count=0/resolution_version=1. Дублирующий POST со старой версией даёт409 и сохраняет SQL snapshot. Ответы проверены на отсутствие JWT и ключа.
Первый запуск harness остановился до создания fixture: jose отсутствует в production-образе как тестовая зависимость. Для генерации стандартной HS256 подписи использован встроенный node:crypto, production middleware и настройки не менялись. Dispatcher не запускался, scheduler admission закрыт, сообщений не отправлено. App/pool/container завершены; fixture удалены, отдельный SQL подтвердил ноль тестовых строк; остались только три основные Compose-службы.
Границы: реальный Portal login/issuer endpoint не вызывался, браузерный RBAC и доставка не заявлены этим тестом. Q-7 подтверждён для API отказа до действия в этих границах. Следующий блок 12.5.43 — успешный UI retry и сохранение checkpoint при потере подтверждения HTTP в отдельной БД, с запретом внешней отправки. Локальный коммит без push.
12.5.43 — браузерный повтор и потеря подтверждения после COMMIT (2026-10-08)
Отчёт браузера: production backend8782054/frontendf194e72, отдельная БД mmapp_acceptance_20261007, два синтетических unknown-сообщения. Реальные браузерные HTTP запросы и production retry transaction; scheduler admission закрыт, dispatcher не запускается, внешний Telegram fetch запрещён. Изолированный frontend использует отдельную Docker-сеть и alias backend.
Первый POST200 подтверждает только постановку в pending/version1, подпись UI прямо сообщает, что отправка и доставка ещё не подтверждены. Во втором сценарии обёртка production retry бросает исключение после завершённой транзакции: настоящий HTTP500 при фактически сохранённом pending/version1. Диалог и checkbox риска остаются, повтор заблокирован. После отмены, refresh и reload предупреждение о неизвестном результате сохраняется; SQL подтверждает две pending-строки/version1/retry_count0 и ноль истории. Явная проверка результата снимает checkpoint без нового POST. Всего POST:200/500, lostReceipts1, senderCalls0, JS errors0; панель и диалог помещаются в320px.
Скриншоты просмотрены: предупреждение после перезагрузки, диалог после HTTP500. Первое тестовое ожидание внутреннего текста исключения исправлено на штатный production текст «Внутренняя ошибка сервера»; приложение не обязано раскрывать исключение. При пересоздании fixture первый прогон очищен с exitCode0. Итоговые контейнеры/сеть/туннель3018 удалены, backend exitCode0, независимый SQL подтвердил ноль fixture-строк. Основной стенд и RouterOS не менялись.
Границы: управляемый отказ получения receipt после фактического COMMIT, а не физический разрыв сети; AUTH_REQUIRED=false; реальных сообщений и проверки чата нет. Найдена UX-недоработка: внутри открытого диалога generic HTTP500 не объясняет неизвестный исход текущего повтора. Следующий блок 12.5.44 — явное пояснение и профильная проверка диалога. Локальный коммит без push.
12.5.44 — понятное пояснение неподтверждённого повтора в диалоге (2026-10-08)
По результатам реального теста12.5.43 уточнён catch в components/alerts-outbox-panel.tsx. При HTTP500, потере ответа или некорректном receipt ошибка прямо в открытом диалоге сообщает: «Результат повтора не подтверждён. Автоматический повтор заблокирован. Проверьте очередь и чат перед новой попыткой», затем показывает подробность ошибки. API400/401/403/409/422 остаются подтверждёнными отказами: checkpoint снимается, исходная ошибка сохраняется. Правила повторной отправки, права и API не менялись.
Профильный Playwright alerts-outbox.spec.ts:8/8, включая новый HTTP500 сценарий, сохранённый checkbox, disabled retry, reload guard и320px; прежние success, malformed receipt, reader, conflict и focus/cancel проходят. Eslint изменённых файлов и tsc --project tmp/tsconfig-speed-check.json --noEmit passed. Scoped config исключает старые копии исходников в tmp; это не утверждение о чистоте обычного полного tsc. Локальный диалог320px просмотрен. HTTP-ответы в этих локальных браузерных тестах подменены; реальные SQL/HTTP результаты43 сохраняются отдельно.
Применён skill ReUI и MCP get_audit_checklist: композиция, установленные primitives, base-nova и semantic tokens сохранены; новых API/стилей/компонентов нет. Ошибка объявляется существующим role=alert, реальные секреты не добавлены; подтверждение риска и управление фокусом покрыты профильными тестами. Изменение пока локальное, удалённый frontend остаётсяf194e72.
Следующий12.5.45 — production Docker build нового frontend, обновление тестового стенда и повтор сценария HTTP500 после COMMIT на отдельной БД. Локальный коммит без push.
12.5.45 — production frontend с пояснением неизвестного исхода (2026-10-08)
Развёртывание: чистый frontend Git archive из b55588f29b, SHA256 f18be60c1dc8c581e26040003d2c655ee2ae1da73044d761b166ac10dca71a7e совпал после передачи. Docker context повторяет frontend staging main workflow, workspaces ограничены packages; production build, полный TypeScript-check внутри образа и export завершились с exit0. Образ mmapp-test/frontend:ux-b55588f, imageId sha256:c3ce5aa8a3dbed7eaab23178cecbce2b2c1a27c31678590b54bc27db5820e5b1; исходный frontendf194e72 сохранён для отката. .env изменён только MMAPP_IMAGE_TAG, backend8782054 прежний и healthy, frontend опубликован исключительно127.0.0.1:3000. Git/image push не выполнялся.
Повтор реального browser retry: новый production frontend и прежний backend на отдельной PostgreSQL БД, без browser HTTP mocks. POST200/500, второй ответ потерян управляемым исключением после фактического COMMIT. Новый текст прямо в диалоге объясняет неподтверждённый исход и необходимость проверки; checkbox/форма/блокировка сохранены. Обе fixture pending/version1/retry_count0; история0, Telegram calls0. Refresh/reload сохраняют checkpoint, явная проверка снимает его без нового POST. Панель/диалог320px помещаются, JS errors0. Диалог и checkpoint просмотрены.
Smoke основной схемы: dashboard, servers, uptime speed, settings, filters, alerts возвращают200,320px fit, JS errors0/API errors0. Независимый контроль основной БД до/после совпадает: servers2/enabled2, speedHistory9, retention14, migrations9. Новые native тесты или сообщения не запускались. Тестовые контейнеры/сеть/туннель3018 удалены, backend fixture завершился exit0, независимый SQL подтвердил ноль его outbox-строк. Основной туннель3000 сохранён.
Границы: управляемый HTTP500 после COMMIT вместо физического сетевого разрыва; синтетические записи и AUTH_REQUIRED=false в изолированном browser стенде. Реальные Telegram доставка/чат, Portal SSO и multi-instance остаются отдельной приёмкой. Уточнены текущие версии и устаревшая сводка плана/паспорта, исторические записи сохранены. Следующий12.5.46 — браузерные права очереди с настоящими JWT. Локальный коммит без push.
12.5.46 — браузерные права очереди с подписанными JWT (2026-10-08)
Отчёт браузера: production frontendb55588f/backend8782054, отдельная PostgreSQL БД mmapp_acceptance_20261007. AUTH_REQUIRED=true только в тестовом процессе, отдельные синтетические HS256 key/issuer, два браузерных контекста read/write. Штатный backend проверяет подпись и разрешения; browser HTTP-ответы не подменялись. Основные настройки авторизации и ключи не изменялись, реальный Portal не вызывался.
Reader получает очередь и видит disabled retry. Прямой POST через browser fetch с reader JWT даёт403, SQL snapshot не меняется, mutation boundary не вызывается. JWT с теми же write claims, но неверной подписью, получает401 через настоящий HTTP API; строка и счётчик mutation сохраняются. Writer видит доступную кнопку, обязательное подтверждение риска, после него POST200 переводит fixture unknown/version0 в pending/version1/retry_count0. UI подтверждает только постановку в очередь; API принял0, история0. Reader после reload видит подтверждённое состояние.
Всего retry HTTP requests3 (403/401/200), mutation calls1, external sender calls0, JS errors0;320px fit. Читатель и после разрешённого повтора сохранены; экран читателя просмотрен. Тестовая запись синтетическая; scheduler admission закрыт, dispatcher не запускался, Telegram fetch дополнительно запрещён. Writer и reader имеют также необходимые read-права окружающей оболочки, но только writer имеет alerts:write.
Тестовые контейнеры/сеть/туннель3018 удалены; backend завершился exitCode0, cleanup подтвердил1mutation/3POST/0send, независимый SQL — ноль fixture-строк. Основной стенд/БД/RouterOS не менялись. Это подтверждение browser и API RBAC, не реального Portal login или Telegram доставки. Следующий12.5.47 — checkpoint и смена источника при незавершённом повторе. Локальный коммит без push.
12.5.47 — изоляция checkpoint при смене источника во время повтора (2026-10-08)
Отчёт браузера: текущий frontend sourceb55588f в Next dev с поддерживаемым NEXT_PUBLIC_BACKEND_URL=local, два настоящих backend8782054 и разные PostgreSQL БД: A mmapp_acceptance_20261007, B временная mmapp_acceptance_sourceb_20261008. Browser HTTP-ответы не подменялись. Production frontend остаётся same-origin с закреплённым источником; результат этого блока относится к конфигурации local, не к переключению в production.
Два синтетических сценария: нормальный поздний receipt и ошибка producer после реального retry COMMIT. Перед навигацией независимый SQL через контрольный endpoint подтверждает A pending/version1/retry_count0, ответ удержан. При A→B отображается только запись B unknown/version0, её кнопка доступна, checkpoint A и его подписи отсутствуют; БД B неизменна. При возврате в A предупреждение неизвестного результата сохраняется. Освобождение позднего producer outcome не снимает checkpoint и не показывает устаревший успех/ошибку; reload и refresh сохраняют защиту. Явная проверка результата снимает её без нового POST. По одному retry в A на сценарий, B retry0, Telegram calls0, JS errors0,320px fit.
Поздний receipt просмотрен; поздняя ошибка сохранена. Навигация штатно abort-ит старый клиентский запрос; управляемая задержка producer не является физическим разрывом сети или доказательством доставки сообщения. Scheduler admission закрыт, dispatcher не запускался, внешний Telegram fetch дополнительно запрещён. AUTH_REQUIRED=false на изолированных процессах; реальные Portal login и чат не проверены.
Оба backend завершились exitCode0, cleanup подтвердил A retry2/B retry0 и sender0. Независимые SQL-запросы подтвердили ноль fixture-записей в обеих БД. Контейнеры, локальный Next3101 и туннели8018/8019 удалены. Новая БД B удалена после проверки точного имени, владельца mmapp и отсутствия соединений; PostgreSQL подтвердил отсутствие БД. Основной стенд и БД не менялись. Следующий12.5.48 — профильная доступность очереди/диалога на production frontend. Локальный коммит без push.
12.5.48 — доступность production очереди и диалога (2026-10-08)
Отчёт доступности: production frontendb55588f/backend8782054, отдельная PostgreSQL БД, browser HTTP-ответы не подменялись. Axe4.11.3 с WCAG2A/AA,2.1A/AA,2.2AA tags: тёмная/светлая темы ×1280/320px, по четыре области/состояния — очередь, диалог без согласия, диалог с согласием, очередь при ошибке GET. Все16 scoped audits: violations0/incomplete0, passed rules14 для очереди и16 для диалога.
Клавиатура открывает диалог через Enter, Space переключает подтверждение риска и доступность submit. По шесть Tab/Shift+Tab проверок в каждом сочетании подтверждают завершённый перенос фокуса внутри modal; Escape закрывает и возвращает фокус trigger. Асинхронные состояния имеют role=status, ошибка GET — role=alert; после восстановления ошибка исчезает. Панель/диалог помещаются в320px. Светлая тема и тёмная тема сохранены и просмотрены.
Уточнены ожидания harness: сначала готовность доступной кнопки после основной загрузки, затем завершение CSS-анимации перед контрастным аудитом и завершение переноса фокуса через Base UI focus guards. Первый аудит поймал промежуточную прозрачность входной анимации; после её завершения контраст прошёл без изменения продукта. Это аудит устойчивых состояний, не проверка всех кадров перехода. HTTP500 создан управляемым backend overview exception; физический отказ БД не моделировался. Реальная screen reader сессия не проводилась, scoped axe/клавиатура не означают полную WCAG сертификацию приложения.
Retry POST0, Telegram calls0, JS errors0, SQL fixture counts сохранялись во всех сценариях. Dispatcher не запускался, scheduler admission закрыт. Временные контейнеры/сеть/туннель3018 удалены, backend exitCode0, отдельный SQL подтвердил ноль fixture-строк. Основной стенд и данные не менялись. Следующий12.5.49 — сводка Q-матрицы и точные оставшиеся условия реальной внешней приёмки. Локальный коммит без push.
12.5.49 — сводка очереди и оставшихся внешних условий (2026-10-08)
Сверены сохранённые JSON evidence блоков35–48: отчёты читаются, дата2026-10-08 и backend8782054 согласованы; актуальные browser отчёты используют frontendb55588f. Это сводка уже выполненных проверок, новых отправок или сетевых изменений нет.
| ID | Подтверждённый результат | Что остаётся за пределами проверки |
|---|---|---|
| Q-1 | Два production claim на PG дают один вызов перехваченного отправителя и одну историю: 37 | Несколько процессов/экземпляров, настоящая Telegram доставка |
| Q-2 | Реальный SQL отказ истории откатывает settlement; ошибка подтверждения после COMMIT не перезаписывает sent: 38 | Принятый ответ настоящего Telegram API, независимая проверка тестового чата |
| Q-3 | Неопределённый sender response удерживает unknown/processing без auto retry; browser checkpoint переживает HTTP500/reload: 39, 45 | Физический timeout/disconnect после возможной реальной отправки и сверка с чатом |
| Q-4 | Конкурентные retry дают200/409 и одно увеличение версии; старый повтор не меняет БД: 36, 46 | Queue receipt не означает доставку |
| Q-5 | Processing отвергается, обязательное подтверждение риска и блокировка неизвестного исхода работают: 36, 45 | Операционная процедура остановки всех реальных senders, включая несколько экземпляров, перед осознанным повтором |
| Q-6 | Два конкурентных enqueue создают одну строку, повтор возвращаетfalse: 35 | Не отдельное доказательство Telegram delivery |
| Q-7 | Malformed receipt откатывает реальную транзакцию; JWT/read/write защищают API и UI; ABA source isolation сохраняет checkpoint: 36.1, 46, 47 | Настоящий Portal login; source switching проверен в поддерживаемой local-конфигурации, production закреплён same-origin |
| UX/a11y | Dark/light1280/320,16 scoped axe audits, keyboard/focus/error states: 48 | Ручная screen reader приёмка и полная WCAG оценка приложения |
Готовность Telegram: штатный GET alerts на основном тестовом стенде, сохранены только признаки tokenConfigured=false/chatConfigured=false/threadConfigured=false. Токен, chat ID и исходный ответ не сохранялись. Telegram пока не настроен; real-message сценарии не могут быть приняты по подменённым ответам. Для этой ветки нужен отдельный тестовый бот/чат в приложении и явное разрешение на одно конкретное тестовое сообщение; до этого внешние сообщения не отправлять.
Этап12.5 остаётся открытым. Проверенные группы не заменяют остальные PG/ROS/Portal/интеграционные сценарии протокола. Следующий12.5.50 — read-only инвентаризация двух CHR для определения доступных VPN/маршрутизации/диагностики и подготовки оставшихся сетевых проверок; конфигурацию устройств этим шагом не менять. План/паспорт/протокол синхронизированы. Локальный коммит без push.
12.5.50 — инвентаризация двух CHR без изменения конфигурации (2026-10-08)
Отчёт CHR: штатный MikrotikClient из backend8782054, соединения из существующих записей основной тестовой БД, только enabled устройства194.226.121.150/id1 и104.165.244.7/id2. Использованы исключительно GET; post/put/patch/delete в тестовом процессе дополнительно запрещены. Не запускались Ping/bandwidth, scheduler или buildApp. Сырые VPN ответы, ключи и пароли оставались в памяти и не сохранялись/не выводились.
Оба устройства отвечают, RouterOS7.24.5 stable, CHR; оба имеют appType home-router. На каждом прочитаны19 разделов и повторно сверены выбранные конфигурационные поля; вместе с resource78 GET. Все разделы доступны, selectedConfigurationUnchanged=true. Сверка ограничена перечисленными в harness полями, не является полным export или доказательством отсутствия любых внешних изменений.
| Раздел | CHR1 / CHR2 | Следствие для приёмки |
|---|---|---|
| Интерфейсы | 2/2: ether и loopback | Нет VPN-интерфейсов для действий над существующим туннелем |
| IPv4 адреса / маршруты | 1/2 адреса,4/5 маршрутов | Существующая адресация и маршруты сохранены; connectivity этим GET не доказана |
| WireGuard / peers, GRE, VXLAN | 0/0 в каждом разделе | Можно проверить истинное пустое состояние; ROS6 lifecycle/connectivity требует отдельного тестового объекта |
| IPsec | Peers0,active-peers0; на каждом1policy/template | Стандартный template не считать действующим VPN |
| BGP connections/sessions | 0/0 | Для реального сценария нужны тестовый peer и сессия |
| OSPF instances/templates/neighbors | 0/0 | Preview/apply/factual cost в ROS5 пока проверить не на чем |
| IPv4 Firewall filter/NAT/mangle, routing filters | 0/0 | Пустая конфигурация подтверждена; IPv6 и реальные изменения правил не приняты |
| Роли приложения | home-router/home-router | Home→JH и JH↔Exit в ROS4 не подтверждены текущей парой ролей |
Контроль основной БД до/после совпадает: servers2, speedHistory9, retention14. Дополнительный SELECT подтвердил роли home-router. Эфемерный контейнер завершён/удалён, pool закрыт; остались только три основные Compose-службы. Пароли, адресация и правила устройств не менялись. Эта инвентаризация не закрывает ROS4/5/6 или остальные внешние ограничения.
Следующий12.5.51 — проверить реальные пустые состояния, выбор устройства/URL-контекст и доступность форм сетевых экранов на production frontend, без изменения RouterOS. После этого конкретный план создания изолированных тестовых объектов должен сохранять административный доступ и существующую конфигурацию. План/паспорт/протокол синхронизированы; локальный коммит без push.
12.5.51 — реальная GRE пара, связность и lifecycle (2026-10-08)
По прямому поручению пользователя VPN-приёмка продолжается с созданием реальных тестовых туннелей, особенно GRE. Lifecycle: production backend8782054, два CHR7.24.5, собственные имена mm-acceptance-gre-* и комментарий владения. Перед записью проверены локальные внешние адреса и отсутствие пересечения198.18.255.248/30 с существующей адресацией/недефолтными маршрутами. POST application API создал обе GRE стороны и /ip/address:201/201. Внешние endpoints194.226.121.150 ↔104.165.244.7, внутренние198.18.255.249/30 ↔198.18.255.250/30, MTU1400,keepalive2s/3. Дополнительных static/default routes и Firewall правил не создавалось.
После running=true независимый RouterOS Ping через указанный GRE интерфейс:3/3 в каждом направлении,0%loss,~54ms. Это реальная point-to-point связность, не benchmark и не шифрованный IPsec. PATCH MTU первого конца1360, disable и enable дали200 и подтверждены отдельным чтением RouterOS. Browser: настоящие созданные объекты, формы обоих устройств, local IP и server/tunnel URL-контекст/reload/320px, JS errors0; browser проход читает/отменяет формы, создание/изменение выполнял production API. ФормаCHR1 просмотрена, CHR2 сохранена.
Первый запуск Ping до готовности получил timeout; повтор после running подтвердил3/3. Первый harness остановил свою очистку на слишком строгом сравнении baseline, включавшем runtime IDs; причина конкретного несовпадения не была сохранена полностью. Независимая очистка удалила оставшуюся собственную сторону и подтвердила отсутствие интерфейсов/IP/connected route, исходные количества0GRE/1–2addresses/4–5routes. Harness исправлен: сначала очистить обе стороны, сравнивать конфигурационные поля без runtime IDs, сохранить evidence до assertion. Повторный полный lifecycle прошёл с exitCode0: DELETE200/200, все выбранные поля GRE/IP/route/IPv4 Firewall совпали с baseline. Прямое административное восстановление чужих объектов не выполнялось.
Обнаружен настоящий дефект: принятый remoteInnerIp возвращается пустым, затем теряется в форме редактирования. Связность обеспечивается настройкой обоих реальных /ip/address, но сохранение формы этим не считается исправленным. Следующий12.5.52 — исправить metadata persistence/restore peer IP и профильные тесты, затем развернуть и повторить настоящий GRE цикл. Ограничения ROS6 для остальных VPN/прав/частичных отказов остаются. Control main2servers/9speed/retention14 сохранён; application GRE revisions намеренно остаются журналом выполненных действий. Временный контейнер/туннель8018 удалены; RouterOS тестовые объекты очищены. Локальный коммит без push.
Официальная схема пары и keepalive: MikroTik GRE. Документация текущей версии проверена, реальные команды/ответы — RouterOS7.24.5.
12.5.52 — сохранение удалённого внутреннего IP GRE (2026-10-08)
Исправлен дефект, обнаруженный на настоящей GRE паре в12.5.51. Новый backend services/gre-comment.ts хранит remoteInnerIp в версионированном base64url JSON suffix комментария RouterOS. Это метаданные приложения, не маршруты и не /ip/address на удалённом устройстве. greInterfaceBody сохраняет peer, mapGreLive возвращает его и чистый пользовательский комментарий; snapshot содержит peer и исходный raw comment для корректного restore. PATCH без remoteInnerIp сохраняет текущий peer; явная пустая строка очищает. Форма теперь передаёт пустую строку при очистке вместо пропуска поля.
Старые gateway/network комментарии читаются и сохраняются при restore; непонятный/повреждённый suffix остаётся обычным пользовательским текстом. Явная очистка legacy peer записывает пустое metadata значение, чтобы прежняя подсказка комментария не возвращала удалённое поле. Метаданные не создают сетевые маршруты и не содержат PSK/паролей; GRE/IPsec secret logic не менялась. Raw metadata видна в прямом RouterOS comment, в API/UI служебный suffix отделён от пользовательского текста.
gre-comment.test.ts проверил create plan→native comment→map→snapshot→restore, Unicode/несколько строк, idempotence, legacy, invalid suffix и explicit clear; планы ограничены GRE/IP, без /ip/route. Прежний entity-snapshots.test.ts passed. Playwright gre-form+gre-toggle5/5: создание/DTO/edit, сохранённый ввод при отказе и неверном receipt, explicit empty remoteInnerIp, подтверждение переключения. Browser ответы локальных проверок подменены; новое metadata на реальном RouterOS этим блоком не принято. Backend tsc --noEmit и scoped frontend typecheck passed. Eslint без ошибок, одно прежнее unused bool предупреждение в entity-snapshots.ts:258; дифф не меняет этот helper.
Код и тесты готовы к сборке; удалённый runtime пока backend8782054/frontendb55588f, реальные GRE объекты из51 удалены. Следующий12.5.53 — production Docker build/deploy backend и frontend, новая собственная GRE пара с независимой проверкой peer read/MTU-toggle/clear/restore, реальный UI и двусторонний Ping, очистка по имени и decoded ownership comment. Пользовательское требование реальных VPN объектов сохраняется. Локальный коммит без push.
12.5.53 — развёртывание peer metadata и реальный GRE regression (2026-10-08)
Развёртывание: backend и frontend из bd3f996f55, чистый Git archive SHA256 c154aa8c706d083a791ed04f26bad433cb1ab9a5d9a6c6ec08b5751d7977d46f совпал после передачи. Docker staging повторяет main workflow; обе сборки exit0, Next production compile/full TypeScript passed. Backend imageId sha256:6bb78eaeb922de577d399633ed6fcc821a47ae8abbb947ce6971bb453bfcf6d8, frontend sha256:1f22f4a2900b13bb5b1202e4a98a4c679b57d6453599318b52cbc988a63cc4053. Только две image tag переменные .env обновлены, compose validation/health passed, version1.0.0-test.bd3f996. Прежние образы сохранены. Приватный PG backup1433491bytes/PGDMP/pg_restore --list passed остаётся только на сервере; дамп и секреты в Git не передавались. Push не выполнялся.
Настоящий GRE lifecycle: новая собственная пара на двух CHR, предварительно GRE разделы пусты и подсеть198.18.255.248/30 свободна. POST201/201 вернули запрошенный peer IP и чистый пользовательский комментарий. Независимое чтение native comment подтвердило metadata, MTU1360 и disable/enable сохранили peer; explicit clear и restore собственной первой apply-ревизии подтвердились. Snapshot проверен по имени, одному объекту и peer до restore, текущий GRE state ограничен собственным fixture. Двусторонний Ping после running:true —3/3,0%loss,~54ms. Это plain GRE/point-to-point ICMP, не IPsec или throughput benchmark.
Browser regression: production frontend/API без HTTP mocks, peer и local IP в формах обоих устройств, comment без служебного suffix, server/tunnel URL и reload сохранены,320px fits. НаCHR1 очистка и повторное сохранение peer через форму дали PATCH200/200, результат перечитан непосредственно с RouterOS. JS errors0. CHR1 просмотрен, CHR2 сохранён. Smoke: dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0.
Первые browser попытки остановились на меню, которое исчезало при перерисовке. Таймер первой пары удалил собственные объекты. Немедленная сверка /ip/route дала mismatch; финальный harness добавил ограниченное ожидание сходимости маршрутов, не меняя их вручную. Итоговый запуск exit0: DELETE200/200, все выбранные поля GRE/IP/routes/IPv4 Firewall совпали с baseline; CHR1 потребовал одно повторное чтение через250ms, CHR2 совпал сразу. Тестовое меню в успешном проходе пришлось открыть повторно1раз: это не исправленный UX, а отдельная выявленная недоработка для54. Проверка не является доказательством неизменности всех runtime параметров/полного export.
Own GRE интерфейсы, адреса и connected route удалены; эфемерный контейнер и туннель8018 закрыты, остались три основные Compose-службы. Main controls до/после: servers2/speedHistory9/retention14/migrations9 совпадают; GRE audit revisions намеренно сохранены. Следующий12.5.54 — сохранить устойчивость меню действий GRE при перерисовке и проверить профильный сценарий; затем продолжать настоящие VPN объекты. Права, частичные отказы остальных VPN, Portal/Telegram и прочие внешние ограничения остаются открытыми. Локальный коммит без push.
12.5.54 — устойчивость меню GRE при обновлении таблицы (2026-10-08)
При обновлении callbacks/прав пересоздавался inline renderer actions column; React монтировал ячейку заново и закрывал Base UI меню. В components/data-grids/gre-tunnels-data-grid.tsx вынесен стабильный GreActionsCell, текущие callbacks/permissions передаются через типизированный React context. ReUI composition, оформление, API таблицы и ключ строки serverId/id сохранены. Политика блокировки операций при загрузке и отсутствии доступа сохранена.
Проверки: новый tests/e2e/gre-menu-refresh.spec.ts открывает меню, запускает GET без outside pointer event, проверяет сохранение меню, disabled во время загрузки, восстановление enabled и свежий peer IP в форме. На прежнем HEAD тест падает именно из-за исчезнувшего menuitem; исправленный код проходит. Вместе с gre-toggle.spec.ts — 3/3 passed. Scoped TypeScript (tmp/tsconfig-speed-check.json) и ESLint изменённых файлов passed. Первую фикстуру скорректировали: инициализация источника допускает несколько GET, задержка включается только при проверяемом refresh. ReUI data-grid checklist проверен, общие компоненты не менялись.
Это локальное исправление. На тестовом сервере backend/frontend bd3f996; live CHR сценарий стабильности меню пока не проверен. Следующий12.5.55 — собрать и развернуть frontend, создать собственную реальную GRE пару, проверить меню при обновлении и форму, затем удалить только собственные интерфейсы/IP и проверить baseline. Реальные VPN объекты обязательны по указанию пользователя. Telegram/Portal/multi-instance и остальные внешние ограничения остаются открытыми. Локальный коммит без push.
12.5.55 — развёртывание устойчивого меню и повторная реальная GRE проверка (2026-10-08)
Развёртывание: frontend731803bade672e4e5bd58ffbc223563f3318d4a9/version1.0.0-test.731803b. Архив Git SHA256 b6ff604a03e65151b4f2fc1406885b97f40240646f651a371fd603c00e1e867b совпал после передачи. Staging предыдущей main-совместимой сборки обновлён единственным изменённым production input — gre-tunnels-data-grid.tsx; package-lock/Dockerfile совпали. Docker build exit0, Next production compile/full TypeScript passed. Обновлена только MMAPP_IMAGE_TAG, compose validation passed; перезапущен только frontend, прежний образ оставлен для rollback. Backendbd3f996 не менялся и healthy. Контрольные значения БД до/после: servers2/speedHistory9/retention14/migrations9 совпали. Push не выполнялся.
GRE native lifecycle: собственная новая пара mm-acceptance-gre-1791468767519, подсеть198.18.255.248/30 проверена на пересечение, оба GRE раздела исходно пусты. POST201/201, native peer metadata, snapshot/restore, MTU/disable/enable/clear подтверждены; Ping3/3 в обе стороны,0%loss. Production browser: никаких HTTP mocks, на каждом CHR меню открыто один раз и пережило live GET200 при1280 и320px; menuReopens0. Форма совпала с native local/remote inner IP и чистым пользовательским comment; URL/reload сохранён, JS/API errors0. Toolbar refresh вызван без outside pointer event: обычный клик вне меню должен его закрывать. Controlled pending permissions проверены локально в54, здесь подтверждено реальное обновление данных.
CHR1 mobile визуально просмотрен, CHR2 сохранён. Первое измерение ширины произошло во время анимации Sheet и остановило browser harness; повторный проход с ожиданием сходимости layout прошёл, продуктовый код не менялся. Выявлена отдельная UX-недоработка: два внутренних IP поля слишком узкие для чтения полной записи при320px. Это следующий56, а не заявленный исправленный результат55.
DELETE200/200, own интерфейсы/IP и connected routes удалены; выбранные GRE/IP/routes/IPv4 Firewall поля совпали с baseline (CHR1 — одно повторное чтение маршрутов через250ms). Эфемерный контейнер удалён, работают только три основные Compose-службы. GRE revisions намеренно остались как история операций. Smoke: dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0. Это plain GRE и point-to-point ICMP, не IPsec/throughput/остальные VPN. Telegram/Portal/multi-instance и другие внешние ограничения остаются открытыми. Следующий12.5.56 — мобильная форма GRE; пользовательское правило создавать и очищать реальные VPN объекты сохраняется. Локальный коммит без push.
12.5.56 — читаемые внутренние IP в мобильной форме GRE (2026-10-08)
В app/(main)/gre/page.tsx адаптирована только сетка существующих полей: grid-cols-1 gap-3 sm:grid-cols-2. До640px локальный и удалённый IP идут друг под другом; начиная соsm — рядом. Input/Sheet, подписи, значения и API сохранения не менялись, общие ReUI primitives и оформление сохранены. Доступные249px на320px позволяют показать полный255.255.255.254/32 (измеренная ширина текста≈173px); в двух колонках на640px доступно204px.
Локальная визуальная проверка через временный Playwright harness: светлая тема, тёмная тема. Два прохода/шесть комбинаций320/640/1280px passed: расположение полей, полный IPv4/CIDR в текущем шрифте, Tab локальный→удалённый, сохранение значения, доступность footer и отсутствие page overflow. Светлый320px и тёмный320px просмотрены. API в этих проверках подменён; это доказательство локального layout, а не внешняя CHR приёмка. Первые настройки временного harness исправлены: cwd для Next и фактический ключ темы rl-theme; продуктовых ошибок это не выявило.
Итоговая профильная регрессия gre-form.spec.ts + gre-menu-refresh.spec.ts —4/4 passed: create/DTO/edit, API ошибки и неподтверждённые ответы, сохранение ввода, защита от повторной отправки, открытое меню после refresh. Scoped TypeScript (tmp/tsconfig-speed-check.json), ESLint изменённого page и ReUI checklist passed. Общая регрессия не повторялась для одной адаптивной сетки.
Изменение локальное, удалённый runtime backendbd3f996/frontend731803b не менялся. Следующий12.5.57 — frontend production Docker build/deploy и мобильная форма на новой собственной реальной GRE паре/API/RouterOS, затем очистка и baseline. Пользовательское требование настоящих VPN объектов сохраняется. Telegram/Portal/multi-instance и остальные внешние ограничения остаются открытыми. Локальный коммит без push.
12.5.57 — развёртывание мобильной формы и реальная GRE приёмка (2026-10-08)
Развёртывание: frontendfd521f6ef892ff3f7e8bc25878d80fb13817dda8/version1.0.0-test.fd521f6, backendbd3f996 healthy. Архив Git SHA2563187feed4f9346045ccf5d878b2965093b4b115f305d1da183523d1b7988204a совпал после передачи. В main-совместимом staging предыдущей сборки обновлён единственный изменённый production input — app/(main)/gre/page.tsx; package-lock и Dockerfile совпали. Docker build exit0/production TypeScript passed. Изменена только MMAPP_IMAGE_TAG, compose validation passed; перезапущен только frontend, предыдущий731803b образ сохранён для rollback. Контрольные значения БД до/после: servers2/speedHistory9/retention14/migrations9 совпали. Push не выполнялся.
GRE lifecycle: новая собственная пара mm-acceptance-gre-1791469984747, исходные GRE разделы пусты,198.18.255.248/30 не пересекается с недефолтными маршрутами/адресами. POST201/201, native peer metadata, MTU/disable/enable/clear и snapshot restore подтверждены; Ping3/3 в обе стороны,0%loss. Это plain GRE и ICMP, не IPsec/throughput.
Production browser: оба CHR × две темы ×320/640/1280px —12 комбинаций без HTTP mocks. Native local/remote inner IP читаются полностью; на320px одна колонка, на640/1280 две; Tab local→remote и отсутствие page overflow подтверждены. Меню сохраняется после live GET200 при1280/320px, повторных открытий0. В тёмной теме формы обоих CHR сохранены с неизменёнными значениями: PATCH200/200, независимое native чтение подтвердило адреса, peer IP и comment. Светлая тема проверена без записи. Server URL context/reload сохранён. JS/API errors0. Browser refresh вызывается без outside pointer event; локальная проверка pending/прав остаётся доказательством54.
Скриншоты320px: CHR1 dark, CHR1 light, CHR2 dark, CHR2 light. CHR1 dark и CHR2 light визуально просмотрены: внутренние IP целиком видны. Smoke: dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0.
DELETE200/200, собственные GRE/IP/connected routes удалены; выбранные GRE/IP/routes/IPv4 Firewall поля совпали с baseline, CHR1 — одно повторное чтение маршрутов через250ms. Эфемерный контейнер удалён; остались три основные Compose-службы. GRE revisions намеренно сохранены как история операций. Следующий12.5.58 — реальная собственная WireGuard пара, API/native/UI, handshake/связность, очистка и baseline; private/preshared keys не включать в публичные отчёты. Требование пользователя о настоящих VPN объектах сохраняется. Telegram/Portal/multi-instance и другие внешние ограничения остаются открытыми. Локальный коммит без push.
12.5.58 — настоящая WireGuard пара, handshake и UI (2026-10-08)
Итоговый реальный lifecycle: собственная пара mm-acceptance-wg-1791470702451 на двух CHR, UDP51879 и198.18.255.240/30 проверены на коллизии/пересечения. POST interfaces201/201 создали интерфейсы и IP; native чтение подтвердило автоматические ключи и адреса, POST peers201/201 — связь с публичным ключом другого устройства. Ключи проверялись в памяти и не записывались в публичные артефакты. Allowed адреса ограничены IP другого конца /32, persistent keepalive5s. Default routes/Firewall не менялись. Параметры и смысл last-handshake сверены с официальной документацией MikroTik.
На обоих peers появился native handshake и RX>0; двусторонний Ping3/3,0%loss, около54–56ms. PATCH MTU1380 и возврат1420 подтверждены native чтением. Каталог приложения совпал с адресами/peers/handshake и не содержал privateKey по умолчанию. Это короткая проверка защищённой WireGuard связности; throughput, RBAC, interrupted mutation, экспорт и import не проверены.
Production browser: два CHR × две темы,1280/320px без HTTP mocks. В деталях видны own peer name, Allowed IPs, endpoint, handshake и известные RX/TX; server/interface URL и вкладка peers пережили reload, page overflow отсутствует. На320px длинные имя и CIDR переносятся; исходная таблица сохраняет собственный горизонтальный scroll. Создание/изменение/удаление через UI не проверялись. JS/API errors0. Скриншоты: CHR1 dark, CHR1 light, CHR2 dark, CHR2 light; итоговыйCHR2 light просмотрен. Первый browser locator одновременно находил sr-only и родительскую подпись handshake, уточнение локатора дало успешный проход без изменения продукта.
Первый проход подтвердил связность/UI, но cleanup harness получил DELETE400: Content-Type application/json был передан без тела. Это ошибка harness, не доказательство ошибки приложения. Восстановительная очистка через правильные DELETE проверила ownership comment/name и отсутствие own interfaces/peers/IP/routes. Baseline первого прохода был только в памяти и после выхода потерян; точная сверка первого baseline не заявляется. Harness исправлен, создана новая пара и повторён полный lifecycle/browser; итоговый exit0 и все выбранные baseline поля совпали.
В финальном cleanup собственные peers удалены API200/200, собственные IP явно удалены native API до удаления interfaces API200/200. Автоматическая очистка IP/peers при обычном удалении интерфейса НЕ проверена и остаётся следующим12.5.59. WireGuard/IP/routes/IPv4 Firewall выбранные настройки совпали с baseline; эфемерный контейнер удалён, работают только три основные Compose-службы. DB controls до/после servers2/speedHistory9/retention14/migrations9 совпали, backend healthy. WG revisions намеренно сохранены как история операций. Runtime backendbd3f996/frontendfd521f6 не менялся. Telegram/Portal/multi-instance и остальные внешние ограничения остаются открытыми. Локальный коммит без push.
12.5.59 — удаление WireGuard оставляло peer и IP; локальное исправление (2026-10-08)
Production UI: собственная новая пара mm-acceptance-wg-1791471219775, подтверждённые handshake/двусторонний Ping. Интерфейсы удалены через стандартные меню и AlertDialog приложения на обоих CHR (ПК/320px). DELETE200/200 закрыли диалоги, но независимое native чтение обнаружило на каждом устройстве оставшийся peer и собственный IPv4 адрес. Это подтверждённая ошибка backendbd3f996: route удалял только /interface/wireguard/id, RouterOS сохранил связанные записи.
Native проверка и восстановительная очистка: afterBrowserDelete содержит interface:null, peerCount1 и собственный адрес на каждом CHR. Harness сохранил исходные идентификаторы own peers/IP и удалил только эти остатки, даже после исчезновения интерфейса. Финальный exit0, выбранные WG/peers/IP/routes/IPv4 Firewall поля совпали с baseline; ephemeral контейнер удалён, остались три основные службы. Это очистка теста, а не успешная приёмка стандартного удаления. Ключи не включены в публичные отчёты; WG revisions намеренно сохранены.
Локально добавлен backend/src/services/wireguard-delete.ts и подключён к DELETE route: идентификация интерфейса по rosId, чтение peers и IPv4 адресов до первой записи, отбор только связанных с именем/rosId объектов, удаление peers→addresses→interface, независимое перечитывание и ошибка при оставшихся объектах. При read failure запись не начинается; при промежуточной ошибке дальнейшее удаление прекращается, ошибка возвращается вместо ok. Успех и apply revision происходят только после проверки отсутствия объектов. Это последовательные RouterOS операции, не транзакция: частичный сбой может оставить частично удалённые данные, потребуется повтор/обновление. Текст подтверждения в WireGuard page теперь указывает связанные пиры и IP-адреса.
Проверки backend/src/services/wireguard-delete.test.ts —9/9: чужие объекты сохранены, связи по имени/rosId, encoded ID, ошибки всех предварительных чтений, неизвестный интерфейс, частичная ошибка/повтор, неподтверждённое удаление каждой группы. Profile UI tests wireguard-links.spec.ts --grep deletion/удал —2/2: подтверждение удаления интерфейса/пира, запрет повторного нажатия и повтор после API ошибки. Backend TypeScript, scoped frontend TypeScript (tmp/tsconfig-speed-check.json), ESLint изменённых файлов и ReUI checklist passed. Примитивы/таблицы не менялись.
Исправление пока локальное: удалённый backendbd3f996/frontendfd521f6 остаётся прежним. Следующий12.5.60 — production Docker build/deploy обеих частей, новая собственная WireGuard пара и обычное UI/API удаление без предварительного удаления peer/IP, независимая проверка отсутствия остатков и baseline, очистка fallback только own объектов. IPv6 address lifecycle, concurrency/multi-instance, Telegram/Portal и другие внешние ограничения не проверены. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push.
12.5.60 — развёртывание и реальное полное удаление WireGuard (2026-10-08)
Развёртывание: backend/frontend3722fad329a68a8721ebfda8e044ab6cb5830cca/version1.0.0-test.3722fad. Чистый Git archive SHA256ec8084a0acbd0f26886a4c54072b65943d835b42a6a314c28e58b1b2bed791c6 совпал после передачи. Main-совместимые staging contexts предыдущих сборок обновлены только изменившимися production inputs: WireGuard route/service backend и frontend page. Docker builds exit0, backend/full Next TypeScript passed. Только BACKEND_IMAGE_TAG и MMAPP_IMAGE_TAG обновлены, compose validation passed, перезапущены backend/frontend. Прежние backendbd3f996/frontendfd521f6 образы оставлены для rollback. Приватный pre-3722fad PG backup1771860bytes/0600 с проверкой pg_restore --list остаётся только на сервере; дамп и ключи не передавались. DB controls до/после servers2/speedHistory9/retention14/migrations9 совпали, backend healthy, версия API подтверждена. Push не выполнялся.
Настоящая пара и native проверка: новый own fixture mm-acceptance-wg-1791472117395, свободные UDP51879 и198.18.255.240/30. Создание interfaces/peers API201, native key association, handshake/RX, короткий двусторонний Ping3/3 и MTU подтверждены до удаления. Пиры и адреса оставались прикреплены к интерфейсам до действий пользователя в тесте; предварительного удаления peers/IP harness не делал.
Production UI delete: собственные интерфейсы удалены через стандартное меню и подтверждение на обоих CHR (ПК/320px), текст указывает связанные пиры и IP-адреса. DELETE200/200 закрыли диалоги; независимое native чтение сразу после каждого ответа показало interface:null, peers0, addresses[]. Проверка выполнена ДО finish/fallback cleanup. Это подтверждает исправление59 на живом RouterOS, а не маскирующую очистку harness. JS errors0; HTTP mocks отсутствуют.
Итоговый harness exit0: afterBrowserDelete пуст на обеих сторонах, выбранные WG/peers/IP/routes/IPv4 Firewall поля совпали с baseline. Fallback не понадобился для peers/IP/interfaces; ephemeral контейнер удалён, остались три основные Compose-службы. WireGuard revisions намеренно сохранены как история операций. Smoke: dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0.
Приняты успешное обычное удаление own интерфейса с IPv4 адресом и пиром и соответствующий UI результат. Partial failures/read errors/сохранение чужих WG объектов проверены локальными тестами59; на этом стенде такие отказы не инжектировались. IPv6 lifecycle, concurrency/multi-instance, throughput, Telegram/Portal и остальные внешние ограничения остаются открытыми. Следующий12.5.61 — реальные WireGuard действия через UI: создание интерфейса и пира, переключение и очистка собственной пары; ключи не публиковать. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push.
12.5.61 — UI создание WireGuard и локальное исправление нестабильного меню (2026-10-08)
Первый native observer: собственная пара mm-acceptance-wg-ui-1791472667527, свободные UDP51879/198.18.255.240/30, интерфейсы и пиры созданы только через production формы приложения. Observer не создавал конфигурацию. Оба интерфейса/IP/native key generation и поля peers/endpoint/allowed/keepalive/comment подтвердились, native peer key association и первый двусторонний Ping3/3 прошли. Публичные ключи переданы в форму в памяти, ключи не включены в отчёты. Создание интерфейса наCHR1 выполнено наПК, наCHR2 при320px. Мобильная форма сохранена без ключей и визуально просмотрена; этот снимок второй попытки, не доказательство переключения.
Полный сценарий НЕ завершён: первая попытка не получила PATCH переключения; вторая, mm-acceptance-wg-ui-1791472879650, после создания интерфейсов остановилась на Добавить пира. Playwright зафиксировал unstable→detached DOM menuitem при перерисовке. Callback props пересоздавали columns/inline actions cell, React сбрасывал Base UI menu. Временные browser harness имеют эти ограничения; успешный финальный browser report не создавался и не заявляется.
Локально components/data-grids/wireguard-data-grid.tsx адаптирован по уже принятому GRE образцу: стабильный WireguardActionsCell и типизированный context передают свежие onExport/onAddPeer/onToggle/onDelete/toggleBusy. Данные строки остаются текущими; composition, styles, row key и installed ReUI APIs сохранены. Tests/e2e/wireguard-menu-refresh.spec.ts воспроизвёл исчезнувшее меню на прежнем коде; после исправления меню переживает pending refresh, показывает новое enabled state и вызывает PATCH с актуальным disabled=false. Вместе с wireguard-tables.spec.ts —6/6 passed. ESLint и scoped TypeScript passed. Первый TypeScript запуск совпал с генерацией .next/dev/types и получил временные syntax errors; повтор после остановки Next прошёл. ReUI checklist проверен, общие primitives не менялись.
Первая пара очищена observer, выбранный baseline полностью совпал. Во второй попытке observer получил401 на завершающем native чтении до cleanup; причина не установлена, пароли не менялись. Повторное чтение через приложение успешно. Штатный API cleanup проверил точные name/ownership comment и удалил оба own интерфейса DELETE200/200. Независимая native проверка подтвердила отсутствие own WG/peers/IP/routes на обоих CHR, total IPv4 addresses1/2 и routes4/5; WG interfaces/peers0. Второй baseline был только в памяти и потерян при выходе observer: точное равенство его baseline не заявляется. DB controls servers2/speedHistory9/retention14/migrations9 совпали. Эфемерные контейнеры завершены, остались три основные службы, backend healthy. Audit revisions намеренно сохранены.
Runtime backend/frontend3722fad, локальное меню ещё не развёрнуто. Следующий12.5.62 — frontend Docker deploy и полный UI create interface/peer→disable/enable→повторный handshake/Ping→delete на новой реальной паре, без повторных открытий меню. Перед повтором observer должен сохранить приватный baseline на сервере и продолжать независимую cleanup каждого устройства при ошибке финального state read; запуск browser только после подтверждения готовности нового observer. Переключение, экспорт/import, throughput/RBAC и прочие внешние ограничения остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push.
12.5.62 — развёртывание стабильного меню и полный WireGuard UI lifecycle (2026-10-08)
Развёртывание: frontend6a46fb1e40291024202455460dfc233f05e9e5d5/version1.0.0-test.6a46fb1, backend3722fad не перезапускался и healthy. Git archive SHA2560c25ec8215b25446d2a9ad1555244af94afff32194d2a0768ee727b1ca810db8 совпал после передачи. Main-совместимый staging обновлён единственным изменённым production input — WireGuard data grid; package-lock и Dockerfile совпали. Docker build exit0, Next full TypeScript passed. Изменена только MMAPP_IMAGE_TAG, compose validation прошла, предыдущий frontend3722fad образ сохранён. Push не выполнялся.
Production UI: новый fixture mm-acceptance-wg-ui-1791473944233, оба CHR, ПК/320px, HTTP mocks отсутствуют. Интерфейсы/IP созданы формами UI: POST201/201; peer формы дали201/201. Native проверка подтвердила поля, автоматическую генерацию ключей и соответствие публичного ключа другого конца (ключи только в памяти). Отключение/включение каждого устройства через меню дало PATCH200×4; disabled совпал с RouterOS, peer и IP сохранились. UI DELETE200/200 полностью удалили interfaces/peers/IP; native отсутствие остатков проверено до finish/fallback. Каждое меню открывалось один раз, menuReopens0. JS/API errors0. Это завершает незаконченный сценарий61 на исправленном production frontend.
Native observer: два раунда handshake/Ping — до и после переключения, каждый3/3 на обоих CHR,0%loss,≈55ms. Существующая конфигурация/коллизии UDP51879 и198.18.255.240/30 проверены до UI создания. Observer сохранил приватный baseline на сервере с0600, повторное чтение401 ограничено тремя попытками и отражается в readRetries; ошибка финального state read теперь перехватывается перед независимой cleanup каждого устройства. В этом проходе retries0/final state errors0; failure ветки не инжектировались. Browser запускался только после READY и сверял name fixture с зафиксированным новым observer.
Итоговый observer exit0, afterBrowser пуст на обеих сторонах; selected WG/peers/IP/routes/IPv4 Firewall baseline совпал. Fallback удаления не понадобился; эфемерный контейнер удалён, остались три основные Compose-службы. DB controls до/после servers2/speedHistory9/retention14/migrations9 совпали, audit revisions намеренно сохранены. Приватный baseline с возможными ключами чужой конфигурации не скачивался и не коммитился. Smoke: dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0.
Мобильная форма создания просмотрена, без ключей. Выявлена отдельная UX-недоработка: WireGuard create/peer/import используют обычный w-full, который не переопределяет data-side width общего Sheet; мобильная панель фактически240px при320px, footer сжат. Следующий12.5.63 — точные responsive width overrides по существующему GRE образцу, проверка полной ширины/кнопок в обеих темах и профильные UI проверки. Export/import, throughput, IPv6, внешние failures/RBAC/multi-instance, Telegram/Portal и остальные интеграционные ограничения остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push.
12.5.63 — полная ширина мобильных WireGuard Sheets (2026-10-08)
В components/wireguard/wg-create-sheet.tsx, wg-peer-sheet.tsx и wg-import-sheet.tsx заменены только width utilities на data-[side=right]:w-full и data-[side=right]:sm:max-w-md/lg. Это существующий GRE образец: одинаковые data-side modifiers корректно переопределяют default ширину установленного Sheet. Создание/пир наsm имеют448px, импорт512px; доsm панели занимают полную ширину экрана. Содержимое форм, API, footer composition и общие primitives не менялись.
Светлая тема, тёмная тема: временный локальный Playwright visual harness, три панели ×320/640/1280px × две темы —18 комбинаций passed. Actual bounding width равна320/448/512px; все footer buttons находятся внутри панели, scrollWidth не превышает clientWidth, page overflow отсутствует. Tab идёт по ожидаемым полям, Escape закрывает панель. HTTP API подменён, реальные RouterOS операции в этой проверке не выполнялись.
Мобильные скриншоты: создание dark, создание light, пир dark, пир light, импорт light, импорт dark. Create dark/peer dark/import light визуально просмотрены: текст действий читается полностью, IP/endpoint имеют достаточную ширину; ключи в снимках не заполнялись.
Profile wireguard-links.spec.ts --grep импорт/создание сохраняет форму —5/5 passed: interface,interface DTO,peer, импорт без подтверждённого результата и pending/retry. Сохранение ввода, API ошибки/неподтверждённые ответы и ожидание результата сохранились. Scoped TypeScript выполнен после остановки Next, ESLint трёх изменённых компонентов и ReUI checklist passed. Полная регрессия не повторялась для трёх responsive class overrides.
Изменение локальное: удалённый runtime backend3722fad/frontend6a46fb1 healthy остаётся прежним. Следующий12.5.64 — frontend production Docker deploy и live мобильные create/peer/import панели на новой собственной WG паре; real UI lifecycle/связность и очистка, baseline. Просмотр импортной формы не будет заявляться как проверенный настоящий import. Import/export, throughput/IPv6/внешние failures/RBAC/multi-instance/Telegram/Portal и другие внешние ограничения открыты. Правило пользователя создавать настоящие VPN объекты сохраняется. Локальный коммит без push.
12.5.64 — развёртывание и live приёмка мобильных WireGuard панелей (2026-10-08)
Развёртывание: frontendbf43263e43ae375651237e019fe1aae55e848308/version1.0.0-test.bf43263, backend3722fad healthy и не перезапускался. Чистый Git archive SHA256c42edf2983262b62bcc427f7e2922f1c6bf56754abe3b583be73fd71712bd074 совпал после передачи. Main-совместимый staging обновлён только тремя изменёнными WireGuard Sheets; lockfile/Dockerfile совпали. Docker build exit0, full Next TypeScript passed. Изменена только MMAPP_IMAGE_TAG, compose validation прошла, предыдущий frontend6a46fb1 образ оставлен для rollback. Push не выполнялся.
Production UI и формы: собственная новая пара mm-acceptance-wg-ui-1791475047653, оба CHR × две темы × три панели(create/peer/import) ×1280/320px —24 live сочетания без HTTP mocks. Ширина320px на телефоне, create/peer448px и import512px наПК, footer buttons внутри панели и без обрезания, page overflow отсутствует, Escape закрывает каждую форму. Формы просматривались на реально созданной собственной WG паре; в визуальных снимках ключи не вводились. Импортная форма только открывалась и закрывалась: применение/preview импорта не проверены.
Основной UI lifecycle выполнен отдельно от просмотров форм: создание interfaces201/201 и peers201/201 через реальные формы, native поля/key generation/peer association подтверждены; disable/enable каждого CHR PATCH200×4 сохранили peers/IP; Ping3/3 на обоих устройствах до и после переключения. DELETE200/200 удалили interfaces/peers/IP до finish/fallback. MenuReopens0, JS/API errors0. Native observer: приватный baseline0600 на сервере, два Ping раунда passed, retries0, final state без own объектов, выбранный WG/peers/IP/routes/IPv4 Firewall baseline совпал. Эфемерный контейнер удалён; остались три основные службы. Audit revisions намеренно сохранены, DB controls до/после servers2/speedHistory9/retention14/migrations9 совпали.
СкриншотыCHR2/320px: create dark, create light, peer dark, peer light, import dark, import light. Create dark/import light визуально просмотрены: панель и footer занимают доступную ширину, текст действий виден целиком. Smoke: dashboard/servers/uptime/settings/filters/alerts200,320px fit, JS/API errors0.
Следующий12.5.65 — настоящий экспорт WireGuard без private keys на новой собственной паре: RSC/CONF, выбранный interface/peer и независимое сравнение параметров; ключи/конфиги с секретами в публичные отчёты не включать. Настоящий import roundtrip — отдельный блок. Throughput, IPv6, внешние failures/RBAC/multi-instance, Telegram/Portal и другие протоколы/интеграции остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push.
12.5.65 — экспорт WireGuard без приватных ключей и ошибка client endpoint (2026-10-08)
Реальный API export/native: новая собственная пара mm-acceptance-wg-1791475605238 на двух CHR, свободные UDP51879/198.18.255.240/30. До export подтверждены API creation/native peer key association/handshake/Ping. Для каждого устройства POST /api/wireguard/export запрошены rsc/conf/peer-conf с includePrivateKey:false и явным собственным peerId —6 ответов200. Содержимое разобрано и сверено в памяти, реальные native private keys и активные private-key/PrivateKey assignments не обнаружены. Конфиги, публичные/приватные ключи и содержимое export в отчёты/файлы не записывались.
RSC/CONF совпали с native address/listenPort/MTU и выбранным peer(public-key association,allowed address,endpoint,keepalive). Это конфигурационные снимки без приватного ключа, не заявленные готовые импортируемые туннели. Peer-conf подтвердил выбранный interface public key и peer selection, однако клиентская конфигурация не принята: endpoint равен адресу удалённого пира, а не экспортирующего устройства, client Address отсутствует без client metadata. В fixture A→B клиентский шаблон дляB использует keyA, но endpointB — разные стороны соединения. В официальной документации client-endpoint обозначает адрес/порт WireGuard устройства, к которому подключается клиент; клиентские metadata нужно отличать от серверного peer endpoint/allowed-address.
Кодовая причина подтверждена чтением backend WireGuard export route и frontend wg-export-sheet.tsx: fallback peer.clientEndpoint || peer.endpoint. API и локальный preview требуют согласованного исправления; отсутствие client Address/явных client маршрутов нельзя скрывать готовым конфигом. Следующий12.5.66 — корректный client endpoint/defaults, явные поля/состояние шаблона, сохранение client metadata overrides, профильная регрессия. Точное правило client routes/address определить из имеющихся metadata; не выводить клиентские маршруты автоматически из server allowed-address.
UI live export не запускался: его текущий handler запрашивает includePrivateKey:true дляRSC/CONF. Этот блок доказывает API false redaction и выбранные параметры, не безопасность всех UI/export режимов. Native/API snapshot GET, plaintext memory сравнения и отсутствие чувствительных полей в публичном JSON проверены. Product source не менялся, общая регрессия не запускалась для внешней read-only проверки.
Финальный fixture cleanup exit0, selected WG/peers/IP/routes/IPv4 Firewall baseline совпал. Own peers/IP явно удалялись harness перед интерфейсом; полное обычное UI удаление уже отдельно подтверждено в60/62/64. Эфемерный контейнер удалён, остались три основные службы, backend healthy. DB controls до/после servers2/speedHistory9/retention14/migrations9 совпали, audit revisions намеренно сохранены. Runtime backend3722fad/frontendbf43263 не менялся. Настоящий import roundtrip, export private-key modes/UI download, throughput/IPv6/RBAC/внешние failures/multi-instance/Telegram/Portal и остальные протоколы/интеграции остаются открытыми. Пользовательское правило настоящих VPN объектов сохраняется. Локальный коммит без push.
12.5.66 — правильный client endpoint и явный шаблон Peer .conf (2026-10-08)
Ошибка65 исправлена локально в backend и preview. Общий resolveWgClientEndpoint в packages/contracts/src/wireguard.ts приоритетно использует явный client-endpoint, добавляет listenPort для hostname/IPv4 без порта и brackets для IPv6; иначе берёт host/listenPort экспортирующего устройства. Неизвестный host/неподходящий формат оставляют Endpoint placeholder. Backend export route больше не использует peer.endpoint; frontend WgExportSheet получает host выбранного устройства из текущего каталога серверов и использует тот же resolver.
Server allowed-address не обозначает клиентские маршруты: API/preview больше не передают его в Peer .conf. Оба codec generatePeerClientConf сохраняют явно переданные client параметры, но без client Address/AllowedIPs/Endpoint выводят комментарии-подсказки вместо активных выдуманных значений; default0.0.0.0/0 не создаётся. PrivateKey клиента остаётся placeholder. Существующие client-address/client-dns/client-endpoint overrides сохраняются. UI сообщает, что Peer .conf — шаблон: заполнить собственный ключ/адрес/сети и проверить endpoint заNAT. Политика поддерживаемых client routes не расширена новыми RouterOS полями; ready client config без этих данных не обещается.
Схема после исправления: экспорт интерфейсаA для клиентаB → PublicKey интерфейсаA + Endpoint устройстваA:listenPort; Address клиентаB и его AllowedIPs задаются явно. Backend/frontend изменения согласованы через общий contracts helper, Zod wire format и HTTP response shape не менялись. Общие ReUI primitives не менялись; beforeCode — существующий slot CodeExportSheet.
Проверки 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 c16fc0c5b5. 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, browser evidence, deploy/DB controls. Четыре настоящих 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.68 — реальный .rsc roundtrip WireGuard через UI (2026-10-09)
Runtime backend/frontend c16fc0c не менялся. На обоих CHR создана собственная временная WG пара с уникальными name/comment,port51879,MTU1420 и198.18.255.241/30↔198.18.255.242/30. Исходный handshake/Ping3/3 подтверждены. POST export rsc с includePrivateKey=true получен только в памяти; исходные native keys и содержимое конфигураций не записывались в файлы, screenshots, traces или Git. Это собственные ключи тестовой пары, доступы серверов не менялись.
На обоих устройствах POST import dryRun=true вернул200; native интерфейс/пир/IP остались прежними. Затем обычный API DELETE удалил собственный исходный интерфейс и связанные объекты без остатков. Реальный UI импорт восстановил RSC на CHR1 при1280px и CHR2 при320px без HTTP mocks: server context изURL сохранился, локальный preview распознал собственное имя и одного пира, POST import dryRun=false вернул200 с applied.interfaceName и peersCreated=1, Sheet закрылся после подтверждения, интерфейс появился в таблице. Page errors/API errors/горизонтального page overflow нет.
Native проверка после UI восстановила name/comment,listen-port,MTU,один IPv4 address,одного peer,allowed-address,configured endpoint/port,keepalive и peer comment. Публичные ключи интерфейсов/пиров совпали с исходными. На CHR2 текстовая private-key запись после импорта отличается; нормализованные32байтные Curve25519 scalar совпали, а public identity сохранилась. Приёмка сравнивает эквивалентность scalar и public key, не обещает byte-for-byte неизменность raw encoding. Правило clamping проверено по официальному исходнику WireGuard: изменения затрагивают предусмотренные биты. После восстановления настоящий handshake и Ping3/3 в обе стороны passed.
Final native report, browser report, предыдущая диагностика raw-key, DB controls. Первый browser запуск не завершил import; следующая native проверка отклонила raw private-key equality наCHR2. Каждая попытка очищена с совпавшим baseline; диагностическая проверка не объявлена успешной. В окончательном запуске поэлементные native checks passed на обоих устройствах и fixture exit0. Readiness ожидание наблюдателя добавлено в тестовый harness, данные конфигов не выводились при ошибках.
Own interfaces/peers/IP/connected routes удалены; WG/peers/IP/routes/IPv4 filter/nat/mangle совпали с исходным baseline на обоих CHR. Остались три основные службы, backend healthy. Business DB controls совпадают с контрольной точкой67:servers2,speedHistory9,retentionDays14,migrations9; audit revisions намеренно сохранены. Публичные JSON проверены на отсутствие ключей/конфигураций/паролей. Общие ReUI компоненты и product source не менялись; общая регрессия не повторялась для внешней приёмки.
Граница результата: правильный RSC собственного туннеля, preview и успешное применение с независимой связностью. Импорт .conf не принят: exporter не сохраняет имя/комментарии, parser использует wg0 по умолчанию; incomplete Peer .conf template требует отдельной проверки до применения. Partial failure/rollback, повторный import/коллизии, private-key UI download,IPv6/throughput/RBAC/внешние failures/multi-instance/Telegram/Portal и остальные протоколы/интеграции остаются открытыми. Следующий12.5.69 — preflight/ошибки .conf и затем безопасный собственный roundtrip. Локальный коммит без push.
12.5.69 — preflight импорта WireGuard без выдуманных маршрутов (2026-10-09)
Обнаружено локально: parse/apply могли принять клиентский шаблон без PrivateKey и подставить0.0.0.0/0 вместо отсутствующих allowed-address. Добавлен backend/src/services/wireguard-import.ts; route использует его до dry-run, поиска сервера и любых RouterOS mutations. .conf должен содержать ровно одну Interface секцию и PrivateKey; каждый объявленный Peer должен иметь PublicKey и явные корректные AllowedIPs. Проверяются32байтные base64 ключи, IPv4/IPv6 CIDR, порты, положительный MTU и неотрицательный keepalive. Неподдерживаемые несколько Address и PresharedKey отклоняются явно вместо потери данных. Ошибки ключей не выводят их значения.
Backend/frontend RSC parsers больше не подставляют default route и требуют interface command; applyParsedConfig использует только проверенные явные сети. Явно заданный0.0.0.0/0 остаётся допустимым. Числа сохраняются для проверки вместо parseInt/undefined defaults, включая0 иNaN. Перед обычным apply route читает список интерфейсов и возвращает409 при занятом имени; это предварительная проверка, не блокировка конкурентных запросов. Dry-run проверяет формат, но не обещает доступность сервера или отсутствие конфликтов на момент применения.
В существующем WgImportSheet добавлено короткое пояснение: .conf безName использует wg0; ключ/сети надо заполнить, совпадение имени остановит import. Структура Sheet/base-nova, формы, aria labels/status/alert и управление busy не менялись. Локальный preview остаётся разбором формата; обязательная preflight проверка выполняется backend. Новых API полей/зависимостей нет. Полный протокол .conf или поддержку PSK этот блок не добавляет.
Проверки: 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, browser, smoke6 страниц, deploy/DB controls. Первый browser run остановлен ошибочной проверкой harness: после importCHR1 она ожидала отсутствие объектов на обоих CHR перед отказомCHR2. Ошибка исправлена на проверку выбранного устройства; product source не менялся. Прерванная попытка не объявлена принятой; её 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.