Знакът на КАГАМИ КАГАМИ
kagami.bg/academy · lesson · machine-readable viewVERIFIED 2026-10-01 · UPDATED 2026-10-01
IDENTITY
module
OpenClaw-03.2 · Encrypted, scheduled backup of OpenClaw state
series
OpenClaw · lesson 3.2
level
Intermediate
duration
1–2 h
prerequisites
OpenClaw installed with a running Gateway (OpenClaw lesson 3); Ubuntu on WSL2 or any Linux host; a password manager for the decryption key
trust_label
VERIFIED 2026-10-01 (against the official OpenClaw documentation: CLI backup reference, Backups guide, Gateway service and Configuration pages; age 1.3.2 and restic 0.19.1 flags checked against their --help output) · UPDATED 2026-10-01 · PARTLY TESTED: the encryption, rotation and restic steps were run on dummy directories with a stand-in for the openclaw command; NOT run against a real OpenClaw installation, so no TESTED label
versions
OpenClaw npm release 2026.9.7 (Node.js >=24.16.0 <25 or >=26.1.0) · age 1.3.2 · restic 0.19.1 · systemd user timers
language
human view: bg · english edition: /en/academy/openclaw/Обучение 3.2 · Автоматизирано архивиране на OpenClaw конфигурация.html
previous / next
Обучение 3.1 · Разширена конфигурация на Discord бота.html / Обучение 3.3 · Интеграция с KAGAMI графа.html
PURPOSE

Protect the state of a personal OpenClaw assistant: a nightly, verified, encrypted archive created with the built-in "openclaw backup create", kept on the machine with count-based retention, optionally copied off the machine as ciphertext only, plus a rehearsed restore. Replaces the older approach of tar-ing the config folder and uploading it unencrypted.

KEY CONCEPTS
COMMANDS / PATHS
CHECKLIST
NEXT MODULE

Обучение 3.3 · Интеграция с KAGAMI графа.html · connecting an assistant to a Neo4j knowledge graph through MCP (generic example graph) · quick experiment: kagami.bg/stalbata/

SOURCES
TAGS
openclawbackupencryptionagesystemdretentionrestorewsl2
ПРОВЕРЕНО · 01.10.2026 ОБНОВЕНО · 01.10.2026

Шифровани копия на OpenClaw: архивиране по график

Личният ти AI асистент пази в себе си достъпи до чат канали, профили за вход и цялата си история. Загубата му е болезнена, а нешифрованото копие е още по-лошо. Ще направим нощно копие с вградената команда на OpenClaw, ще го шифроваме, ще го пазим по ясно правило и ще репетираме възстановяването, преди да ни потрябва.

⏱ 1–2 ч Средно OpenClaw · Обучение 3.2 Копие · Шифроване · График · Ротация
OpenClaw (openclaw backup)🔒 локално age (шифроване)🔒 локално systemd · cron🔒 локално Отдалечено хранилище (по избор)🌐 извън машината
🔄
ОБНОВЕНО · 01.10.2026 — какво
Старият урок копираше чувствителни данни на открито. Той пакетираше с tar папките ~/.openclaw и ~/.npm-global и ги качваше в облачно хранилище без шифроване. Но в ~/.openclaw има достъпи до канали и доставчици, профили за вход и сесии — всеки, който види архива, получава тях. Сега архивът е шифрован преди да напусне машината. Какво още е различно: (1) OpenClaw има вградена команда openclaw backup — тя снема състоянието безопасно и проверява архива; ръчният tar върху живите SQLite файлове рискува повредено копие. (2) ~/.npm-global не е състояние — това са инсталирани програми, които се връщат с инсталатор; махнато е. (3) Конкретното облачно хранилище е заменено с отдалечено хранилище по избор, и то само с шифровани файлове. (4) „Ротацията“ с rclone delete --min-age 7d трие по възраст, не пази „последните 7“ — ако копията спрат за осем дни, изтрива всичко. Сега се пази броят копия. (5) Възстановяването с cp -r върху живото състояние е заменено със openclaw backup restore в нова папка и ръчно включване. (6) В WSL2 графикът е systemd таймер (cron остава като вариант), а командата за rclone през curl | sudo bash е махната. (7) Махнати са личните потребителски имена и пътища от примерите.
⚠️
Какво не сме пускали сами
Командите на OpenClaw са сверени с официалната документация, но не сме пускали истински OpenClaw — затова няма етикет „ТЕСТВАНО“. Пуснахме в изолирана среда, върху фалшиви папки и с подставка вместо командата openclaw, това: скрипта, шифроването и разшифроването с age, ротацията по брой, правата на файловете и веригата restic (init, backup, forget, check, restore). Не са изпитани на живо: самият openclaw backup, системният таймер в WSL2 и командата на Windows за график.

