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

Очистка

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

Очистка

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

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

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

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

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

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

Storage Prune

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

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

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

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

# Переопределить проверку безопасности монтирования (использовать с осторожностью)
rdc storage prune --name 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 до одного запроса на подпуть.

Machine Prune

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

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

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

КатегорияЧто удаляется
Пустые каталоги монтированияКаталоги mounts/<guid>/ без соответствующего образа репозитория
Осиротевшие неперемещаемые каталогиКаталоги immovable/<guid>/ без соответствующего образа репозитория
Устаревшие файлы блокировкиrepositories/.lock-<guid> для удалённых репозиториев
Устаревшие снимки резервных копий.snapshot-* и .backup-*, оставшиеся после прерванных запусков резервного копирования
Осиротевшие каталоги sandbox 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, не могут быть проверены и всегда сообщаются как осиротевшие.

# Dry-run — показать, что будет удалено (без применения изменений)
rdc machine prune --name server-1 --dry-run

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

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

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

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

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

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

Фаза 3: --prune-unknown (точечная)

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

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

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

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

# Объединённый: полная очистка машины с точечным fork-aware путём
rdc machine prune --name server-1 --prune-unknown

Config Prune

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

  1. Записи кэша сертификатов ACME, чей якорь (GUID, имя репозитория или имя машины) больше не присутствует в активной конфигурации. Wildcard-сертификаты не могут никуда маршрутизировать, так что это мёртвый груз.
  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

Чего она НЕ касается

  • Активных ресурсов (machines, storages, repositories, backup strategies, cloud providers).
  • Учётных данных, блока account, блока шифрования, defaults.
  • vaultContent хранилища (включая истёкший access_token OneDrive. Refresh_token всё ещё генерирует новые; очистка вынудила бы повторную авторизацию).
  • Записей knownHosts (путь автообновления. rdc config machine scan-keys).
  • Массив сжатого блоба сертификатов (infra.acmeCertCache.<base>.data[]) автоматически перестраивается из очищенного списка сертификатов; вы не теряете ни одной цепочки, которая по-прежнему покрывает сохранённое имя.

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

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

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, а также любой однометочный wildcard <service>.<base> или корневой *.<base>. Остаются нетронутыми.

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

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

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

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

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

Восполнение копирует действующее состояние из тома в зеркало для текущих смонтированных репозиториев и записывает синтетическое зеркало с пометкой fork для всех 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 config repository restore-archived --name <guid>), если он был удалён случайно. По истечении льготного периода storage prune, machine prune и config prune все автоматически удаляют запись.

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

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

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

Все три команды очистки по умолчанию применяют изменения. Передайте --dry-run для предварительного просмотра без записи. Это соответствует глаголу: «prune» сам по себе деструктивен, а флаг 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 дней

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

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