#!/usr/bin/env bash # ============================================================================= # OpenClaw All-in-One — instalación en 1 click # ============================================= # Instala y pre-configura: # • openclaw (CLI + Gateway daemon, systemd usuario) # • free-ide-proxy (endpoint OpenAI-compatible local en 127.0.0.1:6446) # Con el modelo por defecto deepseek-v4-flash-free apuntando a TU proxy. # # Uso (Linux/macOS): # curl -fsSL https://gitea.cbcren.online/renato97/openclaw-allinone/raw/branch/main/install.sh | bash # # Variables de entorno opcionales (override): # MODEL modelo a usar (default: deepseek-v4-flash-free) # PROXY_API_KEY clave del proxy (default: embebida, local-only) # GATEWAY_PORT puerto del gateway de openclaw (default: 18789) # GITEA_URL base de tu Gitea (default: https://gitea.cbcren.online/) # GITEA_USER usuario de tu Gitea (default: renato97) # ============================================================================= set -euo pipefail log() { echo -e "\033[1;34m[openclaw]\033[0m $*"; } warn() { echo -e "\033[1;33m[openclaw]\033[0m $*"; } die() { echo -e "\033[1;31m[openclaw]\033[0m ERROR: $*" >&2; exit 1; } # ---------------- Configurables (env override) ---------------- MODEL="${MODEL:-deepseek-v4-flash-free}" PROXY_API_KEY="${PROXY_API_KEY:-tw0rxo314kvga9lfbp2nj5sde7hiq6uc}" GATEWAY_PORT="${GATEWAY_PORT:-18789}" PROXY_PORT="${PROXY_PORT:-6446}" GITEA_URL="${GITEA_URL:-https://gitea.cbcren.online}" GITEA_USER="${GITEA_USER:-renato97}" PROXY_REPO="${PROXY_REPO:-free-ide-proxy}" PROXY_VERSION="${PROXY_VERSION:-v1.0.0}" OPENCLAW_VER="${OPENCLAW_VER:-2026.7.1-2}" # Normalizar GITEA_URL (sin barra final) GITEA_URL="${GITEA_URL%/}" export PATH="$HOME/.local/bin:$HOME/.openclaw/bin:/usr/local/bin:$PATH" # ---------------- Detectar OS / arch ---------------- OS="$(uname -s)" case "$OS" in Linux) OS=linux ;; Darwin) OS=darwin ;; *) die "Sistema operativo no soportado: $OS (se requiere Linux o macOS)" ;; esac case "$(uname -m)" in x86_64|amd64) ARCH=amd64 ;; aarch64|arm64) ARCH=arm64 ;; *) ARCH=source ;; esac log "OS=$OS arch=$(uname -m) modelo=$MODEL gateway=:$GATEWAY_PORT proxy=:$PROXY_PORT" # ---------------- 1) openclaw ---------------- if command -v openclaw >/dev/null 2>&1; then log "openclaw ya instalado: $(openclaw --version 2>&1 | head -1)" elif command -v npm >/dev/null 2>&1 && [ "$(node --version 2>/dev/null | sed -E 's/[^0-9.]//g' | cut -d. -f1)" -ge 22 ]; then log "Instalando openclaw via npm (node >=22)..." npm install -g "openclaw@${OPENCLAW_VER}" else log "Instalando openclaw (installer oficial, provee Node si hace falta)..." curl -fsSL https://openclaw.ai/install.sh | bash fi command -v openclaw >/dev/null 2>&1 || die "openclaw no quedó disponible en PATH" OPENCLAW_BIN="$(command -v openclaw)" # ---------------- 2) free-ide-proxy ---------------- PROXY_OK=0 if curl -fsS "http://127.0.0.1:${PROXY_PORT}/health" >/dev/null 2>&1; then log "free-ide-proxy ya responde en :${PROXY_PORT} — se omite su instalación" PROXY_OK=1 fi if [ "$PROXY_OK" -eq 0 ]; then PROXY_BIN="$HOME/.local/bin/free-ide-proxy" mkdir -p "$HOME/.local/bin" if [ "$OS" = "linux" ] && [ "$ARCH" = "amd64" ]; then ASSET="free-ide-proxy-linux-amd64" log "Descargando free-ide-proxy ${PROXY_VERSION} (${ASSET}) desde tu Gitea..." curl -fsSL "${GITEA_URL}/${GITEA_USER}/${PROXY_REPO}/releases/download/${PROXY_VERSION}/${ASSET}" -o "$PROXY_BIN" chmod +x "$PROXY_BIN" else warn "No hay binario precompilado para $OS/$ARCH — compilando desde fuente (requiere Go 1.22+)..." command -v go >/dev/null 2>&1 || die "Go no está instalado. Instala Go 1.22+ o usa Linux/amd64 con el binario precompilado." TMP="$(mktemp -d)" git clone --depth 1 "${GITEA_URL}/${GITEA_USER}/${PROXY_REPO}.git" "$TMP/proxy" (cd "$TMP/proxy" && go build -o "$PROXY_BIN" .) rm -rf "$TMP" fi # systemd unit a nivel usuario (no requiere root) mkdir -p "$HOME/.config/systemd/user" cat > "$HOME/.config/systemd/user/free-ide-proxy.service" </dev/null || true log "Habilitando linger para arrancar los servicios de usuario al boot..." (sudo loginctl enable-linger "$USER" 2>/dev/null || loginctl enable-linger "$USER" 2>/dev/null) || warn "no se pudo enable-linger (los servicios de usuario no arrancarán solos al boot)" systemctl --user daemon-reload systemctl --user enable --now free-ide-proxy.service sleep 2 curl -fsS "http://127.0.0.1:${PROXY_PORT}/health" >/dev/null 2>&1 || die "free-ide-proxy no quedó arriba en :${PROXY_PORT}" log "free-ide-proxy activo en http://127.0.0.1:${PROXY_PORT} (${MODEL} y más)" fi # ---------------- 3) Config de openclaw (pre-cargada) ---------------- # Reutiliza el token del gateway si ya existía una config (idempotencia). GATEWAY_TOKEN="" if [ -f "$HOME/.openclaw/openclaw.json" ]; then GATEWAY_TOKEN="$(grep -o '"token"[[:space:]]*:[[:space:]]*"[^"]*"' "$HOME/.openclaw/openclaw.json" | head -1 | sed -E 's/.*:"([^"]*)"/\1/')" cp "$HOME/.openclaw/openclaw.json" "$HOME/.openclaw/openclaw.json.bak.$(date +%s)" log "Backup de config existente guardado en ~/.openclaw/openclaw.json.bak.*" fi GATEWAY_TOKEN="${GATEWAY_TOKEN:-$(openssl rand -hex 24 2>/dev/null || cat /dev/urandom | tr -dc 'a-f0-9' | head -c 48)}" mkdir -p "$HOME/.openclaw/workspace" cat > "$HOME/.openclaw/openclaw.json" </dev/null || true log "Instalando daemon del gateway (systemd usuario)..." "$OPENCLAW_BIN" daemon install --runtime node >/dev/null 2>&1 || warn "daemon install avisó algo; se intenta igual" systemctl --user daemon-reload 2>/dev/null || true systemctl --user enable --now openclaw-gateway.service >/dev/null 2>&1 || { warn "El servicio openclaw-gateway no arrancó al vuelo; reintentando..." sleep 2 systemctl --user start openclaw-gateway.service >/dev/null 2>&1 || true } sleep 4 # ---------------- 5) Verificación ---------------- log "Verificando proxy..." curl -fsS "http://127.0.0.1:${PROXY_PORT}/health" && echo log "Verificando gateway ($GATEWAY_PORT)..." (ss -tln 2>/dev/null || netstat -tln 2>/dev/null) | grep -q ":$GATEWAY_PORT " && echo "gateway escuchando en :$GATEWAY_PORT" || warn "no se detectó el puerto $GATEWAY_PORT (revisa: systemctl --user status openclaw-gateway)" if timeout 60 "$OPENCLAW_BIN" agent -m "Responde SOLO con: OK" --agent main >/dev/null 2>&1; then log "Inferencia verificada: el agente respondió OK con $MODEL." else warn "La verificación de inferencia no respondió en 60s. El gateway puede estar calentando; probá luego:" warn " openclaw agent -m 'hola' --agent main" fi echo echo "==============================================================================" echo " ✅ OpenClaw listo" echo " Modelo : $MODEL" echo " Endpoint : http://127.0.0.1:${PROXY_PORT}/v1" echo " Gateway : ws://127.0.0.1:${GATEWAY_PORT}" echo " Servicios : free-ide-proxy + openclaw-gateway (systemd usuario)" echo "----------------------------------------------------------------------------" echo " Chat: openclaw chat" echo " Status: openclaw gateway status" echo " Panel: openclaw dashboard" echo "=============================================================================="