| #!/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 "$@" |
|
|
|
|