Перейти к основному содержанию Перейти к навигации Перейти к нижнему колонтитулу

Очистка

Удаление архивных резервных копий, устаревших снимков, образов репозиториев и остатков локальной конфигурации для освобождения дискового пространства и обеспечения консистентности состояния.

Очистка

Очистка удаляет состояние, которое больше не соответствует активному ресурсу. Три команды охватывают три разных области:

КомандаЧто удаляетсяИсточник истины
rdc storage prune <storage> -m <machine>Архивные резервные копии в облачном хранилищеЛокальная конфигурация CLI (перепроверяется на машине-исполнителе для безопасности монтирования)
rdc machine prune <machine>Артефакты хранилища на машине (всегда); архивные или неизвестные образы репозиториев (по выбору)Локальная конфигурация CLI + зеркало .interim/state машины
rdc config pruneОстатки локальной конфигурации (кэш сертификатов, истекшие архивы, зависающие перекрестные ссылки)Только локальная конфигурация CLI

Эти три команды независимы. Вы можете выполнить любую из них без остальных. Они используют общую модель безопасности, описанную в разделе Модель безопасности ниже.

Очистка удаляет состояние, оставшееся после удалённых ресурсов. Чтобы освободить пространство, занятое живыми репозиториями (блоки, которые их файловые системы освободили, но пул ещё удерживает), используйте вместо этого rdc repo trim; эти два механизма дополняют друг друга.

Предварительная проверка безопасности монтирования

storage prune и machine prune --prune-unknown оба выполняют предварительную проверку безопасности монтирования перед удалением чего-либо: они запрашивают машину-исполнитель для получения информации о текущих смонтированных или работающих репозиториях, выполняют пересечение с кандидатами на удаление и отказываются удалять кандидат, который все еще активен на машине. Удаление внемашинной копии смонтированного репозитория или удаление активного образа репозитория это серьезный риск потери данных. Предварительная проверка делает это невозможным случайно.

Для переопределения (редко; только когда вы действительно уверены, что активное состояние неправильно), передайте --force-delete-mounted. Это отдельный флаг от --force (который управляет периодом льготы), поэтому эти два люка остаются различными.

Очистка хранилища

Просканирует поставщика хранилища и удаляет резервные копии, чьи GUID больше не появляются в каком-либо файле локальной конфигурации.

# Только предпросмотр — показать, что будет удалено
rdc storage prune my-s3 -m server-1 --dry-run

# Действительно удалить архивные резервные копии (поведение по умолчанию)
rdc storage prune my-s3 -m server-1

# Переопределить период льготы (по умолчанию 7 дней)
rdc storage prune my-s3 -m server-1 --grace-days 14

# Переопределить проверку безопасности монтирования (используйте с осторожностью)
rdc storage prune my-s3 -m server-1 --force-delete-mounted

--machine требуется, потому что вызовы rclone выполняются на машине-исполнителе, а не на вашем ноутбуке. От клиентов не ожидается наличие локально установленного rclone. Учетные данные хранилища по-прежнему берутся из вашей локальной конфигурации; машина просто запускает rclone.

