Skip to content

💾 Бекапы (демон)

📌 Описание

Исполнительный модуль бекапов на ноде: создание, восстановление и ротация бекапов приложений. Политики и расписания может задавать платформа (💾 features/backups), но модуль полностью работает и автономно через CLI (asc backup ...) — аккаунт платформы не нужен.

🎯 Сценарии использования

  • asc backup create <app> — бекап приложения в настроенные хранилища (по умолчанию local), либо конкретное — --storage <имя> (можно несколько раз).
  • asc backup restore <app> <backup-id> — восстановление; приложение должно быть остановлено (деструктивно: заменяет repository, config и data).
  • asc backup list <app> [--storage <имя>] — бекапы приложения на одном хранилище, от старых к новым.
  • asc backup prune <app> --keep <n> [--storage <имя>] — вручную удалить старые бекапы сверх n (ротация также выполняется автоматически после каждого create — по настройке keep самого приложения).
  • asc backup storage add|list|remove — управление тем, куда идут бекапы; asc app settings <app> (категория backups) — в какие из этих хранилищ бекапится конкретное приложение, сколько копий хранить и с какой периодичностью (расписание исполняет демон, см. ⏰ scheduler).

🏗️ Техническое решение

Что входит в бекап

Архив (tar.gz) подкаталогов repository/, config/ и data/ каталога приложения — всё, кроме meta.json (он пересоздаётся при восстановлении, как и при 🧬 клонировании). asc.backup.yaml в корне репозитория пакета исключает пути из архива:

yaml
exclude:
  - data/cache/**
  - repository/vendor

Паттерны — относительно каталога приложения, поддерживают * (любая последовательность символов в пределах одного сегмента пути), ** (любая последовательность, включая /) и ? (один символ); исключение каталога исключает и всё, что внутри — как в .gitignore. Файловый бекап не заменяет консистентность на уровне приложения (например, дамп БД) — pre/post-хуки бекапа — более поздний инкремент.

Хранилища (трейт BackupStorage, src/daemon/backup/storage.rs)

  • local — всегда доступно, без настройки: обычный каталог (<data_dir>/backups, по умолчанию /var/lib/asc/backups). Единственный тип хранилища, который сегодня реально что-то переносит.
  • s3 / ftp / sftp — настраиваются через asc backup storage add <имя> --type s3|ftp|sftp ... (параметры подключения хранятся как источники реестра — системный список /etc/asc/backup-storages.toml, управляется root и виден всем, плюс пользовательский ~/.config/asc/backup-storages.toml; файл 0600, так как может содержать учётные данные). Поля провайдера валидируются и сохраняются, но push/pull/list/remove пока не подключены к реальной передаче данных — любая операция возвращает понятную ошибку «не реализовано» с именем провайдера. До их появления используйте local (при необходимости указав --type local --dir <путь> на примонтированную сетевую шару).
  • Имя настроенного хранилища не может быть local (зарезервировано), обычный пользователь не может затенить или удалить системное хранилище — те же правила, что и у 📦 источников реестра.

Политика бекапов (asc app settingsbackups)

Хранится под зарезервированным ключом $backup в config/settings.json, рядом с $quota/$start_command (та же конвенция, DMN-017/030): storages (множественный выбор, переключается по номеру в редакторе), keep (сколько копий хранить на каждое хранилище — обрезается автоматически сразу после каждого create), schedule (daily@HH:MM, просто HH:MM или cron-выражение из пяти полей мин час день месяц день_недели; редактор проверяет синтаксис). schedule исполняется планировщиком демона (⏰ scheduler, DMN-012): раз в минуту он сверяет политики всех приложений с локальным временем ноды и запускает подошедшие бекапы в хранилища политики с её ротацией keep — демон должен быть запущен (asc service install или asc serve). asc backup create <app> без --storage использует хранилища из политики, а при пустой политике — только local.

Восстановление

Скачивает архив во временный файл, затем полностью заменяет repository/, config/ и data/ каталога приложения (удаляются, затем распаковываются заново) — результат в точности соответствует бекапу, а не слиянию с тем, что было раньше. CLI отказывается восстанавливать поверх запущенного приложения.

🔗 Связанные задачи

DMN-009, DMN-012, BE-005 в ROADMAP.md.

Распространяется по лицензии MIT.