Start OpenClaw node host on ClawdBox boot
This commit is contained in:
44
scripts/clawdbox-entrypoint
Normal file
44
scripts/clawdbox-entrypoint
Normal file
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT=/data/agents/clawd
|
||||
|
||||
mkdir -p /data/ssh /data/.cache/pip /data/.cache/npm /data/.local
|
||||
mkdir -p "$ROOT/bin" "$ROOT/src" "$ROOT/tmp" "$ROOT/logs" "$ROOT/notes" "$ROOT/tools"
|
||||
|
||||
for keytype in rsa ecdsa ed25519; do
|
||||
if [ ! -f "/data/ssh/ssh_host_${keytype}_key" ]; then
|
||||
echo "Generating persistent host ${keytype} key..."
|
||||
ssh-keygen -q -f "/data/ssh/ssh_host_${keytype}_key" -N '' -t "$keytype"
|
||||
fi
|
||||
done
|
||||
chmod 600 /data/ssh/ssh_host_*_key
|
||||
|
||||
if [ -f /data/.gitconfig ]; then
|
||||
ln -sf /data/.gitconfig "$HOME/.gitconfig"
|
||||
fi
|
||||
|
||||
cat > "$ROOT/README.md" <<'EOF'
|
||||
# ClawdBox Agent Workspace
|
||||
|
||||
Durable agent workspace for OpenClaw work that should survive pod restarts.
|
||||
|
||||
- `bin/` helper commands
|
||||
- `src/` source checkouts and experiments
|
||||
- `tmp/` scratch files
|
||||
- `logs/` process logs
|
||||
- `notes/` operator notes
|
||||
- `tools/` persistent tool installs
|
||||
EOF
|
||||
|
||||
for script in start-clawdbox-node status-clawdbox-node stop-clawdbox-node; do
|
||||
cp "/usr/local/bin/${script}" "$ROOT/bin/${script}"
|
||||
done
|
||||
|
||||
export PATH="$ROOT/bin:/usr/local/bin:$PATH"
|
||||
|
||||
start-clawdbox-node || {
|
||||
echo "ClawdBox-CLI node host did not start; SSH will remain available." >&2
|
||||
}
|
||||
|
||||
exec /usr/sbin/sshd -D -e -f /etc/ssh/sshd_config
|
||||
84
scripts/start-clawdbox-node
Normal file
84
scripts/start-clawdbox-node
Normal file
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env sh
|
||||
set -eu
|
||||
|
||||
ROOT=${CLAWDBOX_AGENT_ROOT:-/data/agents/clawd}
|
||||
LOG_DIR="$ROOT/logs"
|
||||
PID_FILE="$LOG_DIR/node-host.pid"
|
||||
LOG_FILE="$LOG_DIR/node-host.log"
|
||||
OPENCLAW_DIR="$ROOT/tools/openclaw-node"
|
||||
OPENCLAW_VERSION=${OPENCLAW_VERSION:-2026.6.1}
|
||||
DISPLAY_NAME=${CLAWDBOX_NODE_DISPLAY_NAME:-ClawdBox-CLI}
|
||||
GATEWAY_HOST=${OPENCLAW_GATEWAY_HOST:-openclaw.apps.lab.apilab.us}
|
||||
GATEWAY_PORT=${OPENCLAW_GATEWAY_PORT:-443}
|
||||
|
||||
mkdir -p "$ROOT/bin" "$ROOT/tools" "$LOG_DIR" "$OPENCLAW_DIR"
|
||||
|
||||
log() {
|
||||
printf '%s %s\n' "$(date -Iseconds)" "$*" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
old=$(cat "$PID_FILE" 2>/dev/null || true)
|
||||
case "$old" in
|
||||
*[!0-9]*|"") ;;
|
||||
*)
|
||||
if kill -0 "$old" 2>/dev/null; then
|
||||
echo "$DISPLAY_NAME already running: pid $old"
|
||||
exit 0
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if [ ! -f "$OPENCLAW_DIR/package.json" ]; then
|
||||
cat > "$OPENCLAW_DIR/package.json" <<EOF
|
||||
{
|
||||
"name": "clawdbox-openclaw-node",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"openclaw": "$OPENCLAW_VERSION"
|
||||
}
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
|
||||
installed_version=""
|
||||
if [ -f "$OPENCLAW_DIR/node_modules/openclaw/package.json" ]; then
|
||||
installed_version=$(node -p "require('$OPENCLAW_DIR/node_modules/openclaw/package.json').version" 2>/dev/null || true)
|
||||
fi
|
||||
|
||||
if [ "$installed_version" != "$OPENCLAW_VERSION" ]; then
|
||||
log "Installing openclaw@$OPENCLAW_VERSION under $OPENCLAW_DIR"
|
||||
npm install --prefix "$OPENCLAW_DIR" "openclaw@$OPENCLAW_VERSION" --omit=dev >> "$LOG_FILE" 2>&1
|
||||
fi
|
||||
|
||||
OPENCLAW_BIN="$OPENCLAW_DIR/node_modules/.bin/openclaw"
|
||||
if [ ! -x "$OPENCLAW_BIN" ]; then
|
||||
log "OpenClaw binary not found at $OPENCLAW_BIN"
|
||||
exit 1
|
||||
fi
|
||||
ln -sf "$OPENCLAW_BIN" "$ROOT/bin/openclaw"
|
||||
|
||||
TOKEN=${OPENCLAW_GATEWAY_TOKEN:-}
|
||||
if [ -z "$TOKEN" ]; then
|
||||
TOKEN=$(oc get deployment openclaw -n openclaw -o jsonpath='{.spec.template.spec.containers[0].env[?(@.name=="OPENCLAW_GATEWAY_TOKEN")].value}' 2>/dev/null || true)
|
||||
fi
|
||||
if [ -z "$TOKEN" ]; then
|
||||
log "OPENCLAW_GATEWAY_TOKEN is unavailable; skipping node-host startup"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TLS_FLAG=""
|
||||
if [ "${OPENCLAW_GATEWAY_TLS:-true}" = "true" ]; then
|
||||
TLS_FLAG="--tls"
|
||||
fi
|
||||
|
||||
log "Starting $DISPLAY_NAME against $GATEWAY_HOST:$GATEWAY_PORT"
|
||||
OPENCLAW_GATEWAY_TOKEN="$TOKEN" nohup "$OPENCLAW_BIN" node run \
|
||||
--display-name "$DISPLAY_NAME" \
|
||||
--host "$GATEWAY_HOST" \
|
||||
--port "$GATEWAY_PORT" \
|
||||
$TLS_FLAG >> "$LOG_FILE" 2>&1 &
|
||||
echo $! > "$PID_FILE"
|
||||
sleep 1
|
||||
echo "Started $DISPLAY_NAME node host: pid $(cat "$PID_FILE")"
|
||||
18
scripts/status-clawdbox-node
Normal file
18
scripts/status-clawdbox-node
Normal file
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env sh
|
||||
set -eu
|
||||
|
||||
ROOT=${CLAWDBOX_AGENT_ROOT:-/data/agents/clawd}
|
||||
PID_FILE="$ROOT/logs/node-host.pid"
|
||||
LOG_FILE="$ROOT/logs/node-host.log"
|
||||
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
pid=$(cat "$PID_FILE" 2>/dev/null || true)
|
||||
case "$pid" in
|
||||
*[!0-9]*|"") echo "Invalid pid file: $pid" ;;
|
||||
*) ps -p "$pid" -o pid,etime,cmd || true ;;
|
||||
esac
|
||||
else
|
||||
echo "No pid file"
|
||||
fi
|
||||
|
||||
sed -n '1,120p' "$LOG_FILE" 2>/dev/null || true
|
||||
23
scripts/stop-clawdbox-node
Normal file
23
scripts/stop-clawdbox-node
Normal file
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env sh
|
||||
set -eu
|
||||
|
||||
ROOT=${CLAWDBOX_AGENT_ROOT:-/data/agents/clawd}
|
||||
PID_FILE="$ROOT/logs/node-host.pid"
|
||||
|
||||
if [ ! -f "$PID_FILE" ]; then
|
||||
echo "No pid file"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
pid=$(cat "$PID_FILE" 2>/dev/null || true)
|
||||
case "$pid" in
|
||||
*[!0-9]*|"")
|
||||
echo "Invalid pid file: $pid"
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
kill "$pid" 2>/dev/null || true
|
||||
rm -f "$PID_FILE"
|
||||
echo "Stopped ClawdBox-CLI node host: pid $pid"
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user