Что проверяется

  1. Перечисляет все GUID резервных копий в названном хранилище (в обоих подкаталогах hot/ и cold/. См. Резервное копирование и восстановление).
  2. Просканирует каждый файл конфигурации на диске (~/.config/rediacc/*.json).
  3. Резервная копия считается архивной, если его GUID не указан ни в одной конфигурации в разделе репозиториев.
  4. Недавно архивированные репозитории в периоде льготы защищены даже если удалены из активной конфигурации.
  5. Предварительная проверка безопасности монтирования: GUID, текущие смонтированные на --machine, пропускаются и сообщаются, никогда не удаляются.

Производительность

Удаления группируются по подпути хранилища: один вызов rclone для каждого каталога hot/ или cold/, независимо от количества удаляемых GUID. Список из 11 архивных элементов сокращается примерно с ~50 с накладных расходов SSH до одного обхода туда-обратно на подпуть.

Очистка машины

Очищает ресурсы на машине в три фазы. Фаза 1 всегда выполняется; фазы 2 и 3 являются дополнительными и могут быть объединены.

Фаза 1: Очистка хранилища (всегда выполняется)

Удаляет все, что осталось после удаления репозитория или снятия соглашения об именовании. Каждая категория сканируется независимо. Повторный запуск очистки безопасен: это один идемпотентный проход, поэтому архивные элементы, которых пропустил последний запуск, поймает следующий.

КатегорияЧто удаляется
Пустые каталоги монтированияКаталоги mounts/<guid>/ без резервного образа репозитория
Неподвижные каталоги-архивыКаталоги immovable/<guid>/ без резервного образа репозитория
Устаревшие файлы блокировокrepositories/.lock-<guid> для удаленных репозиториев
Устаревшие снимки резервного копирования.snapshot-* и .backup-*, оставленные убитыми запусками резервного копирования
Каталоги изолятора VS Code-архивы.interim/sandbox/<name> для репозиториев, которые больше не активны на машине
Цепи iptables-архивыЦепи REDIACC_WILDCARD_<N> и DOCKER_ISOLATED_NET_<N> для удаленных сетей
Записи authorized_keys-архивыСтроки sandbox-gateway <repo> --guid <uuid>, чей --guid больше не соответствует активному каталогу монтирования

Сканирование authorized_keys ищет в /home/*/.ssh/authorized_keys и /root/.ssh/authorized_keys. Запись сохраняется только если её тег --guid соответствует GUID активного каталога монтирования, поэтому репозитории, развернутые на машине, всегда сохраняются, независимо от того, появляется ли их имя где-либо на диске. Устаревшие записи, написанные до того, как renet начал добавлять тег --guid, не могут быть проверены и всегда сообщаются как архивные.

# Сухой запуск, показывает, что будет удалено (никаких изменений не применяется)
rdc machine prune server-1 --dry-run

# Выполнить очистку
rdc machine prune server-1

Каскадная очистка. Некоторые категории зависят от более ранних. Например, удаление пустых каталогов монтирования может выявить дополнительные архивы песочницы, чьи резервные каталоги монтирования только что исчезли. Запуск rdc machine prune во второй раз поймает каскад и завершит очистку. Финальный сухой запуск заканчивается на No orphaned resources found. Datastore is clean. когда ничего больше не остается делать.

Фаза 2: --orphaned-repos (грубое)

С помощью --orphaned-repos CLI также удаляет образы репозиториев на машине, которые не появляются в какой-либо файле локальной конфигурации.

rdc machine prune server-1 --orphaned-repos --dry-run
rdc machine prune server-1 --orphaned-repos

Это грубо. Удаляет все, чего нет в вашей локальной конфигурации, включая законные форки, управляемые другими инструментами или проверкой CLI другого оператора. Если зеркало renet .interim/state правильно определяет репозиторий как форк, но локальная конфигурация никогда это не видела, эта фаза все равно его удаляет. Предпочитайте фазу 3 (--prune-unknown), когда хотите быть консервативнее.

Фаза 3: --prune-unknown (хирургическое)

С помощью --prune-unknown CLI удаляет только репозитории, которые оба сигнала не могут классифицировать: отсутствуют в любой локальной конфигурации и нет записи, помеченной как форк, в зеркале .interim/state машины (см. Репозитории. Столбец Type).

rdc machine prune server-1 --prune-unknown --dry-run
rdc machine prune server-1 --prune-unknown

На практике --prune-unknown это то, что вам нужно для плановой очистки; --orphaned-repos правильна только когда вы уверены, что ваша локальная конфигурация является полным и авторитетным инвентарем каждого репозитория на машине. Устаревшие архивные элементы пред-зеркало и репозитории, чья запись конфигурации была удалена по ошибке, обе попадают в группу “unknown”. Они действительно неопределены, и хирургический флаг просит оператора это явно признать.

Предварительная проверка безопасности монтирования также выполняется на этой фазе: репозиторий, текущий смонтированный на --machine, сообщается и пропускается, если не передан --force-delete-mounted.

# Комбинированная: полная очистка машины с хирургическим путем, осведомленным о форках
rdc machine prune server-1 --prune-unknown

Очистка конфигурации

Удаляет устаревшие остатки внутри файла локальной конфигурации в ~/.config/rediacc/<config>.json. Чистая локаль. Нет SSH, нет вызовов renet. Три группы очищены:

  1. Записи кэша сертификатов ACME чьи якоря (GUID, имя репозитория или имя машины) больше не в активной конфигурации. Подстановочные знаки сертификатов никогда не могут маршрутизироваться куда-либо, поэтому они мертвый груз.
  2. Истекшие архивированные репозитории в resources.deletedRepositories[]. Записи, чей deletedAt старше defaults.pruneGraceDays (по умолчанию 7 дней). Записи в периоде льготы сообщаются (с оставшимися днями) и сохраняются.
  3. Зависающие перекрестные ссылки между группами конфигурации:
    • Записи resources.machines.<m>.backupStrategies[], называющие стратегию, которая больше не существует.
    • Записи resources.backupStrategies.<s>.exclude[] и include[], называющие репозиторий, который больше не существует.
    • Назначения хранилища, чье целевое хранилище отсутствует. Отмечены как предупреждение, не автоматически удалены (автоматическое удаление изменило бы семантику стратегии).
# Только предпросмотр
rdc config prune --dry-run

# Применить (поведение по умолчанию)
rdc config prune

# Ограничить одной группой
rdc config prune --certs-only
rdc config prune --archives-only
rdc config prune --refs-only

# Удалить ВСЕ архивированные репозитории независимо от периода льготы
rdc config prune --purge-archived

# Переопределить окно периода льготы архива для этого вызова
rdc config prune --grace-days 30

Что НЕ трогается

  • Активные ресурсы (машины, хранилища, репозитории, стратегии резервного копирования, облачные поставщики).
  • Учетные данные, блок счета, блок шифрования, значения по умолчанию.
  • Хранилище vaultContent (включая истекший OneDrive access_token. Refresh-токен все еще выпускает новые; очистка потребует повторной аутентификации).
  • Записи knownHosts (путь автоматического обновления: rdc machine scan-keys).
  • Сжатый массив данных сертификата (infra.acmeCertCache.<base>.data[]) перестраивается из очищенного списка сертификатов автоматически; вы не потеряете никакую цепь, которая все еще охватывает сохраненное имя.

Пример работы

Вывод из реального запуска на машине с четырьмя подстановочными знаками GUID-архивы и двумя устаревшими подстановочными знаками имен машин:

Scanning local config for stale leftovers...
6 cert cache entry/entries would be removed:
  *.linode-1.rediacc.io  (unknown machine linode-1)
  *.marketing.linode-1.rediacc.io  (unknown machine linode-1)
  *.5b749533-99be-446c-9fe3-e6d0eec905a6.hostinger.rediacc.io  (unknown GUID 5b749533-…)
  *.5d09f3a6-9558-4df1-8a6e-b63140a6a7a6.hostinger.rediacc.io  (unknown GUID 5d09f3a6-…)
  *.e18d8c0f-367e-43c7-919e-2dbc59db4b5e.hostinger.rediacc.io  (unknown GUID e18d8c0f-…)
  *.9806c9b8-6bfb-4a87-9eaa-4b757ce1daca.hostinger.rediacc.io  (unknown GUID 9806c9b8-…)
Dry run: 6 change(s) would be applied. Re-run without --dry-run to commit.

Имена сертификатов, чьи якоря это активная машина, репозиторий или GUID, остаются нетронутыми, как и любые одноуровневые подстановочные знаки <service>.<base> или корневые *.<base>.

Миграция: заполнение зеркала состояния

Зеркало .interim/state/<guid>/.rediacc.json, которое питает --prune-unknown и столбец Type в rdc repo list -m, написано:

  • Во время форка (rdc repo fork). Немедленно, даже до того, как форк когда-либо смонтируется.
  • При каждом сохранении состояния (rdc repo up и любая операция, которая обновляет состояние репозитория). Для репозиториев, которые были созданы до отправки кода зеркала.

Репозитории, которые были созданы перед существованием зеркала и не были повторно смонтированы с момента обновления, не имеют файла зеркала. Они показываются как unknown в rdc repo list -m, хотя некоторые действительно законно форки. Чтобы исправить это для устаревших архивных элементов, запустите одноразовое заполнение на машине:

sudo /usr/local/bin/renet repository backfill-state-mirror \
    --datastore /mnt/rediacc \
    --mark-as-fork <guid1>,<guid2>,<guid3>

Заполнение копирует живое состояние в томе в зеркало для текущих смонтированных репозиториев и записывает синтетическое зеркало, помеченное как форк, для любых GUID, перечисленных под --mark-as-fork. После заполнения, запланированные резервные копии перестают загружать перечисленные форки (конвейер загрузки проверяет зеркало для is_fork: true).

Модель безопасности

Все три команды по умолчанию безопасны в установках с несколькими конфигурациями.

Осведомленность о нескольких конфигурациях

storage prune и machine prune --orphaned-repos сканируют все файлы конфигурации в ~/.config/rediacc/, а не только активную. Репозиторий, указанный в production.json, не будет удален, даже если его нет в staging.json. Это предотвращает случайное удаление, когда конфигурации ограничены разными окружениями.

Период льготы

Когда репозиторий удаляется из конфигурации с --archive-config, его запись учетных данных перемещается в resources.deletedRepositories[] с временной меткой deletedAt. Команды очистки соблюдают период льготы (по умолчанию 7 дней), в течение которого недавно архивированные репозитории защищены от удаления. Это дает вам время восстановить репозиторий (rdc repo admin archive restore <guid>), если он был удален случайно. После истечения периода льготы, storage prune, machine prune и config prune автоматически удаляют запись.

Предварительная проверка безопасности монтирования

Описано выше. storage prune и machine prune --prune-unknown отказываются удалять репозитории, которые текущие смонтированы или работают на машине-исполнителе. Переопределяйте только с помощью --force-delete-mounted.

Применять по умолчанию; --dry-run для предпросмотра

Все три команды очистки по умолчанию применяют изменения. Передайте --dry-run для предпросмотра без записи. Это соответствует глаголу: очистка сама по себе деструктивна, и флаг сухого запуска это явный отказ.

Конфигурация

pruneGraceDays

Установите период льготы по умолчанию в своем файле конфигурации, чтобы вам не нужно было передавать --grace-days каждый раз:

# Установить период льготы на 14 дней в активной конфигурации
rdc config field set --pointer /defaults/pruneGraceDays --new 14

Флаг CLI --grace-days переопределяет это значение, если оно предоставлено.

Приоритет

  1. Флаг --grace-days <N> (наивысший приоритет)
  2. pruneGraceDays в файле конфигурации
  3. Встроенное значение по умолчанию: 7 дней

Лучшие практики

  • Сначала запустите сухой запуск на продакшене. Всегда предпросмотрите перед выполнением деструктивной очистки, особенно на хранилище продакшена.
  • Держите несколько конфигураций актуальными. Хранилище и очистка машины проверяют все конфигурации в каталоге конфигурации. Если файл конфигурации устарел или удален, его репозитории теряют защиту. Держите файлы конфигурации точными.
  • Предпочитайте --prune-unknown над --orphaned-repos. Хирургический флаг соблюдает зеркало renet; грубый флаг с радостью удалит форки, которые создали другие инструменты.
  • Используйте щедрые периоды льготы для продакшена. Период льготы по умолчанию в 7 дней подходит для большинства рабочих процессов. Для окружений продакшена с редкими окнами обслуживания рассмотрите 14 или 30 дней.
  • Планируйте хранилище очистки после запусков резервного копирования. Соедините storage prune с вашим расписанием резервного копирования, чтобы контролировать затраты на хранилище без ручного вмешательства.
  • Комбинируйте очистку машины с расписанием резервного копирования. После развертывания расписаний резервного копирования (rdc backup schedule), добавьте периодическую очистку машины для удаления устаревших снимков и архивных артефактов хранилища.
  • Запускайте config prune периодически. Раздувание локальной конфигурации (особенно кэш сертификатов) накапливается молча; ежеквартальное config prune --dry-run достаточно, чтобы поймать это.
  • Проверьте перед использованием --force или --force-delete-mounted. Оба флага обходят проверки безопасности. Используйте --force только когда уверены, что никакая другая конфигурация не ссылается на репозитории в вопросе; используйте --force-delete-mounted только когда уверены, что активное состояние на машине неправильно.