File size: 5,151 Bytes
c227a9e
 
865283b
e8d4e69
8994f14
 
 
e8d4e69
4b732e7
 
 
 
e8d4e69
 
4b732e7
e8d4e69
c227a9e
e8d4e69
5a27f58
8994f14
 
5a27f58
318214a
5a27f58
 
318214a
8994f14
e8d4e69
8994f14
 
 
 
 
 
318214a
8994f14
 
 
 
 
 
 
 
 
 
4b732e7
 
 
 
 
 
 
 
 
 
 
 
 
 
8994f14
 
 
4b732e7
 
 
 
 
 
 
 
 
 
 
8994f14
 
e14769e
4b732e7
 
318214a
f1c4efa
e14769e
787725e
4b732e7
 
 
787725e
4b732e7
787725e
 
 
4b732e7
 
5e4f74b
 
 
696c8dc
318214a
 
 
 
5e4f74b
 
 
4b732e7
 
318214a
4b732e7
 
e14769e
 
787725e
4b732e7
e14769e
 
8994f14
4b732e7
 
 
 
744a895
4b732e7
787725e
8994f14
ae6a42f
 
e8d4e69
8994f14
865283b
 
ba3990a
787725e
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132


FROM docker.io/library/ubuntu:24.04

ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC

RUN apt-get update && apt-get install -y \
    curl \
    git \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*

RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
    && apt-get install -y nodejs

# 安装 openclaw(无微信插件)
RUN npm install -g openclaw@latest

RUN pip3 install --break-system-packages huggingface_hub -q

# 映射 HF Secrets 到脚本期望的变量
ENV OPENCLAW_LLM_MODEL=${RAW_MODEL:-z-ai/glm4.7}
ENV OPENCLAW_BACKUP_ENABLED=${OPENCLAW_BACKUP_ENABLED:-true}
ENV OPENCLAW_BACKUP_DATASET_REPO=${OPENCLAW_BACKUP_DATASET_REPO:-}

RUN mkdir -p /root/.openclaw /data /var/log/openclaw /scripts

