chore(test): проверить архив PostgreSQL, права и конфликт операций

This commit is contained in:
Denozordec committed 2026-10-07 22:36:24 +07:00
1 parent 66bed28382
commit 6720ad3539
6 files changed
+266 -5

No files matched your search

+1 -1
View File
@@ -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).
## Паспорт стенда
+1 -1
View File
@@ -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). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
+11 -1
View File
@@ -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).
+11 -1
View File
@@ -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.
+7 -1
View File
@@ -54,7 +54,7 @@ ssh -N -L 3000:127.0.0.1:3000 -L 8000:127.0.0.1:8000 [email protected]
После пересборки контрольный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 [email protected]
## 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 пока не обеспечено.
@@ -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)"
}
}