Резервные копии: UX и визуальная спецификация
Статус: проект интерфейса, 2026-09-26; первый экран консоли реализован 2026-10-02 (см. ниже). Backend B2 реализован (2026-10-02, ADR 0056): консоль строится на /api/v1/backup через SDK client.backup — статус, план с CAS, задания, точки, закрепление, preview/apply retention и предупреждения с машинными кодами. Реализовать поверх BACKUP_RECOVERY, не добавляя в рабочую консоль фиктивные «успешные» операции.
Реализовано в консоли (B2)
Раздел «Резервные копии / Backups» (#/backups, поведение и приёмка — CONSOLE_UX) работает только с настоящими API и агентом:
- одна страница вместо трёх представлений: сводка (состояние по предупреждениям, возраст от T, следующий запуск в местном времени и UTC, агент, свободное место vault), предупреждения с действием оператора в подсказке, текущее задание, точки, задания и план;
- «Создать копию сейчас», «Проверить полностью», закрепление, «Применить хранение» после preview «удаляются/остаются с причинами» в окне подтверждения;
- план: включение, время, явный IANA-пояс (пояс браузера только предлагается), хранение 7/4/6 по умолчанию, CAS с перечитыванием при конфликте и отметкой полей;
- опрос только при открытом задании и видимом экране, обновление строк на месте, карточки точек и заданий на 320–390 px;
- признак шифрования vault (ADR 0070): «зашифрован»/«не зашифрован» по последнему heartbeat агента; для открытого vault — подсказка создать зашифрованный, не предупреждение. Шифрование, recovery kit и слоты ключей (
vault init,vault key …) — команды оператора, в консоли их нет; - раздел скрыт без
backup.read, изменения — только сbackup.manage; restore остаётся командой оператора (строка с подсказкой, без кнопки).
Ещё не реализовано и в консоли не изображается: мастер первого плана (vault задаётся оператором через ARKVORY_BACKUP_VAULT и создаётся командой vault init; проверки доступа из консоли нет), несколько vault и S3, выбор дней недели, ближайшие 3 запуска, лимит сети и advanced-настройки, пауза/отмена задания, скорость/ETA и занятое на source место, детали точки (release/schema, состав, отчёт), меню удаления отдельной точки, мастер восстановления, preflight, restore drill и план переключения (B4), вход «Восстановить из копии» в Arkvory Setup. Строка «Пробное восстановление ещё не выполнялось» не показывается, пока drill не существует.
Основной сценарий
После первичной настройки пользователь нажимает «Создать копию». Arkvory сам ставит job, показывает этап и после закрытия страницы продолжает работу. При возвращении отображается тот же job. Восстановление имеет несколько осмысленных шагов: выбрать точку, проверить новую цель, восстановить и проверить. Переключение production выполняется отдельно.
Первый запуск не может честно быть без настройки: нужно выбрать независимое место хранения, проверить доступ, сохранить recovery key и задать расписание. Эти четыре решения мастер объясняет обычными словами; пути, engine flags, dump arguments и SQL в основной форме не показываются.
Информационная архитектура
В консоли — самостоятельный раздел «Резервные копии / Backups», не вкладка last-N очистки билдов. В верхней строке — source instance, его доступность, общий выбор языка/темы. Внутри три представления: Копии, Планы, Восстановление. Vault и ключи открываются из плана, диагностика — из конкретного job. Не помещать все настройки на одну страницу.
Главная содержит:
- Последнюю завершённую точку с датой состояния T, возрастом и назначением. Если копий нет, вместо зелёной плашки — «Резервирование ещё не настроено» и «Настроить копии».
- Отдельный результат проверки bytes и отдельный результат последнего restore drill. Нельзя объединять их в «Защищено на 100%».
- Текущий job, если он есть: этап, обработанный объём/всего, новые bytes назначения, скорость/ETA только при наличии измерений, допустимые сейчас действия.
- Список последних точек: T, vault, логический объём, завершение, степень проверки, pin/retention, меню действий. Детали содержат release/schema, состав, исключённые pending uploads и отчёт.
- Одна главная кнопка «Создать копию». «Восстановить» доступно у выбранной завершённой точки; delete/prune — в отдельном меню с preview.
При нескольких vault статус каждого независим: успешный NAS не делает устаревший S3 зелёным. Точка «Завершена, проверка не выполнялась» остаётся доступной для preflight/restore, но не получает значок подтверждённого восстановления. Повреждённая точка блокирует штатный restore с объяснением причины.
Мастер первого плана
| Шаг | Основные поля | Проверка и результат |
|---|---|---|
| 1. Где хранить | Название; диск/NAS либо S3; путь mount либо endpoint/bucket/prefix/region; доступ через защищённый ввод | Probe от service identity на source. Показать место/права/identity и домен отказа. Секрет после сохранения не возвращается. |
| 2. Доступ при аварии | Encryption/recovery key, «Сохранить набор восстановления», проверка повторного открытия vault | Не активировать unattended backup, пока recovery access не проверен. Набор не должен остаться только на source. |
| 3. Когда и сколько | Ежедневно/по выбранным дням/вручную; время и timezone; retention template; лимит сети | Ближайшие 3 запуска, timezone/UTC, retain preview. Advanced: I/O/concurrency/cache/hold deadline. |
| 4. Итог | Source → vault, расписание, хранение, проверка, предупреждения, оценка первого объёма | «Сохранить и создать первую копию». При недоступном vault предложить сохранить выключенный план; не показывать его активным. |
Редактирование: отдельная сохранённая revision, предупреждение о несохранённых полях, серверный CAS. Фоновое обновление статуса не перезаписывает форму. Часовой пояс браузера не меняет тихо время существующего плана. Повторная проверка vault обязательна после изменения адреса/credential.
Не показывать пользовательские absolute paths другим ролям. Нельзя выдавать локальный file picker браузера за выбор каталога на удалённом сервере. Для NAS — зарегистрированный серверный mount и проверяемый относительный каталог; для advanced пути нужны повышенные права и server-side validation.
Текущая операция
Этапы: Подготовка → Снимок каталога → Передача → Проверка → Завершение. Процент существует только внутри этапа с измеримым знаменателем. В подготовке — название действия и elapsed time, без выдуманных «97%». Большой размер копии не превращается в долго зависший общий progress bar.
«Пауза» доступна только после durable capture; рядом — срок удержания исходных данных. Pause реализуется checkpoint + остановка/возобновление поддерживаемой engine-операции, а не произвольная заморозка процесса. При close UI job продолжается. «Отменить» означает отмену задания, не удаление предыдущих копий. При неопределённом исходе — «Проверяем результат на сервере», затем interrupted/нужна проверка, а не ложное success.
Во время длительного backup показывать удерживаемое для него место source и влияние выбранного бюджета. Настройка лимита применяется на поддерживаемой безопасной границе; UI сообщает, если потребуется перезапуск передачи. Нельзя показывать как работающий slider, который backend игнорирует.
Мастер восстановления
| Шаг | Что видит пользователь | Главная кнопка |
|---|---|---|
| 1. Точка | Данные по состоянию на T; завершено в X; версия; состав; проверки; какая история после T потеряется | «Выбрать цель» |
| 2. Новая цель | Новый сервер/зарегистрированный target, новый root/volume, нужное место, сеть изолирована | «Проверить восстановление» |
| 3. Результат preflight | Совместимость, ключ, состав, место, пустая цель, отключение старых ключей/расписаний; ошибки с конкретным действием | «Восстановить в новую цель» либо disabled с причиной |
| 4. Работа и итог | Этапы/объёмы; отчёт ссылок/ACL/bytes/health; «Проверен, не опубликован» | «Открыть изолированную консоль» |
Preflight ничего не перезаписывает; его plan устаревает после изменения копии/цели/версии. Перед start backend снова проверяет identity, свободное место, права и пустоту цели. Нельзя превращать название hostname в команду shell.
Из готовой цели доступен отдельный «План переключения»: потеря данных относительно T, адрес, остановка/fencing старого writer, maintenance window, внешняя проверка. Последний destructive шаг требует актуального плана и явного подтверждения имени цели. Отказ от переключения оставляет исходный сервис работающим. Старый и новый writers не должны одновременно принимать production mutations.
Аварийный вход из локального Arkvory Setup: «Установить новый» / «Восстановить из копии». Для восстановления source API не нужен. Мастер сначала открывает vault и проверяет recovery key, затем подбирает совместимый доверенный runtime и цель. Автоматическая авторизация старыми пользователями/ключами отсутствует до завершения security recovery.
Визуальный язык
Сохранять визуальную систему Arkvory: спокойные поверхности, чёткая иерархия, аккуратные границы, один акцентный primary action. Без огромного «показателя надёжности», декоративных графиков и ряда бессмысленных KPI. Плотность таблиц настраивается, размеры управляющих элементов остаются удобными.
Использовать существующие tokens консоли, расширяя семантические группы: backup.surface, backup.border, backup.text.secondary, backup.status.success/warning/error, backup.progress.track/fill, backup.radius.panel/control, backup.spacing.*, backup.motion.*. Фактические имена согласовать с tokens.css при реализации; hardcoded palette внутри компонента запрещена. Светлая/тёмная схемы равноправны, тёмная не получается инверсией белой.
Статус выражается текстом и значком, не только цветом. Ссылки и destructive actions различаются. На 320–390px таблица переходит в карточки точек, summary — в одну колонку; restore шаги не образуют горизонтальный скролл. Поля не меньше 16px на touch, цели касания около 44px. Масштаб браузера 200% не скрывает кнопки.
Keyboard и screen reader: семантические controls, видимый focus, понятные labels ошибок, сохранение фокуса при обновлении job. Не заменять весь экран при каждом polling. Live region объявляет смену этапа и итог, а не каждый переданный MiB. Reduced motion отключает необязательные анимации. Закрытие панели возвращает focus к инициатору.
RU/EN: все строки и plurals в существующей i18n-системе, время через locale + явный zone, байты одинаковых единиц в одном сравнении. Не склеивать предложения из фрагментов. Увиденное пользователем 4 TB нельзя сравнивать с 4 TiB без корректного пересчёта.
Состояния, обязательные для дизайна и тестов
| Состояние | Отображение/действие |
|---|---|
| Нет плана/копии | Спокойный onboarding с настройкой; нет зелёного статуса. |
| Первая копия идёт | «Первая точка ещё не готова» + прогресс; исходный сервис работает. |
| Есть завершённая, нет drill | Точная дата и «Пробное восстановление ещё не выполнялось». |
| Пропущен запуск/просрочена точка | Возраст T, проблема расписания/доступа, «Посмотреть причину». |
| Vault недоступен | Сохранённый каталог помечен устаревшим; restore/start не обещают доступность. |
| Недостаточно места | Нужно/доступно/запас; start заблокирован, настройки не потеряны. |
| Неверный recovery key | Отдельная ошибка ключа, без повторного создания vault поверх существующего. |
| Повреждение | Какая глубина проверки выявила сбой; предыдущая пригодная точка. |
| Нет прав | Read-only либо раздел скрыт по capability; подсказка запрашиваемого права без раскрытия чужих копий. |
| Browser reconnect | Тот же job и сохранённая позиция; никаких повторных запусков из-за refresh. |
| Restore готов | «Проверен, не опубликован»; production URL ещё не изменён. |
Интерактивный дизайн использует только демонстрационные данные и явно показывает «Прототип · операции не выполняются». Его кнопки позволяют оценить переходы, layout и ошибки; их наличие не означает готовность API, backup agent или engine. При реализации все эти состояния проверяются через общий browser gate и настоящие API/SDK scenarios.