💾 Бекапы (демон)
📌 Описание
Исполнительный модуль бекапов на ноде: создание, восстановление и ротация бекапов приложений. Политики и расписания может задавать платформа (💾 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 в корне репозитория пакета исключает пути из архива:
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 settings → backups)
Хранится под зарезервированным ключом $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.