Initial: Roko Backup Script v2 — Python rewrite with streaming progress & log rotation

Current deployed version (roko-backup.py) after refactoring from bash to Python.
Generated via OpenCode (kimi-k2.7-code). Includes:
- rclone streaming progress (log every 5% or 30s)
- RotatingFileHandler (max 1MB, 5 backups)
- LockFile for concurrent run prevention
- Yandex Cloud upload with NO_PROXY bypass
- Also includes comparison versions from mimo-v2.5-pro and kimi-k2.7-code
This commit is contained in:
Roko
2026-07-07 11:27:02 +07:00
commit a88b2604a1
5 changed files with 2362 additions and 0 deletions
+118
View File
@@ -0,0 +1,118 @@
# Roko Backup Script
Скрипт для автоматического резервного копирования данных OpenClaw в Yandex Object Storage.
## Назначение
Автоматизированный бэкап рабочих файлов, конфигурации, медиа и баз данных OpenClaw с загрузкой в облако (Yandex Object Storage через rclone). Включает верификацию, ротацию старых бэкапов и формирование отчётов.
## Архитектура
Скрипт построен по принципу конвейера (pipeline) с разделением на классы:
- **Config** — конфигурация: пути, лимиты, настройки. Загружается из env-переменных или JSON-файла.
- **LockFile** — предотвращает параллельный запуск через PID-файл.
- **Collector** — собирает файлы для бэкапа в staging-директорию с учётом исключений.
- **Archiver** — создаёт tar.gz-архив из staging-директории.
- **Uploader** — загружает архив в облако через rclone с retry-логикой (10s, 30s, 60s).
- **Verifier** — проверяет наличие архива в облаке.
- **Cleaner** — удаляет старые локальные и облачные бэкапы сверх лимита.
- **Reporter** — пишет JSON-отчёт о результате.
- **BackupPipeline** — оркестрирует все шаги: collect → archive → upload → verify → clean → report.
## Схема работы
1. **Блокировка** — создаётся lock-файл `/tmp/roko-backup.lock` для предотвращения параллельных запусков.
2. **Сбор** — файлы копируются во временную staging-директорию с учётом исключений.
3. **Архивация** — staging упаковывается в `roko-YYYYMMDD-HHMMSS.tar.gz` в `~/backups/`.
4. **Загрузка** — архив загружается в `yabackup:for-backup/roko/` через rclone (3 попытки с backoff).
5. **Верификация** — проверяется наличие архива в облаке через `rclone ls`.
6. **Очистка** — удаляются старые локальные (>3) и облачные (>14) бэкапы.
7. **Отчёт** — пишется JSON-отчёт в `~/.openclaw/workspace/roko-backup-report.json`.
8. **Разблокировка** — lock-файл удаляется.
## Запуск
### Вручную
```bash
python3 ~/.openclaw/scripts/roko-backup.py
```
### Из cron (ежедневно в 3:00)
```bash
crontab -e
```
Добавить строку:
```cron
0 3 * * * /usr/bin/python3 /home/openclaw/.openclaw/scripts/roko-backup.py >> /home/openclaw/backups/roko-backup.log 2>&1
```
### Dry-run (проверить что будет бэкапиться)
```bash
python3 ~/.openclaw/scripts/roko-backup.py --dry-run
```
## Аргументы командной строки
- `--config PATH` — путь к JSON-файлу конфигурации (по умолчанию: env-переменные или built-in defaults).
- `--dry-run` — только собрать файлы, показать что будет бэкапиться, без архивации и загрузки.
- `--verbose` — подробный лог (DEBUG уровень вместо INFO).
## Логи и отчёты
- **Логи** — выводятся в stdout (перенаправляйте в файл при запуске из cron).
- **Отчёт** — JSON-файл `~/.openclaw/workspace/roko-backup-report.json` с полями:
- `timestamp` — время бэкапа
- `status``success`, `error`, `dry-run`
- `name` — имя архива
- `size_bytes` — размер в байтах
- `error` — сообщение об ошибке (если есть)
## Что бэкапится
- `~/.openclaw/workspace/` — рабочая директория
- `~/.openclaw/openclaw.json` — конфигурация
- `~/.openclaw/scripts/` — скрипты
- `~/.openclaw/media/` — медиа-файлы
- `~/.openclaw/plugin-skills/` — навыки плагинов
- `~/.openclaw/agents/main/agent/openclaw-agent.sqlite` — база данных агента
### Исключения
- `node_modules/`
- `__pycache__/`
- `*.pyc`
- `.git/`
- `roko-pulse.jsonl`
- `cache/`
- `*.tmp`
- `.cache/`
## Проксирование (NO_PROXY)
Для работы с Yandex Object Storage используется переменная окружения:
```bash
NO_PROXY="storage.yandexcloud.net,yandexcloud.net"
```
Это гарантирует, что запросы к `storage.yandexcloud.net` и `yandexcloud.net` идут напрямую, минуя HTTP-прокси (если он настроен в системе). Применяется автоматически во всех вызовах rclone (upload, verify, clean).
## Конфигурация через env-переменные
- `ROKO_REPORT_FILE` — путь к файлу отчёта (по умолчанию: `~/.openclaw/workspace/roko-backup-report.json`)
- `ROKO_ARCHIVE_DIR` — директория для локальных архивов (по умолчанию: `~/backups`)
- `ROKO_RCLONE_REMOTE` — rclone remote (по умолчанию: `yabackup:for-backup/roko`)
- `ROKO_MAX_CLOUD` — макс. облачных бэкапов (по умолчанию: 14)
- `ROKO_MAX_LOCAL` — макс. локальных бэкапов (по умолчанию: 3)
## Требования
- Python 3.10+
- rclone (должен быть в PATH)
- Настроенный rclone remote `yabackup` для Yandex Object Storage