diff --git a/backend/start-container.sh b/backend/start-container.sh index 7905630..03f75bb 100644 --- a/backend/start-container.sh +++ b/backend/start-container.sh @@ -1,86 +1,99 @@ #!/bin/bash set -e -echo "🦊 Starting Foxy Dev Team API Container (Enhanced Mode)..." +echo "🦊 Starting Foxy Dev Team API Container..." +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -# Force HOME for consistent paths +# ─── Environment ────────────────────────────────────────────────────────────── export HOME="/home/foxy" export FOXY_HOME="/home/foxy/.openclaw" export OPENCLAW_TYPE="${OPENCLAW_TYPE:-standalone}" -# Ensure directories exist -mkdir -p "$FOXY_HOME/logs" -mkdir -p "$FOXY_HOME/workspace" -mkdir -p "$FOXY_HOME/agents" +echo "📌 OPENCLAW_TYPE = $OPENCLAW_TYPE" +echo "📌 FOXY_HOME = $FOXY_HOME" -# --- CONFIG PATCHING --- -# We look for both possible filenames -FILES=("$FOXY_HOME/config.json" "$FOXY_HOME/openclaw.json" "$FOXY_HOME/config.yaml" "$FOXY_HOME/openclaw.yaml") +# ─── Ensure directories ────────────────────────────────────────────────────── +mkdir -p "$FOXY_HOME/logs" "$FOXY_HOME/workspace" "$FOXY_HOME/agents" -for CONFIG_FILE in "${FILES[@]}"; do - if [ -f "$CONFIG_FILE" ]; then - echo "🔧 Patching $CONFIG_FILE..." - sed -i 's/\/home\/openclaw/\/home\/foxy/g' "$CONFIG_FILE" - sed -i 's/"gatewayHost": "127.0.0.1"/"gatewayHost": "0.0.0.0"/g' "$CONFIG_FILE" - sed -i 's/gatewayHost: 127.0.0.1/gatewayHost: 0.0.0.0/g' "$CONFIG_FILE" - echo "✅ $CONFIG_FILE patched." - fi -done +# ─── 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." -# Deep patch: search for any stray host paths in agents or other files -echo "🔍 Searching for stray host paths in $FOXY_HOME..." -find "$FOXY_HOME" -type f -not -path "*/logs/*" -exec sed -i 's/\/home\/openclaw/\/home\/foxy/g' {} + -echo "✅ Recursive 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 no config exists at all, create a default one -if [ ! -f "$FOXY_HOME/config.json" ] && [ ! -f "$FOXY_HOME/openclaw.json" ] && [ ! -f "$FOXY_HOME/config.yaml" ] && [ ! -f "$FOXY_HOME/openclaw.yaml" ]; then - echo "📦 No config found. Initializing default OpenClaw config..." - cat < "$FOXY_HOME/openclaw.json" -{ - "theme": "dark", - "logLevel": "info", - "gatewayPort": 18789, - "gatewayHost": "0.0.0.0", - "workspaceDir": "$FOXY_HOME/workspace", - "agentsDir": "$FOXY_HOME/agents" -} -EOF +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 -# --- GATEWAY STARTUP --- +# ─── 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 "🔧 OPENCLAW_TYPE is standalone. Starting internal Gateway..." - - # Try to kill any existing (though unlikely in fresh container) - pkill -f "openclaw" || true - - echo "🚀 Launching OpenClaw Gateway in background..." - # We use 'nohup' and target 0.0.0.0 explicitly. - # Redirecting to a persistent log file. - nohup openclaw gateway start --host 0.0.0.0 --port 18789 > "$FOXY_HOME/logs/gateway.log" 2>&1 & - - # Wait and check - echo "⏱ Waiting for Gateway to initialize..." + 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 - - if pgrep -f "openclaw" > /dev/null; then - echo "✅ OpenClaw Gateway process found (PID: $(pgrep -f "openclaw"))." - # Optional: check if port is listening - if command -v netstat >/dev/null 2>&1; then - netstat -tulpn | grep 18789 || echo "⚠️ Gateway started but port 18789 not yet listening." + + # 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 crashed or failed to start!" - echo "--- LAST LOGS ---" - tail -n 20 "$FOXY_HOME/logs/gateway.log" - echo "-----------------" + 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. Assuming host gateway." + echo "🔗 OPENCLAW_TYPE is shared — expecting host-managed Gateway." fi -echo "🚀 Starting Uvicorn API Server..." -# We don't use 'exec' here so that this script stays as a parent -# OR we do use exec if tini is the entrypoint (it will handle orphans). -# Using exec is better for signal propagation. +# ─── 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