| #!/bin/bash |
| |
| set -e |
|
|
| export OPENCLAW_STATE_DIR="${OPENCLAW_STATE_DIR:-/root/.openclaw}" |
| export PORT="${PORT:-7860}" |
| export OPENCLAW_GATEWAY_PORT="${OPENCLAW_GATEWAY_PORT:-18889}" |
|
|
| echo "================================================" |
| echo " OpenClaw AI Gateway -- HF Spaces Startup" |
| echo "================================================" |
|
|
| |
| echo "[1/13] Creating directories..." |
| mkdir -p "${OPENCLAW_STATE_DIR}"/{agents/main/sessions,credentials,sessions,workspace,extensions} |
|
|
| |
| echo "[2/13] System tools pre-installed (OpenClaw, Caddy, Claude Code)" |
|
|
| |
| echo "[3/13] Restoring from backup..." |
| python3 /app/backup-manager.py restore |
|
|
| |
| echo "[4/13] Generating OpenClaw config..." |
| python3 /app/config-generator.py |
|
|
| |
| echo "[5-8/13] Skip -- post-gateway tasks postponed" |
|
|
| |
| echo "[9/13] Starting backup scheduler..." |
| python3 /app/backup-manager.py scheduler & |
| BACKUP_PID=$! |
| echo " -> Backup scheduler PID: $BACKUP_PID" |
|
|
| |
| echo "[10/13] Starting cc-switch-web..." |
| CCSWITCH_BIN="${OPENCLAW_STATE_DIR}/cc-switch-server" |
| if [[ ! -f "$CCSWITCH_BIN" ]]; then |
| curl -fsSL "https://github.com/Laliet/cc-switch-web/releases/download/v0.11.1/cc-switch-server-linux-x86_64" \ |
| -o "$CCSWITCH_BIN" 2>/dev/null && chmod +x "$CCSWITCH_BIN" || echo " WARNING: Download failed" |
| fi |
| if [[ -f "$CCSWITCH_BIN" ]]; then |
| HOST=0.0.0.0 PORT=3000 "$CCSWITCH_BIN" > /dev/null 2>&1 & |
| CCSWITCH_PID=$! |
| echo " -> cc-switch-web started (PID $CCSWITCH_PID)" |
| else |
| echo " -> cc-switch-web not available" |
| fi |
|
|
| |
| echo "[11/13] Starting Caddy reverse proxy..." |
| caddy run --config /app/Caddyfile > /dev/null 2>&1 & |
| CADDY_PID=$! |
| echo " -> Caddy PID: $CADDY_PID" |
| trap "kill $CADDY_PID 2>/dev/null" EXIT |
|
|
| |
| echo "[12/13] Configuring third-party integrations (if enabled)..." |
|
|
| if [[ "${WEIXIN_ENABLED:-false}" == "true" ]]; then |
| echo " -> WeChat integration enabled, activating..." |
| bash /app/scripts/wechat-activate.sh |
| else |
| echo " -> WeChat integration disabled (WEIXIN_ENABLED=false)" |
| fi |
|
|
| if [[ "${FEISHU_ENABLED:-false}" == "true" ]]; then |
| echo " -> Feishu integration enabled, setting up..." |
| bash /app/scripts/feishu-setup.sh |
| else |
| echo " -> Feishu integration disabled (FEISHU_ENABLED=false)" |
| fi |
|
|
| |
| echo "[13/13] Starting OpenClaw Gateway..." |
| GATEWAY_LOG="${OPENCLAW_STATE_DIR}/gateway.log" |
| openclaw gateway run --port "${OPENCLAW_GATEWAY_PORT}" > "$GATEWAY_LOG" 2>&1 & |
| OPENCLAW_PID=$! |
| echo " -> OpenClaw PID: $OPENCLAW_PID (on :${OPENCLAW_GATEWAY_PORT})" |
| echo " -> Gateway log: $GATEWAY_LOG" |
| |
| tail -f "$GATEWAY_LOG" 2>/dev/null & |
|
|
| |
| echo " -> Waiting for gateway to be ready (up to 90s) via Caddy on :$PORT..." |
| for i in $(seq 1 30); do |
| if curl -s -f --connect-timeout 3 --max-time 5 "http://localhost:${PORT}/health" >/dev/null 2>&1; then |
| echo " -> Gateway ready!" |
| break |
| fi |
| if [ $i -eq 10 ] || [ $i -eq 20 ]; then |
| echo " -> Still waiting... (${i}x3s elapsed)" |
| if ! kill -0 $OPENCLAW_PID 2>/dev/null; then |
| echo " -> WARNING: Gateway process died! Last log lines:" |
| tail -5 "$GATEWAY_LOG" 2>/dev/null || echo " -> (no log file)" |
| break |
| fi |
| fi |
| sleep 3 |
| done |
|
|
| |
| if ! kill -0 $OPENCLAW_PID 2>/dev/null; then |
| echo " -> ERROR: Gateway process exited. Full log:" |
| cat "$GATEWAY_LOG" 2>/dev/null || echo " -> (no log)" |
| exit 1 |
| fi |
|
|
| |
| echo " -> Waiting for provider auth warmup (60s)..." |
| for i in 1 2 3 4 5 6 7 8 9 10 11 12; do |
| if curl -s -f --connect-timeout 3 --max-time 5 "http://localhost:${PORT}/health" >/dev/null 2>&1; then |
| : |
| fi |
| sleep 5 |
| done |
| echo " -> Warmup window done" |
|
|
| |
| ( |
| sleep 2 |
|
|
| echo "[5/13] Creating agents..." |
| for i in 1 2 3 4 5; do |
| agent_id="agent-${i}" |
| if timeout 15 openclaw agents list 2>/dev/null | grep -q "\"${agent_id}\""; then |
| echo " -> Agent ${agent_id} exists, skipping" |
| else |
| echo " -> Creating agent ${agent_id}..." |
| openclaw agents add "${agent_id}" \ |
| --workspace "${OPENCLAW_STATE_DIR}/workspace-agent-${i}" \ |
| --non-interactive 2>/dev/null || true |
| fi |
| done |
|
|
| echo "[6/13] Configuring skills..." |
| allow_bundled="${SKILLS_ALLOW_BUNDLED:-multi-search-cn,github,summarize}" |
| IFS=',' read -ra ALLOW <<< "$allow_bundled" |
| for skill in "${ALLOW[@]}"; do |
| [[ -n "$skill" ]] && timeout 15 openclaw config set "skills.allowBundled[+]" "$skill" 2>/dev/null || true |
| done |
|
|
| echo "[7/13] Post-gateway setup done" |
| ) & |
|
|
| |
| wait $OPENCLAW_PID |