From 7187d1da06082c85e925a76f3495c79402b7b2b4 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Thu, 19 Mar 2026 11:52:39 -0700 Subject: [PATCH] =?UTF-8?q?docs:=20rewrite=20updating.md=20(276=E2=86=9212?= =?UTF-8?q?8=20lines)=20and=20migrating.md=20(193=E2=86=92107=20lines)=20f?= =?UTF-8?q?or=20readability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/install/migrating.md | 230 +++++++++++----------------------- docs/install/updating.md | 253 ++++++++------------------------------ 2 files changed, 127 insertions(+), 356 deletions(-) diff --git a/docs/install/migrating.md b/docs/install/migrating.md index 64c136be425..49e8e7606bb 100644 --- a/docs/install/migrating.md +++ b/docs/install/migrating.md @@ -6,187 +6,105 @@ read_when: title: "Migration Guide" --- -# Migrating OpenClaw to a new machine +# Migrating OpenClaw to a New Machine -This guide migrates an OpenClaw Gateway from one machine to another **without redoing onboarding**. +This guide moves an OpenClaw gateway to a new machine without redoing onboarding. -The migration is simple conceptually: +## What Gets Migrated -- Copy the **state directory** (`$OPENCLAW_STATE_DIR`, default: `~/.openclaw/`) — this includes config, auth, sessions, and channel state. -- Copy your **workspace** (`~/.openclaw/workspace/` by default) — this includes your agent files (memory, prompts, etc.). +When you copy the **state directory** (`~/.openclaw/` by default) and your **workspace**, you preserve: -But there are common footguns around **profiles**, **permissions**, and **partial copies**. +- **Config** -- `openclaw.json` and all gateway settings +- **Auth** -- API keys, OAuth tokens, credential profiles +- **Sessions** -- conversation history and agent state +- **Channel state** -- WhatsApp login, Telegram session, etc. +- **Workspace files** -- `MEMORY.md`, `USER.md`, skills, and prompts -## Before you start (what you are migrating) + +Run `openclaw status` on the old machine to confirm your state directory path. +Custom profiles use `~/.openclaw-/` or a path set via `OPENCLAW_STATE_DIR`. + -### 1) Identify your state directory +## Migration Steps -Most installs use the default: + + + On the **old** machine, stop the gateway so files are not changing mid-copy, then archive: -- **State dir:** `~/.openclaw/` + ```bash + openclaw gateway stop + cd ~ + tar -czf openclaw-state.tgz .openclaw + ``` -But it may be different if you use: + If you use multiple profiles (e.g. `~/.openclaw-work`), archive each separately. -- `--profile ` (often becomes `~/.openclaw-/`) -- `OPENCLAW_STATE_DIR=/some/path` + -If you’re not sure, run on the **old** machine: + + [Install](/install) the CLI (and Node if needed) on the new machine. + It is fine if onboarding creates a fresh `~/.openclaw/` -- you will overwrite it next. + -```bash -openclaw status -``` + + Transfer the archive via `scp`, `rsync -a`, or an external drive, then extract: -Look for mentions of `OPENCLAW_STATE_DIR` / profile in the output. If you run multiple gateways, repeat for each profile. + ```bash + cd ~ + tar -xzf openclaw-state.tgz + ``` -### 2) Identify your workspace + Ensure hidden directories were included and file ownership matches the user that will run the gateway. -Common defaults: + -- `~/.openclaw/workspace/` (recommended workspace) -- a custom folder you created + + On the new machine, run [Doctor](/gateway/doctor) to apply config migrations and repair services: -Your workspace is where files like `MEMORY.md`, `USER.md`, and `memory/*.md` live. + ```bash + openclaw doctor + openclaw gateway restart + openclaw status + ``` -### 3) Understand what you will preserve + + -If you copy **both** the state dir and workspace, you keep: +## Common Pitfalls -- Gateway configuration (`openclaw.json`) -- Auth profiles / API keys / OAuth tokens -- Session history + agent state -- Channel state (e.g. WhatsApp login/session) -- Your workspace files (memory, skills notes, etc.) + + + If the old gateway used `--profile` or `OPENCLAW_STATE_DIR` and the new one does not, + channels will appear logged out and sessions will be empty. + Launch the gateway with the **same** profile or state-dir you migrated, then rerun `openclaw doctor`. + -If you copy **only** the workspace (e.g., via Git), you do **not** preserve: + + The config file alone is not enough. Credentials live under `credentials/`, and agent + state lives under `agents/`. Always migrate the **entire** state directory. + -- sessions -- credentials -- channel logins + + If you copied as root or switched users, the gateway may fail to read credentials. + Ensure the state directory and workspace are owned by the user running the gateway. + -Those live under `$OPENCLAW_STATE_DIR`. + + If your UI points at a **remote** gateway, the remote host owns sessions and workspace. + Migrate the gateway host itself, not your local laptop. See [FAQ](/help/faq#where-does-openclaw-store-its-data). + -## Migration steps (recommended) + + The state directory contains API keys, OAuth tokens, and channel credentials. + Store backups encrypted, avoid insecure transfer channels, and rotate keys if you suspect exposure. + + -### Step 0 - Make a backup (old machine) - -On the **old** machine, stop the gateway first so files aren’t changing mid-copy: - -```bash -openclaw gateway stop -``` - -(Optional but recommended) archive the state dir and workspace: - -```bash -# Adjust paths if you use a profile or custom locations -cd ~ -tar -czf openclaw-state.tgz .openclaw - -tar -czf openclaw-workspace.tgz .openclaw/workspace -``` - -If you have multiple profiles/state dirs (e.g. `~/.openclaw-main`, `~/.openclaw-work`), archive each. - -### Step 1 - Install OpenClaw on the new machine - -On the **new** machine, install the CLI (and Node if needed): - -- See: [Install](/install) - -At this stage, it’s OK if onboarding creates a fresh `~/.openclaw/` — you will overwrite it in the next step. - -### Step 2 - Copy the state dir + workspace to the new machine - -Copy **both**: - -- `$OPENCLAW_STATE_DIR` (default `~/.openclaw/`) -- your workspace (default `~/.openclaw/workspace/`) - -Common approaches: - -- `scp` the tarballs and extract -- `rsync -a` over SSH -- external drive - -After copying, ensure: - -- Hidden directories were included (e.g. `.openclaw/`) -- File ownership is correct for the user running the gateway - -### Step 3 - Run Doctor (migrations + service repair) - -On the **new** machine: - -```bash -openclaw doctor -``` - -Doctor is the “safe boring” command. It repairs services, applies config migrations, and warns about mismatches. - -Then: - -```bash -openclaw gateway restart -openclaw status -``` - -## Common footguns (and how to avoid them) - -### Footgun: profile / state-dir mismatch - -If you ran the old gateway with a profile (or `OPENCLAW_STATE_DIR`), and the new gateway uses a different one, you’ll see symptoms like: - -- config changes not taking effect -- channels missing / logged out -- empty session history - -Fix: run the gateway/service using the **same** profile/state dir you migrated, then rerun: - -```bash -openclaw doctor -``` - -### Footgun: copying only `openclaw.json` - -`openclaw.json` is not enough. Many providers store state under: - -- `$OPENCLAW_STATE_DIR/credentials/` -- `$OPENCLAW_STATE_DIR/agents//...` - -Always migrate the entire `$OPENCLAW_STATE_DIR` folder. - -### Footgun: permissions / ownership - -If you copied as root or changed users, the gateway may fail to read credentials/sessions. - -Fix: ensure the state dir + workspace are owned by the user running the gateway. - -### Footgun: migrating between remote/local modes - -- If your UI (WebUI/TUI) points at a **remote** gateway, the remote host owns the session store + workspace. -- Migrating your laptop won’t move the remote gateway’s state. - -If you’re in remote mode, migrate the **gateway host**. - -### Footgun: secrets in backups - -`$OPENCLAW_STATE_DIR` contains secrets (API keys, OAuth tokens, WhatsApp creds). Treat backups like production secrets: - -- store encrypted -- avoid sharing over insecure channels -- rotate keys if you suspect exposure - -## Verification checklist +## Verification Checklist On the new machine, confirm: -- `openclaw status` shows the gateway running -- Your channels are still connected (e.g. WhatsApp doesn’t require re-pair) -- The dashboard opens and shows existing sessions -- Your workspace files (memory, configs) are present - -## Related - -- [Doctor](/gateway/doctor) -- [Gateway troubleshooting](/gateway/troubleshooting) -- [Where does OpenClaw store its data?](/help/faq#where-does-openclaw-store-its-data) +- [ ] `openclaw status` shows the gateway running +- [ ] Channels are still connected (no re-pairing needed) +- [ ] The dashboard opens and shows existing sessions +- [ ] Workspace files (memory, configs) are present diff --git a/docs/install/updating.md b/docs/install/updating.md index ddae557c9f2..bbe3e949d96 100644 --- a/docs/install/updating.md +++ b/docs/install/updating.md @@ -8,44 +8,35 @@ title: "Updating" # Updating -OpenClaw is moving fast (pre “1.0”). Treat updates like shipping infra: update → run checks → restart (or use `openclaw update`, which restarts) → verify. +Keep OpenClaw up to date. -## Recommended: re-run the website installer (upgrade in place) +## Recommended: `openclaw update` -The **preferred** update path is to re-run the installer from the website. It -detects existing installs, upgrades in place, and runs `openclaw doctor` when -needed. +The fastest way to update. It detects your install type (npm or git), fetches the latest version, runs `openclaw doctor`, and restarts the gateway. + +```bash +openclaw update +``` + +To switch channels or target a specific version: + +```bash +openclaw update --channel beta +openclaw update --tag main +openclaw update --dry-run # preview without applying +``` + +See [Development channels](/install/development-channels) for channel semantics. + +## Alternative: re-run the installer ```bash curl -fsSL https://openclaw.ai/install.sh | bash ``` -Notes: +Add `--no-onboard` to skip onboarding. For source installs, pass `--install-method git --no-onboard`. -- Add `--no-onboard` if you don’t want onboarding to run again. -- For **source installs**, use: - - ```bash - curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git --no-onboard - ``` - - The installer will `git pull --rebase` **only** if the repo is clean. - -- For **global installs**, the script uses `npm install -g openclaw@latest` under the hood. -- Legacy note: `clawdbot` remains available as a compatibility shim. - -## Before you update - -- Know how you installed: **global** (npm/pnpm) vs **from source** (git clone). -- Know how your Gateway is running: **foreground terminal** vs **supervised service** (launchd/systemd). -- Snapshot your tailoring: - - Config: `~/.openclaw/openclaw.json` - - Credentials: `~/.openclaw/credentials/` - - Workspace: `~/.openclaw/workspace` - -## Update (global install) - -Global install (pick one): +## Alternative: manual npm or pnpm ```bash npm i -g openclaw@latest @@ -55,43 +46,9 @@ npm i -g openclaw@latest pnpm add -g openclaw@latest ``` -We do **not** recommend Bun for the Gateway runtime (WhatsApp/Telegram bugs). +## Auto-updater -To switch update channels (git + npm installs): - -```bash -openclaw update --channel beta -openclaw update --channel dev -openclaw update --channel stable -``` - -Use `--tag ` for a one-off package target override. - -For the current GitHub `main` head via a package-manager install: - -```bash -openclaw update --tag main -``` - -Manual equivalents: - -```bash -npm i -g github:openclaw/openclaw#main -``` - -```bash -pnpm add -g github:openclaw/openclaw#main -``` - -You can also pass an explicit package spec to `--tag` for one-off updates (for example a GitHub ref or tarball URL). - -See [Development channels](/install/development-channels) for channel semantics and release notes. - -Note: on npm installs, the gateway logs an update hint on startup (checks the current channel tag). Disable via `update.checkOnStart: false`. - -### Core auto-updater (optional) - -Auto-updater is **off by default** and is a core Gateway feature (not a plugin). +The auto-updater is off by default. Enable it in `~/.openclaw/openclaw.json`: ```json5 { @@ -107,169 +64,65 @@ Auto-updater is **off by default** and is a core Gateway feature (not a plugin). } ``` -Behavior: +| Channel | Behavior | +| -------- | ------------------------------------------------------------------------------------------------------------- | +| `stable` | Waits `stableDelayHours`, then applies with deterministic jitter across `stableJitterHours` (spread rollout). | +| `beta` | Checks every `betaCheckIntervalHours` (default: hourly) and applies immediately. | +| `dev` | No automatic apply. Use `openclaw update` manually. | -- `stable`: when a new version is seen, OpenClaw waits `stableDelayHours` and then applies a deterministic per-install jitter in `stableJitterHours` (spread rollout). -- `beta`: checks on `betaCheckIntervalHours` cadence (default: hourly) and applies when an update is available. -- `dev`: no automatic apply; use manual `openclaw update`. +The gateway also logs an update hint on startup (disable with `update.checkOnStart: false`). -Use `openclaw update --dry-run` to preview update actions before enabling automation. +## After updating -Then: + + +### Run doctor ```bash openclaw doctor +``` + +Migrates config, audits DM policies, and checks gateway health. Details: [Doctor](/gateway/doctor) + +### Restart the gateway + +```bash openclaw gateway restart +``` + +### Verify + +```bash openclaw health ``` -Notes: + -- If your Gateway runs as a service, `openclaw gateway restart` is preferred over killing PIDs. -- If you’re pinned to a specific version, see “Rollback / pinning” below. +## Rollback -## Update (`openclaw update`) - -For **source installs** (git checkout), prefer: - -```bash -openclaw update -``` - -It runs a safe-ish update flow: - -- Requires a clean worktree. -- Switches to the selected channel (tag or branch). -- Fetches + rebases against the configured upstream (dev channel). -- Installs deps, builds, builds the Control UI, and runs `openclaw doctor`. -- Restarts the gateway by default (use `--no-restart` to skip). - -If you installed via **npm/pnpm** (no git metadata), `openclaw update` will try to update via your package manager. If it can’t detect the install, use “Update (global install)” instead. - -## Update (Control UI / RPC) - -The Control UI has **Update & Restart** (RPC: `update.run`). It: - -1. Runs the same source-update flow as `openclaw update` (git checkout only). -2. Writes a restart sentinel with a structured report (stdout/stderr tail). -3. Restarts the gateway and pings the last active session with the report. - -If the rebase fails, the gateway aborts and restarts without applying the update. - -## Update (from source) - -From the repo checkout: - -Preferred: - -```bash -openclaw update -``` - -Manual (equivalent-ish): - -```bash -git pull -pnpm install -pnpm build -pnpm ui:build # auto-installs UI deps on first run -openclaw doctor -openclaw health -``` - -Notes: - -- `pnpm build` matters when you run the packaged `openclaw` binary ([`openclaw.mjs`](https://github.com/openclaw/openclaw/blob/main/openclaw.mjs)) or use Node to run `dist/`. -- If you run from a repo checkout without a global install, use `pnpm openclaw ...` for CLI commands. -- If you run directly from TypeScript (`pnpm openclaw ...`), a rebuild is usually unnecessary, but **config migrations still apply** → run doctor. -- Switching between global and git installs is easy: install the other flavor, then run `openclaw doctor` so the gateway service entrypoint is rewritten to the current install. - -## Always Run: `openclaw doctor` - -Doctor is the “safe update” command. It’s intentionally boring: repair + migrate + warn. - -Note: if you’re on a **source install** (git checkout), `openclaw doctor` will offer to run `openclaw update` first. - -Typical things it does: - -- Migrate deprecated config keys / legacy config file locations. -- Audit DM policies and warn on risky “open” settings. -- Check Gateway health and can offer to restart. -- Detect and migrate older gateway services (launchd/systemd; legacy schtasks) to current OpenClaw services. -- On Linux, ensure systemd user lingering (so the Gateway survives logout). - -Details: [Doctor](/gateway/doctor) - -## Start / stop / restart the Gateway - -CLI (works regardless of OS): - -```bash -openclaw gateway status -openclaw gateway stop -openclaw gateway restart -openclaw gateway --port 18789 -openclaw logs --follow -``` - -If you’re supervised: - -- macOS launchd (app-bundled LaunchAgent): `launchctl kickstart -k gui/$UID/ai.openclaw.gateway` (use `ai.openclaw.`; legacy `com.openclaw.*` still works) -- Linux systemd user service: `systemctl --user restart openclaw-gateway[-].service` -- Windows (WSL2): `systemctl --user restart openclaw-gateway[-].service` - - `launchctl`/`systemctl` only work if the service is installed; otherwise run `openclaw gateway install`. - -Runbook + exact service labels: [Gateway runbook](/gateway) - -## Rollback / pinning (when something breaks) - -### Pin (global install) - -Install a known-good version (replace `` with the last working one): +### Pin a version (npm) ```bash npm i -g openclaw@ -``` - -```bash -pnpm add -g openclaw@ -``` - -Tip: to see the current published version, run `npm view openclaw version`. - -Then restart + re-run doctor: - -```bash openclaw doctor openclaw gateway restart ``` -### Pin (source) by date +Tip: `npm view openclaw version` shows the current published version. -Pick a commit from a date (example: “state of main as of 2026-01-01”): +### Pin a commit (source) ```bash git fetch origin git checkout "$(git rev-list -n 1 --before=\"2026-01-01\" origin/main)" -``` - -Then reinstall deps + restart: - -```bash -pnpm install -pnpm build +pnpm install && pnpm build openclaw gateway restart ``` -If you want to go back to latest later: - -```bash -git checkout main -git pull -``` +To return to latest: `git checkout main && git pull`. ## If you are stuck -- Run `openclaw doctor` again and read the output carefully (it often tells you the fix). +- Run `openclaw doctor` again and read the output carefully. - Check: [Troubleshooting](/gateway/troubleshooting) - Ask in Discord: [https://discord.gg/clawd](https://discord.gg/clawd)