#!/bin/bash # ============================================================================= # init-lab.sh — Inicialización del laboratorio de IA local # ============================================================================= # # Uso: # chmod +x init-lab.sh # ./init-lab.sh # # Descripción: # Script de inicialización rápida del laboratorio. Crea la estructura de # directorios recomendada en el episodio, descarga los modelos esenciales # y genera un docker-compose.yml básico para empezar. # # Este script está diseñado para que el oyente pueda poner en marcha su # laboratorio con un solo comando después de instalar Ollama y Docker. # # Estructura que crea: # ~/lab-ia/ # ├── docker/ # │ ├── ollama/ # │ ├── open-webui/ # │ └── docker-compose.yml # ├── modelos/ # ├── datos/ # │ ├── notas/ # │ ├── transcripciones/ # │ └── embeddings/ # ├── scripts/ # └── config/ # ├── ollama/ # └── open-webui/ # # Requisitos: # - Ollama instalado (ver 02-instalacion/setup-ollama.sh) # - Docker instalado (para el docker-compose.yml) # - Conexión a internet (para descargar modelos) # - ~5 GB de espacio libre # # ============================================================================= set -euo pipefail # Colores VERDE='\033[0;32m' AMARILLO='\033[1;33m' AZUL='\033[0;34m' ROJO='\033[0;31m' RESET='\033[0m' # Directorio base del laboratorio LAB_DIR="$HOME/lab-ia" echo -e "${AZUL}╔══════════════════════════════════════════════════════╗${RESET}" echo -e "${AZUL}║ 🔬 Inicialización del Laboratorio de IA Local ║${RESET}" echo -e "${AZUL}║ Episodio 827 — Recursos IA: el botiquín del ║${RESET}" echo -e "${AZUL}║ explorador ║${RESET}" echo -e "${AZUL}╚══════════════════════════════════════════════════════╝${RESET}" echo "" # ============================================================================= # PASO 1: Comprobar requisitos # ============================================================================= echo -e "${AZUL}[1/5] Comprobando requisitos...${RESET}" echo "" REQUISITOS_OK=true # Ollama echo -n " Ollama: " if command -v ollama &>/dev/null; then echo -e "${VERDE}✓${RESET}" else echo -e "${ROJO}✗${RESET}" echo " → Instala Ollama primero: curl -fsSL https://ollama.com/install.sh | sh" REQUISITOS_OK=false fi # Docker echo -n " Docker: " if command -v docker &>/dev/null; then echo -e "${VERDE}✓${RESET}" else echo -e "${AMARILLO}⚠${RESET}" echo " → Docker no está instalado. El docker-compose.yml se creará igual." echo " → Instálalo con: curl -fsSL https://get.docker.com | sh" fi # Espacio en disco (~5 GB necesarios) echo -n " Espacio en disco: " ESPACIO_LIBRE=$(df -BG "$HOME" | tail -1 | awk '{print $4}' | sed 's/G//') if [ "$ESPACIO_LIBRE" -ge 10 ]; then echo -e "${VERDE}✓${RESET} ($ESPACIO_LIBRE GB libres)" elif [ "$ESPACIO_LIBRE" -ge 5 ]; then echo -e "${AMARILLO}⚠${RESET} ($ESPACIO_LIBRE GB libres — suficiente pero justo)" else echo -e "${ROJO}✗${RESET} ($ESPACIO_LIBRE GB libres — necesitas al menos 5 GB)" REQUISITOS_OK=false fi echo "" if [ "$REQUISITOS_OK" = false ]; then echo " ERROR: Requisitos insuficientes. Revisa los mensajes anteriores." exit 1 fi # ============================================================================= # PASO 2: Crear estructura de directorios # ============================================================================= echo -e "${AZUL}[2/5] Creando estructura de directorios...${RESET}" echo "" mkdir -p "$LAB_DIR" mkdir -p "$LAB_DIR/docker/ollama" mkdir -p "$LAB_DIR/docker/open-webui" mkdir -p "$LAB_DIR/modelos" mkdir -p "$LAB_DIR/datos/notas" mkdir -p "$LAB_DIR/datos/transcripciones" mkdir -p "$LAB_DIR/datos/embeddings" mkdir -p "$LAB_DIR/scripts" mkdir -p "$LAB_DIR/config/ollama" mkdir -p "$LAB_DIR/config/open-webui" echo " Estructura creada en: ${AZUL}${LAB_DIR}${RESET}" echo "" echo " ${LAB_DIR}/" echo " ├── docker/" echo " │ ├── ollama/" echo " │ ├── open-webui/" echo " │ └── docker-compose.yml (se crea a continuación)" echo " ├── modelos/" echo " ├── datos/" echo " │ ├── notas/" echo " │ ├── transcripciones/" echo " │ └── embeddings/" echo " ├── scripts/" echo " └── config/" echo " ├── ollama/" echo " └── open-webui/" echo "" # ============================================================================= # PASO 3: Crear docker-compose.yml básico # ============================================================================= echo -e "${AZUL}[3/5] Creando docker-compose.yml básico...${RESET}" echo "" COMPOSE_FILE="$LAB_DIR/docker/docker-compose.yml" cat > "$COMPOSE_FILE" << 'COMPOSE_EOF' # ============================================================================= # docker-compose.yml — Laboratorio IA Local # Generado por init-lab.sh del Episodio 827 # ============================================================================= # # Uso: # docker compose up -d # Levantar todos los servicios # docker compose down # Detener todos los servicios # docker compose logs -f # Ver logs en tiempo real # # Servicios: # - ollama: Gestor de modelos de lenguaje (API en :11434) # - open-webui: Interfaz gráfica web (web en :3000) # # Requisitos: # - Docker Engine 24+ o Podman 4+ # - Docker Compose v2+ # # ============================================================================= services: # --------------------------------------------------------------------------- # Ollama — Gestor de modelos de lenguaje # --------------------------------------------------------------------------- ollama: image: ollama/ollama:latest container_name: ollama-server hostname: ollama volumes: # Persistencia de modelos descargados - ./ollama/models:/root/.ollama ports: # API REST de Ollama - "11434:11434" environment: # Mantener el modelo en memoria para respuestas más rápidas - OLLAMA_KEEP_ALIVE=5m # Número máximo de modelos cargados simultáneamente - OLLAMA_NUM_PARALLEL=1 # Límite de contexto (ventana de tokens) - OLLAMA_CONTEXT_LENGTH=8192 restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - ia-local-net # --------------------------------------------------------------------------- # Open WebUI — Interfaz gráfica para chatear con modelos # --------------------------------------------------------------------------- open-webui: image: ghcr.io/open-webui/open-webui:main container_name: open-webui depends_on: ollama: condition: service_healthy volumes: # Persistencia de conversaciones, configuraciones, archivos subidos - ./open-webui/data:/app/backend/data ports: # Interfaz web - "3000:8080" environment: # URL del servicio Ollama (nombre del contenedor, no localhost) - OLLAMA_BASE_URL=http://ollama:11434 # Tiempo máximo de espera para respuestas largas - WEBUI_TIMEOUT=300 restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s networks: - ia-local-net # --------------------------------------------------------------------------- # Redes # --------------------------------------------------------------------------- networks: ia-local-net: name: ia-local-network driver: bridge COMPOSE_EOF echo -e " ${VERDE}✓${RESET} docker-compose.yml creado en:" echo " $COMPOSE_FILE" echo "" # ============================================================================= # PASO 4: Descargar modelos esenciales # ============================================================================= echo -e "${AZUL}[4/5] Descargando modelos esenciales...${RESET}" echo "" # Modelo de lenguaje pequeño (ideal para empezar) MODELO_LENGUAJE="qwen2.5:3b" echo " Modelo de lenguaje: ${AMARILLO}${MODELO_LENGUAJE}${RESET}" echo " (~2 GB — recomendado para empezar)" echo "" if ollama list 2>/dev/null | grep -q "^${MODELO_LENGUAJE}\s"; then echo -e " ${VERDE}✓${RESET} ${MODELO_LENGUAJE} ya está descargado." else echo " Descargando ${MODELO_LENGUAJE}..." echo " (Esto puede tardar según tu conexión)" ollama pull "$MODELO_LENGUAJE" echo -e " ${VERDE}✓${RESET} ${MODELO_LENGUAJE} descargado." fi echo "" # Modelo de embeddings (para RAG y búsqueda semántica) MODELO_EMBED="nomic-embed-text" echo " Modelo de embeddings: ${AMARILLO}${MODELO_EMBED}${RESET}" echo " (~0.3 GB — necesario para RAG y búsqueda semántica)" echo "" if ollama list 2>/dev/null | grep -q "^${MODELO_EMBED}\s"; then echo -e " ${VERDE}✓${RESET} ${MODELO_EMBED} ya está descargado." else echo " Descargando ${MODELO_EMBED}..." ollama pull "$MODELO_EMBED" echo -e " ${VERDE}✓${RESET} ${MODELO_EMBED} descargado." fi echo "" # ============================================================================= # PASO 5: Crear script de respaldo básico # ============================================================================= echo -e "${AZUL}[5/5] Creando script de respaldo básico...${RESET}" echo "" BACKUP_SCRIPT="$LAB_DIR/scripts/backup.sh" cat > "$BACKUP_SCRIPT" << 'BACKUP_EOF' #!/bin/bash # backup.sh — Respaldo del laboratorio de IA local # # Uso: # ./backup.sh # Respaldo completo # ./backup.sh --modelos # Solo respaldo de modelos # ./backup.sh --datos # Solo respaldo de datos # # Descripción: # Crea una copia de seguridad de los elementos esenciales del laboratorio: # modelos descargados, configuraciones y datos generados. set -euo pipefail BACKUP_DIR="$HOME/lab-ia-backup-$(date +%Y%m%d)" LAB_DIR="$HOME/lab-ia" echo "==============================================" echo " Respaldo del Laboratorio IA Local" echo "==============================================" echo "" echo " Directorio de respaldo: $BACKUP_DIR" echo "" mkdir -p "$BACKUP_DIR" # Respaldar configuración de Ollama if [ -d "$HOME/.ollama" ]; then echo " Respaldando modelos de Ollama..." cp -r "$HOME/.ollama" "$BACKUP_DIR/ollama" echo " ✓ Modelos respaldados" fi # Respaldar docker-compose y configuraciones if [ -d "$LAB_DIR/docker" ]; then echo " Respaldando docker-compose..." cp -r "$LAB_DIR/docker" "$BACKUP_DIR/docker" echo " ✓ Configuración Docker respaldada" fi # Respaldar scripts personalizados if [ -d "$LAB_DIR/scripts" ]; then echo " Respaldando scripts..." cp -r "$LAB_DIR/scripts" "$BACKUP_DIR/scripts" echo " ✓ Scripts respaldados" fi echo "" echo " Respaldo completado en: $BACKUP_DIR" echo " Para restaurar: cp -r $BACKUP_DIR/* $HOME/" echo "==============================================" BACKUP_EOF chmod +x "$BACKUP_SCRIPT" echo -e " ${VERDE}✓${RESET} Script de respaldo creado: $BACKUP_SCRIPT" echo "" # ============================================================================= # CIERRE # ============================================================================= echo -e "${VERDE}╔══════════════════════════════════════════════════════╗${RESET}" echo -e "${VERDE}║ ✅ Laboratorio inicializado con éxito ║${RESET}" echo -e "${VERDE}╚══════════════════════════════════════════════════════╝${RESET}" echo "" echo " Tu laboratorio está listo en: ${AZUL}${LAB_DIR}${RESET}" echo "" echo " Modelos descargados:" ollama list 2>/dev/null | tail -n +2 | while read -r line; do echo " • $line" done echo "" echo " Para empezar a usar tu laboratorio:" echo "" echo " 1. Abre la interfaz web (si tienes Docker):" echo " cd ${LAB_DIR}/docker" echo " docker compose up -d" echo " → http://localhost:3000" echo "" echo " 2. Chatea desde terminal:" echo " ollama run qwen2.5:3b \"¿Qué puedo hacer con IA local?\"" echo "" echo " 3. Prueba la API REST:" echo " curl http://localhost:11434/api/tags" echo "" echo " 4. Haz un respaldo:" echo " ${LAB_DIR}/scripts/backup.sh" echo "" echo " 📖 Guía completa en: atareao.es/827" echo "" echo " Próximo episodio (829): Skills imprescindibles para tu agente IA" echo " Vamos a enseñar al modelo a usar herramientas." echo "" echo " Nos oímos el jueves. Sed felices. Y seguid trasteando." echo ""