Администрирование через веб-консоль
Разделы «Репозитории» и «Сервисный доступ» используют существующие публичные API/SDK. Сервер проверяет каждый запрос; скрытие кнопки не заменяет авторизацию. UI поддерживает RU/EN, общие токены обеих тем, клавиатуру и узкие экраны.
Репозитории
Постраничные карточки показывают только области, доступные текущему ключу, форматы и его права. Из карточки можно перейти к файлам либо к существующим настройкам хранения: квотам, предупреждениям, retention, preview и физической очистке; они видны только управляемому сервисному ключу с правами storage.read/storage.manage/diagnostics.read/artifact.delete — парольная сессия, персональный токен и ключ восстановления этих прав не имеют. Переход «Управление доступом» доступен оператору соответствующего уровня и открывает сервисные политики или управление пользовательскими группами.
Отдельного реестра жизненного цикла репозиториев в текущем API нет. Логическую область создают назначением её точного ID в сервисной политике/ключе или пользовательской группе; она появляется в discovery после получения repository.read. UI не имитирует переименование или удаление репозитория. Снятие доступа не удаляет байты. Модель discovery.
Сервисные аккаунты и политики
- Bootstrap создаёт аккаунт, задаёт его политику и включает/отключает аккаунт. Отключение требует подтверждения по имени и блокирует все ключи аккаунта.
- Права задаются строками репозиториев с отдельными флажками. Наборы для чтения и публикации — явные заменяющие пресеты; опасное удаление и управление хранилищем в них не включены.
- Пустая политика означает отсутствие доступа к данным. Права ключа дополнительно ограничиваются политикой его аккаунта; выдача ключа не расширяет её.
- Сохранение использует показанную revision. При конфликте 409 черновик остаётся в форме; оператор явно обновляет аккаунт перед повторной правкой.
- Списки аккаунтов, ключей и аудит постраничные. Переключение страницы заменяет предыдущую, ограничивая память DOM.
Ключи
Выпуск поддерживает отдельные bindings и срок действия. Поле времени вводится в локальном часовом поясе и отправляется как UTC. Без значения действуют ограничения срока на сервере: обычно 90 дней, максимум 365, не дольше срока делегата.
Секрет показывается в отдельном модальном окне один раз. Его можно скопировать; при недоступном Clipboard API остаётся ручное выделение. Права выдаваемого ключа в редакторе ограничены текущей политикой аккаунта, ceiling оператора и, при ротации, исходными bindings. Активация становится доступной после отметки о сохранении секрета. Она выполняется отдельным SDK-клиентом с новым credential, не меняя текущее подключение оператора. Закрытие, Escape и смена подключения очищают поле и отменяют ожидающую активацию. В localStorage, URL, атрибутах DOM и списках ключей секрет не хранится.
Неизменённый повтор выдачи/ротации после сетевой ошибки использует тот же Idempotency-Key. Серверный replay возвращает только metadata; UI объясняет, что утраченный secret нужно заменить через отзыв и новую выдачу. При изменении формы или явном начале новой выдачи создаётся новый идентификатор запроса. Это не межвкладочное восстановление: после reload состояние формы и запроса не сохраняется.
Ротация сохраняет аккаунт/ownership, не расширяет права исходного ключа и не переносит административные grants. После активации замены старому ключу остаётся не более 24 часов. Старый ключ можно явно отозвать после проверки интеграции. Отзыв необратим и требует подтверждения по имени; начатые передачи могут завершиться.
Делегирование и аудит
Bootstrap открывает делегирование конкретного ключа, выбирает точный целевой аккаунт, административные действия и ceiling репозиториев. Сохранение и снятие grants используют revision; выключенные записи сохраняют её. Делегат видит свои назначения, назначенные аккаунты и разрешённые действия. Политика/enable и ротация/отзыв дополнительно проверяются UI на соответствие ceiling; окончательное решение принимает сервер. Снятие делегирования не отзывает уже активированные ключи потребителей.
Reader показывает разрешённые данные, но не предоставляет управляющие mutations. Пользовательский administrator не приравнивается к сервисному bootstrap. Для ежедневной работы рекомендуется отдельный делегированный ключ оператора; bootstrap нужен для начальной настройки и изменения самих grants.
Журнал аккаунта показывает события, время, actor и key ID без секрета. Контракты и ограничения, делегирование.
Изоляция и проверки
Контроллеры разделены на discovery, аккаунты, ключи, делегирование, редактор bindings и модальные окна. Новый код укладывается в общие лимиты без архитектурных исключений. Одна задача на панель исключает двойную отправку; AbortSignal, ограниченное время ожидания и привязанный к identity SDK предотвращают переход незавершённой операции на другой credential. После смены подключения старые ответы не возвращают данные в DOM.
tests/browser/management.mjs подключён к общему browser gate и работает с реальными PostgreSQL/API. Проверяет выбор репозитория, создание аккаунта, выдачу/активацию/ротацию/отзыв ключа, конфликт политики, потерю ответа выдачи с идемпотентным повтором, отключение/включение аккаунта, назначение/снятие делегирования и ограниченный UI оператора, очистку данных, RU/EN, светлую/тёмную темы и ширины 320/390/1440 px. Основной browser gate также проверяет настройки хранения и очистки. Локальный запуск: npm run gate -- quick browser с выделенной ARKVORY_TEST_DATABASE_URL.