RUN printf '#!/bin/bash\n\
set -euo pipefail\n\
\n\
OPENCLAW_STATE_DIR="${OPENCLAW_STATE_DIR:-/root/.openclaw}"\n\
OPENCLAW_WORKSPACE_DIR="${OPENCLAW_WORKSPACE_DIR:-${OPENCLAW_STATE_DIR}/workspace}"\n\
OPENCLAW_GATEWAY_PORT="${OPENCLAW_GATEWAY_PORT:-7860}"\n\
OPENCLAW_LLM_MODEL="${OPENCLAW_LLM_MODEL:-z-ai/glm4.7}"\n\
BACKUP_ENABLED="${OPENCLAW_BACKUP_ENABLED:-true}"\n\
HF_TOKEN="${HF_TOKEN:-${HUGGINGFACE_HUB_TOKEN:-}}"\n\
BACKUP_DATASET_REPO="${OPENCLAW_BACKUP_DATASET_REPO:-}"\n\
\n\
mkdir -p /var/log/openclaw\n\
mkdir -p "${OPENCLAW_STATE_DIR}"/{workspace,agents/main/agent,agents/main/sessions,logs,identity}\n\
\n\
log_info() { echo "[$(date -u +%%Y-%%m-%%dT%%H:%%M:%%SZ)] [ENTRYPOINT] $1" | tee -a /var/log/openclaw/gateway.stdout.log; }\n\
\n\
restore_if_exists() {\n\
    [[ -z "${HF_TOKEN}" ]] && return 0\n\
    [[ -z "${BACKUP_DATASET_REPO}" ]] && return 0\n\
    log_info "检查备份数据..."\n\
    RESTORE_TEMP=$(mktemp -d)\n\
    if huggingface-cli download "${BACKUP_DATASET_REPO}" --repo-type dataset --token "${HF_TOKEN}" --local-dir "${RESTORE_TEMP}" 2>/dev/null; then\n\
        log_info "找到备份,开始恢复数据..."\n\
        [[ -d "${RESTORE_TEMP}/workspace" ]] && cp -r "${RESTORE_TEMP}/workspace/"* "${OPENCLAW_WORKSPACE_DIR}/" 2>/dev/null || true\n\
        [[ -d "${RESTORE_TEMP}/agents" ]] && cp -r "${RESTORE_TEMP}/agents/"* "${OPENCLAW_STATE_DIR}/agents/" 2>/dev/null || true\n\
        [[ -d "${RESTORE_TEMP}/identity" ]] && cp -r "${RESTORE_TEMP}/identity/"* "${OPENCLAW_STATE_DIR}/identity/" 2>/dev/null || true\n\
        log_info "数据恢复完成"\n\
    else\n\
        log_info "未找到备份,跳过恢复"\n\
    fi\n\
    rm -rf "${RESTORE_TEMP}"\n\
}\n\
\n\
backup_on_start() {\n\
    [[ "${BACKUP_ENABLED}" != "true" ]] && return 0\n\
    [[ -z "${HF_TOKEN}" ]] && return 0\n\
    [[ -z "${BACKUP_DATASET_REPO}" ]] && return 0\n\
    log_info "执行启动备份..."\n\
    BACKUP_TEMP=$(mktemp -d)\n\
    cp -r "${OPENCLAW_WORKSPACE_DIR}" "${BACKUP_TEMP}/" 2>/dev/null || true\n\
    cp -r "${OPENCLAW_STATE_DIR}/agents" "${BACKUP_TEMP}/" 2>/dev/null || true\n\
    cp -r "${OPENCLAW_STATE_DIR}/identity" "${BACKUP_TEMP}/" 2>/dev/null || true\n\
    echo "{\"backup_time\": \"$(date -u +%%Y-%%m-%%dT%%H:%%M:%%SZ)\", \"trigger\": \"startup\"}" > "${BACKUP_TEMP}/backup_info.json"\n\
    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 && log_info "启动备份完成" || log_info "启动备份失败(继续启动)"\n\
    rm -rf "${BACKUP_TEMP}"\n\
}\n\
\n\
init_config() {\n\
    local config_file="${OPENCLAW_STATE_DIR}/openclaw.json"\n\
    log_info "初始化 OpenClaw 配置..."\n\
    log_info "使用模型: ${OPENCLAW_LLM_MODEL}"\n\
    cat > "${config_file}" <<EOFCONFIG\n\
{\n\
    "meta": { "lastTouchedVersion": "2026.5.6" },\n\
    "gateway": {\n\
        "mode": "local",\n\
        "bind": "lan",\n\
        "auth": { "mode": "token", "token": "CUSTOM_GATEWAY_TOKEN_PLACEHOLDER" },\n\
        "controlUi": {\n\
            "allowedOrigins": ["*"],\n\
            "dangerouslyDisableDeviceAuth": true,\n\
            "allowInsecureAuth": true\n\
        }\n\
    },\n\
    "models": {\n\
        "providers": {\n\
            "nvidia": {\n\
                "baseUrl": "https://integrate.api.nvidia.com/v1",\n\
                "api": "openai-completions",\n\
                "models": [\n\
                    { "id": "'"${OPENCLAW_LLM_MODEL}"'", "name": "'"${OPENCLAW_LLM_MODEL}"'" }\n\
                ]\n\
            }\n\
        }\n\
    },\n\
    "agents": {\n\
        "defaults": {\n\
            "model": { "primary": "nvidia/'"${OPENCLAW_LLM_MODEL}"'" }\n\
        }\n\
    }\n\
}\n\
EOFCONFIG\n\
    sed -i "s/CUSTOM_GATEWAY_TOKEN_PLACEHOLDER/${OPENCLAW_GATEWAY_TOKEN:-}/" "${config_file}"\n\
    log_info "配置初始化完成"\n\
}\n\
\n\
main() {\n\
    log_info "===== OpenClaw 启动 ====="\n\
    init_config\n\
    restore_if_exists\n\
    backup_on_start\n\
    \n\
    log_info "启动 OpenClaw 网关..."\n\
    exec openclaw gateway --bind lan --port "${OPENCLAW_GATEWAY_PORT}" --token "${OPENCLAW_GATEWAY_TOKEN}"\n\
}\n\
main "$@"\n\
' > /scripts/openclaw-entrypoint.sh

RUN chmod +x /scripts/openclaw-entrypoint.sh

EXPOSE 7860

ENTRYPOINT ["/scripts/openclaw-entrypoint.sh"]