fix(ipsec): восстановить mode-config с проверкой зависимостей

This commit is contained in:
Denozordec committed 2026-10-09 15:49:50 +07:00
1 parent 5d9ef9dcf3
commit a83e4734df
12 files changed
+156 -34

No files matched your search

+3 -1
View File
@@ -1,11 +1,13 @@
# UX/UI: протокол внешней приёмки 12.5
Статус на2026-10-09: backend ux-ipsec79/frontend ux-ipsec77, backend healthy; основной блок IPsec77 и VXLAN76 приняты в описанных границах. В12.5.67 исправленный Peer .conf принят как клиентский шаблон: API6/6, browser4/4, server endpoint и placeholders; настоящий RSC roundtrip через UI/native/handshake/Ping принят в12.5.68, .conf с явнымName/отказы400/409/сохранение формы приняты в70; поздний native rejection/подтверждённая компенсация/retry приняты в72; изолированный audit INSERT permission denial принят в74; остальные неизвестные исходы/DB faults открыты. Мобильная ширина WireGuard Sheets принята в12.5.64. Мобильная GRE форма и native сохранение на обоих CHR приняты в12.5.57. WireGuard handshake/короткий Ping/native API/read-only UI приняты в границах12.5.58; 12.5.59 воспроизвёл оставшиеся peers/IP; 12.5.60 развернул исправление и принял обычное удаление own WG интерфейса с peer/IPv4 адресом на обоих CHR. 12.5.62 принял полный WireGuard UI create/peer/disable/enable/Ping/delete на обоих CHR; устойчивое меню развёрнуто. Устойчивость меню GRE при live refresh на обоих CHR принята в12.5.55. GRE peer metadata и реальный lifecycle/API/UI/двусторонний Ping подтверждены в12.5.53. Browser retry/checkpoint на реальном HTTP/PG принят в границах12.5.43–45; Telegram sender responses подменены, реальная доставка не проверена. PG-1/2/3/4/5 приняты в описанных границах, PG-6 integrated для одного isolated instance, PG-7 real JWT/processcounts и browser restore passed. PG-8 real PG/native и browser unknown→history done приняты с fault injection после настоящего COMMIT. ROS-8/9 real API/SQL/native приняты в границах12.5.23; browser pair/duration change и delete приняты в12.5.24. ROS-2 authentication failure принят в12.5.25. PortalSSO, физический TCP disconnect, мультиэкземпляры и остальные ROS/Q/интеграции остаются открытыми. [Паспорт](ux-ui-test-server.md), [журнал](ux-ui-progress.md). VXLAN75: собственная native пара/Ping/catalog/URL/export приняты, create/delete API отсутствует; selected baseline восстановлен.
Статус на2026-10-09: backend ux-ipsec80/frontend ux-ipsec77, backend healthy; основной блок IPsec77 и VXLAN76 приняты в описанных границах. В12.5.67 исправленный Peer .conf принят как клиентский шаблон: API6/6, browser4/4, server endpoint и placeholders; настоящий RSC roundtrip через UI/native/handshake/Ping принят в12.5.68, .conf с явнымName/отказы400/409/сохранение формы приняты в70; поздний native rejection/подтверждённая компенсация/retry приняты в72; изолированный audit INSERT permission denial принят в74; остальные неизвестные исходы/DB faults открыты. Мобильная ширина WireGuard Sheets принята в12.5.64. Мобильная GRE форма и native сохранение на обоих CHR приняты в12.5.57. WireGuard handshake/короткий Ping/native API/read-only UI приняты в границах12.5.58; 12.5.59 воспроизвёл оставшиеся peers/IP; 12.5.60 развернул исправление и принял обычное удаление own WG интерфейса с peer/IPv4 адресом на обоих CHR. 12.5.62 принял полный WireGuard UI create/peer/disable/enable/Ping/delete на обоих CHR; устойчивое меню развёрнуто. Устойчивость меню GRE при live refresh на обоих CHR принята в12.5.55. GRE peer metadata и реальный lifecycle/API/UI/двусторонний Ping подтверждены в12.5.53. Browser retry/checkpoint на реальном HTTP/PG принят в границах12.5.43–45; Telegram sender responses подменены, реальная доставка не проверена. PG-1/2/3/4/5 приняты в описанных границах, PG-6 integrated для одного isolated instance, PG-7 real JWT/processcounts и browser restore passed. PG-8 real PG/native и browser unknown→history done приняты с fault injection после настоящего COMMIT. ROS-8/9 real API/SQL/native приняты в границах12.5.23; browser pair/duration change и delete приняты в12.5.24. ROS-2 authentication failure принят в12.5.25. PortalSSO, физический TCP disconnect, мультиэкземпляры и остальные ROS/Q/интеграции остаются открытыми. [Паспорт](ux-ui-test-server.md), [журнал](ux-ui-progress.md). VXLAN75: собственная native пара/Ping/catalog/URL/export приняты, create/delete API отсутствует; selected baseline восстановлен.
IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md).
IPsec79: сертификатный responder online=true/static mode-config198.18.79.250 принят; recordRevision=null после native patch даёт502/state=applied. Собственные объекты и private files удалены. [Отчёт](ux-ui/acceptance/ipsec-certificate-2026-10-09.json).
IPsec80: real restore staticIp/disabled, повтор без дубликатов, foreign-reference409 и cleanup приняты. Первоначальный неполный образ откатан; исправленный runtime healthy. [Отчёт](ux-ui/acceptance/ipsec-restore-2026-10-09.json).
## Паспорт стенда
Перед внешним запуском зафиксировать отдельные PostgreSQL и RouterOS тестовые устройства, версии server/client PostgreSQL и RouterOS, HEAD backend/frontend, роли пользователей, число экземпляров backend/планировщика/отправителей и способ их остановки. Для Telegram использовать тестовый чат, для остальных интеграций — тестовые endpoints и учётные записи. Зафиксировать ожидаемые изменения и способ восстановления стенда.
+1 -1
View File
@@ -1,6 +1,6 @@
# План реализации UX/UI по пятичасовым окнам
Актуальное продолжение 2026-10-09: 12.5.79 подтвердил сертификатный IKEv2 со статическим mode-config198.18.79.250 и online=true; поздний сбой сохранения ревизии сообщает state=applied/historyRecorded=false. Backend ux-ipsec79, frontend ux-ipsec77. Следующий12.5.80 — исправление и реальная приёмка восстановления истории IPsec; поздние частичные/транспортные ошибки остаются открытыми. Этап12.5 открыт.
Актуальное продолжение 2026-10-09: 12.5.80 исправил восстановление IPsec mode-config и порядок зависимостей; реальный откат staticIp/disabled, повтор без дубликатов и запрет чужой ссылки приняты. Backend ux-ipsec80 healthy, frontend ux-ipsec77. Следующий12.5.81 — частичные ошибки операций и неопределённый результат при потере ответа RouterOS. Этап12.5 открыт.
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-09. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
+16 -2
View File
@@ -1,6 +1,6 @@
# UX/UI: журнал реализации
Актуальное продолжение 2026-10-09: 12.5.79 подтвердил сертификатный IKEv2 со статическим mode-config198.18.79.250 и online=true; поздний сбой сохранения ревизии сообщает state=applied/historyRecorded=false. Backend ux-ipsec79, frontend ux-ipsec77. Следующий12.5.80 — исправление и реальная приёмка восстановления истории IPsec; поздние частичные/транспортные ошибки остаются открытыми. Этап12.5 открыт.
Актуальное продолжение 2026-10-09: 12.5.80 исправил восстановление IPsec mode-config и порядок зависимостей; реальный откат staticIp/disabled, повтор без дубликатов и запрет чужой ссылки приняты. Backend ux-ipsec80 healthy, frontend ux-ipsec77. Следующий12.5.81 — частичные ошибки операций и неопределённый результат при потере ответа RouterOS. Этап12.5 открыт.
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md).
@@ -36,7 +36,21 @@
| 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 |
| 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 |
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 |
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–79 и ограничения ниже. Runtime backend ux-ipsec79/frontend ux-ipsec77. |
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–80 и ограничения ниже. Runtime backend ux-ipsec80/frontend ux-ipsec77. |
## 12.5.80 — IPsec: восстановление истории и зависимости (2026-10-09)
**Исправления.** Restore распознаёт reserved mode-config по имени без неподдерживаемого RouterOS comment; существующий объект обновляется вместо повторного PUT. Пул создаётся до mode-config; restored responder=yes и персональный address-prefix-length=32. Лишние mode-config/peer/pool удаляются после переключения identities. Для проверки ссылок restore state содержит полный live набор, а план изменяет managed объекты. Чужие identity/static policy/пул mode-config и конфликт имени блокируют разрушительный план до записей; HTTP409 с объяснением отсутствия изменений. Отсутствующие сертификаты/profile ревизии также проверяются до исполнения; история не содержит ключи PKI и не может создать их.
**Проверки.** config +80 state checks, IPsec HTTP history test, новый ipsec-restore test (reserved objects, pool dependency, responder/32, переключение перед удалением, foreign identity/policy/name conflict), entity-snapshots tests, backend TypeScript/ESLint/diff check. Сохраняется исходное предупреждение entity-snapshots.ts unused bool; новых ESLint ошибок нет.
**Реальная приёмка.** Собственные profile/peer/pool/mode-config/PSK identity наCHR1. Production API сохранил observed ревизию, PATCH изменил198.18.80.250→249 и disabled=true; restore вернул250/disabled=false, native responder=true. Повторный restore200 не создал дубликат. Собственная дополнительная identity без managed marker, ссылающаяся на test peer/mode-config, заблокировала возврат пустой ревизии409; native peer и identity сохранились. Очистка по точным ID/name/comment; исходные ID пяти коллекций совпали. PKI/profile missing guards добавлены, но их отдельная native fault injection не заявляется. [Отчёт](ux-ui/acceptance/ipsec-restore-2026-10-09.json).
**Docker и инцидент.** Установка системных пакетов runner перенесена до COPY приложения/APP_VERSION для повторного использования кэша. Первая правка ошибочно выбрала apt block deps и сократила Dockerfile: build формально прошёл, backend не стартовал. Health gate остановил тест до RouterOS/БД mutations; возвращён healthy ux-ipsec79. Dockerfile восстановлен из HEAD, перемещён только runner apt block, diff проверен. Перед повторным deploy проверены entry file/node --check и pg_restore18.6 внутри образа; compose --wait подтвердил healthy. Это две сборки80, включая исправление собственной ошибки; не считать первую успешной приёмкой. Повторное использование apt слоя будет проверено на следующем изменении.
**Runtime.** mmapp-test/backend:ux-ipsec80/version1.0.0-test.ipsec80, image sha256:c28600a85fb609c910a030594ff4ea2fea91d87415744935c5e49e24b013f578, healthy; frontend ux-ipsec77. Context ipsec79 + шесть backend-файлов рабочего состояния до коммита; corrected archive SHA680f90b1f88119702aa5761a5d71e77bb6c512b4a67aea4f606993606f1e586b; label revision=ipsec80, не Git SHA. Приватный .env backup; миграций нет. Один локальный коммит без push.
**Границы.** Принят откат управляемых peer/identity/mode-config/pool/nat в проверенном срезе. Политики и profile/proposal/CA/key материал не пересоздаются; удалённый сертификат/profile требует ручного восстановления перед restore. Частичные write failures и транспортная неопределённость остаются12.5.81; NAT/интернет/IPv6/клиентские ОС/RBAC/throughput и сложные DN открыты.
## 12.5.79 — IPsec: сертификатный online и поздняя ошибка истории (2026-10-09)
+14
View File
@@ -1912,3 +1912,17 @@ flowchart LR
**Runtime.** Одна backend production сборка: mmapp-test/backend:ux-ipsec79/version1.0.0-test.ipsec79, image sha256:26b5b05122b7b55aa83b1f80b880d1aee6eaf33caa225afe09327b02a219c5dc1. Frontend ux-ipsec77 сохранён. Context предыдущего ipsec78 + пять backend-файлов из рабочего состояния перед коммитом; archiveSHA50cdacc0016810bd8c87c0bf2eaedbe9ddd4e1d6134a960f6ca11207c4faaff6. SHA runtime исходников совпали локально/удалённо: ipsec-live.ts676b51c9ed7edd9bc5d0cf5a455409b445c46235a55e2bedeff9e07208401bb6, routes/ipsec.ts192a3a7c5628c5e68c5cb20c26b55ce97c9a4c2cce8effea8ed1a26c79ee442d. Label revision=ipsec79, не итоговый Git SHA. .env backup приватный; миграций нет.
Следующий12.5.80: исправить restore mode-config без неподдерживаемого comment, порядок зависимостей и проверить реальный откат изменений. Обнаружен воспроизводимый локальный отказ: существующие reserved mode-config планируются как новые PUT; новая профильная проверка для следующего блока пока красная. Остальные ограничения12.5.77, составные/экранированные DN, NAT/интернет/IPv6/клиентские ОС/RBAC/throughput открыты. Один локальный коммит без push.
## 12.5.80 — IPsec: восстановление истории и зависимости (2026-10-09)
**Исправления.** Restore распознаёт reserved mode-config по имени без неподдерживаемого RouterOS comment; существующий объект обновляется вместо повторного PUT. Пул создаётся до mode-config; restored responder=yes и персональный address-prefix-length=32. Лишние mode-config/peer/pool удаляются после переключения identities. Для проверки ссылок restore state содержит полный live набор, а план изменяет managed объекты. Чужие identity/static policy/пул mode-config и конфликт имени блокируют разрушительный план до записей; HTTP409 с объяснением отсутствия изменений. Отсутствующие сертификаты/profile ревизии также проверяются до исполнения; история не содержит ключи PKI и не может создать их.
**Проверки.** config +80 state checks, IPsec HTTP history test, новый ipsec-restore test (reserved objects, pool dependency, responder/32, переключение перед удалением, foreign identity/policy/name conflict), entity-snapshots tests, backend TypeScript/ESLint/diff check. Сохраняется исходное предупреждение entity-snapshots.ts unused bool; новых ESLint ошибок нет.
**Реальная приёмка.** Собственные profile/peer/pool/mode-config/PSK identity наCHR1. Production API сохранил observed ревизию, PATCH изменил198.18.80.250→249 и disabled=true; restore вернул250/disabled=false, native responder=true. Повторный restore200 не создал дубликат. Собственная дополнительная identity без managed marker, ссылающаяся на test peer/mode-config, заблокировала возврат пустой ревизии409; native peer и identity сохранились. Очистка по точным ID/name/comment; исходные ID пяти коллекций совпали. PKI/profile missing guards добавлены, но их отдельная native fault injection не заявляется. [Отчёт](ux-ui/acceptance/ipsec-restore-2026-10-09.json).
**Docker и инцидент.** Установка системных пакетов runner перенесена до COPY приложения/APP_VERSION для повторного использования кэша. Первая правка ошибочно выбрала apt block deps и сократила Dockerfile: build формально прошёл, backend не стартовал. Health gate остановил тест до RouterOS/БД mutations; возвращён healthy ux-ipsec79. Dockerfile восстановлен из HEAD, перемещён только runner apt block, diff проверен. Перед повторным deploy проверены entry file/node --check и pg_restore18.6 внутри образа; compose --wait подтвердил healthy. Это две сборки80, включая исправление собственной ошибки; не считать первую успешной приёмкой. Повторное использование apt слоя будет проверено на следующем изменении.
**Runtime.** mmapp-test/backend:ux-ipsec80/version1.0.0-test.ipsec80, image sha256:c28600a85fb609c910a030594ff4ea2fea91d87415744935c5e49e24b013f578, healthy; frontend ux-ipsec77. Context ipsec79 + шесть backend-файлов рабочего состояния до коммита; corrected archive SHA680f90b1f88119702aa5761a5d71e77bb6c512b4a67aea4f606993606f1e586b; label revision=ipsec80, не Git SHA. Приватный .env backup; миграций нет. Один локальный коммит без push.
**Границы.** Принят откат управляемых peer/identity/mode-config/pool/nat в проверенном срезе. Политики и profile/proposal/CA/key материал не пересоздаются; удалённый сертификат/profile требует ручного восстановления перед restore. Частичные write failures и транспортная неопределённость остаются12.5.81; NAT/интернет/IPv6/клиентские ОС/RBAC/throughput и сложные DN открыты.
+4 -2
View File
@@ -1,6 +1,6 @@
# Тестовый сервер UX/UI — 2026-10-09
Сервер161.104.46.222 предоставлен для временного тестирования. Backend ux-ipsec79/version1.0.0-test.ipsec79, frontend ux-ipsec77/version1.0.0-test.ipsec77; backend/PG healthy, frontend HTTP/browser passed. Основной блок IPsec77 принят в границах журнала, own fixtures/fake DB rows удалены; каталог flash CHR2 сохранён из-за неподтверждённого ownership. SSH/оба CHR доступны, пароли прежние.
Сервер161.104.46.222 предоставлен для временного тестирования. Backend ux-ipsec80/version1.0.0-test.ipsec80, frontend ux-ipsec77/version1.0.0-test.ipsec77; backend/PG healthy, frontend HTTP/browser passed. Основной блок IPsec77 принят в границах журнала, own fixtures/fake DB rows удалены; каталог flash CHR2 сохранён из-за неподтверждённого ownership. SSH/оба CHR доступны, пароли прежние.
| Параметр | Проверенное состояние |
| --- | --- |
@@ -14,7 +14,7 @@
| PostgreSQL | postgres:18-alpine,18.6;mmapp-test-postgres healthy;SELECT version() passed |
| Данные | Отдельный Compose project mmapp-test,том mmapp-test_mmapp-pgdata и каталог ./data |
| Доступ | PostgreSQL не публикуется;frontend3000/backend8000 привязаны к127.0.0.1 после запуска |
| Образы приложения | mmapp-test/backend:ux-ipsec79 и mmapp-test/frontend:ux-ipsec77; запущены |
| Образы приложения | mmapp-test/backend:ux-ipsec80 и mmapp-test/frontend:ux-ipsec77; запущены |
Compose SHA256:3052bd6ab5d9865f97605cebfb5ff27a4410cd3357b81153a65a87fb7c92582f. OptionalBACKEND_IMAGE_TAG позволяетобновлятьbackendотдельно. Локальный и удалённый файлы совпали. Шаблоны: [Compose](../deploy/docker-compose.test.yml), [env без секретов](../deploy/env.test.example).
@@ -22,6 +22,8 @@ IPsec78: PSK active-peer/online и mode-config приняты через native
IPsec79: сертификатный responder online=true/static mode-config198.18.79.250 принят; recordRevision=null после native patch даёт502/state=applied. Собственные объекты и private files удалены. [Отчёт](ux-ui/acceptance/ipsec-certificate-2026-10-09.json).
IPsec80: real restore staticIp/disabled, повтор без дубликатов, foreign-reference409 и cleanup приняты. Первоначальный неполный образ откатан; исправленный runtime healthy. [Отчёт](ux-ui/acceptance/ipsec-restore-2026-10-09.json).
## Развёртывание приложения
Чистые 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.
@@ -0,0 +1,29 @@
{
"date": "2026-10-09",
"name": "mm-ipsec80-1791535642119",
"serverId": 1,
"checks": [
{
"scenario": "restore static address and enabled state",
"httpStatus": 200,
"nativeAddress": "198.18.80.250",
"nativeResponder": true
},
{
"scenario": "repeat restore without duplicate mode-config",
"httpStatus": 200
},
{
"scenario": "foreign reference blocks restore before writes",
"httpStatus": 409,
"nativeObjectsPreserved": true
}
],
"cleanup": {
"/ip/ipsec/identity": true,
"/ip/ipsec/peer": true,
"/ip/ipsec/mode-config": true,
"/ip/pool": true,
"/ip/ipsec/profile": true
}
}