diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index 66c004b2..eb93f42f 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -1,6 +1,6 @@ # UX/UI: протокол внешней приёмки 12.5 -Статус на 2026-10-07:стенд161.104.46.222 развёрнут;PG-1 проверенbootstrap/restart/schema/control-row,приложение прошлоreal smoke. ОстальныеPG/Q/ROS/интеграционные сценарии ещё не выполнены. [Паспорт и evidence](ux-ui-test-server.md). Локальные браузерные и DI-проверки записаны в [журнале](ux-ui-progress.md), общий объём — в [плане](ux-ui-plan.md). Результат каждого внешнего сценария заполняется после выполнения, с указанием HEAD и стенда. +Статус на 2026-10-07: стенд161.104.46.222/source673e5ba развёрнут; PG-1 проверен в границах bootstrap/restart/schema/control-row, PG-2 проверен архивом и отдельной БД, PG-5 — реальными конкурентными backup/restore HTTP200/409. PG-7 — HTTP RBAC 401/403 при AUTH_REQUIRED=true, без доказательства отсутствия процессов и реального Portal SSO. Native TCP transmit/receive/both по3s и первоначальный отказ подключения проверены на паре CHR; прочие ROS/PG/Q/интеграционные сценарии остаются открытыми. [PG evidence](ux-ui/acceptance/pg-backup-auth-2026-10-07.json), [паспорт](ux-ui-test-server.md), [журнал](ux-ui-progress.md), [план](ux-ui-plan.md). ## Паспорт стенда diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 22df4a62..60ddc894 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,6 +1,6 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-07:12.5.5–6 завершены:второйCHR online,bandwidth-server включён сauthenticate=true поразрешениюпользователя;3nativeTCP tests transmit/receive/both по3s подтвержденыAPI/GETистории/UI. Первоначальный отказкорректно записанerror/null;Ping0%loss. Следующий12.5.7 — PG/остальные сетевые и интеграционные сценарии. Вся12.5 остаётся открытой. +Актуальное продолжение 2026-10-07: блок 12.5.7 завершён. Реальные PG-2 (backup и проверочное восстановление отдельной БД) и PG-5 (backup/restore конфликт 409) проверены; PG-7 подтверждён в границах HTTP RBAC. Следующий 12.5.8 — завершение текущих jobs/flush перед restore и проверка PG-6. Вся 12.5 остаётся открытой. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-07. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 4f5256c7..47432991 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-07:12.5.5–6 завершены:второйCHR online,bandwidth-server включён сauthenticate=true поразрешениюпользователя;3nativeTCP tests transmit/receive/both по3s подтвержденыAPI/GETистории/UI. Первоначальный отказкорректно записанerror/null;Ping0%loss. Следующий12.5.7 — PG/остальные сетевые и интеграционные сценарии. Вся12.5 остаётся открытой. +Актуальное продолжение 2026-10-07: блок 12.5.7 завершён. Реальные PG-2 (backup и проверочное восстановление отдельной БД) и PG-5 (backup/restore конфликт 409) проверены; PG-7 подтверждён в границах HTTP RBAC. Следующий 12.5.8 — завершение текущих jobs/flush перед restore и проверка PG-6. Вся 12.5 остаётся открытой. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -34,6 +34,16 @@ | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | | 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в описанных границах:12.3.83,main1186/1186,context221/221. Этап остаётся в работе: стенд12.5.1–3 развёрнут,bootstrap/smoke проверены;остальные сценарии12.5 не выполнены. | +## 12.5.7 — реальный архив PostgreSQL, права и конкуренция операций (2026-10-07) + +Стенд 161.104.46.222, source 673e5ba, PostgreSQL/server и pg_restore/client 18.6. [Очищенный отчёт](ux-ui/acceptance/pg-backup-auth-2026-10-07.json). Для проверки прав временно включён AUTH_REQUIRED=true; JWT с тестовым issuer сформированы только в памяти контейнера. Восемь запросов backup/restore: anonymous и wrong issuer → 401, settings writer и wrong app → 403. Admin mm:settings:admin получил backup HTTP200, 475225 байт, PGDMP, SHA256 a6b66402b28bdb146cae9712c384979aa1c1000fee19cbc97c0ec045b673c002, outcome {} без предупреждений. Настоящий Portal SSO и отсутствие процессов при отказах отдельно не инструментированы: PG-7 принят только в границах HTTP RBAC. + +PG-2: pg_restore --list прочитал 907 TOC entries, включая servers, uptime_settings, uptime_speed_test_runs и schema_migrations. Архив успешно восстановлен pg_restore --single-transaction --exit-on-error в отдельную mmapp_acceptance_20261007, exit0. Независимые SQL сравнили исходную/проверочную БД: два server ID/IP, retention14, девять миграций, пять speed history rows с одинаковым digest, servers_id_seq last_value2/is_called=true. Новая запись после restore не выполнялась; API restore основной тестовой БД этим не проверен. Архив содержит учётные данные и остался только на сервере: data/acceptance-private 0700, dump0600, вне Git. Проверочная БД сохранена, активных соединений к ней после теста0. + +PG-5: отдельная SQL-транзакция временно удерживала ACCESS EXCLUSIVE lock таблицы servers, первый HTTP backup запустил реальный pg_dump. Независимое соединение наблюдателя подтвердило application_name=pg_dump/wait_event_type=Lock/wait_event=relation. Конкурирующий POST restore с валидным доверенным архивом получил409 «Операция с базой приложения уже выполняется». После ROLLBACK тестового lock первый backup вернул200/PGDMP/478793 байта. Первая попытка наблюдения использовала кешированный stats snapshot внутри удерживающей транзакции и не увидела процесс; исправлена отдельным observer connection, повторная проверка прошла. Первый контрольный SQL ошибочно называл таблицу uptime_speed_runs; исправлен на uptime_speed_test_runs. + +Выявлен незакрытый PG-6: stopScheduler отменяет таймеры без ожидания текущих jobs; stopTrafficFlowListener вызывает flushPending без await и не подтверждает завершение worker. API restore основной БД не запускался. После проверки AUTH_REQUIRED возвращён в false, /api/auth/config это подтвердил, /health ok/version1.0.0-test.673e5ba; listener по-прежнему disabled/alivefalse/boundfalse. Код продукта и RouterOS в этом блоке не менялись. Следующий 12.5.8: обеспечить ожидание завершения jobs/flush/worker, проверить lifecycle перед PG-3/4; остальной протокол остаётся открытым. Локальный коммит без push. + ## 12.5.6 — реальные TCP bandwidth-test на паре CHR (2026-10-07) Source194.226.121.150(id1) → destination104.165.244.7(id2),RouterOS7.24.5;приложение673e5ba на161.104.46.222. Первыйtransmit3s вернул502/native «не смог подключиться»;GET истории подтвердилerror иTX/RXnull. Остальныеавтоматические запуски остановлены. ЧтениеRouterOS показалоbandwidth-server enabled=false наобоихCHR. [Первоначальная ошибка](ux-ui/acceptance/chr-native-speed-2026-10-07.json). diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index f4b082f4..988fc33a 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-07:12.5.5–6 завершены:второйCHR online,bandwidth-server включён сauthenticate=true поразрешениюпользователя;3nativeTCP tests transmit/receive/both по3s подтвержденыAPI/GETистории/UI. Первоначальный отказкорректно записанerror/null;Ping0%loss. Следующий12.5.7 — PG/остальные сетевые и интеграционные сценарии. Вся12.5 остаётся открытой. +Актуальное продолжение 2026-10-07: блок 12.5.7 завершён. Реальные PG-2 (backup и проверочное восстановление отдельной БД) и PG-5 (backup/restore конфликт 409) проверены; PG-7 подтверждён в границах HTTP RBAC. Следующий 12.5.8 — завершение текущих jobs/flush перед restore и проверка PG-6. Вся 12.5 остаётся открытой. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -1000,3 +1000,13 @@ Source194.226.121.150(id1) → destination104.165.244.7(id2),RouterOS7.24.5;пр Повторные короткиеTCP tests transmit/receive/both по3s прошлиHTTP200;native массивзаканчиваетсяdone testing. Transmit:TX1771.419912Mbps/RXnull;receive:TXnull/RX1454.885984Mbps;both:TX1124.95272/RX863.660264Mbps. After-ping53–54ms/0%loss. [Очищенные API receipts и независимый GET истории](ux-ui/acceptance/chr-native-speed-enabled-2026-10-07.json) совпали поrunId/endpoints/direction/duration/averages/date/status. Nativeданные не подменены моками;неизмеренная сторонаnull,первый отказ не объявленdone/zero. RealUI показывает3successful и1failedhistoryrows,неизмеренная сторона «Неизвестно»,320px fits. ПервыйUI-selector ожидал русские «Готово/Ошибка»,но существующаятаблица выводитdone/error;проверка уточнена пофактическим caption,продуктовый код не менялся. Это короткая функциональная проверкаTCP,не benchmark устойчивой скорости и неWAN-interface/source binding. Ad-hoc runs безprobeId:probe ownership/snapshot race этим не проверены. PGbackup/restore/concurrency/права/workers,ROS остальныеошибки/UDP/OSPF/VPN/интеграции ещё не приняты. Следующий12.5.7 — продолжение протокола;локальныйкоммит безpush,credentials в evidence отсутствуют. + +## 12.5.7 — реальный архив PostgreSQL, права и конкуренция операций (2026-10-07) + +Стенд 161.104.46.222, source 673e5ba, PostgreSQL/server и pg_restore/client 18.6. [Очищенный отчёт](ux-ui/acceptance/pg-backup-auth-2026-10-07.json). Для проверки прав временно включён AUTH_REQUIRED=true; JWT с тестовым issuer сформированы только в памяти контейнера. Восемь запросов backup/restore: anonymous и wrong issuer → 401, settings writer и wrong app → 403. Admin mm:settings:admin получил backup HTTP200, 475225 байт, PGDMP, SHA256 a6b66402b28bdb146cae9712c384979aa1c1000fee19cbc97c0ec045b673c002, outcome {} без предупреждений. Настоящий Portal SSO и отсутствие процессов при отказах отдельно не инструментированы: PG-7 принят только в границах HTTP RBAC. + +PG-2: pg_restore --list прочитал 907 TOC entries, включая servers, uptime_settings, uptime_speed_test_runs и schema_migrations. Архив успешно восстановлен pg_restore --single-transaction --exit-on-error в отдельную mmapp_acceptance_20261007, exit0. Независимые SQL сравнили исходную/проверочную БД: два server ID/IP, retention14, девять миграций, пять speed history rows с одинаковым digest, servers_id_seq last_value2/is_called=true. Новая запись после restore не выполнялась; API restore основной тестовой БД этим не проверен. Архив содержит учётные данные и остался только на сервере: data/acceptance-private 0700, dump0600, вне Git. Проверочная БД сохранена, активных соединений к ней после теста0. + +PG-5: отдельная SQL-транзакция временно удерживала ACCESS EXCLUSIVE lock таблицы servers, первый HTTP backup запустил реальный pg_dump. Независимое соединение наблюдателя подтвердило application_name=pg_dump/wait_event_type=Lock/wait_event=relation. Конкурирующий POST restore с валидным доверенным архивом получил409 «Операция с базой приложения уже выполняется». После ROLLBACK тестового lock первый backup вернул200/PGDMP/478793 байта. Первая попытка наблюдения использовала кешированный stats snapshot внутри удерживающей транзакции и не увидела процесс; исправлена отдельным observer connection, повторная проверка прошла. Первый контрольный SQL ошибочно называл таблицу uptime_speed_runs; исправлен на uptime_speed_test_runs. + +Выявлен незакрытый PG-6: stopScheduler отменяет таймеры без ожидания текущих jobs; stopTrafficFlowListener вызывает flushPending без await и не подтверждает завершение worker. API restore основной БД не запускался. После проверки AUTH_REQUIRED возвращён в false, /api/auth/config это подтвердил, /health ok/version1.0.0-test.673e5ba; listener по-прежнему disabled/alivefalse/boundfalse. Код продукта и RouterOS в этом блоке не менялись. Следующий 12.5.8: обеспечить ожидание завершения jobs/flush/worker, проверить lifecycle перед PG-3/4; остальной протокол остаётся открытым. Локальный коммит без push. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index 3cfbafce..9ddff43f 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -54,7 +54,7 @@ ssh -N -L 3000:127.0.0.1:3000 -L 8000:127.0.0.1:8000 root@161.104.46.222 После пересборки контрольныйid1/retention14 и9миграций сохранились. Подробные build logs и контрольные файлы расположены в /opt/mmapp-test/artifacts. Секреты остаются только в серверном.env0600. Временный SSH-туннель3000/8000 открыт в этой задаче;если процесс остановится,повторить команду выше. -Следующий12.5.5 — PG backup/restore/concurrency/права и наблюдаемая остановка workers по [протоколу12.5](ux-ui-external-acceptance.md). Эти сценарии ещё не выполнены. Для RouterOS/Telegram/Portal и других интеграций нужны тестовые устройства/учётные записи. 1CPU/2GiB не представляют production performance. +Продолжение PG проверок записано в блоке 12.5.7 ниже. Следующий 12.5.8 — lifecycle jobs/flush/worker перед API restore по [протоколу](ux-ui-external-acceptance.md). Для Telegram/Portal и других интеграций нужны тестовые endpoints/учётные записи. 1CPU/2GiB не представляют production performance. ## Первый тестовый CHR — 2026-10-07 @@ -67,3 +67,9 @@ ssh -N -L 3000:127.0.0.1:3000 -L 8000:127.0.0.1:8000 root@161.104.46.222 ## 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 подтверждены. [Настройки](ux-ui/acceptance/chr-bandwidth-server-2026-10-07.json),[результаты](ux-ui/acceptance/chr-native-speed-enabled-2026-10-07.json),[предыдущий отказ при выключенной службе](ux-ui/acceptance/chr-native-speed-2026-10-07.json). Это функциональная проверка,неbenchmark;UDP/WANbinding/probe-races/остальнойROS иPG-протокол не закрыты. + +## PostgreSQL backup/RBAC/concurrency — 2026-10-07 + +[Отчёт 12.5.7](ux-ui/acceptance/pg-backup-auth-2026-10-07.json): 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 пока не обеспечено. diff --git a/docs/ux-ui/acceptance/pg-backup-auth-2026-10-07.json b/docs/ux-ui/acceptance/pg-backup-auth-2026-10-07.json new file mode 100644 index 00000000..2b483613 --- /dev/null +++ b/docs/ux-ui/acceptance/pg-backup-auth-2026-10-07.json @@ -0,0 +1,235 @@ +{ + "date": "2026-10-07", + "source": "673e5ba", + "authRequired": true, + "denials": [ + { + "label": "anonymous", + "method": "GET", + "path": "backup", + "status": 401, + "error": "Unauthorized" + }, + { + "label": "anonymous", + "method": "POST", + "path": "restore", + "status": 401, + "error": "Unauthorized" + }, + { + "label": "settings-writer", + "method": "GET", + "path": "backup", + "status": 403, + "error": "Недостаточно прав: mm:settings:admin" + }, + { + "label": "settings-writer", + "method": "POST", + "path": "restore", + "status": 403, + "error": "Недостаточно прав: mm:settings:admin" + }, + { + "label": "wrong-app", + "method": "GET", + "path": "backup", + "status": 403, + "error": "Нет доступа к приложению MikrotikManager" + }, + { + "label": "wrong-app", + "method": "POST", + "path": "restore", + "status": 403, + "error": "Нет доступа к приложению MikrotikManager" + }, + { + "label": "wrong-issuer", + "method": "GET", + "path": "backup", + "status": 401, + "error": "Unauthorized" + }, + { + "label": "wrong-issuer", + "method": "POST", + "path": "restore", + "status": 401, + "error": "Unauthorized" + } + ], + "backup": { + "status": 200, + "bytes": 475225, + "sha256": "a6b66402b28bdb146cae9712c384979aa1c1000fee19cbc97c0ec045b673c002", + "signature": "PGDMP", + "filename": "attachment; filename=\"mikrotik-manager_2026-10-07_15-31-18.dump\"", + "outcome": {} + }, + "conflict": { + "date": "2026-10-07", + "scenario": "PG-5", + "authRequired": false, + "activeDump": [ + { + "application_name": "pg_dump", + "wait_event_type": "Lock", + "wait_event": "relation" + } + ], + "second": { + "method": "POST", + "path": "restore", + "status": 409, + "body": { + "error": "Операция с базой приложения уже выполняется" + } + }, + "first": { + "method": "GET", + "path": "backup", + "status": 200, + "bytes": 478793, + "signature": "PGDMP" + } + }, + "controls": { + "mmapp": { + "servers": [ + { + "id": "1", + "host": "194.226.121.150" + }, + { + "id": "2", + "host": "104.165.244.7" + } + ], + "uptimeSettings": [ + { + "id": "1", + "retention_days": 14 + } + ], + "migrations": [ + { + "id": "0000_postgresql" + }, + { + "id": "0002_compact_schema" + }, + { + "id": "0003_backup_s3" + }, + { + "id": "0004_geoip_settings" + }, + { + "id": "0005_flow_facts" + }, + { + "id": "0006_config_revisions" + }, + { + "id": "0007_flow_buckets_nat" + }, + { + "id": "0008_alert_outbox_outcomes" + }, + { + "id": "0009_alert_outbox_resolution" + } + ], + "speed": { + "count": 5, + "digest": "6d82b65f9ca64a309d5bf6a60163135a" + }, + "serversSequence": { + "last_value": "2", + "is_called": true + } + }, + "mmapp_acceptance_20261007": { + "servers": [ + { + "id": "1", + "host": "194.226.121.150" + }, + { + "id": "2", + "host": "104.165.244.7" + } + ], + "uptimeSettings": [ + { + "id": "1", + "retention_days": 14 + } + ], + "migrations": [ + { + "id": "0000_postgresql" + }, + { + "id": "0002_compact_schema" + }, + { + "id": "0003_backup_s3" + }, + { + "id": "0004_geoip_settings" + }, + { + "id": "0005_flow_facts" + }, + { + "id": "0006_config_revisions" + }, + { + "id": "0007_flow_buckets_nat" + }, + { + "id": "0008_alert_outbox_outcomes" + }, + { + "id": "0009_alert_outbox_resolution" + } + ], + "speed": { + "count": 5, + "digest": "6d82b65f9ca64a309d5bf6a60163135a" + }, + "serversSequence": { + "last_value": "2", + "is_called": true + } + } + }, + "controlsMatch": true, + "scratchRestore": { + "database": "mmapp_acceptance_20261007", + "exitCode": 0, + "method": "pg_restore --single-transaction --exit-on-error", + "apiRestoreTested": false + }, + "limits": [ + "No live database restore performed", + "PG-6 pending: scheduler jobs and flow flush are not awaited", + "JWT generated in memory with test issuer; real Portal SSO not tested", + "No pg_dump/pg_restore process tracing during denied requests; PG-7 only HTTP RBAC evidence", + "Initial PG-5 observer reused transaction snapshot; rerun used separate observer connection", + "Initial control query used incorrect table name; corrected to uptime_speed_test_runs" + ], + "archiveValidation": { + "tocEntries": 907, + "requiredObjects": { + "servers": true, + "uptime_settings": true, + "uptime_speed_test_runs": true, + "schema_migrations": true + }, + "clientVersion": "pg_restore (PostgreSQL) 18.6 (Debian 18.6-1.pgdg12+2)" + } +} \ No newline at end of file