#!/bin/bash set -e echo "🦊 Starting Foxy Dev Team API Container..." echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" # ─── Environment ────────────────────────────────────────────────────────────── export HOME="/home/foxy" export FOXY_HOME="/home/foxy/.openclaw" export OPENCLAW_TYPE="${OPENCLAW_TYPE:-standalone}" echo "📌 OPENCLAW_TYPE = $OPENCLAW_TYPE" echo "📌 FOXY_HOME = $FOXY_HOME" # ─── Ensure directories ────────────────────────────────────────────────────── mkdir -p "$FOXY_HOME/logs" "$FOXY_HOME/workspace" "$FOXY_HOME/agents" # ─── Config patching ───────────────────────────────────────────────────────── # Fix host paths (/home/openclaw → /home/foxy) in all config & agent files echo "🔧 Patching host paths for container environment..." find "$FOXY_HOME" -type f \( -name "*.json" -o -name "*.yaml" -o -name "*.yml" \) \ -not -path "*/logs/*" \ -not -path "*/node_modules/*" \ -exec sed -i 's/\/home\/openclaw/\/home\/foxy/g' {} + 2>/dev/null || true echo "✅ Path patching complete." # ─── Ensure gateway.bind is set to 0.0.0.0 in config ───────────────────────── # OpenClaw uses openclaw.json as its config file OCCONFIG="$FOXY_HOME/openclaw.json" if [ -f "$OCCONFIG" ]; then echo "🔧 Ensuring gateway binds to 0.0.0.0 in $OCCONFIG..." # Replace any 127.0.0.1 binding with 0.0.0.0 so Docker can expose the port sed -i 's/"bind"[[:space:]]*:[[:space:]]*"loopback"/"bind": "all"/g' "$OCCONFIG" sed -i 's/"bind"[[:space:]]*:[[:space:]]*"127.0.0.1"/"bind": "0.0.0.0"/g' "$OCCONFIG" # Also handle the gateway.host key if present sed -i 's/"host"[[:space:]]*:[[:space:]]*"127.0.0.1"/"host": "0.0.0.0"/g' "$OCCONFIG" fi # ─── Default config if none exists ──────────────────────────────────────────── if [ ! -f "$OCCONFIG" ]; then echo "📦 No openclaw.json found. Creating default configuration..." cat <<'DEFAULTEOF' > "$OCCONFIG" { "gateway": { "port": 18789, "bind": "all" }, "agents": { "directory": "/home/foxy/.openclaw/agents" }, "workspace": "/home/foxy/.openclaw/workspace" } DEFAULTEOF echo "✅ Default openclaw.json created." fi # ─── Gateway startup ───────────────────────────────────────────────────────── if [ "$OPENCLAW_TYPE" = "standalone" ]; then echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "🚀 Starting OpenClaw Gateway (standalone)..." # Kill any leftover process pkill -f "openclaw" 2>/dev/null || true sleep 1 # Start gateway — NO --host flag (doesn't exist). # Binding is controlled via openclaw.json gateway.bind setting. nohup openclaw gateway start > "$FOXY_HOME/logs/gateway.log" 2>&1 & GATEWAY_PID=$! echo "⏱ Waiting for Gateway (PID $GATEWAY_PID) to initialize..." sleep 5 # Check if process is alive if kill -0 $GATEWAY_PID 2>/dev/null; then echo "✅ OpenClaw Gateway is running (PID $GATEWAY_PID)." # Check port if netstat -tulpn 2>/dev/null | grep -q 18789; then echo "✅ Port 18789 is listening." else echo "⚠️ Gateway running but port 18789 not yet open. It may need more time." echo " Check logs: cat $FOXY_HOME/logs/gateway.log" fi else echo "❌ OpenClaw Gateway failed to start!" echo "──── Gateway Log ────" cat "$FOXY_HOME/logs/gateway.log" 2>/dev/null || echo "(no log)" echo "─────────────────────" echo "⚠️ Continuing without Gateway. API will still start." fi else echo "🔗 OPENCLAW_TYPE is shared — expecting host-managed Gateway." fi # ─── Start API ──────────────────────────────────────────────────────────────── echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "🚀 Starting Uvicorn API Server on port 7000..." exec python -m uvicorn app.main:app --host 0.0.0.0 --port 7000