01Какво ще научиш

02Преди да започнеш

⛔
Три неща, които не правим
(1) Не качваме нешифрован архив никъде — нито в облак, нито в общо споделена папка, нито в git хранилище (историята му е вечна). (2) Не копираме ръчно *.sqlite, -wal, -shm или -journal файлове от работещ Gateway — копието може да е скъсано. (3) Не държим ключа за разшифроване до копията: който открадне папката, би открил и ключа.

03Стъпки

  1. Къде живее състоянието на OpenClaw

    Според официалната документация OpenClaw пази същественото в SQLite: една обща база и по една база на всеки агент. Настройките са във файл openclaw.json. Защо е важно? Защото старият ни урок копираше „папка“, а истинското състояние са бази, които се пишат, докато Gateway работи.

    КаквоКъде (по подразбиране)В архива?
    Състояние и бази (обща + по агент)~/.openclaw (сменя се с OPENCLAW_STATE_DIR)да — като безопасна онлайн снимка
    Настройки~/.openclaw/openclaw.json (сменя се с OPENCLAW_CONFIG_PATH)да, заедно с включените $include файлове
    Достъпи и профили за входв състоянието (папка credentials/ и базите)да — най-чувствителното
    Работно пространство на агентаобикновено ~/.openclaw/workspaceда; пропуска се с --no-include-workspace
    Инсталирани програми (~/.npm-global, node_modules на разширенията)—не — преинсталират се

    Ако в openclaw.json има тайни, OpenClaw запазва в копието написаното от теб (вкл. заместители като ${ПРОМЕНЛИВА}), не „разрешените“ стойности — но другите файлове в архива пак могат да са чувствителни.

  2. Пробен пуск на вградената команда

    Първо виж какво би влязло, без да пишеш нищо:

    bash · в Ubuntu (WSL2)
    openclaw backup create --dry-run --json

    Отговорът изброява източниците (състояние, настройки, агенти, работно пространство) и какво се пропуска. После направи истински архив в частна папка — извън ~/.openclaw и извън работното пространство, иначе OpenClaw отказва (за да не копира себе си):

    bash
    mkdir -p ~/openclaw-backups-test && chmod 700 ~/openclaw-backups-test
    openclaw backup create --output ~/openclaw-backups-test --verify
    ls -lh ~/openclaw-backups-test

    --verify проверява архива веднага след записа. Файлът е с име от вида ДАТА-openclaw-backup.tar.gz, а вече съществуващ файл никога не се презаписва. Това е вече нешифрован архив с тайни — след проверката го изтрий (rm -r ~/openclaw-backups-test), за да не стои.

    💡
    По-малък или по-бърз архив
    --no-include-workspace пропуска работното пространство (агентите и базите остават); --only-config записва само файла с настройки — и то без включените $include файлове, затова не е пълно възстановяване. Най-полезен е, когато настройките са повредени и първо искаш да ги запазиш.
  3. Ключ за шифроване с age

    Идеята: на машината стои само публичният ключ — с него се шифрова, но не се чете. Частният ключ (идентичност) стои другаде. Така, дори ако някой вземе копията и машината, не разчита архивите без частния ключ.

    bash
    mkdir -p ~/.config/openclaw-backup && chmod 700 ~/.config/openclaw-backup
    age-keygen -o ~/.config/openclaw-backup/identity.txt
    age-keygen -y ~/.config/openclaw-backup/identity.txt > ~/.config/openclaw-backup/recipients.txt
    cat ~/.config/openclaw-backup/recipients.txt

    Първата команда създава двойката и печата публичния ключ (започва с age1…). Втората го записва във файл за получатели. Сега:

    1. Препиши съдържанието на identity.txt в мениджъра на пароли.
    2. После премахни файла от тази машина (или го премести на външен носител). Трябва ти само при възстановяване.
    3. Файлът recipients.txt остава на машината — той е безопасен.
    ✅
    Без частния ключ няма връщане
    age не може да „възстанови“ загубен ключ. Провери, че в мениджъра на пароли има записано копие, преди да го махнеш от машината.
  4. Скриптът за копие

    Един малък скрипт прави всичко: архив → шифроване → ротация. Поставяме го в ~/bin. Най-важното в него: umask 077 (файловете са само за теб), временна папка със сигурни права, шифроване преди файлът да отиде където и да е, и запис с окончателно име едва накрая (недовършено копие не прилича на готово).

    bash · ~/bin/backup_openclaw.sh
    #!/usr/bin/env bash
    # backup_openclaw.sh: encrypted OpenClaw backup with retention
    set -euo pipefail
    umask 077
    
    RECIPIENTS="${RECIPIENTS:-$HOME/.config/openclaw-backup/recipients.txt}"  # age PUBLIC key
    DEST_DIR="${DEST_DIR:-$HOME/openclaw-backups}"
    KEEP="${KEEP:-14}"     # how many encrypted archives to keep
    
    [ -r "$RECIPIENTS" ] || { echo "missing recipients file: $RECIPIENTS" >&2; exit 1; }
    mkdir -p "$DEST_DIR"
    chmod 700 "$DEST_DIR"
    
    STAGE="$(mktemp -d)"   # private temp dir, outside the OpenClaw state
    trap 'rm -rf "$STAGE"' EXIT
    
    # 1. official archive: state + config + credentials + agents, verified after writing
    openclaw backup create --output "$STAGE" --verify
    
    ARCHIVE="$(find "$STAGE" -maxdepth 1 -type f -name '*.tar.gz' | head -n 1)"
    [ -n "$ARCHIVE" ] || { echo "no archive produced" >&2; exit 1; }
    
    # 2. encrypt BEFORE the file goes anywhere else
    OUT="$DEST_DIR/$(basename "$ARCHIVE").age"
    age -R "$RECIPIENTS" -o "$OUT.partial" "$ARCHIVE"
    mv "$OUT.partial" "$OUT"
    
    # 3. retention: keep the newest $KEEP encrypted archives
    ls -1t "$DEST_DIR"/*.tar.gz.age 2>/dev/null | tail -n +"$((KEEP + 1))" | xargs -r rm --
    
    echo "ok: $OUT"
    bash
    mkdir -p ~/bin                 # после запиши скрипта в ~/bin/backup_openclaw.sh
    chmod 700 ~/bin/backup_openclaw.sh
    ~/bin/backup_openclaw.sh

    Ако всичко е наред, виждаш ok: …/…-openclaw-backup.tar.gz.age. Провери трите неща, които ни интересуват:

    bash · проверка
    ls -l ~/openclaw-backups                   # файлове с права -rw-------, само *.age
    ls -d /tmp/tmp.* 2>/dev/null               # не трябва да е останала временна папка
    # пробно разшифроване (ползва частния ключ — донеси го за момент):
    age -d -i /път/до/identity.txt ~/openclaw-backups/<файл>.age | tar -tz | head
    ⚠️
    Временният архив е нешифрован — докато трае скриптът
    Между стъпка 1 и 2 архивът е нешифрован във временната папка (права 700, изтрива се при излизане, дори при грешка). Това е приемливо на машина, на която вярваш; ако не — сложи TMPDIR на папка върху шифрован диск.
  5. Ротация: колко копия пазим

    Правилото е в последния ред на скрипта и е по брой: пази се най-новите KEEP шифровани архива (по подразбиране 14 — две седмици ежедневни копия). Защо не „трий всичко по-старо от N дни“? Защото ако копията тихо спрат (счупен график, пълен диск), след N дни ще изтриеш и последните работещи. Проба — с малко число:

    bash
    for i in 1 2 3 4 5; do KEEP=3 ~/bin/backup_openclaw.sh; done
    ls ~/openclaw-backups | wc -l              # трябва да покаже 3

    След проверката (с пробните копия) изтрий излишните на ръка — те са твои, не на скрипта.

    КъдеПравило (предложение)Как
    На машинатапоследните 14 шифровани архиваскриптът (KEEP=14)
    Извън машината (по избор)колкото ти е нужно за „връщане назад“, напр. 30 дни или 7 дневни + 4 седмични + 6 месечниправило на хранилището или restic forget (по-долу)
    Проба за възстановяваневеднъж месечностъпка 8

    Сигурността е част от срока. Старо копие съдържа старите достъпи. Когато смениш ключ на канал или доставчик, или заподозреш изтичане, сменяш достъпите и унищожаваш копията, които ги съдържат. Числата в таблицата са предложение — реши ти колко назад искаш да можеш да се върнеш.

  6. График: systemd таймер (и варианти)

    Вариант А — systemd (препоръчан). В WSL2 systemd не е винаги включен. Провери в Ubuntu: systemctl --user status. Ако не работи, добави във файла /etc/wsl.conf:

    ini · /etc/wsl.conf (с sudo)
    [boot]
    systemd=true

    После от PowerShell на Windows изпълни wsl --shutdown и отвори Ubuntu отново. След това две малки единици — услуга (какво се пуска) и таймер (кога):

    bash · създава двата файла
    mkdir -p ~/.config/systemd/user
    
    cat > ~/.config/systemd/user/openclaw-backup.service <<'EOF'
    [Unit]
    Description=Encrypted OpenClaw backup
    
    [Service]
    Type=oneshot
    Environment=PATH=%h/.npm-global/bin:/usr/local/bin:/usr/bin:/bin
    ExecStart=%h/bin/backup_openclaw.sh
    EOF
    
    cat > ~/.config/systemd/user/openclaw-backup.timer <<'EOF'
    [Unit]
    Description=Nightly encrypted OpenClaw backup
    
    [Timer]
    OnCalendar=*-*-* 02:30:00
    Persistent=true
    RandomizedDelaySec=10min
    
    [Install]
    WantedBy=timers.target
    EOF
    
    systemctl --user daemon-reload
    systemctl --user enable --now openclaw-backup.timer
    systemctl --user list-timers

    Persistent=true значи: ако машината е била изключена в 02:30, копието се прави при следващото включване. Редът с Environment=PATH=… е нужен, защото услугите на systemd не наследяват пътищата на твоя терминал — сложи там папката, където е openclaw (провери с command -v openclaw). Резултатите гледаш с journalctl --user -u openclaw-backup.service. За да работят потребителските таймери и без отворена сесия, може да е нужно loginctl enable-linger "$USER" ⚠️ (не сме го проверявали специално за WSL).

    ⚠️
    WSL2 спи, когато никой не го ползва
    Таймерът работи само докато Ubuntu е пуснат. Persistent=true наваксва при следващото стартиране, но ако искаш копие „в 02:30 на всяка цена“, използвай вариант В.

    Вариант Б — cron. Редактирай с crontab -e (а в WSL2 cron трябва да е пуснат: sudo service cron start):

    cron
    PATH=/home/<user>/.npm-global/bin:/usr/local/bin:/usr/bin:/bin
    30 2 * * * /home/<user>/bin/backup_openclaw.sh >> /home/<user>/openclaw-backups/backup.log 2>&1

    Провери с crontab -l, а след първия пуск — с tail -n 20 ~/openclaw-backups/backup.log.

    Вариант В — Планировчик на Windows, който буди Ubuntu и пуска скрипта (wsl -l -v показва името на дистрибуцията):

    PowerShell
    schtasks /Create /SC DAILY /ST 02:30 /TN "OpenClaw-Backup" /TR "wsl.exe -d Ubuntu-24.04 -- /home/<user>/bin/backup_openclaw.sh"

    ⚠️ Кавичките и пътят през schtasks не са проверени на живо — прегледай задачата в „Task Scheduler“ и я пусни веднъж на ръка.

    🧩
    Вграденият график на OpenClaw — друго нещо
    openclaw backup enable --repository <папка> --every 24h пуска график, притежаван от Gateway, но той записва само базите данни в git хранилище (дамп по таблици), не целия архив с настройки и работни пространства. С --push по подразбиране пропуска таблиците с достъпи, а за да тръгне, хранилището първо трябва да има отдалечен origin (openclaw backup git init --repository <папка> --remote <адрес>). Спира се с openclaw backup disable. Полезен допълнителен слой, не замяна на този урок. След време openclaw status показва ред „Backups“, а openclaw doctor предупреждава, ако няма успешно копие от над 14 дни ⚠️ (това не го потвърдихме при повторната проверка на документацията).
  7. Копие извън машината (по избор)

    Копие само на същия диск не пази от повреда или кражба. Тъй като вече всичко е шифровано, можеш спокойно да го пратиш на отдалечено хранилище 🌐 извън машината (S3-съвместимо, WebDAV и други, които rclone поддържа). Настройката на самото хранилище е отделна работа: rclone config → n) New remote → име (напр. remote) → тип (напр. webdav или s3) → адрес и данни за вход; пробата е rclone mkdir remote:openclaw-backups и rclone lsd remote:. Подробностите за всеки тип са в документацията на rclone. Инсталирай го от пакетите на Ubuntu (sudo apt install rclone) или по официалните указания, не с curl … | sudo bash на сляпо. Качваме само шифрованите файлове:

    bash
    rclone copy ~/openclaw-backups remote:openclaw-backups --include "*.tar.gz.age"

    remote: е името на хранилището, което си задал с rclone config. rclone copy не трие нищо на отсрещната страна — срокът там се урежда от правилата на хранилището.

    Вариант с restic. restic е самостоятелна програма за копия, която шифрова и сама. Ако предпочиташ нея пред age, в скрипта замени частите „шифроване“ и „ротация“ (коментари 2 и 3) с долните команди. Паролата на хранилището е във файл с права 600 (chmod 600), не в самата команда:

    bash · restic
    export RESTIC_REPOSITORY=/път/до/хранилище-или-remote
    export RESTIC_PASSWORD_FILE=~/.config/openclaw-backup/restic-pass.txt
    
    restic init
    restic backup "$STAGE" --tag openclaw            # вместо age: $STAGE е папката на архива
    restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
    restic check
    restic restore latest --target ~/restore-work/restic

    Честно за ползата: всеки архив е ново компресирано цяло, затова restic спестява малко място тук (документацията на OpenClaw също отбелязва, че подобни инструменти пак четат пълните копия). Предимството му е вграденото правило за срок (forget) и проверката (check).

  8. Възстановяване — и репетиция

    Възстановяването е нарочно „бавно и явно“: OpenClaw никога не пише върху живото състояние. Извлича копието в нова празна папка, а включването е отделна ръчна стъпка. Направи го веднъж сега, докато всичко работи — така знаеш, че ключът и копията са годни.

    bash · 1. разшифрова и провери
    mkdir -p ~/restore-work && chmod 700 ~/restore-work
    ls -1t ~/openclaw-backups/*.age | head -n 3
    age -d -i /път/до/identity.txt -o ~/restore-work/openclaw-backup.tar.gz ~/openclaw-backups/<файл>.age
    openclaw backup verify ~/restore-work/openclaw-backup.tar.gz
    bash · 2. извлечи в НОВА папка (репетицията свършва тук)
    openclaw backup restore ~/restore-work/openclaw-backup.tar.gz --target ~/restore-work/staging
    find ~/restore-work/staging -type d -name .openclaw

    Целта не трябва да съществува (или да е празна) и не може да е вътре в живото състояние. Вътре ще видиш manifest.json и папка payload/ — манифестът е източникът на истината за това какво къде е било. Ако това е репетиция, спри тук, прегледай и изтрий ~/restore-work.

    За истинско възстановяване: спри Gateway, махни настрана текущото състояние (или първо го архивирай), постави извлечената папка на мястото му и провери.

    bash · 3. включване (само при истинска нужда)
    openclaw gateway stop
    mv ~/.openclaw ~/.openclaw.before-restore
    mv "<пътят от find>" ~/.openclaw
    openclaw doctor
    openclaw gateway start
    openclaw health

    В скрипт или неинтерактивна обвивка openclaw gateway stop иска --force. Ако изнесеш състоянието другаде, вместо mv насочи OPENCLAW_STATE_DIR към него. ⚠️ Пътят payload/posix/… и стъпките по-горе са по документацията, не са пробвани върху истински архив.

    ⛔
    Възстановяването е „пътуване във времето“
    Достъпи до чат канали със съхранявано състояние (най-вече WhatsApp) може да се разсинхронизират и да искат повторно свързване. Изчакващи одобрения и състояние на доставките също се връщат назад — прегледай ги, преди да пуснеш Gateway отново. Програмите на разширенията не са в архива: след възстановяване пусни openclaw plugins update <id> (или преинсталирай) и openclaw skills list, за да се изградят наново.

    Пренасяне на друга машина. Същият архив служи и за преместване на асистента на нов компютър: на новата машина инсталираш OpenClaw, минаваш стъпките „разшифрова → verify → restore → включване“ и пускаш openclaw doctor. Официалното ръководство „Migrating between machines“ описва подробностите. Копието е моментна снимка за пренасяне, не постоянна синхронизация между две работещи машини.

04Проверка

✅
Копие, което не е възстановявано, е предположение
Поставяй в календара веднъж месечно проба за възстановяване. Три минути днес струват повече от часове в деня, когато ти потрябва.

05Какво следва

06Източници

  1. OpenClaw: командата openclaw backup — архиви, SQLite снимки, git история, график, какво влиза в копието.
  2. OpenClaw: ръководство за копия — избор на път, презапис само във нова папка, „пътуване във времето“, копие извън машината.
  3. OpenClaw: настройки — ~/.openclaw/openclaw.json, OPENCLAW_CONFIG_PATH.
  4. OpenClaw: управление на услугата на Gateway — gateway stop, start, restart.
  5. age 🔒 локално — прост инструмент за шифроване на файлове; ключове, получатели, -R, -d -i.
  6. restic 🔒 локално — копия със сам шифроване; backup, forget --prune, check, restore.
  7. Microsoft: настройки на WSL — /etc/wsl.conf и systemd=true.
  8. systemd.timer — OnCalendar, Persistent.