Безпечна міграція OpenClaw на новий Mac без втрати памʼяті та налаштувань

notes · 2026-05-26

Короткий висновок

Безпечна міграція OpenClaw на новий Mac — це не копіювання однієї папки ~/.openclaw. Правильний підхід: розділити систему на declarative layer, memory layer, secrets layer і runtime state, а потім переносити їх контрольовано.

Для мого сетапу оптимальна модель така:

  1. macOS baseline через Nix~/Projects/mac-config, nix-darwin, home-manager, Homebrew bundle.
  2. OpenClaw runtime/config~/.openclaw/openclaw.json, агенти, workspace, cron, LaunchAgents.
  3. Памʼять і knowledge base~/Projects/knowledge-base як canonical encrypted Obsidian/knowledge vault; ~/.openclaw/workspace/MEMORY.md і memory/*.md як локальна operational memory.
  4. Secrets.env, provider keys, git-crypt key, OAuth/session state, SSH/GPG/age keys; переносити окремо, не комітити в репозиторії.
  5. Validation gatesopenclaw status, web search, memory recall, Telegram, Hugo build, cron inventory, local Hugo servers.

Головне правило: спочатку backup і inventory, потім Nix bootstrap, потім OpenClaw restore, потім validation, і тільки після цього cutover.


Що саме потрібно зберегти

1. Declarative system config

Це має бути основа нового Mac:

  • ~/Projects/mac-config
  • flake.nix
  • hosts/openclaw.nix
  • modules/home/*.nix
  • Brewfile
  • justfile
  • .sops.yaml

У цьому сетапі openclaw host вже описаний як multi-user Mac:

  • admin user: user
  • day-to-day OpenClaw user: openclaw
  • OpenClaw package встановлюється через official nix-openclaw flake
  • firewall вмикається declaratively
  • home-manager налаштовує shell, git, tmux, direnv, obsidian skeleton, dev tooling

Це правильний pattern: новий Mac не налаштовується вручну кліками; він відтворюється з Git.

2. OpenClaw config and runtime

Критичні файли й директорії:

~/.openclaw/openclaw.json
~/.openclaw/.env
~/.openclaw/cron/jobs.json
~/.openclaw/plugins/
~/.openclaw/identity/
~/.openclaw/agents/
~/.openclaw/workspace/
~/.openclaw/workspace/MEMORY.md
~/.openclaw/workspace/memory/
~/.openclaw/workspace/AGENTS.md
~/.openclaw/workspace/SOUL.md
~/.openclaw/workspace/USER.md
~/.openclaw/workspace/TOOLS.md

Не все з цього однаково переносити.

Path Переносити? Коментар
openclaw.json так основна конфігурація gateway, tools, plugins, channels
.env так, але encrypted/manual provider keys; не в Git plaintext
cron/jobs.json так автоматизації, daily jobs, Hugo publishing
workspace/MEMORY.md так curated long-term memory
workspace/memory/*.md так daily operational memory
workspace/AGENTS.md, SOUL.md, USER.md так persona, user prefs, operating rules
agents/main/sessions/ бажано snapshot корисно для continuity/debug, але не primary source of truth
cache/ ні можна відновити автоматично
logs/ optional тільки якщо потрібна forensic/debug історія
exec-approvals.json ні/обережно runtime approvals не повинні сліпо переноситись

3. Canonical memory / Obsidian / knowledge vault

Для довгої памʼяті canonical source має бути не chat history, а vault:

~/Projects/knowledge-base

Важливі частини:

~/Projects/knowledge-base/openclaw/_index.md
~/Projects/knowledge-base/openclaw/CLAUDE.md
~/Projects/knowledge-base/openclaw/_shared/conventions.md
~/Projects/knowledge-base/openclaw/publishing/
~/Projects/knowledge-base/openclaw/sessions/

Цей repo має бути encrypted через git-crypt. На новому Mac потрібно мати ключ для unlock, наприклад:

~/Documents/git-crypt-knowledge-base.key

Правило: OpenClaw workspace memory — це runtime memory; knowledge-base — це canonical portable memory.

Якщо є конфлікт між старою chat памʼяттю і vault — виграє vault.

4. Publishing/Hugo repos

Для Hugo-публікацій потрібні локальні репозиторії:

~/Projects/devsecops-hugo
~/Projects/study-hugo
~/Projects/health-fitness
~/Projects/aleksom.com

Ключові очікування:

  • devsecops-hugo пушиться в origin/main, Cloudflare Pages деплоїть автоматично.
  • study-hugo локально працює на 1314.
  • devsecops-hugo локально працює на 1313.
  • health-fitness локально працює на 1315.

Для OpenClaw host є LaunchAgents:

~/Library/LaunchAgents/ai.openclaw.hugo.devsecops.plist
~/Library/LaunchAgents/ai.openclaw.hugo.studdy.plist
~/Library/LaunchAgents/ai.openclaw.hugo.health-fitness.plist

Їх можна переносити, але краще з часом зробити declarative через Nix/home-manager. Ручні LaunchAgents — це acceptable runtime state, але не ідеальний long-term pattern.


Pre-migration checklist на старому Mac

Крок 1. Зафіксувати поточний стан

openclaw status > ~/Desktop/openclaw-status-before-migration.txt
openclaw config validate > ~/Desktop/openclaw-config-validate-before-migration.txt

Додатково:

git -C ~/Projects/mac-config status --short
git -C ~/Projects/knowledge-base status --short
git -C ~/Projects/devsecops-hugo status --short
git -C ~/Projects/study-hugo status --short

Якщо є uncommitted зміни — або commit, або свідомо включити в backup. Не починати міграцію з dirty state, якщо це не вимушено.

Крок 2. Зробити inventory OpenClaw

find ~/.openclaw -maxdepth 3 -type f \
  | sed "s#$HOME#~#" \
  | sort \
  > ~/Desktop/openclaw-file-inventory.txt

Окремо зберегти список cron jobs:

jq '.jobs // .' ~/.openclaw/cron/jobs.json \
  > ~/Desktop/openclaw-cron-jobs-before-migration.json

Якщо структура jobs.json інша — не страшно, головне мати readable snapshot.

Крок 3. Перевірити Git remotes

for repo in mac-config knowledge-base devsecops-hugo study-hugo aleksom.com; do
  echo "--- $repo"
  git -C ~/Projects/$repo remote -v || true
  git -C ~/Projects/$repo branch --show-current || true
  git -C ~/Projects/$repo status --short || true
done

Ціль: знати, що можна відновити з Git, а що є тільки локально.

Крок 4. Зробити encrypted backup OpenClaw state

Не варто робити plaintext tarball з secrets. Мінімально — створити archive і зашифрувати age/GPG або покласти в 1Password/secure storage.

Приклад із age:

mkdir -p ~/Backups/openclaw-migration

cd ~
tar --exclude='.openclaw/cache' \
    --exclude='.openclaw/logs' \
    --exclude='.openclaw/tmp' \
    -czf ~/Backups/openclaw-migration/openclaw-state-$(date +%Y%m%d-%H%M).tar.gz \
    .openclaw

age -r '<AGE_PUBLIC_KEY>' \
  -o ~/Backups/openclaw-migration/openclaw-state-$(date +%Y%m%d-%H%M).tar.gz.age \
  ~/Backups/openclaw-migration/openclaw-state-*.tar.gz

Після encryption plaintext archive краще видалити через trash, не rm:

trash ~/Backups/openclaw-migration/openclaw-state-*.tar.gz

Якщо trash недоступний — встановити або видаляти тільки після перевірки encrypted archive.

Крок 5. Зробити окремий backup secrets

Секрети не змішувати з operational files.

Перевірити наявність:

ls -la ~/.openclaw/.env
ls -la ~/.ssh
ls -la ~/.config/sops/age/keys.txt
ls -la ~/Documents/git-crypt-knowledge-base.key

Що треба перенести окремо:

  • ~/.openclaw/.env — API keys, provider secrets.
  • ~/.ssh/id_ed25519* або новий SSH key + GitHub registration.
  • ~/.config/sops/age/keys.txt — якщо використовується sops-nix.
  • ~/Documents/git-crypt-knowledge-base.key — unlock knowledge-base.
  • GPG keys, якщо потрібні для commits/signing/decryption.
  • 1Password/Vault recovery матеріали.

Best practice: краще згенерувати нові SSH keys на новому Mac і додати їх у GitHub, ніж бездумно переносити старі. Але git-crypt/SOPS keys треба мати доступними, інакше encrypted vault не відкриється.

Крок 6. Commit and push canonical repos

cd ~/Projects/mac-config
git status --short
# якщо є важливі зміни:
git add -A && git commit -m "Update mac OpenClaw migration baseline" && git push

cd ~/Projects/knowledge-base
git status --short
# якщо є важливі зміни:
git add -A && git commit -m "Update OpenClaw migration notes" && git push

Для Hugo:

cd ~/Projects/devsecops-hugo
hugo --minify
git status --short
# commit/push якщо є зміни

Bootstrap нового Mac через Nix

Крок 1. Підготувати macOS

На новому Mac:

  1. Встановити macOS updates.
  2. Увійти в admin account user.
  3. Увімкнути FileVault.
  4. Увімкнути firewall.
  5. Встановити Xcode Command Line Tools:
xcode-select --install

Крок 2. Запустити mac-config bootstrap

Для OpenClaw host:

curl -fsSL https://raw.githubusercontent.com/omitsalex/mac-config/main/bootstrap.sh \
  | bash -s -- --hostname openclaw

Або вручну:

git clone https://github.com/omitsalex/mac-config.git ~/mac-config
cd ~/mac-config
./install.sh --hostname openclaw

Це має:

  • встановити Nix;
  • застосувати nix-darwin config;
  • створити day-to-day user openclaw, якщо його ще немає;
  • встановити OpenClaw package через Nix;
  • налаштувати home-manager для openclaw;
  • застосувати базові macOS defaults.

Після цього логінитись як openclaw для щоденної роботи.

Крок 3. Перевірити Nix baseline

cd ~/mac-config
just sysinfo
just build openclaw

Якщо треба застосувати зміни:

sudo darwin-rebuild switch --flake .#openclaw

Або з admin account згідно з поточним mac-config flow.


Restore OpenClaw

Крок 1. Встановити базову директорію

Під user openclaw:

mkdir -p ~/.openclaw

Крок 2. Відновити encrypted backup

mkdir -p ~/Restore/openclaw
age -d -i ~/.config/sops/age/keys.txt \
  -o ~/Restore/openclaw/openclaw-state.tar.gz \
  ~/Backups/openclaw-migration/openclaw-state-YYYYMMDD-HHMM.tar.gz.age

tar -xzf ~/Restore/openclaw/openclaw-state.tar.gz -C ~

Перевірити permissions:

chmod 700 ~/.openclaw
chmod 600 ~/.openclaw/.env 2>/dev/null || true
chmod 600 ~/.openclaw/openclaw.json

Крок 3. Не переносити blind runtime state, якщо версія OpenClaw суттєво змінилась

Якщо новий Mac має новішу OpenClaw версію, обережно з такими директоріями:

~/.openclaw/cache
~/.openclaw/tmp
~/.openclaw/exec-approvals.json

Їх краще не переносити або видалити після restore.

Для session history можна зберегти:

~/.openclaw/agents/main/sessions/

Але operational truth має бути у:

~/.openclaw/workspace/MEMORY.md
~/.openclaw/workspace/memory/
~/Projects/knowledge-base

Restore knowledge-base / Obsidian memory

Крок 1. Clone canonical vault

mkdir -p ~/Projects
cd ~/Projects
git clone https://github.com/omitsalex/knowledge-base.git
cd knowledge-base

Крок 2. Unlock git-crypt

git-crypt unlock ~/Documents/git-crypt-knowledge-base.key

Перевірити, що файли readable:

sed -n '1,80p' openclaw/_index.md
sed -n '1,120p' openclaw/_shared/conventions.md

Крок 3. Перевірити Obsidian path

У mac-config/modules/home/obsidian.nix зараз skeleton орієнтований на iCloud Obsidian path:

~/Library/Mobile Documents/com~apple~CloudDocs/Obsidian

Але для OpenClaw canonical shared vault використовується:

~/Projects/knowledge-base

Best practice: не змішувати ці дві ролі.

  • ~/Projects/knowledge-base — portable encrypted shared source of truth.
  • iCloud Obsidian vault — UI/convenience layer, якщо потрібен Obsidian на Apple devices.
  • OpenClaw має читати/оновлювати canonical repo, коли знання повинне пережити міграцію.

Якщо хочеться бачити knowledge-base в Obsidian — додати його як окремий vault, а не копіювати вручну в iCloud без sync strategy.


Restore projects and Hugo publishing

cd ~/Projects
git clone https://github.com/omitsalex/devsecops-hugo.git
git clone https://github.com/omitsalex/study-hugo.git
git clone https://github.com/omitsalex/aleksom.com.git

Для health-fitness, якщо він ще не в GitHub, треба або:

  1. додати repo і пушнути перед міграцією;
  2. або включити його в encrypted backup;
  3. або перенести через rsync.

Перевірка Hugo:

cd ~/Projects/devsecops-hugo
hugo --minify

cd ~/Projects/study-hugo
hugo --minify

cd ~/Projects/health-fitness
hugo --minify

Якщо Hugo не встановлений — він має прийти через Nix/Homebrew config. Якщо ні:

brew install hugo

Але краще додати Hugo в mac-config, якщо він є required dependency.


Restore LaunchAgents / local services

OpenClaw gateway зазвичай встановлюється як LaunchAgent через OpenClaw setup. Перевірка:

openclaw status
launchctl list | grep -i openclaw || true

Для Hugo local services:

ls -la ~/Library/LaunchAgents | grep hugo

Очікувані сервіси:

ai.openclaw.hugo.devsecops
ai.openclaw.hugo.studdy
ai.openclaw.hugo.health-fitness

Перезапуск:

launchctl kickstart -k gui/$(id -u)/ai.openclaw.hugo.devsecops
launchctl kickstart -k gui/$(id -u)/ai.openclaw.hugo.studdy
launchctl kickstart -k gui/$(id -u)/ai.openclaw.hugo.health-fitness

Перевірка портів:

curl -I http://127.0.0.1:1313/
curl -I http://127.0.0.1:1314/
curl -I http://127.0.0.1:1315/

Якщо треба доступ з домашньої мережі — Hugo має bind-итись не на 127.0.0.1, а на 0.0.0.0, а baseURL має містити LAN IP:

hugo server --bind 0.0.0.0 --baseURL http://192.168.1.x:1315/ --port 1315 --disableFastRender

Security note: LAN exposure — це не public internet, але все одно exposure. Не піднімати admin/debug endpoints на 0.0.0.0 без потреби.


Restore OpenClaw providers and tools

Config validation

openclaw config validate
openclaw status

Web search / Gemini

Поточний бажаний стан:

{
  "tools": {
    "web": {
      "search": {
        "enabled": true,
        "provider": "gemini"
      }
    }
  },
  "plugins": {
    "entries": {
      "google": {
        "enabled": true,
        "config": {
          "webSearch": {
            "model": "gemini-2.5-flash"
          }
        }
      }
    }
  }
}

Секрет має бути в:

~/.openclaw/.env

Наприклад:

GEMINI_API_KEY=...

Не комітити .env. Не вставляти ключі в Hugo notes, Obsidian plaintext або GitHub issues.

Telegram

Перевірити Telegram channel у openclaw status. Якщо bot token перенесений через .env/config, channel має бути OK.

Якщо session binding змінився, не відновлювати blind старі pairing tokens без розуміння. Краще пройти re-pairing, ніж переносити зламаний auth state.


Memory validation після міграції

Це критичний етап. Не достатньо, що OpenClaw “запустився”. Треба перевірити, що він памʼятає правильно.

1. Перевірити workspace memory

ls -la ~/.openclaw/workspace
ls -la ~/.openclaw/workspace/memory
sed -n '1,120p' ~/.openclaw/workspace/USER.md
sed -n '1,120p' ~/.openclaw/workspace/MEMORY.md

2. Перевірити canonical vault

cd ~/Projects/knowledge-base
git status --short
sed -n '1,120p' openclaw/_index.md
sed -n '1,120p' openclaw/_shared/conventions.md

3. Запитати OpenClaw контрольні питання

Після запуску в чаті:

  • “Як мене звати і яка моя timezone?”
  • “Де canonical knowledge vault?”
  • “Які Hugo сайти в мене є і на яких портах?”
  • “Які правила для cron/Hugo publishing?”
  • “Який мій підхід до Terraform/Terragrunt команд?”

Правильні відповіді мають включати:

  • Aleksandr, Europe/Lisbon;
  • ~/Projects/knowledge-base;
  • devsecops-hugo, study-hugo, health-fitness;
  • Hugo jobs: validate/build, commit, push to origin main;
  • Terraform/Terragrunt/OpenTofu — у named tmux sessions.

Якщо відповіді неправильні — не продовжувати automation, спочатку виправити memory/vault.


Cutover strategy

Варіант A — conservative parallel run

Найбезпечніше:

  1. Старий Mac лишається включеним, але cron/automation pause або read-only.
  2. Новий Mac запускає OpenClaw без production-like changes.
  3. Перевіряються Telegram, web search, memory, Hugo builds.
  4. Після validation cron переноситься/активується на новому Mac.
  5. Старий Mac лишається backup ще 3–7 днів.

Це найкращий варіант, якщо OpenClaw керує публікаціями, reminders, Telegram або infra workflows.

Варіант B — fast cutover

Можна, але ризик вище:

  1. Full encrypted backup.
  2. Restore на новому Mac.
  3. Одразу зупинити OpenClaw на старому.
  4. Запустити на новому.

Ризик: якщо щось не перенеслось — cron може мовчки зламатися, Telegram binding може бути неправильний, або memory буде неповна.

Рекомендація: для OpenClaw краще conservative parallel run.


Security best practices

1. Не переносити secrets без ревізії

Міграція — хороший момент для rotation:

  • GitHub PATs;
  • OpenAI/OpenRouter/Gemini keys;
  • Telegram bot token, якщо є підозра exposure;
  • AWS credentials;
  • SSH keys, якщо старий Mac більше не буде trusted.

2. Новий Mac = нова trust boundary

Перед тим як давати OpenClaw доступ до cloud/infra:

  • FileVault on;
  • firewall on;
  • OS updated;
  • admin user відділений від day-to-day openclaw user;
  • SSH keys protected;
  • 1Password/Vault доступ налаштований;
  • no plaintext secret archives залишені в Downloads/Desktop.

3. Не робити rsync ~ без фільтрів

Поганий pattern:

rsync -a ~ newmac:~

Чому погано:

  • переносить cache, logs, stale sockets;
  • може зламати permissions;
  • переносить secrets без інвентаризації;
  • змішує declarative і accidental state.

Краще переносити named artifacts:

~/.openclaw selected backup
~/Projects repos via Git
selected secrets via secure channel
LaunchAgents if needed
Documents/git-crypt key via secure storage

4. Secrets у notes — заборонено

У Hugo/Obsidian можна писати:

GEMINI_API_KEY має бути в ~/.openclaw/.env

Не можна писати:

GEMINI_API_KEY=AIza...

5. Automation після міграції вмикати поступово

Порядок:

  1. OpenClaw gateway.
  2. Telegram receive/send.
  3. Memory recall.
  4. Web search.
  5. Hugo local build.
  6. Git push to GitHub.
  7. Cloudflare Pages deploy.
  8. Cron jobs.
  9. Infra/Terraform tooling.

Не навпаки.


Post-migration validation checklist

OpenClaw

openclaw status
openclaw config validate
openclaw status --deep

Очікування:

  • Gateway running.
  • Telegram channel OK.
  • Memory enabled.
  • web_search provider correct.
  • No plugin compatibility issues.

Git

git -C ~/Projects/mac-config status --short
git -C ~/Projects/knowledge-base status --short
git -C ~/Projects/devsecops-hugo status --short

Очікування: clean або тільки свідомі локальні зміни.

Hugo

cd ~/Projects/devsecops-hugo && hugo --minify
cd ~/Projects/study-hugo && hugo --minify
cd ~/Projects/health-fitness && hugo --minify

Cloudflare publishing path

Тестовий safe flow:

cd ~/Projects/devsecops-hugo
hugo --minify
git status --short
# якщо є тестовий або реальний пост:
git add content/notes/example.md
git commit -m "Add migration validation note"
git push origin main

Потім перевірити Cloudflare Pages deployment у UI або через публічний сайт.

Cron

jq '.jobs // .' ~/.openclaw/cron/jobs.json | head

Після першого дня перевірити:

  • чи DevSecOps digest створюється;
  • чи OpenClaw ideas створюються;
  • чи routine jobs не спамлять Telegram;
  • чи статуси пишуться у vault/notes.

Rollback plan

До остаточного cutover старий Mac не стирати.

Мінімальний rollback:

  1. Зупинити OpenClaw на новому Mac.
  2. Запустити OpenClaw на старому Mac.
  3. Відкотити DNS/Telegram/session expectation, якщо треба.
  4. Зафіксувати в knowledge-base, що cutover failed і чому.

Не робити factory reset старого Mac, доки:

  • новий Mac не відпрацював хоча б 3–7 днів;
  • cron jobs не пройшли повний цикл;
  • Hugo publishing не зробив успішний commit/push/deploy;
  • memory recall перевірений;
  • secrets rotation завершена або явно відкладена.

Що варто покращити в майбутньому

1. Зробити OpenClaw LaunchAgents declarative

Зараз частина Hugo local services може бути ручними plist у ~/Library/LaunchAgents. Краще перенести їх у mac-config як home-manager launchd agents.

Перевага:

  • новий Mac автоматично підніме Hugo servers;
  • менше manual restore;
  • конфіг портів і bind адрес буде reviewed у Git.

2. Винести backup script у mac-config

Додати команду типу:

just backup-openclaw

Вона має:

  • робити inventory;
  • архівувати selected OpenClaw state;
  • exclude cache/logs;
  • encrypt через age;
  • писати manifest;
  • перевіряти, що archive decryptable.

3. Регулярний restore drill

Раз на місяць корисно робити dry-run:

  • decrypt backup у temp dir;
  • перевірити наявність openclaw.json, .env, memory;
  • перевірити knowledge-base unlock;
  • не запускати production automation.

Backup, який ніхто не restore-ив, — це припущення, не backup.

4. Окремий migration runbook у knowledge-base

Цю Hugo note варто продублювати або послати з:

~/Projects/knowledge-base/openclaw/_shared/conventions.md
~/Projects/knowledge-base/openclaw/_index.md

Бо Hugo — це published/readable knowledge, а knowledge-base — operational source of truth для майбутнього OpenClaw instance.


Final runbook: коротко

На старому Mac:

openclaw status > ~/Desktop/openclaw-status-before-migration.txt
openclaw config validate

cd ~/Projects/mac-config && git status --short
cd ~/Projects/knowledge-base && git status --short
cd ~/Projects/devsecops-hugo && hugo --minify

# encrypted backup ~/.openclaw
# secure copy .env, git-crypt key, age key, SSH/GPG material
# commit/push canonical repos

На новому Mac:

xcode-select --install
curl -fsSL https://raw.githubusercontent.com/omitsalex/mac-config/main/bootstrap.sh \
  | bash -s -- --hostname openclaw

# log in as openclaw
# restore ~/.openclaw from encrypted backup
# clone ~/Projects/knowledge-base and git-crypt unlock
# clone Hugo/project repos

openclaw config validate
openclaw status

cd ~/Projects/devsecops-hugo && hugo --minify
cd ~/Projects/study-hugo && hugo --minify

Після цього:

  1. Перевірити Telegram.
  2. Перевірити memory recall.
  3. Перевірити Gemini/web search.
  4. Перевірити Hugo local servers.
  5. Перевірити Cloudflare deploy через push.
  6. Увімкнути/перевірити cron.
  7. Тримати старий Mac як rollback 3–7 днів.

Це не найшвидший спосіб. Це спосіб, який не втрачає памʼять, не розмазує secrets і не перетворює OpenClaw migration на archaeology project через пів року.