Subir archivos a "/"
This commit is contained in:
510
vololite.sh
Normal file
510
vololite.sh
Normal file
@@ -0,0 +1,510 @@
|
||||
#!/bin/bash
|
||||
|
||||
################################################################################
|
||||
# Script LITE de instalación de VOLO con Docker
|
||||
# Para sistemas con Docker, Ollama, Kiwix y ZIM ya instalados
|
||||
# Autor: Script generado para instalación simplificada
|
||||
# Fecha: Noviembre 2025
|
||||
################################################################################
|
||||
|
||||
set -e
|
||||
|
||||
# Colores para output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Puertos Volo (solo verificamos estos)
|
||||
VOLO_UI_PORT=3002
|
||||
VOLO_API_PORT=1255
|
||||
|
||||
# Puertos de servicios existentes
|
||||
OPENWEBUI_PORT=8380
|
||||
OLLAMA_PORT=11434
|
||||
KIWIX_PORT=8888
|
||||
|
||||
# Directorios
|
||||
INSTALL_DIR="/opt/volo"
|
||||
ZIM_FILE_PATH=""
|
||||
|
||||
echo -e "${BLUE}╔═══════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║ Instalador LITE de VOLO con Docker ║${NC}"
|
||||
echo -e "${BLUE}║ Usa infraestructura existente ║${NC}"
|
||||
echo -e "${BLUE}╚═══════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
|
||||
################################################################################
|
||||
# Función: Verificar si el script se ejecuta como root
|
||||
################################################################################
|
||||
check_root() {
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo -e "${RED}[ERROR]${NC} Este script debe ejecutarse como root o con sudo"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Verificar disponibilidad de puerto
|
||||
################################################################################
|
||||
check_port() {
|
||||
local port=$1
|
||||
local service=$2
|
||||
|
||||
if ss -tuln | grep -q ":$port "; then
|
||||
echo -e "${RED}[✗]${NC} Puerto $port ($service) está en uso"
|
||||
ss -tulnp | grep ":$port "
|
||||
return 1
|
||||
else
|
||||
echo -e "${GREEN}[✓]${NC} Puerto $port ($service) disponible"
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Verificar puertos de Volo
|
||||
################################################################################
|
||||
check_volo_ports() {
|
||||
echo -e "\n${BLUE}[INFO]${NC} Verificando puertos de Volo...\n"
|
||||
|
||||
local all_available=true
|
||||
|
||||
check_port $VOLO_UI_PORT "Volo UI" || all_available=false
|
||||
check_port $VOLO_API_PORT "Volo API" || all_available=false
|
||||
|
||||
if [ "$all_available" = false ]; then
|
||||
echo -e "\n${RED}[ERROR]${NC} Puertos de Volo en uso. ¿Continuar de todos modos? (s/N)"
|
||||
read -r response
|
||||
if [[ ! "$response" =~ ^[Ss]$ ]]; then
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo -e "\n${GREEN}[✓]${NC} Puertos de Volo disponibles\n"
|
||||
fi
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Verificar servicios existentes
|
||||
################################################################################
|
||||
check_existing_services() {
|
||||
echo -e "${BLUE}[INFO]${NC} Verificando servicios existentes...\n"
|
||||
|
||||
# Verificar Docker
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo -e "${RED}[ERROR]${NC} Docker no está instalado"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}[✓]${NC} Docker instalado: $(docker --version)"
|
||||
|
||||
# Verificar Docker Compose
|
||||
if ! docker compose version &> /dev/null; then
|
||||
echo -e "${RED}[ERROR]${NC} Docker Compose no está disponible"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}[✓]${NC} Docker Compose instalado: $(docker compose version)"
|
||||
|
||||
# Verificar Ollama
|
||||
if ss -tuln | grep -q ":$OLLAMA_PORT "; then
|
||||
echo -e "${GREEN}[✓]${NC} Ollama detectado en puerto $OLLAMA_PORT"
|
||||
else
|
||||
echo -e "${YELLOW}[WARN]${NC} Ollama no detectado en puerto $OLLAMA_PORT"
|
||||
echo -e "${YELLOW} ${NC}Volo necesita Ollama para funcionar"
|
||||
fi
|
||||
|
||||
# Verificar Kiwix
|
||||
if ss -tuln | grep -q ":$KIWIX_PORT "; then
|
||||
echo -e "${GREEN}[✓]${NC} Kiwix detectado en puerto $KIWIX_PORT"
|
||||
else
|
||||
echo -e "${YELLOW}[WARN]${NC} Kiwix no detectado en puerto $KIWIX_PORT"
|
||||
echo -e "${YELLOW} ${NC}Volo puede funcionar con Kiwix integrado o externo"
|
||||
fi
|
||||
|
||||
# Verificar OpenWebUI
|
||||
if ss -tuln | grep -q ":$OPENWEBUI_PORT "; then
|
||||
echo -e "${GREEN}[✓]${NC} OpenWebUI detectado en puerto $OPENWEBUI_PORT"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Solicitar ruta de archivos ZIM
|
||||
################################################################################
|
||||
ask_zim_path() {
|
||||
echo -e "${BLUE}[INFO]${NC} Especifica la ruta COMPLETA al archivo ZIM de Wikipedia"
|
||||
echo -e "${YELLOW}Ejemplo:${NC} /mnt/data/zim/wikipedia_en_all_nopic_2024-06.zim"
|
||||
read -e -p "Ruta al archivo .zim: " ZIM_FILE_PATH
|
||||
|
||||
if [ -z "$ZIM_FILE_PATH" ]; then
|
||||
echo -e "${RED}[ERROR]${NC} Debes especificar la ruta al archivo ZIM"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$ZIM_FILE_PATH" ]; then
|
||||
echo -e "${YELLOW}[WARN]${NC} El archivo no existe: $ZIM_FILE_PATH"
|
||||
echo -e "${YELLOW} ${NC}¿Continuar de todos modos? (s/N)"
|
||||
read -r response
|
||||
if [[ ! "$response" =~ ^[Ss]$ ]]; then
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo -e "${GREEN}[✓]${NC} Archivo ZIM encontrado: $ZIM_FILE_PATH"
|
||||
fi
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Preguntar modo de Kiwix
|
||||
################################################################################
|
||||
ask_kiwix_mode() {
|
||||
echo -e "\n${BLUE}[INFO]${NC} ¿Cómo deseas usar Kiwix?"
|
||||
echo -e " 1) Usar Kiwix externo existente (puerto $KIWIX_PORT)"
|
||||
echo -e " 2) Integrar Kiwix dentro del contenedor de Volo"
|
||||
read -p "Opción [1-2]: " kiwix_choice
|
||||
|
||||
if [ "$kiwix_choice" = "1" ]; then
|
||||
USE_EXTERNAL_KIWIX=true
|
||||
echo -e "${GREEN}[✓]${NC} Usando Kiwix externo en http://localhost:$KIWIX_PORT"
|
||||
else
|
||||
USE_EXTERNAL_KIWIX=false
|
||||
echo -e "${GREEN}[✓]${NC} Kiwix se integrará en el contenedor de Volo"
|
||||
fi
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Crear estructura de directorios
|
||||
################################################################################
|
||||
create_directories() {
|
||||
echo -e "\n${BLUE}[INFO]${NC} Creando directorios..."
|
||||
|
||||
mkdir -p "$INSTALL_DIR"
|
||||
|
||||
echo -e "${GREEN}[✓]${NC} Directorios creados"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Crear Dockerfile optimizado
|
||||
################################################################################
|
||||
create_dockerfile() {
|
||||
echo -e "${BLUE}[INFO]${NC} Creando Dockerfile..."
|
||||
|
||||
if [ "$USE_EXTERNAL_KIWIX" = true ]; then
|
||||
# Dockerfile sin Kiwix (usa el externo)
|
||||
cat > "$INSTALL_DIR/Dockerfile" << 'EOF'
|
||||
FROM python:3.11-slim-bookworm
|
||||
|
||||
# Instalar dependencias mínimas
|
||||
RUN apt-get update && apt-get install -y \
|
||||
git \
|
||||
curl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Clonar Volo
|
||||
RUN git clone https://github.com/AdyTech99/volo.git .
|
||||
|
||||
# Instalar dependencias Python
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Crear directorios
|
||||
RUN mkdir -p /app/data
|
||||
|
||||
# Exponer puertos
|
||||
EXPOSE 3002 1255
|
||||
|
||||
COPY entrypoint.sh /app/entrypoint.sh
|
||||
RUN chmod +x /app/entrypoint.sh
|
||||
|
||||
ENTRYPOINT ["/app/entrypoint.sh"]
|
||||
EOF
|
||||
else
|
||||
# Dockerfile con Kiwix integrado
|
||||
cat > "$INSTALL_DIR/Dockerfile" << 'EOF'
|
||||
FROM python:3.11-slim-bookworm
|
||||
|
||||
# Instalar dependencias
|
||||
RUN apt-get update && apt-get install -y \
|
||||
git \
|
||||
wget \
|
||||
curl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Clonar Volo
|
||||
RUN git clone https://github.com/AdyTech99/volo.git .
|
||||
|
||||
# Instalar dependencias Python
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Descargar Kiwix tools
|
||||
RUN mkdir -p /app/kiwix_tools && \
|
||||
wget https://download.kiwix.org/release/kiwix-tools/kiwix-tools_linux-x86_64-3.7.0.tar.gz && \
|
||||
tar -xzf kiwix-tools_linux-x86_64-3.7.0.tar.gz -C /app/kiwix_tools --strip-components=1 && \
|
||||
rm kiwix-tools_linux-x86_64-3.7.0.tar.gz && \
|
||||
chmod +x /app/kiwix_tools/*
|
||||
|
||||
# Crear directorios
|
||||
RUN mkdir -p /app/data
|
||||
|
||||
# Exponer puertos
|
||||
EXPOSE 3002 1255 821
|
||||
|
||||
COPY entrypoint.sh /app/entrypoint.sh
|
||||
RUN chmod +x /app/entrypoint.sh
|
||||
|
||||
ENTRYPOINT ["/app/entrypoint.sh"]
|
||||
EOF
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}[✓]${NC} Dockerfile creado"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Crear entrypoint
|
||||
################################################################################
|
||||
create_entrypoint() {
|
||||
echo -e "${BLUE}[INFO]${NC} Creando script de entrada..."
|
||||
|
||||
cat > "$INSTALL_DIR/entrypoint.sh" << 'EOF'
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
echo "Iniciando Volo..."
|
||||
|
||||
# Generar config.ini si no existe
|
||||
if [ ! -f /app/config.ini ]; then
|
||||
echo "Generando config.ini..."
|
||||
timeout 10 python3 /app/start.py || true
|
||||
fi
|
||||
|
||||
# Aplicar configuración
|
||||
if [ -f /app/config.ini ]; then
|
||||
# Configurar paths según el config.ini montado
|
||||
echo "Configuración cargada desde /app/config.ini"
|
||||
fi
|
||||
|
||||
echo "Volo iniciado correctamente"
|
||||
exec python3 /app/start.py
|
||||
EOF
|
||||
|
||||
chmod +x "$INSTALL_DIR/entrypoint.sh"
|
||||
|
||||
echo -e "${GREEN}[✓]${NC} Script de entrada creado"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Crear config.ini
|
||||
################################################################################
|
||||
create_config() {
|
||||
echo -e "${BLUE}[INFO]${NC} Creando configuración..."
|
||||
|
||||
if [ "$USE_EXTERNAL_KIWIX" = true ]; then
|
||||
# Configuración con Kiwix externo
|
||||
cat > "$INSTALL_DIR/config.ini" << EOF
|
||||
[PATHS]
|
||||
zim_file_path = $ZIM_FILE_PATH
|
||||
|
||||
[SERVER]
|
||||
port = 1255
|
||||
ui_port = 3002
|
||||
kiwix_serve_url = http://host.docker.internal:$KIWIX_PORT
|
||||
heading_count = 64
|
||||
ai_model = qwen2.5:3b
|
||||
ollama_api_url = http://host.docker.internal:$OLLAMA_PORT/api/chat
|
||||
|
||||
[RAG]
|
||||
max_results = 5
|
||||
context_window = 4096
|
||||
EOF
|
||||
else
|
||||
# Configuración con Kiwix integrado
|
||||
cat > "$INSTALL_DIR/config.ini" << EOF
|
||||
[PATHS]
|
||||
kiwix_search_path = /app/kiwix_tools/kiwix-search
|
||||
kiwix_serve_path = /app/kiwix_tools/kiwix-serve
|
||||
zim_file_path = $ZIM_FILE_PATH
|
||||
|
||||
[SERVER]
|
||||
port = 1255
|
||||
ui_port = 3002
|
||||
kiwix_serve_url = http://localhost:821
|
||||
heading_count = 64
|
||||
ai_model = qwen2.5:3b
|
||||
ollama_api_url = http://host.docker.internal:$OLLAMA_PORT/api/chat
|
||||
|
||||
[RAG]
|
||||
max_results = 5
|
||||
context_window = 4096
|
||||
EOF
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}[✓]${NC} Configuración creada"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Crear docker-compose.yml
|
||||
################################################################################
|
||||
create_docker_compose() {
|
||||
echo -e "${BLUE}[INFO]${NC} Creando docker-compose.yml..."
|
||||
|
||||
local expose_kiwix=""
|
||||
if [ "$USE_EXTERNAL_KIWIX" = false ]; then
|
||||
expose_kiwix=" - \"821:821\" # Kiwix Server interno"
|
||||
fi
|
||||
|
||||
# Obtener directorio del archivo ZIM
|
||||
local zim_dir=$(dirname "$ZIM_FILE_PATH")
|
||||
local zim_file=$(basename "$ZIM_FILE_PATH")
|
||||
|
||||
cat > "$INSTALL_DIR/docker-compose.yml" << EOF
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
volo:
|
||||
build: .
|
||||
container_name: volo
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${VOLO_UI_PORT}:3002" # UI Web
|
||||
- "${VOLO_API_PORT}:1255" # API REST
|
||||
$expose_kiwix
|
||||
volumes:
|
||||
- ${INSTALL_DIR}/config.ini:/app/config.ini:rw
|
||||
- ${INSTALL_DIR}/data:/app/data
|
||||
- ${zim_dir}:/zim:ro
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
environment:
|
||||
- TZ=Europe/Madrid
|
||||
- PYTHONUNBUFFERED=1
|
||||
networks:
|
||||
- volo-network
|
||||
|
||||
networks:
|
||||
volo-network:
|
||||
driver: bridge
|
||||
EOF
|
||||
|
||||
# Actualizar config.ini con la ruta correcta dentro del contenedor
|
||||
sed -i "s|zim_file_path = .*|zim_file_path = /zim/$zim_file|g" "$INSTALL_DIR/config.ini"
|
||||
|
||||
echo -e "${GREEN}[✓]${NC} docker-compose.yml creado"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Crear archivo systemd service (opcional)
|
||||
################################################################################
|
||||
create_systemd_service() {
|
||||
echo -e "\n${BLUE}[INFO]${NC} ¿Deseas crear un servicio systemd para iniciar Volo automáticamente? (S/n)"
|
||||
read -r response
|
||||
|
||||
if [[ ! "$response" =~ ^[Nn]$ ]]; then
|
||||
cat > /etc/systemd/system/volo.service << EOF
|
||||
[Unit]
|
||||
Description=Volo RAG Wikipedia Service
|
||||
Requires=docker.service
|
||||
After=docker.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
WorkingDirectory=$INSTALL_DIR
|
||||
ExecStart=/usr/bin/docker compose up -d
|
||||
ExecStop=/usr/bin/docker compose down
|
||||
User=root
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable volo.service
|
||||
|
||||
echo -e "${GREEN}[✓]${NC} Servicio systemd creado y habilitado"
|
||||
echo -e "${YELLOW}Comandos:${NC}"
|
||||
echo -e " sudo systemctl start volo"
|
||||
echo -e " sudo systemctl stop volo"
|
||||
echo -e " sudo systemctl status volo"
|
||||
fi
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Construir e iniciar
|
||||
################################################################################
|
||||
build_and_start() {
|
||||
echo -e "\n${BLUE}[INFO]${NC} Construyendo imagen de Volo..."
|
||||
|
||||
cd "$INSTALL_DIR"
|
||||
docker compose build
|
||||
|
||||
echo -e "${GREEN}[✓]${NC} Imagen construida"
|
||||
|
||||
echo -e "\n${BLUE}[INFO]${NC} ¿Deseas iniciar Volo ahora? (S/n)"
|
||||
read -r response
|
||||
|
||||
if [[ ! "$response" =~ ^[Nn]$ ]]; then
|
||||
docker compose up -d
|
||||
sleep 3
|
||||
echo -e "\n${GREEN}[✓]${NC} Volo iniciado"
|
||||
echo -e "\n${BLUE}[INFO]${NC} Verificando estado..."
|
||||
docker compose ps
|
||||
echo -e "\n${YELLOW}Ver logs:${NC} cd $INSTALL_DIR && docker compose logs -f"
|
||||
fi
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Función: Mostrar información final
|
||||
################################################################################
|
||||
show_final_info() {
|
||||
echo -e "\n${GREEN}╔════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${GREEN}║ Instalación LITE completada exitosamente ║${NC}"
|
||||
echo -e "${GREEN}╚════════════════════════════════════════════════════════╝${NC}"
|
||||
echo -e "\n${BLUE}🎯 Acceso a Volo:${NC}\n"
|
||||
echo -e " 🌐 UI Web: ${YELLOW}http://localhost:$VOLO_UI_PORT${NC}"
|
||||
echo -e " 🔌 API REST: ${YELLOW}http://localhost:$VOLO_API_PORT/v1${NC}"
|
||||
echo -e "\n${BLUE}🔗 Integración con OpenWebUI (puerto $OPENWEBUI_PORT):${NC}\n"
|
||||
echo -e " 1. Accede a OpenWebUI: ${YELLOW}http://localhost:$OPENWEBUI_PORT${NC}"
|
||||
echo -e " 2. Ve a Admin Panel > Settings > Connections"
|
||||
echo -e " 3. Añade esta URL: ${YELLOW}http://host.docker.internal:$VOLO_API_PORT/v1${NC}"
|
||||
echo -e " 4. ${RED}IMPORTANTE:${NC} Desactiva streaming en OpenWebUI"
|
||||
echo -e " 5. Selecciona el modelo ${YELLOW}volo-workflow${NC}"
|
||||
echo -e "\n${BLUE}📁 Directorios:${NC}\n"
|
||||
echo -e " Instalación: ${YELLOW}$INSTALL_DIR${NC}"
|
||||
echo -e " Configuración: ${YELLOW}$INSTALL_DIR/config.ini${NC}"
|
||||
echo -e " Archivo ZIM: ${YELLOW}$ZIM_FILE_PATH${NC}"
|
||||
echo -e "\n${BLUE}🛠️ Comandos útiles:${NC}\n"
|
||||
echo -e " Iniciar: ${YELLOW}cd $INSTALL_DIR && docker compose up -d${NC}"
|
||||
echo -e " Detener: ${YELLOW}cd $INSTALL_DIR && docker compose down${NC}"
|
||||
echo -e " Logs: ${YELLOW}cd $INSTALL_DIR && docker compose logs -f${NC}"
|
||||
echo -e " Reiniciar: ${YELLOW}cd $INSTALL_DIR && docker compose restart${NC}"
|
||||
echo -e " Estado: ${YELLOW}cd $INSTALL_DIR && docker compose ps${NC}"
|
||||
echo -e "\n${BLUE}🧪 Prueba rápida:${NC}\n"
|
||||
echo -e " ${YELLOW}curl -X POST http://localhost:$VOLO_API_PORT/v1/chat/completions \\${NC}"
|
||||
echo -e " ${YELLOW} -H \"Content-Type: application/json\" \\${NC}"
|
||||
echo -e " ${YELLOW} -d '{\"model\": \"volo-workflow\", \"messages\": [{\"role\": \"user\", \"content\": \"What is Linux?\"}]}'${NC}"
|
||||
echo -e ""
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# MAIN - Ejecución principal
|
||||
################################################################################
|
||||
main() {
|
||||
check_root
|
||||
check_existing_services
|
||||
check_volo_ports
|
||||
ask_zim_path
|
||||
ask_kiwix_mode
|
||||
create_directories
|
||||
create_dockerfile
|
||||
create_entrypoint
|
||||
create_config
|
||||
create_docker_compose
|
||||
create_systemd_service
|
||||
build_and_start
|
||||
show_final_info
|
||||
}
|
||||
|
||||
# Ejecutar script principal
|
||||
main
|
||||
Reference in New Issue
Block a user