#!/bin/bash # ────────────────────────────────────────────── # d0a1 pack — Hermes Agent # Agente de IA desde terminal o Telegram. # ────────────────────────────────────────────── # Local: ./deploy.sh local → terminal + http://localhost:11434 (Ollama) # VPS: ./deploy.sh vps → + gateway accesible desde fuera # Stop: ./deploy.sh stop → para Ollama # ────────────────────────────────────────────── set -e GREEN='\033[0;32m' CYAN='\033[0;36m' YELLOW='\033[0;33m' RED='\033[0;31m' BOLD='\033[1m' NC='\033[0m' MODE="${1:-local}" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" echo "" echo -e "${BOLD}${CYAN}╔══════════════════════════════════════════╗${NC}" echo -e "${BOLD}${CYAN}║ d0a1 pack — Hermes Agent ║${NC}" echo -e "${BOLD}${CYAN}║ Agente de IA desde terminal o Telegram. ║${NC}" echo -e "${BOLD}${CYAN}╚══════════════════════════════════════════╝${NC}" echo "" # ── Stop mode ─────────────────────────────── if [ "$MODE" = "stop" ]; then if docker ps --format '{{.Names}}' | grep -q d0a1-hermes-ollama; then docker stop d0a1-hermes-ollama && docker rm d0a1-hermes-ollama echo -e "${GREEN}✓ Ollama parado.${NC}" else echo "Ollama no está corriendo." fi exit 0 fi # ── Check Docker (for Ollama) ──────────────── if ! command -v docker &>/dev/null; then echo -e "${RED}✗ Docker no está instalado (necesario para Ollama).${NC}" echo "Instálalo: curl -fsSL https://get.docker.com | sh" exit 1 fi echo -e "${GREEN}✓${NC} Docker: $(docker --version 2>/dev/null | awk '{print $3}' | tr -d ',')" # ── Check RAM ─────────────────────────────── TOTAL_RAM_KB=$(grep MemTotal /proc/meminfo 2>/dev/null | awk '{print $2}' || echo "0") TOTAL_RAM_GB=$((TOTAL_RAM_KB / 1024 / 1024)) if [ "$TOTAL_RAM_GB" -lt 3 ]; then echo -e "${RED}✗ Se necesitan 4 GB de RAM mínimo (detectado: ${TOTAL_RAM_GB} GB).${NC}" exit 1 fi echo -e "${GREEN}✓${NC} RAM: ${TOTAL_RAM_GB} GB" # ── Auto-detect Ollama port ───────────────── find_free_port() { local port=$1 local max_port=$((port + 20)) while [ "$port" -le "$max_port" ]; do if ! ss -tlnp 2>/dev/null | grep -q ":${port} " && ! netstat -tlnp 2>/dev/null | grep -q ":${port} "; then echo "$port" return 0 fi port=$((port + 1)) done echo "$1" return 1 } OLLAMA_PORT=$(find_free_port 11434) if [ "$MODE" = "vps" ]; then echo -e "${YELLOW}Modo:${NC} VPS" echo "" echo -e " ${BOLD}¿No tienes VPS?${NC} Consigue uno con descuento:" echo -e " ${CYAN}https://d0a1.es/go/vultr/${NC} — Vultr" echo -e " ${CYAN}https://d0a1.es/go/digitalocean/${NC} — DigitalOcean (\$200 credit)" echo "" elif [ "$MODE" != "local" ]; then echo -e "${RED}Modo desconocido: $MODE${NC}" echo "Usa: ./deploy.sh local | vps | stop" exit 1 fi if [ "$OLLAMA_PORT" != "11434" ]; then echo -e "${YELLOW}⚠ Puerto 11434 ocupado, usando ${OLLAMA_PORT}${NC}" fi echo "" # ── 1. Arrancar Ollama (Docker) ────────────── echo -e "${YELLOW}[1/3]${NC} Arrancando Ollama (IA local)..." if ! docker ps --format '{{.Names}}' | grep -q d0a1-hermes-ollama; then docker run -d --name d0a1-hermes-ollama \ -p "${OLLAMA_PORT}:11434" \ -v d0a1_hermes_ollama:/root/.ollama \ -e OLLAMA_HOST=0.0.0.0 \ --restart unless-stopped \ ollama/ollama:0.33.0 fi # Wait for Ollama echo -e " Esperando a que Ollama arranque..." MAX_WAIT=60 WAITED=0 until docker exec d0a1-hermes-ollama ollama ps &>/dev/null; do sleep 2 WAITED=$((WAITED + 2)) if [ "$WAITED" -ge "$MAX_WAIT" ]; then echo -e "${RED}✗ Ollama no arrancó. Revisa: docker logs d0a1-hermes-ollama${NC}" exit 1 fi done echo -e "${YELLOW} Descargando modelo (llama3.2:3b, ~2 GB)...${NC}" docker exec d0a1-hermes-ollama ollama pull llama3.2:3b echo -e "${GREEN}✓${NC} Ollama corriendo en http://localhost:${OLLAMA_PORT}" # ── 2. Instalar Hermes Agent ──────────────── echo -e "${YELLOW}[2/3]${NC} Instalando Hermes Agent..." if command -v hermes &>/dev/null; then echo -e "${GREEN}✓${NC} Hermes Agent ya instalado: $(hermes --version 2>/dev/null || echo 'OK')" else curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash export PATH="$HOME/.local/bin:$PATH" if ! command -v hermes &>/dev/null; then source ~/.bashrc 2>/dev/null || source ~/.zshrc 2>/dev/null || true fi if command -v hermes &>/dev/null; then echo -e "${GREEN}✓${NC} Hermes Agent instalado: $(hermes --version 2>/dev/null || echo 'OK')" else echo -e "${RED}✗ Hermes Agent no se instaló. Instálalo manualmente:${NC}" echo " curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash" echo " source ~/.bashrc" exit 1 fi fi # ── 3. Configurar ─────────────────────────── echo -e "${YELLOW}[3/3]${NC} Configurando..." echo "" echo -e "${BOLD}Ejecuta estos comandos para terminar:${NC}" echo "" echo -e " ${CYAN}hermes setup${NC} — configuración interactiva" echo -e " ${CYAN}hermes model${NC} — elige modelo (Ollama ya está corriendo)" echo -e " ${CYAN}hermes gateway setup${NC} — conecta mensajería (Telegram, etc.)" echo "" if [ "$MODE" = "vps" ]; then echo -e " ${BOLD}Para VPS:${NC} configura el gateway para acceso remoto:" echo -e " ${CYAN}hermes gateway setup --portal${NC}" echo "" fi echo -e " ${BOLD}Parar:${NC} ./deploy.sh stop" echo -e " ${BOLD}¿Quieres más?${NC} ${CYAN}https://d0a1.es/packs/${NC}" echo ""