# Instalación del Servidor Sherpa AI

## Instalación del Servidor Sherpa AI

#### Descompresión de archivos del cliente

Descomprima el archivo con los archivos del cliente y prepare el sistema para la instalación.

**Descompresión del archivo con los archivos del cliente**

```bash
# Encuentre y descomprima el archivo (se selecciona automáticamente la versión más reciente)
tar -xvzf "$(ls client_files_*.tgz | sort -V | tail -n 1)"
```

<details>

<summary>💡 Comentarios sobre la descompresión del archivo</summary>

**tar -xvzf "$(ls client\_files\_\*.tgz | sort -V | tail -n 1)"** - descomprime el archivo de archivos del cliente

* `tar -xvzf` - descomprime el archivo con salida detallada
* `ls client_files_*.tgz` - encuentra todos los archivos de archivos
* `sort -V` - ordena las versiones de manera natural (1.0 < 1.1 < 1.10)
* `tail -n 1` - selecciona el archivo más reciente

**Resultado esperado:** Se creará un directorio `sh_scripts/` con scripts ejecutables y otros archivos necesarios.

</details>

**Preparación de scripts para ejecución**

```bash
# Cambie al directorio con los scripts
cd sh_scripts/

# Haga que todos los scripts sean ejecutables
chmod +x *.sh

# Regrese al directorio raíz del proyecto
cd ..
```

<details>

<summary>💡 Comentarios sobre la preparación de scripts</summary>

