Репликация: интерфейс и пользовательские сценарии
Статус: проект UI, без подключённого runtime. Интерактивный макет в разговоре демонстрирует состояния на условных данных; он не управляет сервером. API, протокол и этапы.
Экран «Инфраструктура → Репликация»
Основной экран показывает режим защиты записи, primary и список зеркал. До первой настройки — короткое объяснение, что будет скопировано, требования к диску/сети и одна кнопка «Подключить узел». Общие сведения о продукте и развёртывании не повторяются на каждом экране.
На карточке узла: имя/роль, доступность, стадия синхронизации, время свежего наблюдения. Отдельно от состояния сети — раздача и проверенные копии. В выбранном узле три значения: проверенные bytes/объекты, остающийся backlog и место, удерживаемое от очистки на source. Неизвестные значения показываются «Нет данных», а не 0/100%.
Не показывать среднюю скорость, ETA или «4 ТБ скопировано», пока они не измерены/подтверждены. ETA выводится диапазоном только при достаточно стабильной скорости, при паузе/повторном seed исчезает. Прогресс initial seed и очередь новых изменений — разные строки.
Верхнее сообщение объясняет последствия: «Запись доступна; зеркало отстаёт», «Раздача с зеркала остановлена: недоступна проверка прав», «Запись приостановлена: нет обязательной второй копии». Состояние не обозначается одним цветом. «Синхронизировано» не означает «writer можно переключить».
Мастер подключения
- Режим и назначение. Mirror либо доступный HA provider из capabilities. У mirror видно: published files; primary нужен для каталога и прав; writer переключать нельзя. Нереализованный HA-профиль не выглядит доступным вариантом установки.
- Подготовка узла. Выбор OS installer/remote setup, локальное создание node identity и выбор volume. На исходной машине не вводятся произвольные команды/пути target. Нельзя выбрать непустой чужой data root. При ручной установке — одна команда/пакет, проверка статуса службой, а не файл CMD вместо installer.
- Доверие. Pairing code ограниченного срока, fingerprints обеих сторон, подтверждённое HTTPS/mTLS. Secret показан один раз, очищается при закрытии, не сохраняется в браузере и не попадает в clipboard автоматически. Недействительный сертификат блокирует шаг; «продолжить небезопасно» отсутствует.
- Данные и ресурсы. Репозитории, полный объём копии, резерв диска, staging, max backlog, concurrency/byte limits. Показать, что каждый узел должен вместить свою полную выбранную копию. Поля имеют единицы; предлагаемые лимиты редактируются в расширенном разделе.
- Preflight и запуск. Результаты проверки сети, места, version/protocol, volume identity, доступа и возможности защиты от GC. Итоговая карточка последствий и «Начать синхронизацию». Принятая команда показывает operationId/фазу, а не «Узел подключён» до подтверждения.
После потери связи/reload мастер читает сохранённый operation status у сервера. Повтор с тем же Idempotency-Key продолжает ту же операцию. Утраченный pairing secret отзывается и выдаётся новый; нельзя показывать старый токен из локального журнала. Журнал незавершённой формы может содержать лишь несекретный operationId/черновик настроек согласно общей политике приватности.
Действия по состоянию
| Состояние | Основное действие | Что остаётся видно |
|---|---|---|
| Seeding / catching up | Пауза | Закрытые checkpoints, backlog, retained source bytes |
| Draining | Ожидание / статус операции | Какие активные потоки ещё завершаются; конечный срок |
| Paused | Продолжить | Последний ACK, место под pins, последствия долгой паузы |
| Target offline | Проверить связь | Запись на primary, неизвестная актуальность target; пауза не лечит сеть |
| Authority offline | Диагностика | Bytes на target сохранены; новые reads запрещены |
| Checksum mismatch | Подробности → повторить проверку/передачу | Quarantined artifact; отсутствие его в раздаче |
| Disk full / pins limit | Открыть использование места | Конкретный reserve/backlog threshold, без предложения отключить защиту |
| Reseed required | Просмотреть план пересинхронизации | Причина, объём, возможное повторное использование проверенных bytes |
| Retiring / interrupted | Статус / reconcile | Нельзя скрыть незавершённую операцию удалением строки |
| Caught up | Проверить целостность | Cursor и свежесть результата, отдельное состояние delivery |
«Пауза» не удаляет копию и не снимает pins. «Очистить очередь» разделяется на скрытие завершённой истории и прекращение конкретных obligations через отдельную подтверждаемую операцию. Успех в UI означает серверный receipt, не отправленный POST.
Настройки и удаление узла
Обычные поля — имя, scope, concurrency и byte ceiling. В расширенных — thresholds, retry, окна обслуживания, доверенные адреса. Секреты не возвращаются маскированной строкой как редактируемое значение. CAS conflict сохраняет черновик, показывает изменения сервера и предлагает заново сверить политику.
Retire сначала показывает preview: что перестанет раздаваться, какие source pins будут освобождены и какие файлы сохранятся на target. По умолчанию данные target остаются. Purge локальной копии — отдельный последующий preview/операция, когда worker/readers остановлены и их владение подтверждённо завершено. Неизвестное состояние не допускает кнопку «Удалить всё равно».
Переключение writer
В mirror v1 нет действующей кнопки promote. Информация «Для переключения writer нужен HA-профиль» видима в настройках режима, а не спрятана в tooltip. В будущем HA-профиле мастер показывает: доступность authority, подтверждённые копии, fencing provider, возможную потерю, влияние на uploads/reads, план cutover и условия отката.
Команда «Переключить» доступна только по результату свежего server-side preview, с отдельным permission. UI не принимает решение по heartbeat. После отправки UI наблюдает фазы drain → fence → verify → promote → readiness → route; потеря связи выводит interrupted и предлагает проверить тот же operation, а не повторно выполнять переключение. Нулевой RPO не выводится по одному зелёному индикатору replication.
Визуальная система и доступность
Основной код UI использует текущие tokens.css, светлую/тёмную/системную темы и RU/EN словари. Цвета, радиусы, spacing, типографика и motion не дублируются в feature CSS. В компонентах нет физических путей, SQL/LSN и служебных значений; они доступны в административных подробностях там, где помогают разбору инцидента.
Основной экран компактен: одна строка последствий, узлы, три показателя и доступные действия. Инвентарь и подробные ошибки открываются по запросу с cursor pagination. Tooltips содержат объяснения терминов, но ограничения записи, потери данных, доверия и удаления всегда видимы. Переходы короткие, без бесконечной пульсации и фиктивного движения прогресса; reduced motion отключает необязательные эффекты.
Forms сохраняют значения, focus и активную операцию при смене темы/языка. Кнопки имеют доступные имена; изменения стадий объявляются aria-live без чтения каждого байта. На 390 px узлы/показатели складываются вертикально, таблица inventory прокручивается внутри подписанного контейнера. Поддерживаются loading, empty, offline, revoked permission, stale data, CAS и partial failure.
Browser gate
Мастер с реальными тестовыми primary/target: подключение, истёкший token, несовместимость, ограниченный диск, потеря ответа, reload/resume; затем pause/drain, новый ACK, диапазон с готовой копии, authority outage, CAS, quarantine, retire и запрет purge при неопределённой остановке. RU/EN × light/dark × 390/1440 px, клавиатура и reduced motion. Реальные ОС installers, сертификаты и fencing дополняют браузерные проверки, не имитируются зелёным mock статусом.