fix(settings): восстанавливать базу транзакционно и сохранять результат операции

This commit is contained in:
Denozordec committed 2026-10-03 14:45:51 +07:00
1 parent ff8b04bddf
commit af5dbb0519
12 files changed
+86 -40

No files matched your search

+9 -1
View File
@@ -28,7 +28,7 @@
| 9 | VPN, Firewall и Filters | Завершён в границах локальной приёмки 2026-09-30; блоки 9.1–9.64, ограничения в 9.64 |
| 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 |
| 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 |
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | В работе: 11Б.1–11Б.3.6.2.1; scheduler и GeoIP приняты локально; NetFlow принят локально; Evolution принят локально; далее общие Settings |
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | В работе: 11Б.1–11Б.3.6.2.2.1; scheduler и GeoIP приняты локально; NetFlow принят локально; Evolution принят локально; далее общие Settings |
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Не начат |
@@ -36,6 +36,14 @@
## Блок 11Б.3.6.2.2.1 — выполнение восстановления PostgreSQL (2026-10-03)
- Restore executor вынесен в pure DI helper. Production pg_restore получает --single-transaction вместе с --clean/--if-exists; validate size/PGDMP prefix выполняется до lock/остановки сборщиков и повторно в executor. Команда не повторяется, временный файл удаляется при write/run error. Cleanup failure после успешной команды — отдельный cleanupError, не отменяет её подтверждённый результат; основная ошибка не подменяется cleanup error.
- Backend receipt и frontend strict parser поддерживают cleanupError; Settings показывает предупреждение отдельно от успеха. File selection больше не сообщает «Импорт выполнен»: FileImportDialog получил optional actionLabel/successMessage, Settings использует «Продолжить» и suppress success. Остальные callers сохраняют прежние defaults. Confirmation preventDefault удерживает dialog до receipt; ошибка сохраняет выбранный файл.
- 4 DI executor tests, 3 API unit группы, 2 browser receipt сценария (false → нет успеха/dialog сохранён; true+cleanupError → success+warning), backend build/typecheck/профильный lint и production frontend/contracts build прошли. Profile test:system-database включён в backend test.
- Это проверка переданных аргументов/управления выполнением, не реальное доказательство PG rollback/совместимости архива. Настоящий PG restore/pg_dump не запускался; UDP worker stop acknowledgment не доказан. Внешний withDatabaseOperation restart/listener/scheduler и appendEvent всё ещё могут скрыть уже выполненный результат; остаётся source/lock/unknown review в форме. System DB целиком не принят.
- Следующий точный шаг 11Б.3.6.2.2.2: разделить результат core операции и failures restart listener/scheduler/event в backend, DI HTTP/JWT gates и запрет повторной конкурентной операции. Затем 11Б.3.6.2.3: отдельная форма DB с active/source guards, общим sync lock, unknown checkpoint и адаптивной приёмкой. Alerts/Releases/probe scheduling и итоговая 11Б/12 ещё впереди.
## Блок 11Б.3.6.2.1 — system database API и журнал (2026-10-03)
- Export reader проверяет PGDMP prefix/nonempty binary вместо принятия HTML/JSON, безопасное leaf filename (RFC5987/quoted/plain) и fallback .dump вместо .db. Restore проверяет размер ≤512 МБ, PGDMP prefix и caller abort до POST; после запроса нужен strict literal ok receipt, false/204/malformed/contradictory error не дают успеха. Нет автоматического повтора; 10 минут timeout/caller signal не отменяет серверное восстановление.