fix(geoip): проверить локальный кеш и ограничить загрузку баз

This commit is contained in:
Denozordec committed 2026-10-14 15:04:20 +07:00
1 parent 3c3d152c2d
commit 48cc65ec2b
16 files changed
+492 -31

No files matched your search

+19 -1
View File
@@ -1,6 +1,6 @@
# UX/UI: протокол внешней приёмки 12.5
Актуальное продолжение 2026-10-14:241 — после237 приняты1000 смешанных local/missing,both/missing,unknown,available строк:ПК1440/320, rendered50, DOM2477/2239, search/last-good/pagination/keyboard passed, scoped axe0, writes0. Runtime backend/frontend ux-backups237. S3 native/limitedUI/retention230–240 приняты в записанных границах. Следующий242 — доступный mirror GeoIP job в изолированном scope; paid MaxMind/Cloudflare/Gitea/container jobs отдельно. Этап12.5 открыт.
Актуальное продолжение 2026-10-14:242 — GeoIP mirror job принят в own SQL/files и реальном mirror:12 fetches200/304, две валидные MMDB12,380,575bytes, missing/corrupt recovery, concurrent409, partial error сохраняетlastSuccessAt. Исправлены false304/eager gate/body deadline; download120s/64MiB, HTTP boundary tests и15E2E прошли. Backend ux-geoip242 healthy, frontend ux-backups237 image/container unchanged; live readUI1440/320 passed. Следующий243 — аудит доступных container/certificate/release jobs и актуальных внешних ограничений. Этап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).
@@ -18,6 +18,24 @@ OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/bro
BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json).
## 12.5.242 — реальный GeoIP mirror job и честное состояние cache (2026-10-14)
В collector обнаруженыfalse-success304 при отсутствующей локальной базе (старый тест прямо принимал это), race до acquisition lock из-за await settings и освобождение timeout после headers вместо body. Теперь gate захватывается до первогоawait; concurrent force409/backgroundskip. Conditional ETag отправляется только после проверки локальной MMDB; missing/corrupt cache требует200 полного файла.304 без validated cache — ошибка, неskippedUnchanged. Partial failures сохраняют дату последнего успешного update и предыдущий файл, добавляя lastError. Новая downloadGeoipDatabase держит120s deadline через streaming body, ограничивает declared/chunked file64MiB и закрывает непригодное тело. Базы проходят existing Country/ASN validation до atomic swap; формат/layout ReUI не менялись.
Local test:geoip прошёл: реальный HTTP healthy/304, stalls after headers→AbortError, declared/chunked oversize→reject, recovery; collector invalid/cache/concurrent gates; JWT reader cannotmutate/writer/admin allowed. Backend/contracts build и scoped ESLint прошли.15 unique GeoIP settings/responsive/data-collection E2E прошли25.2s; ошибочная первоначальная команда с несуществующимиspec далаNo tests found и не считалась проверкой. Три автоматически перегенерированных старыхGeoIP PNG возвращены к исходным байтам; чужие GRE/VXLAN changes сохранены.
Final production source516/compiled1072 matched. В own PostgreSQL/files scope выполнены7 укрупнённых сценариев: actual mirror download обеих MMDB12,380,575bytes, Google8.8.8.8→US/ASN15169, actual conditional304/hash unchanged иconcurrent409, missing-country refetch безETag, corrupt-country refetch, controlled invalid MMDB200/uncached304 сохраняютlastSuccessAt, actual recovery иdisabled background0fetch.12 реальных mirror GET200/304; negative country responses явно контролируемые и не выдаются за native WAN failure. Валидация MMDB не подменялась. Temporary DB/role/container/files удалены, CHRcontacts0/mainDBwrites0 в этом scope. Предварительная сборка с иным downloader отдельно проверялась; повтор не прибавлен кunique приёмке.
Развёрнут только backend ux-geoip242; frontend ux-backups237 image/container ID неизменны. Backendhealthy; real Portal/live GET GeoIP200 иUI1440/320, обе main bases alreadyloaded, globaloverflow0/pageerrors0, POSTupdate0. Main GeoIP job через UI не запускался; реальная загрузка доказана в isolated scope, а не заявлена обновлением данных приложения. Откатbackend ux-backups237 и приватная прежняя.env сохранены на сервере.
Протоколы: [mirror/SQL](ux-ui/acceptance/geoip-mirror242.json), [deployment](ux-ui/acceptance/geoip242-deployment.json), [live read UI](ux-ui/acceptance/geoip242-live-ui.json). MirrorP3TERX — фактический источник collector без account key. Прямой licensed MaxMind download не реализован текущим collector и не принят этим тестом; актуальность/геолокационная точность всех IP, publicIPv6 geography, multi-process lock, physical WAN failures отдельно.
| Референс | Схема состояний |
| --- | --- |
| [ReUI Settings16](https://reui.io/preview/base/settings-16?ref=mcp) | validated cache → conditional304; missing/corrupt → full200 → validate → swap; error → last-good + last-success + warning |
Следующий243 — read-only availability audit контейнерных/ACME/release jobs на текущем стенде и согласованная матрица реальных remaining dependencies. Не выдумывать Cloudflare/registry credentials и не обновлять RouterOS без отдельной команды.
## 12.5.241 — тысяча бэкапов со смешанными состояниями файлов (2026-10-14)
Изменение237 проверено на1000 обычных live-path HTTP DTO (199062bytes), по250 local/missing,both/missing,local/unknown,local/available. Два сценария1440/320 прошли25.2s. UI сохраняет pagination50 строк:DOM2477/2239, ready1203/806ms в dev fixture окружении. Это измерение конкретного запуска, не production SLA/сетевой latency и не доказательство скорости filesystem API1000 файлов.
+19 -1
View File
@@ -1,9 +1,27 @@
# План реализации UX/UI по пятичасовым окнам
Актуальное продолжение 2026-10-14:241 — после237 приняты1000 смешанных local/missing,both/missing,unknown,available строк:ПК1440/320, rendered50, DOM2477/2239, search/last-good/pagination/keyboard passed, scoped axe0, writes0. Runtime backend/frontend ux-backups237. S3 native/limitedUI/retention230–240 приняты в записанных границах. Следующий242 — доступный mirror GeoIP job в изолированном scope; paid MaxMind/Cloudflare/Gitea/container jobs отдельно. Этап12.5 открыт.
Актуальное продолжение 2026-10-14:242 — GeoIP mirror job принят в own SQL/files и реальном mirror:12 fetches200/304, две валидные MMDB12,380,575bytes, missing/corrupt recovery, concurrent409, partial error сохраняетlastSuccessAt. Исправлены false304/eager gate/body deadline; download120s/64MiB, HTTP boundary tests и15E2E прошли. Backend ux-geoip242 healthy, frontend ux-backups237 image/container unchanged; live readUI1440/320 passed. Следующий243 — аудит доступных container/certificate/release jobs и актуальных внешних ограничений. Этап12.5 открыт.
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-14. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
## 12.5.242 — реальный GeoIP mirror job и честное состояние cache (2026-10-14)
В collector обнаруженыfalse-success304 при отсутствующей локальной базе (старый тест прямо принимал это), race до acquisition lock из-за await settings и освобождение timeout после headers вместо body. Теперь gate захватывается до первогоawait; concurrent force409/backgroundskip. Conditional ETag отправляется только после проверки локальной MMDB; missing/corrupt cache требует200 полного файла.304 без validated cache — ошибка, неskippedUnchanged. Partial failures сохраняют дату последнего успешного update и предыдущий файл, добавляя lastError. Новая downloadGeoipDatabase держит120s deadline через streaming body, ограничивает declared/chunked file64MiB и закрывает непригодное тело. Базы проходят existing Country/ASN validation до atomic swap; формат/layout ReUI не менялись.
Local test:geoip прошёл: реальный HTTP healthy/304, stalls after headers→AbortError, declared/chunked oversize→reject, recovery; collector invalid/cache/concurrent gates; JWT reader cannotmutate/writer/admin allowed. Backend/contracts build и scoped ESLint прошли.15 unique GeoIP settings/responsive/data-collection E2E прошли25.2s; ошибочная первоначальная команда с несуществующимиspec далаNo tests found и не считалась проверкой. Три автоматически перегенерированных старыхGeoIP PNG возвращены к исходным байтам; чужие GRE/VXLAN changes сохранены.
Final production source516/compiled1072 matched. В own PostgreSQL/files scope выполнены7 укрупнённых сценариев: actual mirror download обеих MMDB12,380,575bytes, Google8.8.8.8→US/ASN15169, actual conditional304/hash unchanged иconcurrent409, missing-country refetch безETag, corrupt-country refetch, controlled invalid MMDB200/uncached304 сохраняютlastSuccessAt, actual recovery иdisabled background0fetch.12 реальных mirror GET200/304; negative country responses явно контролируемые и не выдаются за native WAN failure. Валидация MMDB не подменялась. Temporary DB/role/container/files удалены, CHRcontacts0/mainDBwrites0 в этом scope. Предварительная сборка с иным downloader отдельно проверялась; повтор не прибавлен кunique приёмке.
Развёрнут только backend ux-geoip242; frontend ux-backups237 image/container ID неизменны. Backendhealthy; real Portal/live GET GeoIP200 иUI1440/320, обе main bases alreadyloaded, globaloverflow0/pageerrors0, POSTupdate0. Main GeoIP job через UI не запускался; реальная загрузка доказана в isolated scope, а не заявлена обновлением данных приложения. Откатbackend ux-backups237 и приватная прежняя.env сохранены на сервере.
Протоколы: [mirror/SQL](ux-ui/acceptance/geoip-mirror242.json), [deployment](ux-ui/acceptance/geoip242-deployment.json), [live read UI](ux-ui/acceptance/geoip242-live-ui.json). MirrorP3TERX — фактический источник collector без account key. Прямой licensed MaxMind download не реализован текущим collector и не принят этим тестом; актуальность/геолокационная точность всех IP, publicIPv6 geography, multi-process lock, physical WAN failures отдельно.
| Референс | Схема состояний |
| --- | --- |
| [ReUI Settings16](https://reui.io/preview/base/settings-16?ref=mcp) | validated cache → conditional304; missing/corrupt → full200 → validate → swap; error → last-good + last-success + warning |
Следующий243 — read-only availability audit контейнерных/ACME/release jobs на текущем стенде и согласованная матрица реальных remaining dependencies. Не выдумывать Cloudflare/registry credentials и не обновлять RouterOS без отдельной команды.
## 12.5.241 — тысяча бэкапов со смешанными состояниями файлов (2026-10-14)
Изменение237 проверено на1000 обычных live-path HTTP DTO (199062bytes), по250 local/missing,both/missing,local/unknown,local/available. Два сценария1440/320 прошли25.2s. UI сохраняет pagination50 строк:DOM2477/2239, ready1203/806ms в dev fixture окружении. Это измерение конкретного запуска, не production SLA/сетевой latency и не доказательство скорости filesystem API1000 файлов.
+19 -1
View File
@@ -1,6 +1,6 @@
# UX/UI: журнал реализации
Актуальное продолжение 2026-10-14:241 — после237 приняты1000 смешанных local/missing,both/missing,unknown,available строк:ПК1440/320, rendered50, DOM2477/2239, search/last-good/pagination/keyboard passed, scoped axe0, writes0. Runtime backend/frontend ux-backups237. S3 native/limitedUI/retention230–240 приняты в записанных границах. Следующий242 — доступный mirror GeoIP job в изолированном scope; paid MaxMind/Cloudflare/Gitea/container jobs отдельно. Этап12.5 открыт.
Актуальное продолжение 2026-10-14:242 — GeoIP mirror job принят в own SQL/files и реальном mirror:12 fetches200/304, две валидные MMDB12,380,575bytes, missing/corrupt recovery, concurrent409, partial error сохраняетlastSuccessAt. Исправлены false304/eager gate/body deadline; download120s/64MiB, HTTP boundary tests и15E2E прошли. Backend ux-geoip242 healthy, frontend ux-backups237 image/container unchanged; live readUI1440/320 passed. Следующий243 — аудит доступных container/certificate/release jobs и актуальных внешних ограничений. Этап12.5 открыт.
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md).
@@ -38,6 +38,24 @@
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 |
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка12.3.83 в границах журнала. Внешняя12.5: блоки1–236 завершены в записанных scopes, этап открыт. Runtime backend ux-backup234/frontend ux-routing218; backend25/UI52 и дополнительные SQL/UDP222 прошли. |
## 12.5.242 — реальный GeoIP mirror job и честное состояние cache (2026-10-14)
В collector обнаруженыfalse-success304 при отсутствующей локальной базе (старый тест прямо принимал это), race до acquisition lock из-за await settings и освобождение timeout после headers вместо body. Теперь gate захватывается до первогоawait; concurrent force409/backgroundskip. Conditional ETag отправляется только после проверки локальной MMDB; missing/corrupt cache требует200 полного файла.304 без validated cache — ошибка, неskippedUnchanged. Partial failures сохраняют дату последнего успешного update и предыдущий файл, добавляя lastError. Новая downloadGeoipDatabase держит120s deadline через streaming body, ограничивает declared/chunked file64MiB и закрывает непригодное тело. Базы проходят existing Country/ASN validation до atomic swap; формат/layout ReUI не менялись.
Local test:geoip прошёл: реальный HTTP healthy/304, stalls after headers→AbortError, declared/chunked oversize→reject, recovery; collector invalid/cache/concurrent gates; JWT reader cannotmutate/writer/admin allowed. Backend/contracts build и scoped ESLint прошли.15 unique GeoIP settings/responsive/data-collection E2E прошли25.2s; ошибочная первоначальная команда с несуществующимиspec далаNo tests found и не считалась проверкой. Три автоматически перегенерированных старыхGeoIP PNG возвращены к исходным байтам; чужие GRE/VXLAN changes сохранены.
Final production source516/compiled1072 matched. В own PostgreSQL/files scope выполнены7 укрупнённых сценариев: actual mirror download обеих MMDB12,380,575bytes, Google8.8.8.8→US/ASN15169, actual conditional304/hash unchanged иconcurrent409, missing-country refetch безETag, corrupt-country refetch, controlled invalid MMDB200/uncached304 сохраняютlastSuccessAt, actual recovery иdisabled background0fetch.12 реальных mirror GET200/304; negative country responses явно контролируемые и не выдаются за native WAN failure. Валидация MMDB не подменялась. Temporary DB/role/container/files удалены, CHRcontacts0/mainDBwrites0 в этом scope. Предварительная сборка с иным downloader отдельно проверялась; повтор не прибавлен кunique приёмке.
Развёрнут только backend ux-geoip242; frontend ux-backups237 image/container ID неизменны. Backendhealthy; real Portal/live GET GeoIP200 иUI1440/320, обе main bases alreadyloaded, globaloverflow0/pageerrors0, POSTupdate0. Main GeoIP job через UI не запускался; реальная загрузка доказана в isolated scope, а не заявлена обновлением данных приложения. Откатbackend ux-backups237 и приватная прежняя.env сохранены на сервере.
Протоколы: [mirror/SQL](ux-ui/acceptance/geoip-mirror242.json), [deployment](ux-ui/acceptance/geoip242-deployment.json), [live read UI](ux-ui/acceptance/geoip242-live-ui.json). MirrorP3TERX — фактический источник collector без account key. Прямой licensed MaxMind download не реализован текущим collector и не принят этим тестом; актуальность/геолокационная точность всех IP, publicIPv6 geography, multi-process lock, physical WAN failures отдельно.
| Референс | Схема состояний |
| --- | --- |
| [ReUI Settings16](https://reui.io/preview/base/settings-16?ref=mcp) | validated cache → conditional304; missing/corrupt → full200 → validate → swap; error → last-good + last-success + warning |
Следующий243 — read-only availability audit контейнерных/ACME/release jobs на текущем стенде и согласованная матрица реальных remaining dependencies. Не выдумывать Cloudflare/registry credentials и не обновлять RouterOS без отдельной команды.
## 12.5.241 — тысяча бэкапов со смешанными состояниями файлов (2026-10-14)
Изменение237 проверено на1000 обычных live-path HTTP DTO (199062bytes), по250 local/missing,both/missing,local/unknown,local/available. Два сценария1440/320 прошли25.2s. UI сохраняет pagination50 строк:DOM2477/2239, ready1203/806ms в dev fixture окружении. Это измерение конкретного запуска, не production SLA/сетевой latency и не доказательство скорости filesystem API1000 файлов.
+23 -5
View File
@@ -1,10 +1,28 @@
# Оставшаяся внешняя приёмка — 2026-10-14
Актуальное продолжение 2026-10-14:241 — после237 приняты1000 смешанных local/missing,both/missing,unknown,available строк:ПК1440/320, rendered50, DOM2477/2239, search/last-good/pagination/keyboard passed, scoped axe0, writes0. Runtime backend/frontend ux-backups237. S3 native/limitedUI/retention230–240 приняты в записанных границах. Следующий242 — доступный mirror GeoIP job в изолированном scope; paid MaxMind/Cloudflare/Gitea/container jobs отдельно. Этап12.5 открыт.
Актуальное продолжение 2026-10-14:242 — GeoIP mirror job принят в own SQL/files и реальном mirror:12 fetches200/304, две валидные MMDB12,380,575bytes, missing/corrupt recovery, concurrent409, partial error сохраняетlastSuccessAt. Исправлены false304/eager gate/body deadline; download120s/64MiB, HTTP boundary tests и15E2E прошли. Backend ux-geoip242 healthy, frontend ux-backups237 image/container unchanged; live readUI1440/320 passed. Следующий243 — аудит доступных container/certificate/release jobs и актуальных внешних ограничений. Этап12.5 открыт.
Это актуальная матрица после 12.5.241. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
Это актуальная матрица после 12.5.242. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-backups237`, frontend `ux-backups237`; 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-geoip242`, frontend `ux-backups237`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись.
## 12.5.242 — реальный GeoIP mirror job и честное состояние cache (2026-10-14)
В collector обнаруженыfalse-success304 при отсутствующей локальной базе (старый тест прямо принимал это), race до acquisition lock из-за await settings и освобождение timeout после headers вместо body. Теперь gate захватывается до первогоawait; concurrent force409/backgroundskip. Conditional ETag отправляется только после проверки локальной MMDB; missing/corrupt cache требует200 полного файла.304 без validated cache — ошибка, неskippedUnchanged. Partial failures сохраняют дату последнего успешного update и предыдущий файл, добавляя lastError. Новая downloadGeoipDatabase держит120s deadline через streaming body, ограничивает declared/chunked file64MiB и закрывает непригодное тело. Базы проходят existing Country/ASN validation до atomic swap; формат/layout ReUI не менялись.
Local test:geoip прошёл: реальный HTTP healthy/304, stalls after headers→AbortError, declared/chunked oversize→reject, recovery; collector invalid/cache/concurrent gates; JWT reader cannotmutate/writer/admin allowed. Backend/contracts build и scoped ESLint прошли.15 unique GeoIP settings/responsive/data-collection E2E прошли25.2s; ошибочная первоначальная команда с несуществующимиspec далаNo tests found и не считалась проверкой. Три автоматически перегенерированных старыхGeoIP PNG возвращены к исходным байтам; чужие GRE/VXLAN changes сохранены.
Final production source516/compiled1072 matched. В own PostgreSQL/files scope выполнены7 укрупнённых сценариев: actual mirror download обеих MMDB12,380,575bytes, Google8.8.8.8→US/ASN15169, actual conditional304/hash unchanged иconcurrent409, missing-country refetch безETag, corrupt-country refetch, controlled invalid MMDB200/uncached304 сохраняютlastSuccessAt, actual recovery иdisabled background0fetch.12 реальных mirror GET200/304; negative country responses явно контролируемые и не выдаются за native WAN failure. Валидация MMDB не подменялась. Temporary DB/role/container/files удалены, CHRcontacts0/mainDBwrites0 в этом scope. Предварительная сборка с иным downloader отдельно проверялась; повтор не прибавлен кunique приёмке.
Развёрнут только backend ux-geoip242; frontend ux-backups237 image/container ID неизменны. Backendhealthy; real Portal/live GET GeoIP200 иUI1440/320, обе main bases alreadyloaded, globaloverflow0/pageerrors0, POSTupdate0. Main GeoIP job через UI не запускался; реальная загрузка доказана в isolated scope, а не заявлена обновлением данных приложения. Откатbackend ux-backups237 и приватная прежняя.env сохранены на сервере.
Протоколы: [mirror/SQL](ux-ui/acceptance/geoip-mirror242.json), [deployment](ux-ui/acceptance/geoip242-deployment.json), [live read UI](ux-ui/acceptance/geoip242-live-ui.json). MirrorP3TERX — фактический источник collector без account key. Прямой licensed MaxMind download не реализован текущим collector и не принят этим тестом; актуальность/геолокационная точность всех IP, publicIPv6 geography, multi-process lock, physical WAN failures отдельно.
| Референс | Схема состояний |
| --- | --- |
| [ReUI Settings16](https://reui.io/preview/base/settings-16?ref=mcp) | validated cache → conditional304; missing/corrupt → full200 → validate → swap; error → last-good + last-success + warning |
Следующий243 — read-only availability audit контейнерных/ACME/release jobs на текущем стенде и согласованная матрица реальных remaining dependencies. Не выдумывать Cloudflare/registry credentials и не обновлять RouterOS без отдельной команды.
## 12.5.241 — тысяча бэкапов со смешанными состояниями файлов (2026-10-14)
@@ -81,7 +99,7 @@ Production backend/frontend ux-backups237 собраны и развёрнуты
| REST и достоверность данных | Ошибки OSPF/BFD/BGP/GRE/WAN215–221 явные; latest API smoke222 прошёл | Correlated236:384 samples/40 diagnostics без отказов; current policies/address/load исправны.828/304 retained REST sessions и vendor inactive-session fix — гипотеза; 238:763.844s/624samples/24diagnostics все200, API records изменились без отказа; причинность401/500 и version control остаются открытыми |
| Клиентские ОС и внешняя сеть | CHR↔CHR/Linux, private IPv4/ULA и synthetic IPv6/IPFIX; Android full-tunnel/reconnect227 подтверждены пользователем | Windows/macOS/iOS VPN, расширенная Android приёмка, независимые WAN/multi-WAN и public IPv6; public IPv6 на текущем стенде отсутствует |
| Масштаб и длительная устойчивость | Контролируемые lock/dedupe/loss/recovery и короткие native проверки | Несколько backend/worker/writers, длительный rekey/REST/traffic, physical disconnect и maximum throughput |
| Внешние хранилища и jobs | Локальные API/errors/RBAC/owned SQL; реальные Portal1.3.1/Telegram195–201 и Selectel S3/client/API/ownSQL228–229 | Large native exports проверены HTTP fixture; Missing local files UX237 принят; Bridge-only S3 restore через UI239 принят; Retention240 в own scope принят; миграция между buckets/multi-instance; provider/container/Gitea/MaxMind jobs с соответствующими endpoints/аккаунтами; private/paid credentials не выдумывать |
| Внешние хранилища и jobs | Локальные API/errors/RBAC/owned SQL; реальные Portal1.3.1/Telegram195–201 и Selectel S3/client/API/ownSQL228–229 | Large native exports проверены HTTP fixture; Missing local files UX237 принят; Bridge-only S3 restore через UI239 принят; Retention240 в own scope принят; миграция между buckets/multi-instance; GeoIP mirror242 принят; прямой licensed MaxMind не реализован; provider/container/Gitea/ACME jobs с соответствующими endpoints/аккаунтами; private/paid credentials не выдумывать |
| Расширенные сетевые конфигурации | GRE/WG/VXLAN/IPsec/OSPF/BFD/BGP сценарии и точные границы записаны | from-pool/EUI-64/multiple-address import/export, outer IPv6, произвольная PKI/OID/policy/path-length и длительные переходы; BFD-only gate гарантией не стал |
| Общий UX, доступность и производительность | Полная UI192 исторически; latest backend25/UI52, scoped contrast/live218 и keyboard206 | Свежая UI226 принята в записанных границах; профильный performance и ручная accessibility/screen-reader приёмка; scoped axe не полный WCAG |
| Границы выпуска | План/доказательства/датированные блоки сохранены; коммиты локальные | Определить требуемые конфигурации и принять результат в этих границах; невыполненные варианты остаются явными ограничениями |
@@ -108,7 +126,7 @@ Portal offline JWT действует доexp после logout/role change; э
## Следующая последовательность — 2026-10-14
1. **242 — доступные external jobs:** actual GeoIP mirror без licence key в own SQL/files scope; отдельно сохранять ограничения paid MaxMind/Cloudflare/registry/Gitea. Затем — актуальная матрица границ выпуска.
1. **243 — availability audit:** read-only packages/device-mode/storage/API/config для containers, ACME и releases; проверить реально доступные GET-сценарии, зафиксировать конкретные внешние зависимости.
2. **Профильный контроль:** для новых изменений выполнять затронутые SQL/API/UI проверки. Общая регрессия192 выполнена; не повторять её без изменений общей основы или нового основания.
3. **Внешние зависимости:** Portal issuer/login/revoke, Telegram bot/chat/разрешённое сообщение, клиентские ОС, независимые WAN/public IPv6 и scale/multi-instance — отдельные группы по таблице выше. Ограничения текущего стенда не превращать в обещание приёмки всех конфигураций.
+19 -1
View File
@@ -1,6 +1,6 @@
# Этап 12: итоговая приёмка UX/UI
Актуальное продолжение 2026-10-14:241 — после237 приняты1000 смешанных local/missing,both/missing,unknown,available строк:ПК1440/320, rendered50, DOM2477/2239, search/last-good/pagination/keyboard passed, scoped axe0, writes0. Runtime backend/frontend ux-backups237. S3 native/limitedUI/retention230–240 приняты в записанных границах. Следующий242 — доступный mirror GeoIP job в изолированном scope; paid MaxMind/Cloudflare/Gitea/container jobs отдельно. Этап12.5 открыт.
Актуальное продолжение 2026-10-14:242 — GeoIP mirror job принят в own SQL/files и реальном mirror:12 fetches200/304, две валидные MMDB12,380,575bytes, missing/corrupt recovery, concurrent409, partial error сохраняетlastSuccessAt. Исправлены false304/eager gate/body deadline; download120s/64MiB, HTTP boundary tests и15E2E прошли. Backend ux-geoip242 healthy, frontend ux-backups237 image/container unchanged; live readUI1440/320 passed. Следующий243 — аудит доступных container/certificate/release jobs и актуальных внешних ограничений. Этап12.5 открыт.
План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.
@@ -4152,6 +4152,24 @@ Real Portal/browser API, provider local verified: создан один job ро
Runtime backend ux-backup234/frontend ux-routing218 healthy; новое application image для volume-only fix не требовалось. Пароли CHR не менялись, S3 mutations0 в235, configs body/JWT не опубликованы, private local manifest удалён. Исходные10 missing local files не восстановлены и records не удалены. Force-recreate — не host reboot/power loss/fsync/DR приёмка. Далее236 — UX недоступных local files, затем version retention границы и оставшиеся7 группы матрицы; multi-instance guard не принимается. Этап12.5 открыт.
## 12.5.242 — реальный GeoIP mirror job и честное состояние cache (2026-10-14)
В collector обнаруженыfalse-success304 при отсутствующей локальной базе (старый тест прямо принимал это), race до acquisition lock из-за await settings и освобождение timeout после headers вместо body. Теперь gate захватывается до первогоawait; concurrent force409/backgroundskip. Conditional ETag отправляется только после проверки локальной MMDB; missing/corrupt cache требует200 полного файла.304 без validated cache — ошибка, неskippedUnchanged. Partial failures сохраняют дату последнего успешного update и предыдущий файл, добавляя lastError. Новая downloadGeoipDatabase держит120s deadline через streaming body, ограничивает declared/chunked file64MiB и закрывает непригодное тело. Базы проходят existing Country/ASN validation до atomic swap; формат/layout ReUI не менялись.
Local test:geoip прошёл: реальный HTTP healthy/304, stalls after headers→AbortError, declared/chunked oversize→reject, recovery; collector invalid/cache/concurrent gates; JWT reader cannotmutate/writer/admin allowed. Backend/contracts build и scoped ESLint прошли.15 unique GeoIP settings/responsive/data-collection E2E прошли25.2s; ошибочная первоначальная команда с несуществующимиspec далаNo tests found и не считалась проверкой. Три автоматически перегенерированных старыхGeoIP PNG возвращены к исходным байтам; чужие GRE/VXLAN changes сохранены.
Final production source516/compiled1072 matched. В own PostgreSQL/files scope выполнены7 укрупнённых сценариев: actual mirror download обеих MMDB12,380,575bytes, Google8.8.8.8→US/ASN15169, actual conditional304/hash unchanged иconcurrent409, missing-country refetch безETag, corrupt-country refetch, controlled invalid MMDB200/uncached304 сохраняютlastSuccessAt, actual recovery иdisabled background0fetch.12 реальных mirror GET200/304; negative country responses явно контролируемые и не выдаются за native WAN failure. Валидация MMDB не подменялась. Temporary DB/role/container/files удалены, CHRcontacts0/mainDBwrites0 в этом scope. Предварительная сборка с иным downloader отдельно проверялась; повтор не прибавлен кunique приёмке.
Развёрнут только backend ux-geoip242; frontend ux-backups237 image/container ID неизменны. Backendhealthy; real Portal/live GET GeoIP200 иUI1440/320, обе main bases alreadyloaded, globaloverflow0/pageerrors0, POSTupdate0. Main GeoIP job через UI не запускался; реальная загрузка доказана в isolated scope, а не заявлена обновлением данных приложения. Откатbackend ux-backups237 и приватная прежняя.env сохранены на сервере.
Протоколы: [mirror/SQL](ux-ui/acceptance/geoip-mirror242.json), [deployment](ux-ui/acceptance/geoip242-deployment.json), [live read UI](ux-ui/acceptance/geoip242-live-ui.json). MirrorP3TERX — фактический источник collector без account key. Прямой licensed MaxMind download не реализован текущим collector и не принят этим тестом; актуальность/геолокационная точность всех IP, publicIPv6 geography, multi-process lock, physical WAN failures отдельно.
| Референс | Схема состояний |
| --- | --- |
| [ReUI Settings16](https://reui.io/preview/base/settings-16?ref=mcp) | validated cache → conditional304; missing/corrupt → full200 → validate → swap; error → last-good + last-success + warning |
Следующий243 — read-only availability audit контейнерных/ACME/release jobs на текущем стенде и согласованная матрица реальных remaining dependencies. Не выдумывать Cloudflare/registry credentials и не обновлять RouterOS без отдельной команды.
## 12.5.241 — тысяча бэкапов со смешанными состояниями файлов (2026-10-14)
Изменение237 проверено на1000 обычных live-path HTTP DTO (199062bytes), по250 local/missing,both/missing,local/unknown,local/available. Два сценария1440/320 прошли25.2s. UI сохраняет pagination50 строк:DOM2477/2239, ready1203/806ms в dev fixture окружении. Это измерение конкретного запуска, не production SLA/сетевой latency и не доказательство скорости filesystem API1000 файлов.
+19 -1
View File
@@ -1,6 +1,6 @@
# Тестовый сервер UX/UI — 2026-10-10
Актуальное продолжение 2026-10-14:241 — после237 приняты1000 смешанных local/missing,both/missing,unknown,available строк:ПК1440/320, rendered50, DOM2477/2239, search/last-good/pagination/keyboard passed, scoped axe0, writes0. Runtime backend/frontend ux-backups237. S3 native/limitedUI/retention230–240 приняты в записанных границах. Следующий242 — доступный mirror GeoIP job в изолированном scope; paid MaxMind/Cloudflare/Gitea/container jobs отдельно. Этап12.5 открыт.
Актуальное продолжение 2026-10-14:242 — GeoIP mirror job принят в own SQL/files и реальном mirror:12 fetches200/304, две валидные MMDB12,380,575bytes, missing/corrupt recovery, concurrent409, partial error сохраняетlastSuccessAt. Исправлены false304/eager gate/body deadline; download120s/64MiB, HTTP boundary tests и15E2E прошли. Backend ux-geoip242 healthy, frontend ux-backups237 image/container unchanged; live readUI1440/320 passed. Следующий243 — аудит доступных container/certificate/release jobs и актуальных внешних ограничений. Этап12.5 открыт.
| Параметр | Проверенное состояние |
| --- | --- |
@@ -34,6 +34,24 @@ OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/bro
BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json).
## 12.5.242 — реальный GeoIP mirror job и честное состояние cache (2026-10-14)
В collector обнаруженыfalse-success304 при отсутствующей локальной базе (старый тест прямо принимал это), race до acquisition lock из-за await settings и освобождение timeout после headers вместо body. Теперь gate захватывается до первогоawait; concurrent force409/backgroundskip. Conditional ETag отправляется только после проверки локальной MMDB; missing/corrupt cache требует200 полного файла.304 без validated cache — ошибка, неskippedUnchanged. Partial failures сохраняют дату последнего успешного update и предыдущий файл, добавляя lastError. Новая downloadGeoipDatabase держит120s deadline через streaming body, ограничивает declared/chunked file64MiB и закрывает непригодное тело. Базы проходят existing Country/ASN validation до atomic swap; формат/layout ReUI не менялись.
Local test:geoip прошёл: реальный HTTP healthy/304, stalls after headers→AbortError, declared/chunked oversize→reject, recovery; collector invalid/cache/concurrent gates; JWT reader cannotmutate/writer/admin allowed. Backend/contracts build и scoped ESLint прошли.15 unique GeoIP settings/responsive/data-collection E2E прошли25.2s; ошибочная первоначальная команда с несуществующимиspec далаNo tests found и не считалась проверкой. Три автоматически перегенерированных старыхGeoIP PNG возвращены к исходным байтам; чужие GRE/VXLAN changes сохранены.
Final production source516/compiled1072 matched. В own PostgreSQL/files scope выполнены7 укрупнённых сценариев: actual mirror download обеих MMDB12,380,575bytes, Google8.8.8.8→US/ASN15169, actual conditional304/hash unchanged иconcurrent409, missing-country refetch безETag, corrupt-country refetch, controlled invalid MMDB200/uncached304 сохраняютlastSuccessAt, actual recovery иdisabled background0fetch.12 реальных mirror GET200/304; negative country responses явно контролируемые и не выдаются за native WAN failure. Валидация MMDB не подменялась. Temporary DB/role/container/files удалены, CHRcontacts0/mainDBwrites0 в этом scope. Предварительная сборка с иным downloader отдельно проверялась; повтор не прибавлен кunique приёмке.
Развёрнут только backend ux-geoip242; frontend ux-backups237 image/container ID неизменны. Backendhealthy; real Portal/live GET GeoIP200 иUI1440/320, обе main bases alreadyloaded, globaloverflow0/pageerrors0, POSTupdate0. Main GeoIP job через UI не запускался; реальная загрузка доказана в isolated scope, а не заявлена обновлением данных приложения. Откатbackend ux-backups237 и приватная прежняя.env сохранены на сервере.
Протоколы: [mirror/SQL](ux-ui/acceptance/geoip-mirror242.json), [deployment](ux-ui/acceptance/geoip242-deployment.json), [live read UI](ux-ui/acceptance/geoip242-live-ui.json). MirrorP3TERX — фактический источник collector без account key. Прямой licensed MaxMind download не реализован текущим collector и не принят этим тестом; актуальность/геолокационная точность всех IP, publicIPv6 geography, multi-process lock, physical WAN failures отдельно.
| Референс | Схема состояний |
| --- | --- |
| [ReUI Settings16](https://reui.io/preview/base/settings-16?ref=mcp) | validated cache → conditional304; missing/corrupt → full200 → validate → swap; error → last-good + last-success + warning |
Следующий243 — read-only availability audit контейнерных/ACME/release jobs на текущем стенде и согласованная матрица реальных remaining dependencies. Не выдумывать Cloudflare/registry credentials и не обновлять RouterOS без отдельной команды.
## 12.5.241 — тысяча бэкапов со смешанными состояниями файлов (2026-10-14)
Изменение237 проверено на1000 обычных live-path HTTP DTO (199062bytes), по250 local/missing,both/missing,local/unknown,local/available. Два сценария1440/320 прошли25.2s. UI сохраняет pagination50 строк:DOM2477/2239, ready1203/806ms в dev fixture окружении. Это измерение конкретного запуска, не production SLA/сетевой latency и не доказательство скорости filesystem API1000 файлов.
+129
View File
@@ -0,0 +1,129 @@
{
"date": "2026-10-14",
"block": "12.5.242",
"passed": true,
"scope": "Compiled GeoIP collector + owned PostgreSQL/files + actual public mirror; controlled negative bodies separately marked",
"mirrorRequests": [
{
"file": "GeoLite2-Country.mmdb",
"conditional": false,
"status": 200,
"headersMs": 1112
},
{
"file": "GeoLite2-ASN.mmdb",
"conditional": false,
"status": 200,
"headersMs": 1209
},
{
"file": "GeoLite2-Country.mmdb",
"conditional": true,
"status": 304,
"headersMs": 97
},
{
"file": "GeoLite2-ASN.mmdb",
"conditional": true,
"status": 304,
"headersMs": 126
},
{
"file": "GeoLite2-Country.mmdb",
"conditional": false,
"status": 200,
"headersMs": 94
},
{
"file": "GeoLite2-ASN.mmdb",
"conditional": true,
"status": 304,
"headersMs": 99
},
{
"file": "GeoLite2-Country.mmdb",
"conditional": false,
"status": 200,
"headersMs": 94
},
{
"file": "GeoLite2-ASN.mmdb",
"conditional": true,
"status": 304,
"headersMs": 104
},
{
"file": "GeoLite2-ASN.mmdb",
"conditional": true,
"status": 304,
"headersMs": 93
},
{
"file": "GeoLite2-ASN.mmdb",
"conditional": true,
"status": 304,
"headersMs": 123
},
{
"file": "GeoLite2-Country.mmdb",
"conditional": false,
"status": 200,
"headersMs": 102
},
{
"file": "GeoLite2-ASN.mmdb",
"conditional": true,
"status": 304,
"headersMs": 90
}
],
"checks": [
{
"name": "actual-two-downloads-valid-mmdb-and-lookup",
"bytes": 12380575,
"hashes": {
"country": "635078e412c4443a2950c2e3f775ccdc400e0a1fea5ffd32e5489e5401a9e51d",
"asn": "7d1cf6cd79a0f35b446570058efb7d05cb6db6dd10bbbc09c3699473f6860cba"
},
"settings": {
"enabled": false,
"updateIntervalSec": 604800,
"lastCheckAt": "2026-10-14 07:59:58.997+00",
"lastSuccessAt": "2026-10-14 07:59:58.997+00",
"lastError": null,
"countryBuildAt": "2026-10-09 16:52:08+00",
"asnBuildAt": "2026-10-12 08:15:43+00",
"updatedAt": "2026-10-14 08:00:02.048+00"
},
"lookup": {
"country": "US",
"asn": 15169
}
},
{
"name": "actual-conditional304-and-concurrent409",
"skippedUnchanged": 2,
"hashesUnchanged": true
},
{
"name": "missing-country-refetched-without-conditional-header"
},
{
"name": "corrupt-local-country-refetched-and-validated"
},
{
"name": "controlled-invalid-body-preserves-file-and-last-success",
"negativeCountryResponse": "controlled-200-invalid-MMDB",
"realAsnStatus": 304
},
{
"name": "controlled-uncached304-is-error-with-last-success-retained"
},
{
"name": "actual-recovery-and-disabled-background-no-fetch"
}
],
"chrContacts": 0,
"mainDatabaseWrites": 0,
"ownedDatabaseAndRoleRemoved": true
}
@@ -0,0 +1,24 @@
{
"date": "2026-10-14",
"block": "12.5.242",
"backendSourceMatched": 516,
"backendCompiledMatched": 1072,
"frontendImageAndContainerUnchanged": true,
"containers": {
"backend": {
"tag": "mmapp-test/backend:ux-geoip242",
"imageId": "sha256:32214bbd6b3df479cf5b503fd370b96abddbe5497fe5fe0fd4b72a009d730a6e",
"containerId": "675dd3412be519a2a92bcd68148db0328264ed784537dd9a3c9e5ce74b33f3ad",
"state": "running",
"health": "healthy"
},
"frontend": {
"tag": "mmapp-test/frontend:ux-backups237",
"imageId": "sha256:baf9989cde6527715890e608c2c3271c5ea40dfb235ee47a48e21939b0ec1fd0",
"containerId": "dc078016b263444b4e15d3445d8ce5b23c9d93e9707e797d63744e5add881e39",
"state": "running",
"health": null
}
},
"rollbackBackend": "ux-backups237"
}
@@ -0,0 +1,25 @@
{
"date": "2026-10-14",
"block": "12.5.242",
"realPortalLogin": true,
"noMocks": true,
"apiStatus": 200,
"ready": true,
"countryLoaded": true,
"asnLoaded": true,
"views": [
{
"width": 1440,
"globalOverflow": false,
"geoipSectionVisible": true
},
{
"width": 320,
"globalOverflow": false,
"geoipSectionVisible": true
}
],
"pageErrors": [],
"geoipUpdates": 0,
"uiDidNotRequestGeoipUpdate": true
}