fix(api): проверять достоверность WAN и не опрашивать выключенные серверы

This commit is contained in:
Denozordec committed 2026-10-14 00:47:29 +07:00
1 parent 4f084222ad
commit d91cc77cda
13 files changed
+353 -12

No files matched your search

+5 -1
View File
@@ -1,6 +1,6 @@
# UX/UI: протокол внешней приёмки 12.5
Актуальное продолжение 2026-10-14: блок216 завершён. Legacy BGP GET и реальный источник BGP snapshots больше не скрывают неполный опрос. Ошибка наблюдения записывается в snapshot; GRE сохраняется. Пять профильных скриптов, SQL/native17 и live API2/anonymous2/native2/UI1440/320 прошли. Backend ux-bgp216/compiled1052/source483 matched, frontend ux-gre214; собственные DB/roles удалены, пароли CHR не менялись. Следующий217 — WAN runtime: скрытые read errors и disabled no-poll. Этап12.5 открыт.
Актуальное продолжение 2026-10-14: блок217 завершён. Legacy WAN runtime больше не скрывает ошибки DHCP/addresses/routes и не опрашивает выключенные Home Router/Exit Node. Empty success сохранён. Production15, профиль snapshot/build, live API2/native6/anonymous2/dashboard smoke1440/320 прошли. Backend ux-wan217/compiled1052/source484 matched, frontend ux-gre214; own DB/roles удалены, пароли не менялись. Следующий218 — доступность заполненных таблиц маршрутизации. Этап12.5 открыт.
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).
@@ -2591,3 +2591,7 @@ Production compiled SQL/API29 на собственной ограниченно
## 12.5.216 — BGP snapshots (2026-10-14)
Неполный BGP poll больше не считается успешным пустым ответом/снимком. GRE при ошибке BGP сохраняется. Production17 и реальный API/UI приняты. Подробности и границы — [журнал](ux-ui-progress.md). Backend ux-bgp216, frontend ux-gre214; следующий217 — WAN runtime.
## 12.5.217 — WAN runtime (2026-10-14)
Read failures/malformed collections дают502, выключенные устройства409 без native poll, empty success сохранён. Production15 и реальная сверка API/native прошли. Подробности и границы — [журнал](ux-ui-progress.md). Backend ux-wan217, frontend ux-gre214; следующий218 — routing table accessibility.
+1 -1
View File
@@ -1,6 +1,6 @@
# План реализации UX/UI по пятичасовым окнам
Актуальное продолжение 2026-10-14: блок216 завершён. Legacy BGP GET и реальный источник BGP snapshots больше не скрывают неполный опрос. Ошибка наблюдения записывается в snapshot; GRE сохраняется. Пять профильных скриптов, SQL/native17 и live API2/anonymous2/native2/UI1440/320 прошли. Backend ux-bgp216/compiled1052/source483 matched, frontend ux-gre214; собственные DB/roles удалены, пароли CHR не менялись. Следующий217 — WAN runtime: скрытые read errors и disabled no-poll. Этап12.5 открыт.
Актуальное продолжение 2026-10-14: блок217 завершён. Legacy WAN runtime больше не скрывает ошибки DHCP/addresses/routes и не опрашивает выключенные Home Router/Exit Node. Empty success сохранён. Production15, профиль snapshot/build, live API2/native6/anonymous2/dashboard smoke1440/320 прошли. Backend ux-wan217/compiled1052/source484 matched, frontend ux-gre214; own DB/roles удалены, пароли не менялись. Следующий218 — доступность заполненных таблиц маршрутизации. Этап12.5 открыт.
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-13. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
+11 -1
View File
@@ -1,6 +1,6 @@
# UX/UI: журнал реализации
Актуальное продолжение 2026-10-14: блок216 завершён. Legacy BGP GET и реальный источник BGP snapshots больше не скрывают неполный опрос. Ошибка наблюдения записывается в snapshot; GRE сохраняется. Пять профильных скриптов, SQL/native17 и live API2/anonymous2/native2/UI1440/320 прошли. Backend ux-bgp216/compiled1052/source483 matched, frontend ux-gre214; собственные DB/roles удалены, пароли CHR не менялись. Следующий217 — WAN runtime: скрытые read errors и disabled no-poll. Этап12.5 открыт.
Актуальное продолжение 2026-10-14: блок217 завершён. Legacy WAN runtime больше не скрывает ошибки DHCP/addresses/routes и не опрашивает выключенные Home Router/Exit Node. Empty success сохранён. Production15, профиль snapshot/build, live API2/native6/anonymous2/dashboard smoke1440/320 прошли. Backend ux-wan217/compiled1052/source484 matched, frontend ux-gre214; own DB/roles удалены, пароли не менялись. Следующий218 — доступность заполненных таблиц маршрутизации. Этап12.5 открыт.
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md).
@@ -38,6 +38,16 @@
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 |
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–196 и ограничения ниже. Runtime backend/frontend ux-peak196. |
## 12.5.217 — достоверный WAN runtime и disabled no-poll (2026-10-14)
/api/servers/:id/wan-runtime подавлял ошибки DHCP, addresses и routes через [] и опрашивал выключенные устройства. Добавлены409 перед native client (с повторной проверкой актуальной DB row) и строгая валидация трёх коллекций тем же readInternetPathRows, что используется Internet path collector. Read failure/malformed row возвращает502 с WAN error; успешный envelope defaultGateway/immediateGateway/defaultInterface/uplinks и корректный empty200 сохранены. Методы/права/алгоритм выбора default route не менялись. Активный dashboard читает сохранённый Internet path, поэтому legacy WAN endpoint не объявляется его единственным источником.
Baseline ux-bgp216 и fixed production ux-wan217 прошли по15 own SQL/native HTTP случаев: anonymous/wrong permission без native reads; populated/empty; отдельный401 и malformed row каждой коллекции; recovery; disabled Home Router/Exit Node; missing/invalid ID. Baseline подтверждает200 при ошибках и native reads выключенных устройств; fixed502/409. Native writes0, own DB/roles удалены. Профиль internet-path-snapshot и backend build прошли.
Compiled1052/source484 matched; backend healthy, frontend ux-gre214 сохранён. Реальный Portal JWT: WAN GET200 обоих CHR сверены с шестью native DHCP/address/route GET200; gateway/immediateGateway/имеющиеся leases совпали, anonymous401. Dashboard1440/320 smoke без page errors/mutations не является тестом прямого legacy WAN consumer или независимого multi-WAN маршрута. Пароли/сетевые настройки не менялись; physical WAN loss и полный route provenance остаются отдельной приёмкой.
Протоколы: [baseline](ux-ui/acceptance/wan217-baseline.json), [fixed](ux-ui/acceptance/wan217-fixed.json), [build](ux-ui/acceptance/wan217-build-proof-2026-10-14.json), [deployment](ux-ui/acceptance/wan217-deployment-2026-10-14.json), [live](ux-ui/acceptance/wan217-live-2026-10-14.json). Следующий218 — accessibility заполненных таблиц маршрутизации: контраст статусов и метрик в light/dark на ПК/телефоне.
## 12.5.216 — неполный BGP опрос в legacy API и snapshots (2026-10-14)
Legacy /api/bgp/sessions возвращал sessions, отбрасывая failures. fetchBgpSessionsForAlerts также подавлял native errors через пустые массивы, и collector отмечал такой снимок без ошибки источника. Теперь endpoint возвращает503+failures, а источник snapshots отвергает неполный опрос. Collector записывает BGP error, сохраняет независимо прочитанный GRE; права, rules/evaluation и формат успешного массива не менялись. /bgp/catalog сохраняет отдельный контракт частичных результатов.
+7 -3
View File
@@ -1,10 +1,10 @@
# Оставшаяся внешняя приёмка — 2026-10-13
Актуальное продолжение 2026-10-14: блок216 завершён. Legacy BGP GET и реальный источник BGP snapshots больше не скрывают неполный опрос. Ошибка наблюдения записывается в snapshot; GRE сохраняется. Пять профильных скриптов, SQL/native17 и live API2/anonymous2/native2/UI1440/320 прошли. Backend ux-bgp216/compiled1052/source483 matched, frontend ux-gre214; собственные DB/roles удалены, пароли CHR не менялись. Следующий217 — WAN runtime: скрытые read errors и disabled no-poll. Этап12.5 открыт.
Актуальное продолжение 2026-10-14: блок217 завершён. Legacy WAN runtime больше не скрывает ошибки DHCP/addresses/routes и не опрашивает выключенные Home Router/Exit Node. Empty success сохранён. Production15, профиль snapshot/build, live API2/native6/anonymous2/dashboard smoke1440/320 прошли. Backend ux-wan217/compiled1052/source484 matched, frontend ux-gre214; own DB/roles удалены, пароли не менялись. Следующий218 — доступность заполненных таблиц маршрутизации. Этап12.5 открыт.
Это актуальная матрица после 12.5.216. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
Это актуальная матрица после 12.5.217. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-bgp216`, frontend `ux-gre214`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись.
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-wan217`, frontend `ux-gre214`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись.
| Раздел | Подтверждено | Осталось / условие завершения |
| --- | --- | --- |
@@ -1509,3 +1509,7 @@ Production compiled SQL/API29 на собственной ограниченно
## 12.5.216 — BGP snapshots (2026-10-14)
Неполный BGP poll больше не считается успешным пустым ответом/снимком. GRE при ошибке BGP сохраняется. Production17 и реальный API/UI приняты. Подробности и границы — [журнал](ux-ui-progress.md). Backend ux-bgp216, frontend ux-gre214; следующий217 — WAN runtime.
## 12.5.217 — WAN runtime (2026-10-14)
Read failures/malformed collections дают502, выключенные устройства409 без native poll, empty success сохранён. Production15 и реальная сверка API/native прошли. Подробности и границы — [журнал](ux-ui-progress.md). Backend ux-wan217, frontend ux-gre214; следующий218 — routing table accessibility.
+12 -1
View File
@@ -1,6 +1,6 @@
# Этап 12: итоговая приёмка UX/UI
Актуальное продолжение 2026-10-14: блок216 завершён. Legacy BGP GET и реальный источник BGP snapshots больше не скрывают неполный опрос. Ошибка наблюдения записывается в snapshot; GRE сохраняется. Пять профильных скриптов, SQL/native17 и live API2/anonymous2/native2/UI1440/320 прошли. Backend ux-bgp216/compiled1052/source483 matched, frontend ux-gre214; собственные DB/roles удалены, пароли CHR не менялись. Следующий217 — WAN runtime: скрытые read errors и disabled no-poll. Этап12.5 открыт.
Актуальное продолжение 2026-10-14: блок217 завершён. Legacy WAN runtime больше не скрывает ошибки DHCP/addresses/routes и не опрашивает выключенные Home Router/Exit Node. Empty success сохранён. Production15, профиль snapshot/build, live API2/native6/anonymous2/dashboard smoke1440/320 прошли. Backend ux-wan217/compiled1052/source484 matched, frontend ux-gre214; own DB/roles удалены, пароли не менялись. Следующий218 — доступность заполненных таблиц маршрутизации. Этап12.5 открыт.
План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.
@@ -3943,3 +3943,14 @@ Backend ux-bgp216 healthy: compiled1052/source483 matched; frontend ux-gre214 с
Протоколы: [baseline](ux-ui/acceptance/bgp216-baseline.json), [fixed](ux-ui/acceptance/bgp216-fixed.json), [initial fixture failure](ux-ui/acceptance/bgp216-initial-fixture-failure.json), [build](ux-ui/acceptance/bgp216-build-proof-2026-10-14.json), [deployment](ux-ui/acceptance/bgp216-deployment-2026-10-14.json), [live](ux-ui/acceptance/bgp216-live-2026-10-14.json). Следующий217 — legacy WAN runtime: подавление ошибок чтения и опрос выключенного устройства.
## 12.5.217 — достоверный WAN runtime и disabled no-poll (2026-10-14)
/api/servers/:id/wan-runtime подавлял ошибки DHCP, addresses и routes через [] и опрашивал выключенные устройства. Добавлены409 перед native client (с повторной проверкой актуальной DB row) и строгая валидация трёх коллекций тем же readInternetPathRows, что используется Internet path collector. Read failure/malformed row возвращает502 с WAN error; успешный envelope defaultGateway/immediateGateway/defaultInterface/uplinks и корректный empty200 сохранены. Методы/права/алгоритм выбора default route не менялись. Активный dashboard читает сохранённый Internet path, поэтому legacy WAN endpoint не объявляется его единственным источником.
Baseline ux-bgp216 и fixed production ux-wan217 прошли по15 own SQL/native HTTP случаев: anonymous/wrong permission без native reads; populated/empty; отдельный401 и malformed row каждой коллекции; recovery; disabled Home Router/Exit Node; missing/invalid ID. Baseline подтверждает200 при ошибках и native reads выключенных устройств; fixed502/409. Native writes0, own DB/roles удалены. Профиль internet-path-snapshot и backend build прошли.
Compiled1052/source484 matched; backend healthy, frontend ux-gre214 сохранён. Реальный Portal JWT: WAN GET200 обоих CHR сверены с шестью native DHCP/address/route GET200; gateway/immediateGateway/имеющиеся leases совпали, anonymous401. Dashboard1440/320 smoke без page errors/mutations не является тестом прямого legacy WAN consumer или независимого multi-WAN маршрута. Пароли/сетевые настройки не менялись; physical WAN loss и полный route provenance остаются отдельной приёмкой.
Протоколы: [baseline](ux-ui/acceptance/wan217-baseline.json), [fixed](ux-ui/acceptance/wan217-fixed.json), [build](ux-ui/acceptance/wan217-build-proof-2026-10-14.json), [deployment](ux-ui/acceptance/wan217-deployment-2026-10-14.json), [live](ux-ui/acceptance/wan217-live-2026-10-14.json). Следующий218 — accessibility заполненных таблиц маршрутизации: контраст статусов и метрик в light/dark на ПК/телефоне.
+5 -1
View File
@@ -1,6 +1,6 @@
# Тестовый сервер UX/UI — 2026-10-10
Актуальное продолжение 2026-10-14: блок216 завершён. Legacy BGP GET и реальный источник BGP snapshots больше не скрывают неполный опрос. Ошибка наблюдения записывается в snapshot; GRE сохраняется. Пять профильных скриптов, SQL/native17 и live API2/anonymous2/native2/UI1440/320 прошли. Backend ux-bgp216/compiled1052/source483 matched, frontend ux-gre214; собственные DB/roles удалены, пароли CHR не менялись. Следующий217 — WAN runtime: скрытые read errors и disabled no-poll. Этап12.5 открыт.
Актуальное продолжение 2026-10-14: блок217 завершён. Legacy WAN runtime больше не скрывает ошибки DHCP/addresses/routes и не опрашивает выключенные Home Router/Exit Node. Empty success сохранён. Production15, профиль snapshot/build, live API2/native6/anonymous2/dashboard smoke1440/320 прошли. Backend ux-wan217/compiled1052/source484 matched, frontend ux-gre214; own DB/roles удалены, пароли не менялись. Следующий218 — доступность заполненных таблиц маршрутизации. Этап12.5 открыт.
| Параметр | Проверенное состояние |
| --- | --- |
@@ -2322,3 +2322,7 @@ Production compiled SQL/API29 на собственной ограниченно
## 12.5.216 — BGP snapshots (2026-10-14)
Неполный BGP poll больше не считается успешным пустым ответом/снимком. GRE при ошибке BGP сохраняется. Production17 и реальный API/UI приняты. Подробности и границы — [журнал](ux-ui-progress.md). Backend ux-bgp216, frontend ux-gre214; следующий217 — WAN runtime.
## 12.5.217 — WAN runtime (2026-10-14)
Read failures/malformed collections дают502, выключенные устройства409 без native poll, empty success сохранён. Production15 и реальная сверка API/native прошли. Подробности и границы — [журнал](ux-ui-progress.md). Backend ux-wan217, frontend ux-gre214; следующий218 — routing table accessibility.
@@ -0,0 +1,89 @@
{
"date": "2026-10-14",
"block": "12.5.217",
"baseline": true,
"database": "mm_accept_166_1791913409174",
"cases": [
{
"phase": "anonymous",
"status": 401,
"nativeCalls": 0
},
{
"phase": "wrong permission",
"status": 403,
"nativeCalls": 0
},
{
"phase": "populated",
"status": 200,
"nativeCalls": 3
},
{
"phase": "empty",
"status": 200,
"nativeCalls": 3
},
{
"phase": "fail-dhcp",
"status": 200,
"nativeCalls": 3
},
{
"phase": "fail-addresses",
"status": 200,
"nativeCalls": 3
},
{
"phase": "fail-routes",
"status": 200,
"nativeCalls": 3
},
{
"phase": "malformed-dhcp",
"status": 200,
"nativeCalls": 3
},
{
"phase": "malformed-addresses",
"status": 200,
"nativeCalls": 3
},
{
"phase": "malformed-routes",
"status": 200,
"nativeCalls": 3
},
{
"phase": "recovery",
"status": 200,
"nativeCalls": 3
},
{
"phase": "disabled",
"type": "home-router",
"status": 200,
"nativeCalls": 3
},
{
"phase": "disabled",
"type": "exit-node",
"status": 200,
"nativeCalls": 3
},
{
"phase": "missing-invalid",
"status": 404,
"nativeCalls": 0
},
{
"phase": "missing-invalid",
"status": 400,
"nativeCalls": 0
}
],
"scope": "Compiled WAN runtime route/auth, owned SQL/native HTTP fixture; real CHR untouched",
"passed": true,
"nativeWrites": 0,
"ownedDatabaseAndRoleRemoved": true
}
@@ -0,0 +1,19 @@
{
"date": "2026-10-14",
"block": "12.5.217",
"compiled": {
"matched": 1052,
"missing": 0,
"different": 0
},
"source": [
{
"kind": "backend",
"matched": 484
}
],
"profileScripts": [
"internet-path-snapshot"
],
"productionCases": 15
}
@@ -0,0 +1,21 @@
{
"date": "2026-10-14",
"block": "12.5.217",
"backendSourceMatched": 484,
"compiledMatched": 1052,
"frontendChanged": false,
"services": {
"backend": {
"image": "mmapp-test/backend:ux-wan217",
"imageId": "sha256:f5fac6167453e180e7aacb3b88de14e49860479dfcf46bc7a9ffd34db682e42b",
"running": true,
"health": "healthy"
},
"frontend": {
"image": "mmapp-test/frontend:ux-gre214",
"imageId": "sha256:7035e5ba628276a9927cce4814739dadd920dba0606e3b9fc316cc0262f77d5f",
"running": true,
"health": null
}
}
}
+89
View File
@@ -0,0 +1,89 @@
{
"date": "2026-10-14",
"block": "12.5.217",
"baseline": false,
"database": "mm_accept_166_1791913523373",
"cases": [
{
"phase": "anonymous",
"status": 401,
"nativeCalls": 0
},
{
"phase": "wrong permission",
"status": 403,
"nativeCalls": 0
},
{
"phase": "populated",
"status": 200,
"nativeCalls": 3
},
{
"phase": "empty",
"status": 200,
"nativeCalls": 3
},
{
"phase": "fail-dhcp",
"status": 502,
"nativeCalls": 3
},
{
"phase": "fail-addresses",
"status": 502,
"nativeCalls": 3
},
{
"phase": "fail-routes",
"status": 502,
"nativeCalls": 3
},
{
"phase": "malformed-dhcp",
"status": 502,
"nativeCalls": 3
},
{
"phase": "malformed-addresses",
"status": 502,
"nativeCalls": 3
},
{
"phase": "malformed-routes",
"status": 502,
"nativeCalls": 3
},
{
"phase": "recovery",
"status": 200,
"nativeCalls": 3
},
{
"phase": "disabled",
"type": "home-router",
"status": 409,
"nativeCalls": 0
},
{
"phase": "disabled",
"type": "exit-node",
"status": 409,
"nativeCalls": 0
},
{
"phase": "missing-invalid",
"status": 404,
"nativeCalls": 0
},
{
"phase": "missing-invalid",
"status": 400,
"nativeCalls": 0
}
],
"scope": "Compiled WAN runtime route/auth, owned SQL/native HTTP fixture; real CHR untouched",
"passed": true,
"nativeWrites": 0,
"ownedDatabaseAndRoleRemoved": true
}
@@ -0,0 +1,60 @@
{
"date": "2026-10-14",
"block": "12.5.217",
"backend": "ux-wan217",
"frontend": "ux-gre214",
"cases": [
{
"host": "194.226.121.150",
"serverId": 1,
"nativeCollections": 3,
"nativeStatuses": [
200,
200,
200
],
"applicationStatus": 200,
"anonymousStatus": 401,
"defaultGatewayMatchesNative": true,
"immediateGatewayMatchesNative": true,
"configuredUplinks": 0,
"leaseProjectionMatchesNative": true,
"passwordUnchanged": true
},
{
"host": "104.165.244.7",
"serverId": 2,
"nativeCollections": 3,
"nativeStatuses": [
200,
200,
200
],
"applicationStatus": 200,
"anonymousStatus": 401,
"defaultGatewayMatchesNative": true,
"immediateGatewayMatchesNative": true,
"configuredUplinks": 0,
"leaseProjectionMatchesNative": true,
"passwordUnchanged": true
}
],
"ui": [
{
"width": 1440,
"pageErrors": 0,
"mutationRequests": 0,
"scope": "Dashboard smoke; does not invoke legacy WAN endpoint directly"
},
{
"width": 320,
"pageErrors": 0,
"mutationRequests": 0,
"scope": "Dashboard smoke; does not invoke legacy WAN endpoint directly"
}
],
"realPortalJWT": true,
"apiMocks": false,
"nativeWrites": 0,
"scope": "Healthy WAN direct API/native projection and dashboard smoke; failures/disabled states tested only in owned SQL fixture"
}