**cd sh\_scripts/** - cambia al directorio con los scripts de instalación

\**chmod +x .sh* - establece permisos de ejecución para todos los scripts de shell

* `chmod +x` - agrega el derecho de ejecución
* `*.sh` - todos los archivos con la extensión .sh

**cd ..** - regresa al directorio raíz del proyecto

**¿Qué hacen estos comandos:**

* `chmod +x *.sh` - establece permisos de ejecución para todos los scripts de shell
* Esto es necesario para ejecutar los scripts en las siguientes etapas de la instalación

</details>

**Estructura del archivo descomprimido:**

Después de descomprimir, debe ver los siguientes archivos y directorios:

* `sh_scripts/` - directorio con scripts de instalación
  * `download_all_latest_docker_images.sh` - script para descargar imágenes de Docker
  * `load_all_docker_images.sh` - script para cargar imágenes en Docker
  * `extract_models.sh` - script para descomprimir modelos de IA
  * `extract_vllm.sh` - script para descomprimir modelos LLM
* `docker-compose.yml` - configuración de Docker Compose para la instalación del cliente
* `.env` - archivo con variables de entorno para la configuración del sistema

**Verificación del éxito de la descompresión:**

```bash
# Verifique el contenido del directorio
ls -la

# Asegúrese de que los scripts sean ejecutables
ls -la sh_scripts/*.sh
```

<details>

<summary>💡 Comentarios sobre la verificación de la descompresión</summary>

**ls -la** - muestra el contenido detallado del directorio

* `-l` - formato largo
* `-a` - muestra archivos ocultos

**ls -la sh\_scripts/\*.sh** - verifica los scripts en el directorio sh\_scripts

</details>

#### Ejecución de scripts para descompresión

**Carga de imágenes de Docker**

```bash
# Ejecute el script de carga de imágenes de Docker
sudo ./sh_scripts/load_all_docker_images.sh
```

<details>

<summary>💡 Comentarios sobre la carga de imágenes de Docker</summary>

**sudo ./sh\_scripts/load\_all\_docker\_images.sh** - ejecuta el script de carga de imágenes de Docker

**¿Qué hace el script:**

1. Carga todas las imágenes de Docker desde los archivos .tar.gz descargados
2. Importa las imágenes en el registro local de Docker
3. Verifica el éxito de la carga

</details>

**Descompresión de modelos de IA**

```bash
# Ejecute el script de descompresión de modelos principales
sudo ./sh_scripts/extract_models.sh
```

<details>

<summary>💡 Comentarios sobre la descompresión de modelos principales</summary>

**sudo ./sh\_scripts/extract\_models.sh** - ejecuta el script de descompresión de modelos

**¿Qué hace el script:**

1. Descomprime el modelo Whisper para reconocimiento de voz
2. Descomprime el modelo BGE Reranker para mejorar la búsqueda
3. Descomprime modelos para generación de embeddings
4. Crea los directorios necesarios
5. Verifica el éxito de la descompresión

</details>

```bash
# Ejecute el script de descompresión de modelos LLM
sudo ./sh_scripts/extract_vllm.sh
```

<details>

<summary>💡 Comentarios sobre la descompresión de modelos LLM</summary>

**sudo ./sh\_scripts/extract\_vllm.sh** - ejecuta el script de descompresión de modelos LLM

**¿Qué hace el script:**

1. Descomprime los modelos
2. Coloca los archivos directamente en el directorio de modelos
3. Verifica el contenido después de la descompresión

</details>

**Estructura de directorios después de la descompresión (aproximada):**

```
./whisper/
└── models/
    ├── base.pt
    └── ...

./bge_reranker/
└── models/
    └── bge-reranker-large/
        ├── config.json
        ├── model.bin
        └── ...

./embed-server/app/
└── model-store/
    └── sentence-transformers/
        └── paraphrase-multilingual-MiniLM-L12-v2/
            ├── config.json
            ├── pytorch_model.bin
            └── ...

./llm-server/models/
├── meta-llama/
│   └── Meta-Llama-3-8B-Instruct/
│       ├── config.json
│       ├── model-00001-of-00004.safetensors
│       ├── model-00002-of-00004.safetensors
│       └── ...
└── tokenizer.json
```

#### Configuración de la configuración del sistema

El Servidor Sherpa AI requiere la configuración de variables de entorno en el archivo `.env` antes de su ejecución.

**Apertura del archivo de configuración**

```bash
# Abra el archivo .env en un editor de texto
nano ./.env
```

O use cualquier editor de texto:

```bash
# Vim
vim ./.env

# VS Code (si está instalado)
code ./.env
```

<details>

<summary>💡 Comentarios sobre la apertura del archivo de configuración</summary>

**nano ./.env** - abre el archivo .env en el editor nano

* `nano` - editor de texto simple
* `./.env` - ruta al archivo de configuración

**vim ./.env** - abre el archivo en el editor Vim **code ./.env** - abre el archivo en VS Code (si está instalado)

**Recomendación:** Use el editor con el que esté familiarizado

</details>

**Parámetros principales de configuración**

**Configuraciones del servidor principal (aiserver):**

```bash
# Dirección IP del servidor (cámbielo a su IP estática)
HOST_IP=127.0.0.1

# Nombre de dominio (cámbielo a su dominio)
NGINX_DOMAIN_NAME=aiserver.sherparpa.ru

# Longitud máxima de mensajes (en tokens)
MAX_TOKENS_MESSAGE=32000
```

**Configuraciones de la base de datos PostgreSQL:**

```bash
# Contraseña de PostgreSQL (ESTABLEZCA SU CONTRASEÑA SEGURA)
POSTGRES_PASSWORD=password
```

**Configuraciones del servidor LLM:**

**Selección del modelo de IA:** Elija uno de los modelos disponibles descomentando la línea correspondiente y comentando las demás:

```bash
# === SELECCIÓN DEL MODELO DE IA ===
# Descomente SOLO UNO de los modelos a continuación:

# Modelo Llama 3.1 (recomendado para uso general)
LLM_COMPLETION_MODEL_NAME=/model-store/meta-llama/Meta-Llama-3-8B-Instruct
LLM_CHAT_TEMPLATE=/model-templates/tool_chat_template_llama3.1_json.jinja
LLM_TOOL_CALL_PARSER=llama3_json

# Modelo Qwen (modelo alternativo)
# LLM_COMPLETION_MODEL_NAME=/model-store/Qwen3-30B-A3B-AWQ
# LLM_CHAT_TEMPLATE=/model-templates/tool_chat_template_qwen3coder.jinja
# LLM_TOOL_CALL_PARSER=hermes

# Modelo OCR (especializado en reconocimiento de texto)
# LLM_COMPLETION_MODEL_NAME=/model-store/olmOCR-2-7B-1025-FP8

# === FIN DE LA SELECCIÓN DEL MODELO ===

```

**Seguridad y contraseñas**

{% hint style="danger" %}
**Críticamente importante:** Cambie todas las contraseñas predeterminadas por contraseñas seguras:
{% endhint %}

```bash
# Generación de contraseñas seguras
openssl rand -base64 32

# O use pwgen, si está instalado
pwgen -s 32 1
```

**Recomendaciones para contraseñas:**

* Mínimo 32 caracteres
* Use letras, números y caracteres especiales
* No use palabras del diccionario
* Almacene las contraseñas en un lugar seguro

**Verificación de la configuración**

Después de editar el archivo `.env`, verifique la corrección de la configuración:

```bash
# Verifique la sintaxis del archivo
cat .env | grep -v '^#' | grep '=' | wc -l

# Verifique la existencia de variables obligatorias
grep -E "(POSTGRES_PASSWORD|HOST_IP|NGINX_DOMAIN_NAME)" .env
```

<details>

<summary>💡 Comentarios sobre la verificación de la configuración</summary>

**cat .env | grep -v '^#' | grep '=' | wc -l** - cuenta el número de variables de entorno

* `cat .env` - muestra el contenido del archivo
* `grep -v '^#'` - excluye comentarios (líneas que comienzan con #)
* `grep '='` - deja solo las líneas con variables
* `wc -l` - cuenta el número de líneas

**grep -E "(POSTGRES\_PASSWORD|HOST\_IP|NGINX\_DOMAIN\_NAME)" .env** - verifica la existencia de variables obligatorias

* `-E` - expresiones regulares extendidas
* Enumera las variables obligatorias a través de |

</details>

**Creación de una copia de seguridad**

```bash
# Cree una copia de seguridad de la configuración
cp .env .env.backup
```

<details>

<summary>💡 Comentarios sobre la creación de una copia de seguridad</summary>

**cp .env .env.backup** - crea una copia de seguridad del archivo de configuración

* `cp` - copy (copia)
* `.env` - archivo original
* `.env.backup` - archivo de copia de seguridad

</details>

{% hint style="warning" %}
**Importante:** Sin la configuración correcta del archivo `.env`, el sistema no se iniciará correctamente.
{% endhint %}

**Copia de certificados SSL**

Para garantizar una conexión HTTPS segura, es necesario copiar los certificados SSL en el directorio `./oais/backend/config/certs/`:

```bash
# Cree el directorio para los certificados (si no existe)
mkdir -p ./oais/backend/config/certs/

# Copie sus certificados SSL
# Reemplace con las rutas a sus certificados reales
cp /path/to/your/certificate.crt ./oais/backend/config/certs/aiserver.crt
cp /path/to/your/private.key ./oais/backend/config/certs/aiserver.key

# O si tiene un certificado wildcard:
cp /path/to/your/wildcard.crt ./oais/backend/config/certs/aiserver.crt
cp /path/to/your/wildcard.key ./oais/backend/config/certs/aiserver.key
```

<details>

<summary>💡 Comentarios sobre la copia de certificados SSL</summary>

**mkdir -p ./oais/backend/config/certs/** - crea un directorio para los certificados

* `-p` - crea directorios padres si no existen

**cp /path/to/your/certificate.crt ./oais/backend/config/certs/aiserver.crt** - copia el certificado **cp /path/to/your/private.key ./oais/backend/config/certs/aiserver.key** - copia la clave privada

**Requisitos para los certificados:**

* El certificado debe estar en formato `.crt` o `.pem`
* La clave privada debe estar en formato `.key`
* Los nombres de los archivos deben ser `aiserver.crt` y `aiserver.key`

</details>

{% hint style="warning" %}
**Importante:** Asegúrese de que los certificados tengan los permisos de acceso correctos:
{% endhint %}

```bash
# Establezca los permisos correctos en los certificados
chmod 644 ./oais/backend/config/certs/*.crt
chmod 600 ./oais/backend/config/certs/*.key
```

{% hint style="info" %}
**ATENCIÓN**: debe obtener los certificados del administrador de red o de su centro de certificación corporativo; en caso de no tener acceso a ninguno de estos, puede consultar el artículo sobre cómo obtener certificados.
{% endhint %}

#### Inicio del sistema

Después de completar todas las etapas de preparación, se puede iniciar Sherpa AI Server. El sistema funcionará en segundo plano como un conjunto de contenedores Docker.

{% hint style="warning" %}
**Importante:** El cliente recibe el archivo `docker-compose.yml`, que contiene la configuración de todos los servicios. Asegúrese de utilizar este archivo para iniciar el sistema.
{% endhint %}

**Inicio de todos los servicios**

```bash
# Inicie los servicios básicos en segundo plano
docker compose up -d
```

<details>

<summary>💡 Comentarios sobre el inicio de servicios</summary>

**docker compose up -d** - inicia todos los servicios en segundo plano

* `docker compose` - utiliza Docker Compose para gestionar los contenedores
* `up` - crea y lanza todos los servicios del docker-compose.yml
* `-d` - ejecuta los contenedores en modo detached (en segundo plano)

**Tiempo de inicio esperado:** 2-5 minutos, dependiendo del rendimiento del sistema.

</details>

**Inicio de servicios con funciones adicionales**

En el archivo `docker-compose.yml`, algunos servicios tienen profiles y se inician solo cuando se especifica explícitamente:

```bash
# Inicio con el servicio de reconocimiento de voz Whisper
docker compose --profile whisper up -d

# Inicio con el servicio de reordenamiento BGE Reranker
docker compose --profile reranker up -d

# Inicio de todos los servicios (Whisper + BGE Reranker + básicos)
docker compose --profile full up -d
```

{% hint style="warning" %}
**Importante:** Tenga en cuenta la cantidad de memoria de video (VRAM) disponible en su sistema. Si tiene una cantidad limitada de VRAM, inicie solo los servicios necesarios con los profiles correspondientes. Si hay falta de memoria, el sistema puede funcionar de manera inestable o no iniciarse en absoluto.
{% endhint %}

**Profiles disponibles:**

* `whisper` - incluye el servicio de reconocimiento de voz (puerto 3005)
* `reranker` - incluye el servicio de reordenamiento de resultados de búsqueda (puerto 8001)
* `full` - incluye todos los servicios adicionales (Whisper + BGE Reranker)

{% hint style="warning" %}
**Importante:** Sin especificar profiles, los servicios Whisper y BGE Reranker no se iniciarán. Seleccione el profile adecuado según sus requisitos de funcionalidad.
{% endhint %}

**Verificación del estado de los contenedores**

```bash
# Verifique el estado de todos los contenedores en ejecución
docker compose ps

# O use docker ps para información detallada
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
```

<details>

<summary>💡 Comentarios sobre la verificación del estado</summary>

**docker compose ps** - muestra el estado de todos los contenedores de Docker Compose

* Muestra nombres, estado y puertos de los contenedores

**docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"** - muestra información detallada sobre los contenedores

* `--format` - establece un formato de salida personalizado
* `table` - formato tabular
* `{{.Names}}` - nombres de los contenedores
* `{{.Status}}` - estado de los contenedores
* `{{.Ports}}` - puertos abiertos

</details>

**Salida esperada (depende del profile seleccionado):**

**Servicios básicos (sin profiles):**

```
NAME                    STATUS              PORTS
aiserver                Up 2 minutes        0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:4500->4500/tcp
aiserver-db             Up 2 minutes        0.0.0.0:3306->3306/tcp
aiserver-pg             Up 2 minutes        0.0.0.0:5432->5432/tcp
aiserver-embed          Up 2 minutes        0.0.0.0:3004->443/tcp
aiserver-llm-server     Up 2 minutes        0.0.0.0:3003->8000/tcp
aiserver-code_interpreter Up 2 minutes        0.0.0.0:3001->3001/tcp
```

**Con el profile `whisper` (se añade):**

```
aiserver-whisper        Up About a minute   0.0.0.0:3005->8000/tcp
```

**Con el profile `reranker` (se añade):**

```
aiserver-bge_reranker   Up About a minute   0.0.0.0:8001->8000/tcp
```

**Con el profile `full` (se añaden ambos):**

```
aiserver-whisper        Up About a minute   0.0.0.0:3005->8000/tcp
aiserver-bge_reranker   Up About a minute   0.0.0.0:8001->8000/tcp
```

Todos los contenedores en ejecución deben tener el estado "Up" y mostrar los puertos abiertos.

**Verificación de los logs de los contenedores**

```bash
# Vea los logs del servidor principal
docker compose logs aiserver

# Vea los logs de todos los servicios
docker compose logs

# Monitoreo de logs en tiempo real
docker compose logs -f aiserver
```

<details>

<summary>💡 Comentarios sobre la verificación de logs</summary>

**docker compose logs aiserver** - muestra los logs de un servicio específico

* `aiserver` - nombre del servicio

**docker compose logs** - muestra los logs de todos los servicios

**docker compose logs -f aiserver** - sigue los logs en tiempo real

* `-f` - follow (seguir nuevos mensajes)

**Verificación de errores:**

* Busque mensajes de error de conexión a bases de datos
* Verifique la carga de modelos de IA
* Asegúrese de la validez de los certificados SSL

</details>

**Verificación de la disponibilidad de los servicios**

**Verificación de la interfaz web principal:**

```bash
# Verifique la disponibilidad HTTP (reemplace con su dominio)
curl -I http://aiserver.sherparpa.ru

# Verifique la disponibilidad HTTPS (reemplace con su dominio)
curl -I https://aiserver.sherparpa.ru

# Respuesta esperada: HTTP/2 200 o redirección a /login
```

<details>

<summary>💡 Comentarios sobre la verificación de la interfaz web</summary>

**curl -I <http://aiserver.sherparpa.ru>** - verifica la disponibilidad HTTP

* `-I` - muestra solo los encabezados de la respuesta
* `http://aiserver.sherparpa.ru` - URL para la verificación

**curl -I <https://aiserver.sherparpa.ru>** - verifica la disponibilidad HTTPS

**Respuesta esperada:** HTTP/2 200 o redirección a /login

</details>

**Verificación de los servicios de IA:**\`\`\`\`bash

## Verifique el servidor LLM

curl -X POST "<http://localhost:3003/v1/completions"\\>
-H "Content-Type: application/json"\
-d '{"model": "meta-llama/Meta-Llama-3-8B-Instruct", "prompt": "Hello", "max\_tokens": 10}'

<details>

<summary>💡 Comentarios sobre la verificación del servidor LLM</summary>

**curl -X POST "<http://localhost:3003/v1/completions>"** - verifica el servidor LLM

* `-X POST` - método HTTP POST
* `"http://localhost:3003/v1/completions"` - URL del endpoint de la API
* `-H "Content-Type: application/json"` - encabezado Content-Type
* `-d '{"model": "...", "prompt": "Hello", "max_tokens": 10}'` - datos de la solicitud en formato JSON

</details>

#### Verificación de la conexión a bases de datos

```bash

# Verifique la conexión a PostgreSQL
docker compose exec aiserver-pg psql -U postgres -d postgres -c "SELECT version();"
```

**Pruebas de funciones básicas**

**Interfaz web:**

1. Abra el navegador y vaya a `https://aiserver.sherparpa.ru`
2. Debería abrirse la página de inicio de sesión
3. Verifique la posibilidad de registro/inicio de sesión

**Gestión del sistema**

**Detener el sistema:**

```bash
# Detenga todos los servicios (teniendo en cuenta los profiles en ejecución)
docker compose down
```

**Reiniciar servicios:**

```bash
# Reinicie un servicio específico
docker compose restart aiserver

# Reinicie todos los servicios en ejecución
docker compose restart

# Reinicie los servicios con un profile específico
docker compose --profile whisper restart aiserver-whisper
```

**Ver recursos:**

```bash
# Verifique el uso de recursos
docker stats

# Verifique el uso de GPU
nvidia-smi
```

<details>

<summary>💡 Comentarios sobre la gestión del sistema</summary>

**Detener el sistema:**

* `docker compose down` - detiene todos los servicios y elimina los contenedores
* `docker compose down -v` - detiene los servicios y elimina los volumes (¡los datos se perderán!)

**Reiniciar servicios:**

* `docker compose restart aiserver` - reinicia un servicio específico
* `docker compose restart` - reinicia todos los servicios
* `docker compose --profile whisper restart aiserver-whisper` - reinicia el servicio con un profile específico

**Ver recursos:**

* `docker stats` - muestra el uso de CPU, memoria y red para los contenedores
* `nvidia-smi` - muestra el uso de GPU NVIDIA

</details>

**Posibles problemas al iniciar:**

* **Los contenedores no se inician**: Verifique los logs con `docker compose logs`
* **Problemas con SSL**: Asegúrese de la validez de los certificados
* **Errores de conexión a la base de datos**: Verifique las variables de entorno en `.env`
* **Problemas de GPU**: Verifique la configuración de CUDA\_VISIBLE\_DEVICES

Después de un inicio y prueba exitosos del sistema, la instalación de Sherpa AI Server ha finalizado.

```
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.sherparpa.ru/es/sherpa-ai/sherpa-ai-server/ustanovka-sherpa-ai-server.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
