Files
Roko a88b2604a1 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
2026-07-07 11:27:02 +07:00

119 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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