人生這部戲
人生這部戲

目錄

OpenClaw 升級後回滾完整指南:從備份到恢復的實戰教程

OpenClaw 作為一個快速迭代的開源項目,新版本往往帶來令人期待的功能和改進。然而,升級過程中可能會遇到各種可見或不可見的問題——從配置文件格式變更、技能不相容,到更嚴重的啟動失敗或數據異常。

這時候,一個可靠的回滾方案就顯得尤為重要。本文將分享如何在升級前做好萬全準備,以及在需要時如何快速、安全地回滾到之前的穩定狀態。

許多用戶習慣只備份配置文件,但對於 OpenClaw 來說,這遠遠不夠。~/.openclaw/ 目錄包含了運行 OpenClaw 所需的一切:

  • openclaw.json —— 核心配置
  • memory/ —— AI 的記憶和知識庫
  • sessions/ —— 對話歷史
  • skills/ —— 已安裝的技能
  • workspace/ —— 工作空間和專案文件

如果這個目錄在升級後出現問題而沒有備份,你可能需要從頭開始配置一切。

以下是一個完整的備份腳本,會在升級前自動備份整個 .openclaw 目錄,並在檔名中包含當前版本號,方便日後識別:

#!/bin/bash

BACKUP_DIR="$HOME/openclaw-backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

# 獲取當前 OpenClaw 版本
VERSION=$(openclaw --version 2>/dev/null | head -1 | sed 's/[^0-9.]//g')
if [ -z "$VERSION" ]; then
    VERSION="unknown"
fi

# 備份檔案名稱包含版本號
BACKUP_NAME="openclaw-v${VERSION}-backup-${TIMESTAMP}"
BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME"

# 創建備份目錄
mkdir -p "$BACKUP_PATH"

# 複製整個 .openclaw 目錄
cp -r "$HOME/.openclaw" "$BACKUP_PATH/"

# 記錄當前版本(雙重保險)
openclaw --version > "$BACKUP_PATH/version.txt"

# 壓縮備份
tar -czf "$BACKUP_PATH.tar.gz" -C "$BACKUP_DIR" "$BACKUP_NAME"

# 清理臨時文件
rm -rf "$BACKUP_PATH"

# 獲取備份檔案大小
BACKUP_SIZE=$(du -h "$BACKUP_PATH.tar.gz" | cut -f1)

echo "========================================"
echo "✅ 備份完成"
echo "========================================"
echo "📁 備份檔案: $BACKUP_PATH.tar.gz"
echo "📦 檔案大小: $BACKUP_SIZE"
echo "🏷️  OpenClaw 版本: $VERSION"
echo "📅 備份時間: $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"

將這個腳本保存為 backup-openclaw.sh,在每次升級前執行:

chmod +x backup-openclaw.sh
./backup-openclaw.sh

執行後會生成類似 openclaw-v2026.2.17-backup-20260309_120000.tar.gz 的檔案,一目了然。

遵循以下步驟可以最大程度降低升級風險:

./backup-openclaw.sh
# 使用官方安裝腳本升級
curl -fsSL https://openclaw.ai/install.sh | sh

# 或使用包管理器
openclaw update
openclaw status
openclaw doctor

升級後如果遇到以下情況,建議立即回滾:

  • 啟動失敗openclaw start 無法正常啟動服務
  • 工具調用異常:AI 無法正常使用已安裝的技能
  • 記憶讀取錯誤:出現與 memory 文件相關的錯誤訊息
  • 性能明顯下降:回應速度變慢或資源佔用異常
  • 配置不兼容:現有配置在新版本中無法正常運作

如果只是想恢復 .openclaw/ 目錄的數據,而不需要降級 OpenClaw 本身,可以使用此方法:

#!/bin/bash

# 停止 OpenClaw 服務
systemctl --user stop openclaw-gateway.service

# 備份當前(有問題的)狀態以防萬一
mv "$HOME/.openclaw" "$HOME/.openclaw-broken-$(date +%Y%m%d_%H%M%S)"

# 指定要恢復的備份檔(範例:openclaw-v2026.3.2-backup-20260309_120000.tar.gz)
BACKUP_FILE="$HOME/openclaw-backups/openclaw-v2026.3.2-backup-20260309_120000.tar.gz"

# 檢查備份檔是否存在
if [ ! -f "$BACKUP_FILE" ]; then
    echo "錯誤:找不到備份檔 $BACKUP_FILE"
    echo "可用的備份檔:"
    ls -lh "$HOME/openclaw-backups/"*.tar.gz 2>/dev/null || echo "沒有找到備份檔"
    exit 1
