diff --git a/Dockerfile b/Dockerfile index a613155..3908cbc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -62,6 +62,10 @@ COPY --chown=foxy:foxy --from=frontend-build /build/dist ./static HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD curl -f http://localhost:7000/api/health || exit 1 +# Copy and prepare startup script +COPY --chown=foxy:foxy backend/start-container.sh ./ +RUN chmod +x ./start-container.sh + # Runtime config ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ @@ -71,4 +75,4 @@ EXPOSE 7000 USER foxy -CMD ["python", "-m", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "7000"] +CMD ["./start-container.sh"] diff --git a/backend/.env.example b/backend/.env.example index d723a2d..bb0b426 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -6,11 +6,20 @@ TELEGRAM_BOT_TOKEN=your-telegram-bot-token TELEGRAM_CHAT_ID=your-chat-id # ─── OpenClaw ────────────────────────────────────────────── +# OpenClaw installation type (standalone or Shared) +# Shared: OpenClaw is installed on the host and shared with the container +# Standalone: OpenClaw is installed inside the container with gateway running +OPENCLAW_TYPE=standalone # Root path on the HOST (contains agents/, workspace/, config.json) OPENCLAW_HOME=/home/openclaw/.openclaw # Root path in the CONTAINER (keep as is) FOXY_HOME=/home/foxy/.openclaw +# OpenClaw installation type (standalone or shared) +# shared: OpenClaw gateway runs on the host (Default if empty) +# standalone: OpenClaw gateway starts automatically inside the container +OPENCLAW_TYPE=standalone + # ─── Gitea ───────────────────────────────────────────────── GITEA_SERVER=https://gitea.your.server GITEA_OPENCLAW_TOKEN=your-gitea-token diff --git a/backend/start-container.sh b/backend/start-container.sh new file mode 100644 index 0000000..758fc76 --- /dev/null +++ b/backend/start-container.sh @@ -0,0 +1,48 @@ +#!/bin/bash +set -e + +echo "🦊 Starting Foxy Dev Team API Container..." + +# Defaults if not provided +export FOXY_HOME="${FOXY_HOME:-/home/foxy/.openclaw}" +export OPENCLAW_TYPE="${OPENCLAW_TYPE:-shared}" + +if [ "$OPENCLAW_TYPE" = "standalone" ]; then + echo "🔧 OPENCLAW_TYPE is standalone. Setting up OpenClaw..." + + # Initialize OpenClaw default configuration if it doesn't exist + if [ ! -f "$FOXY_HOME/config.json" ] && [ ! -f "$FOXY_HOME/config.yaml" ]; then + echo "📦 Initializing default OpenClaw config at $FOXY_HOME..." + mkdir -p "$FOXY_HOME/workspace" + mkdir -p "$FOXY_HOME/agents" + + # Write a simple default config if OpenClaw hasn't been onboarded + cat < "$FOXY_HOME/config.json" +{ + "theme": "dark", + "logLevel": "info", + "gatewayPort": 20124, + "gatewayHost": "127.0.0.1", + "workspaceDir": "$FOXY_HOME/workspace", + "agentsDir": "$FOXY_HOME/agents" +} +EOF + echo "✅ Default configuration created." + else + echo "👍 OpenClaw configuration already exists at $FOXY_HOME." + fi + + echo "🚀 Starting OpenClaw Gateway in the background..." + # Starting OpenClaw gateway in the background so it doesn't block FastAPI + if command -v openclaw >/dev/null 2>&1; then + nohup openclaw gateway start > "$FOXY_HOME/logs/gateway.log" 2>&1 & + echo "✅ OpenClaw Gateway started." + else + echo "❌ 'openclaw' command not found, unable to start gateway!" + fi +else + echo "🔗 OPENCLAW_TYPE is shared. Assuming OpenClaw Gateway is managed by the host." +fi + +echo "🚀 Starting Uvicorn API Server..." +exec python -m uvicorn app.main:app --host 0.0.0.0 --port 7000 diff --git a/docker-compose.yml b/docker-compose.yml index aee6e63..f805abb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,6 +22,9 @@ services: - "${API_PORT:-7000}:7000" env_file: - backend/.env + environment: + - FOXY_WORKSPACE=${FOXY_WORKSPACE:-/home/foxy/.openclaw/workspace} + - OPENCLAW_TYPE=${OPENCLAW_TYPE:-standalone} volumes: - foxy-data:/app/data - "${OPENCLAW_HOME:-/home/openclaw/.openclaw}:${FOXY_HOME:-/home/foxy/.openclaw}"