File size: 4,061 Bytes
ca8354c
 
 
4986cd9
37215eb
4986cd9
ca8354c
 
4986cd9
 
43a222e
4986cd9
 
 
 
 
43a222e
4986cd9
 
 
f31c67c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4986cd9
 
 
f31c67c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4986cd9
ca8354c
e9ac9d5
f31c67c
 
 
e9ac9d5
f31c67c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e9ac9d5
 
 
f31c67c
 
 
4986cd9
9be0274
e9ac9d5
f31c67c
 
 
e9ac9d5
f31c67c
 
 
e9ac9d5
f31c67c
 
e9ac9d5
4978696
e480646
9825525
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/env bash
set -euo pipefail

OPENCLAW_USER="${OPENCLAW_USER:-root}"
OPENCLAW_STATE_DIR="${OPENCLAW_STATE_DIR:-/root/.openclaw}"
OPENCLAW_WORKSPACE_DIR="${OPENCLAW_WORKSPACE_DIR:-${OPENCLAW_STATE_DIR}/workspace}"
OPENCLAW_GATEWAY_PORT="${OPENCLAW_GATEWAY_PORT:-7860}"

BACKUP_ENABLED="${OPENCLAW_BACKUP_ENABLED:-true}"
HF_TOKEN="${HF_TOKEN:-${HUGGINGFACE_HUB_TOKEN:-}}"
BACKUP_DATASET_REPO="${BACKUP_DATASET_REPO:-}"

mkdir -p /var/log/openclaw
mkdir -p "${OPENCLAW_STATE_DIR}"/{workspace,agents/main/agent,agents/main/sessions,logs,identity}

log_info() {
 echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] [ENTRYPOINT] $1" | tee -a /var/log/openclaw/gateway.stdout.log
}

restore_if_exists() {
    if [[ -z "${HF_TOKEN}" ]] || [[ -z "${BACKUP_DATASET_REPO}" ]]; then
        log_info "未配置备份,跳过恢复步骤"
        return 0
    fi
    log_info "检查备份数据..."
    RESTORE_TEMP=$(mktemp -d)
    if huggingface-cli download "${BACKUP_DATASET_REPO}" --repo-type dataset --token "${HF_TOKEN}" --local-dir "${RESTORE_TEMP}" 2>/dev/null; then
        log_info "找到备份,开始恢复数据..."
        [[ -d "${RESTORE_TEMP}/workspace" ]] && cp -r "${RESTORE_TEMP}/workspace/"* "${OPENCLAW_WORKSPACE_DIR}/" 2>/dev/null || true
        [[ -d "${RESTORE_TEMP}/agents" ]] && cp -r "${RESTORE_TEMP}/agents/"* "${OPENCLAW_STATE_DIR}/agents/" 2>/dev/null || true
        [[ -d "${RESTORE_TEMP}/identity" ]] && cp -r "${RESTORE_TEMP}/identity/"* "${OPENCLAW_STATE_DIR}/identity/" 2>/dev/null || true
        log_info "数据恢复完成"
    else
        log_info "未找到备份或下载失败,跳过恢复"
    fi
    rm -rf "${RESTORE_TEMP}"
}

backup_on_start() {
    if [[ "${BACKUP_ENABLED}" != "true" ]]; then
        return 0
    fi
    if [[ -z "${HF_TOKEN}" ]] || [[ -z "${BACKUP_DATASET_REPO}" ]]; then
        log_info "未配置备份,跳过启动备份"
        return 0
    fi
    log_info "执行启动备份..."
    BACKUP_TEMP=$(mktemp -d)
    cp -r "${OPENCLAW_WORKSPACE_DIR}" "${BACKUP_TEMP}/" 2>/dev/null || true
    cp -r "${OPENCLAW_STATE_DIR}/agents" "${BACKUP_TEMP}/" 2>/dev/null || true
    cp -r "${OPENCLAW_STATE_DIR}/identity" "${BACKUP_TEMP}/" 2>/dev/null || true
    echo "{\"backup_time\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\", \"trigger\": \"startup\"}" > "${BACKUP_TEMP}/backup_info.json"
    if huggingface-cli upload "${BACKUP_DATASET_REPO}" "${BACKUP_TEMP}/" --repo-type dataset --token "${HF_TOKEN}" --commit-message "Auto-backup $(date -u +%Y-%m-%dT%H:%M:%SZ)" 2>/dev/null; then
        log_info "启动备份完成"
    else
        log_info "启动备份失败(继续启动)"
    fi
    rm -rf "${BACKUP_TEMP}"
}

init_config() {
    local config_file="${OPENCLAW_STATE_DIR}/openclaw.json"
    log_info "初始化 OpenClaw 配置..."
    cat > "${config_file}" <<'EOFCONFIG'
{
    "meta": {
        "lastTouchedVersion": "2026.5.6"
    },
    "gateway": {
        "mode": "local",
        "bind": "lan",
        "auth": {
            "mode": "token",
            "token": "CUSTOM_GATEWAY_TOKEN_PLACEHOLDER"
        },
        "controlUi": {
            "allowedOrigins": ["*"],
            "dangerouslyDisableDeviceAuth": true,
            "allowInsecureAuth": true
        },
        "devicePairing": {
            "required": false
        }
    },
    "agents": {
        "defaults": {
            "model": {
                "primary": "PLACEHOLDER_MODEL"
            }
        }
    }
}
EOFCONFIG

    sed -i "s/CUSTOM_GATEWAY_TOKEN_PLACEHOLDER/${OPENCLAW_GATEWAY_TOKEN:-}/" "${config_file}"
    sed -i "s/PLACEHOLDER_MODEL/${RAW_MODEL:-z-ai\/glm4.7}/" "${config_file}"
    log_info "配置初始化完成"
}

main() {
    log_info "===== OpenClaw 启动 ====="
    log_info "状态目录: ${OPENCLAW_STATE_DIR}"
    log_info "工作区目录: ${OPENCLAW_WORKSPACE_DIR}"

    init_config
    restore_if_exists
    backup_on_start

    log_info "启动 OpenClaw 网关..."
    exec openclaw gateway --bind lan --port "${OPENCLAW_GATEWAY_PORT}" --token "${OPENCLAW_GATEWAY_TOKEN}"
}

main "$@"