fi

# 提取備份目錄名稱
BACKUP_NAME=$(basename "$BACKUP_FILE" .tar.gz)

# 解壓備份
tar -xzf "$BACKUP_FILE" -C "$HOME/openclaw-backups/"

# 恢復 .openclaw 目錄
mv "$HOME/openclaw-backups/$BACKUP_NAME/.openclaw" "$HOME/"

# 清理臨時文件
rm -rf "$HOME/openclaw-backups/$BACKUP_NAME"

# 啟動 OpenClaw 服務
systemctl --user start openclaw-gateway.service

echo "✅ 數據恢復完成,已恢復到: $BACKUP_NAME"

適用場景:OpenClaw 版本沒問題,只是數據損壞或配置錯誤時使用。

快速查找備份

# 列出所有備份,按時間排序
ls -lth ~/openclaw-backups/*.tar.gz | head -10

# 搜尋特定版本的備份
ls ~/openclaw-backups/ | grep "v2026.2.17"

如果只是想恢復配置,可以使用內建的配置恢復功能:

# 列出可用備份
openclaw config backup --list

# 恢復特定備份
openclaw config restore config-2026-02-01-1600.yaml

如果新版本有嚴重問題,需要完整回滾到之前的版本。這個方法會自動列出所有備份,讓你交互式選擇要恢復的版本:

#!/bin/bash

# OpenClaw 交互式回滾腳本
# 提供互動式界面,讓用戶選擇備份和版本

set -e  # 遇到錯誤立即退出

BACKUP_DIR="$HOME/openclaw-backups"

# 顏色定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 打印標題
print_header() {
    echo ""
    echo "========================================"
    echo "$1"
    echo "========================================"
}

# 打印步驟
print_step() {
    echo ""
    echo -e "${BLUE}👉 步驟 $1/7: $2${NC}"
}

# 打印成功
print_success() {
    echo -e "${GREEN}$1${NC}"
}

# 打印警告
print_warning() {
    echo -e "${YELLOW}⚠️  $1${NC}"
}

# 打印錯誤
print_error() {
    echo -e "${RED}$1${NC}"
}

# 檢查是否有備份檔
check_backups() {
    if [ ! -d "$BACKUP_DIR" ] || [ -z "$(ls -A "$BACKUP_DIR"/*.tar.gz 2>/dev/null)" ]; then
        print_error "找不到任何備份檔"
        echo "請先執行備份腳本: ./backup-openclaw.sh"
        exit 1
    fi
}

# 顯示備份列表並讓用戶選擇
select_backup() {
    print_header "📦 選擇要恢復的備份"
    
    # 獲取備份列表
    local backups=()
    local i=1
    
    echo ""
    echo "可用的備份檔:"
    echo ""
    
    for file in "$BACKUP_DIR"/openclaw-v*-backup-*.tar.gz; do
        if [ -f "$file" ]; then
            local filename=$(basename "$file")
            local size=$(du -h "$file" | cut -f1)
            local date=$(echo "$filename" | grep -o '[0-9]\{8\}_[0-9]\{6\}')
            local version=$(echo "$filename" | grep -o 'v[0-9.]\+' | head -1)
            
            printf "  [%d] %s\n" "$i" "$filename"
            printf "      版本: %s | 大小: %s | 日期: %s\n" "$version" "$size" "$date"
            echo ""
            
            backups+=("$filename")
            ((i++))
        fi
    done
    
    if [ ${#backups[@]} -eq 0 ]; then
        print_error "沒有找到有效的備份檔"
        exit 1
    fi
    
    echo ""
    read -p "請選擇備份檔編號 (1-${#backups[@]}): " selection
    
    if ! [[ "$selection" =~ ^[0-9]+$ ]] || [ "$selection" -lt 1 ] || [ "$selection" -gt ${#backups[@]} ]; then
        print_error "無效的選擇"
        exit 1
    fi
    
    SELECTED_BACKUP="${backups[$((selection-1))]}"
    SELECTED_VERSION=$(echo "$SELECTED_BACKUP" | grep -o 'v[0-9.]\+' | head -1 | sed 's/v//')
    
    print_success "已選擇: $SELECTED_BACKUP (版本: $SELECTED_VERSION)"
}

# 讓用戶確認或修改版本號
confirm_version() {
    print_header "🏷️  確認 OpenClaw 版本"
    
    echo ""
    echo "從備份檔檢測到的版本: $SELECTED_VERSION"
    echo ""
    read -p "按 Enter 使用此版本,或輸入其他版本號 (例如: 2026.2.17): " input_version
    
    if [ -n "$input_version" ]; then
        TARGET_VERSION="$input_version"
        print_warning "將安裝指定版本: $TARGET_VERSION"
    else
        TARGET_VERSION="$SELECTED_VERSION"
        print_success "將安裝備份對應版本: $TARGET_VERSION"
    fi
}

# 執行回滾
perform_rollback() {
    local backup_path="$BACKUP_DIR/$SELECTED_BACKUP"
    local timestamp=$(date +%Y%m%d_%H%M%S)
    
    print_header "🚀 開始回滾 OpenClaw"
    
    # 步驟 1: 停止服務
    print_step "1" "停止 OpenClaw 服務"
    systemctl --user stop openclaw-gateway.service || true
    print_success "服務已停止"
    
    # 步驟 2: 備份當前有問題的 .openclaw
    print_step "2" "備份當前(有問題的).openclaw"
    if [ -d "$HOME/.openclaw" ]; then
        mv "$HOME/.openclaw" "$HOME/.openclaw-broken-$timestamp"
        print_success "已備份到: ~/.openclaw-broken-$timestamp"
    else
        print_warning "當前沒有 .openclaw 目錄,跳過此步驟"
    fi
    
    # 步驟 3: 卸載當前 OpenClaw
    print_step "3" "卸載當前 OpenClaw 版本"
    npm uninstall -g openclaw 2>/dev/null || true
    print_success "已卸載"
    
    # 步驟 4: 清理 npm 緩存
    print_step "4" "清理 npm 緩存"
    npm cache clean --force 2>/dev/null || true
    print_success "緩存已清理"
    
    # 步驟 5: 恢復 .openclaw 目錄
    print_step "5" "恢復 .openclaw 目錄"
    tar -xzf "$backup_path" -C "$BACKUP_DIR/"
    local backup_name=$(basename "$SELECTED_BACKUP" .tar.gz)
    
    # 刪除現有的 .openclaw(如果還存在)
    if [ -d "$HOME/.openclaw" ]; then
        rm -rf "$HOME/.openclaw"
    fi
    
    mv "$BACKUP_DIR/$backup_name/.openclaw" "$HOME/"
    rm -rf "$BACKUP_DIR/$backup_name"
    print_success ".openclaw 已恢復"
    
    # 步驟 6: 安裝指定版本
    print_step "6" "安裝 OpenClaw $TARGET_VERSION"
    echo "這可能需要幾分鐘..."
    SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install -g "openclaw@$TARGET_VERSION"
    hash -r
    print_success "安裝完成"
    
    # 步驟 7: 啟動服務
    print_step "7" "啟動 OpenClaw 服務"
    systemctl --user start openclaw-gateway.service
    print_success "服務已啟動"
}

# 驗證結果
verify_rollback() {
    print_header "✅ 回滾完成!"
    
    echo ""
    echo "📋 當前版本資訊:"
    openclaw --version 2>/dev/null || echo "無法獲取版本資訊"
    
    echo ""
    echo "📊 服務狀態:"
    systemctl --user status openclaw-gateway.service --no-pager -l || true
    
    echo ""
    echo "💡 後續操作:"
    echo "   • 檢查完整狀態: openclaw status"
    echo "   • 運行診斷: openclaw doctor"
    echo "   • 查看日誌: openclaw logs"
    echo "   • 如果還有問題,可以恢復這個備份: ~/.openclaw-broken-*"
}

# 主程序
main() {
    print_header "🔄 OpenClaw 交互式回滾工具"
    
    # 檢查備份
    check_backups
    
    # 選擇備份
    select_backup
    
    # 確認版本
    confirm_version
    
    # 最終確認
    print_header "⚠️  最終確認"
    echo ""
    echo "即將執行以下操作:"
    echo "  1. 停止 OpenClaw 服務"
    echo "  2. 備份當前(有問題的).openclaw"
    echo "  3. 卸載當前 OpenClaw"
    echo "  4. 清理 npm 緩存"
    echo "  5. 恢復備份: $SELECTED_BACKUP"
    echo "  6. 安裝 OpenClaw $TARGET_VERSION"
    echo "  7. 啟動服務"
    echo ""
    
    read -p "確認執行? (yes/no): " confirm
    
    if [ "$confirm" != "yes" ]; then
        print_warning "已取消"
        exit 0
    fi
    
    # 執行回滾
    perform_rollback
    
    # 驗證結果
    verify_rollback
}

# 運行主程序
main

執行方式

# 將腳本保存為 rollback-openclaw.sh
chmod +x rollback-openclaw.sh
./rollback-openclaw.sh

腳本會引導你完成以下步驟

  1. 📦 選擇備份 - 自動列出所有可用備份,帶版本號、大小、日期
  2. 🏷️ 確認版本 - 可以選擇使用備份對應版本或輸入其他版本
  3. ⚠️ 最終確認 - 顯示即將執行的操作列表
  4. 🚀 自動執行 - 7 步驟自動完成,帶彩色進度提示
  5. 結果驗證 - 顯示當前版本和服務狀態

執行示例

========================================
🔄 OpenClaw 交互式回滾工具
========================================

========================================
📦 選擇要恢復的備份
========================================

可用的備份檔:

  [1] openclaw-v2026.3.2-backup-20260309_120000.tar.gz
      版本: v2026.3.2 | 大小: 245M | 日期: 20260309_120000

  [2] openclaw-v2026.2.17-backup-20260228_080000.tar.gz
      版本: v2026.2.17 | 大小: 238M | 日期: 20260228_080000

請選擇備份檔編號 (1-2): 1

✅ 已選擇: openclaw-v2026.3.2-backup-20260309_120000.tar.gz (版本: 2026.3.2)

========================================
🏷️  確認 OpenClaw 版本
========================================

從備份檔檢測到的版本: 2026.3.2

按 Enter 使用此版本,或輸入其他版本號 (例如: 2026.2.17): 

✅ 將安裝備份對應版本: 2026.3.2

========================================
⚠️  最終確認
========================================

即將執行以下操作:
  1. 停止 OpenClaw 服務
  2. 備份當前(有問題的).openclaw
  3. 卸載當前 OpenClaw
  4. 清理 npm 緩存
  5. 恢復備份: openclaw-v2026.3.2-backup-20260309_120000.tar.gz
  6. 安裝 OpenClaw 2026.3.2
  7. 啟動服務

確認執行? (yes/no): yes

========================================
🚀 開始回滾 OpenClaw
========================================

👉 步驟 1/7: 停止 OpenClaw 服務...
✅ 服務已停止

👉 步驟 2/7: 備份當前(有問題的).openclaw
✅ 已備份到: ~/.openclaw-broken-20260309_201500

👉 步驟 3/7: 卸載當前 OpenClaw 版本...
✅ 已卸載

👉 步驟 4/7: 清理 npm 緩存...
✅ 緩存已清理

👉 步驟 5/7: 恢復 .openclaw 目錄...
✅ .openclaw 已恢復

👉 步驟 6/7: 安裝 OpenClaw 2026.3.2
這可能需要幾分鐘...
✅ 安裝完成

👉 步驟 7/7: 啟動 OpenClaw 服務...
✅ 服務已啟動

========================================
✅ 回滾完成!
========================================

📋 當前版本資訊:
2026.3.2

📊 服務狀態:
● openclaw-gateway.service - OpenClaw Gateway
   Active: active (running) ...

💡 後續操作:
   • 檢查完整狀態: openclaw status
   • 運行診斷: openclaw doctor
   • 查看日誌: openclaw logs
   • 如果還有問題,可以恢復這個備份: ~/.openclaw-broken-*

對於重要的工作空間,建議使用 Git 進行版本控制:

cd "$HOME/.openclaw/workspace"
git init
git add .
git commit -m "Pre-upgrade backup"

可以設置定時任務,定期自動備份:

# 編輯 crontab
crontab -e

# 每天凌晨 3 點自動備份
0 3 * * * /home/user/backup-openclaw.sh

對於生產環境,建議先在測試環境驗證升級:

# 複製現有環境到測試目錄
cp -r "$HOME/.openclaw" "$HOME/.openclaw-test"

# 使用測試配置啟動
OPENCLAW_HOME="$HOME/.openclaw-test" openclaw start

升級 OpenClaw 是一把雙刃劍——新功能令人期待,但潛在風險也不容忽視。記住這幾個要點:

  1. 升級前必備份:完整的 ~/.openclaw/ 目錄備份是萬全之策
  2. 保留多個備份:不要只保留最新備份,保留幾個歷史版本
  3. 驗證後再使用:升級後充分測試再投入生產使用
  4. 知道如何回滾:提前熟悉回滾流程,不要等到出問題時手忙腳亂

希望這篇指南能幫助你在享受 OpenClaw 新功能的同時,也能在需要時從容應對。畢竟,技術的穩定性永遠是第一位的。

評論

載入中...
0/200 字符