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"]
|