> For the complete documentation index, see [llms.txt](https://doc.velneo.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://doc.velneo.com/38/velneo-vadmin/web.md).

# Web

Desde esta sección podremos configurar virtual hosts en el [servidor HTTP](/38/velneo-vserver/servicio-https.md) de Velneo vServer.

La barra de herramientas de esta sección de Velneo vAdmin incluye los siguientes botones:

<img src="https://1985084359-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSSuDG1WIgF9xPUK4NaFS%2Fuploads%2FAhGmUKcDUFdOc2X7icYO%2Fimage.png?alt=media&amp;token=b75bebbf-7a4b-4571-a771-725817ad7e42" alt="" data-size="line"> **Reiniciar servidor HTTP**: detiene y vuelve a iniciar el servicio HTTP del servidor. Es necesario reiniciarlo para que se apliquen los cambios realizados en la configuración de los virtual hosts, sus rutas y sus perfiles de seguridad.

![](https://content.gitbook.com/content/SSuDG1WIgF9xPUK4NaFS/blobs/NVZoLX5qG3zz9exebcwM/image.png) **Iniciar servidor HTTP**: inicia el servicio HTTP del el servidor. Al arrancar nos informará sobre el host o hosts que se han iniciado. Ejemplo:

> Servidor HTTP iniciado en los siguientes hosts: 8080 ssl, 8081 misitio.com, 8082 ssl

![](https://content.gitbook.com/content/SSuDG1WIgF9xPUK4NaFS/blobs/SdKbU1va8RfPanX87IFw/image.png) **Detener servidor HTTP**: detiene el servicio HTTP del servidor y nos informará sobre el estado de la operación.&#x20;

* Esta acción no detiene la escucha en el puerto de acceso a los módulos Web de vAdmin y vDataClient.
* Esta acción detiene el acceso a las rutas pero sí permite el acceso a los ficheros estáticos.

![](https://content.gitbook.com/content/SSuDG1WIgF9xPUK4NaFS/blobs/ug9hUEd5psK4h4BHddya/image.png) **Nuevo virtual host**: permite crear y configurar un nuevo host virtual en el vServer.

![](https://content.gitbook.com/content/SSuDG1WIgF9xPUK4NaFS/blobs/tM1Dl6uFPlE2Xn5Vc66W/image.png) **Eliminar virtual host**: permite borrar un host virtual.

![](https://content.gitbook.com/content/SSuDG1WIgF9xPUK4NaFS/blobs/qLHluXRE6Ntyd086Ewat/image.png) **Refrescar**: refresca la lista de host virtuales del servidor.

La configuración se guarda en dos archivos del [directorio de configuración del servidor](/38/velneo-vserver/instalacion-y-configuracion/estructura-de-directorios.md#ficheros-de-configuracion), en la carpeta `Velneo\httpserver`:

* `httpserver.vsi`: es un archivo binario, utilizado para una carga más rápida.
* `httpserver.json`: es un archivo de configuración en formato JSON, legible y editable.

El servidor (`vServer`) tiene una lógica específica para garantizar la mejor experiencia de carga y para mantener la coherencia de la configuración.

El servidor intenta cargar la configuración de la forma más eficiente posible, priorizando el archivo binario.

**1. Carga por Defecto (Desde el Binario)**

Este es el escenario de carga habitual, que optimiza el rendimiento.

* Al solicitarse la carga de la configuración, y el archivo binario `httpserver.vsi` existe, la configuración se carga directamente desde el archivo binario.
* Si ocurre algún error durante esta carga, el mensaje correspondiente se mostrará en el panel de mensajes de vAdmin.

**2. Carga de Respaldo (Desde JSON y Regeneración Binaria)**

Este escenario se ejecuta cuando no existe el fichero binario.

* Al solicitarse la carga de la configuración, y el archivo binario `httpserver.vsi` no existe, la configuración se carga desde el archivo JSON (`httpserver.json`).
* Inmediatamente después de la carga exitosa, el servidor genera y guarda una nueva versión del archivo binario (`httpserver.vsi`).
* Si ocurre algún error durante esta carga, el mensaje correspondiente se mostrará en el panel de mensajes de vAdmin.

{% hint style="info" %}
Si necesitamos que `vServer` cargue la configuración desde el archivo JSON de forma intencionada (por ejemplo, tras editarlo manualmente o después de una migración), debemos detener el servidor, borrar el archivo `httpserver.vsi` . Al arrancarlo nuevamente, se generará el vis a partir del JSON.
{% endhint %}

Al realizar un cambio en el panel de administración (`vAdmin`), el servidor se asegura de que la configuración quede guardada en ambos formatos.

{% hint style="info" %}
En servidores locales, por defecto, siempre se abre un puerto 443 en el servidor para servir los componentes (vAdmin Web, vDataClient Web). Pero es configurable.
{% endhint %}

## Las propiedades de un **Virtual host** son las siguientes:

### Configuración general

#### Activo

Nos permite activar o desactivar el *virtual host*.

#### Puerto de escucha

En este parámetro especificaremos el puerto de escucha para este *virtual host*. Ejemplo: 8080

#### Nombre del host&#x20;

Si vamos a usar un dominio, lo especificaremos aquí. Ejemplo: midominio.com.

Este parámetro es opcional.

#### SSL

En este parámetro configuraremos si el protocolo a usar va a ser con SSL (HTTPS) o sin SSL (HTTP).

#### Fichero certificado

Si la conexión va a ser SSL, aquí podemos especificar la senda en disco del fichero correspondiente al certificado.&#x20;

{% hint style="info" icon="circle-exclamation" %}
El certificado debe ser ***fullchain***: es el archivo que garantiza la jerarquía de confianza entre el servidor y una autoridad reconocida. Contiene, en un orden específico, la lista de certificados necesarios para que un navegador valide la conexión como segura:

1. Certificado de Entidad Final: El certificado específico de tu dominio (el "suscriptor").
2. Certificados Intermedios: Uno o varios certificados que actúan como puente, demostrando que tu dominio ha sido validado por una Autoridad Certificadora (CA) de confianza.

&#x20;Si necesitas información sobre cómo componerlo, haz clic [aquí](/38/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver/componer-certificado-fullchain.md).
{% endhint %}

Este parámetro es opcional.

#### Fichero clave privada

Si la conexión va a ser SSL, y en el parámetro anterior hemos especificado un certificado, aquí podemos especificar la senda en disco del fichero de la clave privada del certificado.

Este parámetro es opcional.

### Rutas

Una ruta define qué sirve el virtual host en una dirección determinada: una aplicación, una API REST de una instancia, etc.

El botón ![](https://1985084359-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSSuDG1WIgF9xPUK4NaFS%2Fuploads%2FiQnWynpNW4GCvlt7JV4p%2Fimage.png?alt=media\&token=ce17371c-be65-4de2-bb85-17def5e097b0) nos permitirá configurar una ruta y el botón ![](https://1985084359-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSSuDG1WIgF9xPUK4NaFS%2Fuploads%2FLHC7OaSiIME79DNjkmj4%2Fimage.png?alt=media\&token=9f31824f-d564-48db-a9c2-be83941e5e13) eliminarla.

Por cada ruta, debemos cumplimentar los siguientes parámetros:

#### Ruta

Que será la ruta para la web dentro del host que tendrá la instancia que queremos servir.

Siempre debe ir precedida del carácter "/".

Ejemplos:

`/auth` , `/verp-api`

#### Tipo

Qué servirá la ruta. Los valores posibles son:

* **App**: para ejecutar vía Web objetos programados en aplicaciones Velneo como, por ejemplo, [procesos accesibles Web](/38/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso.md#accesible-web).
* **Apirest instancia**: API REST nativa de una instancia: acceso a sus datos y ejecución de los procesos y búsquedas que la propia instancia permita por esta vía. Está pensada para integraciones con otros sistemas.
* **Apirest admin**: API REST de administración del propio vServer: usuarios, grupos, soluciones, instancias, tareas, monitorización, licencia y servicio HTTPS. No da acceso a los datos de las instancias. Solo se puede seleccionar si la ruta no tiene instancia asignada.
* **MCP**: servidor MCP del propio vServer, para conectar asistentes y agentes de inteligencia artificial. Si se asocia una instancia, las herramientas de datos trabajarán con ella por defecto.
* **Health**: comprobación del estado del servidor, pensada para monitorización. Sin credencial, devuelve únicamente el estado (`ok` o `degraded`).
* **Metrics**: métricas de funcionamiento del servidor.

{% hint style="info" %}
Todo virtual host nuevo incluye de serie una ruta de tipo **Health** (`/health`), otra de tipo **Metrics** (`/metrics`) y otra de tipo **Apirest admin** (`/api`) con los métodos GET y POST y limitada a las operaciones de arranque. La ruta `/api` se crea sin ningún método de seguridad, por lo que no se sirve hasta que se configure en su perfil de seguridad.
{% endhint %}

#### Usuario

Usuario declarado en el vServer con permisos de acceso a la instancia.

#### Instancia

Que será el identificador que tenga en vAdmin la instancia que queremos servir.

#### IPs permitidas

Permite limitar el acceso a la ruta a determinadas direcciones IP. Tiene dos opciones:

* **Permitir todas las IPs**: no se aplica ninguna restricción.
* **Restringir a IPs específicas**: el botón ![](https://1985084359-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FSSuDG1WIgF9xPUK4NaFS%2Fuploads%2FROXAiUfjYdUO9wGlbiNj%2Fimage.png?alt=media\&token=8f5fb493-db21-460b-8e06-68b74ae4c31d) abre el editor **IPs permitidas**, donde podemos añadir y eliminar entradas con los botones **Añadir** y **Eliminar**.

Cada entrada del editor tiene una **Dirección IP** y un **Tipo**, que puede ser **IP directa** (la de la conexión), **X-Forwarded-For** (la del cliente real detrás de un proxy inverso) o cualquiera de las dos.

{% hint style="warning" %}
127.0.0.1 no cubre ::1: son direcciones distintas y hay que listar las dos.
{% endhint %}

La restricción de IPs se puede definir en dos niveles:

* **En la ruta**: se aplica a todos los perfiles de seguridad de la ruta.
* **En un perfil de seguridad**: se aplica solo a ese perfil (ver [Seguridad](#perfiles-de-seguridad)).

Lo habitual es utilizar uno de los dos niveles. Si se configuran ambos, se combinan como una condición Y: la petición debe cumplir las dos restricciones para ser aceptada.

#### Reservar licencia por sesión

Si la casilla está activada, que es lo habitual, cada sesión de la ruta reserva una licencia al autenticarse y la libera al terminar. Así se garantiza que haya conexiones disponibles para la ruta: sin reserva, una web podría dejar de responder si se supera el número de usuarios. Si no hay licencias disponibles, la petición recibe un error 503 con la cabecera `Retry-After`. Si la desactivamos, la ruta no consume licencias.

Esta opción no está disponible en las rutas de tipo **Apirest admin**.

#### **Métodos HTTP permitidos**

Solo en rutas de tipo **Apirest admin**. Las casillas **GET**, **POST**, **PUT** y **DELETE** indican los métodos que admitirá la ruta. Las peticiones con un método no marcado responden con un error 405. HEAD se permite si se permite GET, y PATCH se trata como PUT.

En la misma fila se encuentra la casilla **Solo operaciones de arranque**, que se describe a continuación.

#### **Solo operaciones de arranque**

Solo en rutas de tipo **Apirest admin**. Si está marcada, la ruta solo atiende el inicio y cierre de sesión y la consulta y activación de la licencia; el resto de peticiones responden como si la ruta no existiera (error 404). Esta comprobación se hace antes que la de los métodos permitidos: con la casilla marcada, una petición PUT o DELETE a una operación que no sea de arranque responde 404, no 405.

La casilla viene marcada de serie en la ruta `/api`, para poder gestionar un servidor recién instalado mediante peticiones. Para usar el resto de la API hay que desmarcarla.

#### Perfiles de seguridad

Cada ruta puede tener uno o varios perfiles de seguridad. Se muestran en una rejilla con las columnas **Nombre**, **Habilitado**, **Autenticación**, **IPs permitidas** y **Permisos**. Un texto bajo la rejilla indica el método de seguridad activo.

Los botones de la derecha actúan sobre el perfil seleccionado:

* **Añadir**: crea un perfil nuevo.
* **Modificar**: abre la ventana de edición del perfil. También se abre haciendo doble clic sobre el perfil.
* **Copiar**: duplica el perfil.
* **Eliminar**: borra el perfil. No está disponible cuando solo hay un perfil.
* **Importar permisos…**: importa los permisos dados en otro perfil configurado en ese servidor.

**Propiedades de un perfil de seguridad**

Cuando creamos o editamos un perfil de seguridad, en la parte superior de la ventana se indican el **Nombre** del perfil, la casilla **Habilitado** y el botón **Eliminar perfil**. El resto se organiza en tres pestañas. **Aceptar** y **Cancelar** son propios de esta ventana, de modo que podemos descartar los cambios de un perfil sin descartar los de la ruta.

**Autenticación**

El **Método de autenticación** puede ser:

* **API Keys estáticas**: permite definir hasta dos claves. Por cada una indicamos una **Etiqueta** y, opcionalmente, una fecha de caducidad (**Caduca**, con formato AAAA-MM-DD; si se deja vacío, no caduca). El botón **Generar/Regenerar** crea la clave y **Eliminar** la borra. Los iconos junto a la clave permiten copiarla y mostrarla.
* **OAuth externo (IdP ajeno)**: delega la autenticación en un proveedor de identidad externo. El **Modo** indica cómo se valida el token:

  * **Introspección (RFC 7662)**: el servidor consulta al proveedor para comprobar cada token. Los parámetros son:
    * **URI de introspección**: dirección del servicio de introspección del proveedor.
    * **Client ID ante el IdP**: la credencial de este servidor ante el proveedor.
    * **Client Secret ante el IdP**: el secreto ante el proveedor.
    * **Caché de introspección**: segundos durante los que se conserva el resultado de la introspección (60 por defecto).
  * **JWKS (firma verificada en local)**: el servidor verifica localmente la firma del token, sin consultar al proveedor en cada petición. El parámetro propio de este modo es la **URI de JWKS**, la dirección donde el proveedor publica sus claves públicas (por ejemplo, `https://idp.ejemplo.com/.well-known/jwks.json`).

  Además, en ambos modos se pueden indicar:

  * **Scopes exigidos**: si se deja vacío, no se exige ningún scope.
  * **Issuer esperado (iss)**: si se deja vacío, no se valida el claim `iss`.
  * **Audience esperada (aud)**: si se deja vacío, no se valida el claim `aud`.

  <div data-gb-custom-block data-tag="hint" data-style="warning" class="hint hint-warning"><p>El <strong>Client Secret</strong> se guarda en claro. Solo se usa en el modo Introspección.</p></div>
* **Sin autenticación**: el perfil no exige autenticación.

**Seguridad**

Los ajustes de esta pestaña se aplican a cada perfil por separado:

* **IPs permitidas**: igual que en la ruta, con las opciones **Permitir todas las IPs** y **Restringir a IPs específicas**. Solo afecta a este perfil. Si la ruta también tiene restricción de IPs, se deben cumplir ambas.
* **Límite de peticiones**: número máximo de peticiones por minuto (120 por defecto).
* **CORS habilitado**: activa CORS para el perfil.
* **Orígenes CORS**: orígenes permitidos. Si se deja vacío, solo se admite el mismo origen.
* **Tamaño máx. body**: tamaño máximo del cuerpo de la petición. Puede ser **Por defecto (10 MiB)** o un valor propio.
* **Tiempo máximo**: tiempo máximo de la petición. Por defecto, **Sin límite**.
* **Nivel de log**: nivel de detalle del registro de la ruta. Los niveles disponibles son **Depuración**, **Información**, **Aviso** y **Error**.

**Permisos**

Define a qué objetos de la instancia tiene acceso el perfil:

* **Acceso completo**: sin restricciones.
* **Acceso restringido**: el perfil solo accede a los objetos que marquemos. El selector **Objetos** permite elegir entre **Tablas**, **Tablas estáticas**, **Procesos** y **Búsquedas**. Un campo **Filtrar…** ayuda a localizar un objeto, y la lista muestra su **Id**, su **Nombre** y su **Acceso** (**Sin acceso**, **Completo** o **Restringido**), con una casilla para marcarlo. Los objetos sin marcar no tienen acceso.

**Tablas**

Al marcar una tabla, indicamos para ella **Acceso completo** o **Acceso restringido**. Con **Acceso restringido** podemos configurar:

* **HEAD** y **DELETE**: permiten o deniegan esos verbos sobre la tabla.
* **Campos y verbos**: para cada campo de la tabla, qué verbos se permiten: **GET**, **POST**, **PUT** y **PATCH**. Las casillas de la cabecera marcan o desmarcan un verbo para todos los campos.
* **Índices**: **Todos los índices**, o bien solo los índices que marquemos en la lista.

**Tablas estáticas, Procesos y Búsquedas**

Basta con marcar o desmarcar cada objeto: se permite o se deniega directamente, sin detalle por campo.

### Ficheros estáticos

Si desde el *virtual host* va servir ficheros estáticos, en esta sección debemos indicar:

#### Directorio raíz

Senda de disco local dentro de la cual se situarán los ficheros estáticos del *virtual host*.&#x20;

#### Fichero index

Senda de  un fichero html en disco que se cargará cuando se acceda a la URL base del host.

Por ejemplo, si hemos definido un *virtual host* para el dominio miempresa.com y creamos un fichero índex para el mismo, cuando alguien escriba en un navegador `miempresa.com`, se cargará el fichero indicado en este parámetro.

Dentro de cada fichero estático podemos configurar diversos **alias**. El botón ![](https://content.gitbook.com/content/SSuDG1WIgF9xPUK4NaFS/blobs/ug9hUEd5psK4h4BHddya/image.png) nos permitirá añadir un nuevo alias y el botón ![](https://content.gitbook.com/content/SSuDG1WIgF9xPUK4NaFS/blobs/tM1Dl6uFPlE2Xn5Vc66W/image.png) eliminarlo. De cada alias debemos especificar:

El **alias** (que debe ir precedido del carácter "/") por ejemplo "/filial1" y su **senda**, que se corresponderá con una carpeta física del disco.

### Página de error

El servicio HTTPS de Velneo vServer permite configurar **páginas de error personalizadas** para cada Virtual Host. Esta funcionalidad permite mostrar páginas HTML específicas cuando se produce un error HTTP (como 404 - No encontrado, 500 - Error interno del servidor, etc.), mejorando la experiencia del usuario final al proporcionar mensajes de error más amigables y coherentes con el diseño de nuestro sitio web.

El botón ![](https://content.gitbook.com/content/SSuDG1WIgF9xPUK4NaFS/blobs/ug9hUEd5psK4h4BHddya/image.png) (`Ctrl + N`) nos permitirá añadir una página de error para el virtual host que estemos editando y el botón ![](https://content.gitbook.com/content/SSuDG1WIgF9xPUK4NaFS/blobs/tM1Dl6uFPlE2Xn5Vc66W/image.png) (`Supr`) eliminarla.

Los datos que debemos especificar al crear una página de error son:

#### Status

Código del error HTTP (número entre 0 y 999). Ejemplo:  `404` .

#### Senda fichero HTML

Ruta relativa al documento HTML que se mostrará cuando se produzca ese código de error. El archivo ha de estar en la Velneo\httpserver\htdocs del directorio de trabajo del servidor o en una subcarpeta dentro de ésta.

Si creamos la página de error 404.html en la carpeta, htdocs, en este parámetro especificaremos `404.html` . Si la cremos dentro de la carpeta htdocs/errores, en este parámetro especificaremos `errorres/404.html`.

**Funcionamiento**

Cuando se produce un error HTTP (por ejemplo, un recurso no encontrado genera un error 404), el servidor verifica si existe una página de error configurada para ese código.

Si existe una página de error configurada, el servidor sirve el contenido del fichero HTML especificado manteniendo el código de estado HTTP original.

Si no existe una página de error configurada para ese código específico en el Virtual Host actual, el servidor busca en la configuración del Virtual Host principal.

Si no se encuentra ninguna página de error configurada, se devuelve la respuesta de error estándar del servidor.

El código de error HTTP se mantiene. Por ejemplo, el código de error 404 sigue siendo 404.

**Códigos de error HTTP comunes**

| Código | Descripción           | Uso recomendado            |
| ------ | --------------------- | -------------------------- |
| 400    | Bad Request           | Solicitud mal formada      |
| 401    | Unauthorized          | Acceso no autorizado       |
| 403    | Forbidden             | Acceso prohibido           |
| 404    | Not Found             | Recurso no encontrado      |
| 500    | Internal Server Error | Error interno del servidor |
| 502    | Bad Gateway           | Error de gateway           |
| 503    | Service Unavailable   | Servicio no disponible     |

{% hint style="info" %}
Las páginas de error personalizadas deben estar ubicadas en un directorio accesible por el manejador de ficheros estáticos del Virtual Host.
{% endhint %}

{% hint style="warning" %}
Si configuramos una página de error que no existe o no es accesible, el servidor devolverá el error original sin contenido personalizado.
{% endhint %}

{% hint style="info" %}
Podemos configurar páginas de error en el Virtual Host principal para que actúen como valores por defecto para todos los demás Virtual Hosts que no tengan configuración específica.
{% endhint %}

## Consumo de puestos de ejecución

Cada instancia que se configure consumirá un puesto de ejecución del servidor y admite hasta 64 conexiones concurrentes, si llega a la 65 empezará a consumir 2 puestos de ejecución del servidor ys si llega a 129, consumirá 3 puestos de ejecución.

## Log

En la parte inferior de la sección se muestra el log del servicio HTTPS. Dispone de los siguientes controles:

* **Log**: permite seleccionar el log que queremos consultar: **General**, **Accesos**, **MCP** o **API REST**.
* **Fecha inicio** y **Fecha fin**: rango de fechas que se mostrará.
* &#x20;**Refrescar**: vuelve a cargar el log con el rango de fechas seleccionado.

### General

Mensajes generales del servicio HTTPS, como las operaciones invocadas en la API REST o el registro de auditoría (`[AUDIT]`) de los accesos denegados. Por cada entrada se muestran la **Fecha/Hora**, la **Severidad** y la **Descripción** del mensaje.

### Accesos

Registro de todas las peticiones HTTP recibidas por el servicio HTTPS. Por cada petición se muestran:

* **Fecha/Hora**.
* **Ip (IPv4)** e **Ip (IPv6)**: dirección del cliente.
* **X-Forwarded-For**: dirección original del cliente cuando la petición llega a través de un proxy inverso.
* **Virtual host**: virtual host que ha atendido la petición.
* **Método**: método HTTP (GET, POST…).
* **Url**: dirección solicitada.
* **Status**: código de estado HTTP de la respuesta.
* **Tamaño respuesta** y **Tamaño petición**.
* **Referer**: página desde la que se hizo la petición.
* **Agente**: cliente que ha realizado la petición (cabecera *User-Agent*).
* **Puerto**: puerto por el que se ha recibido la petición.
* **Usuario**: usuario de Velneo vServer con el que se ha atendido la petición.
* **Tiempo respuesta (ms)**: tiempo, en milisegundos, empleado en atender la petición.

### MCP

Registro de las peticiones recibidas por las rutas de tipo **MCP** (servidor MCP), **Health** y **Metrics**, con las mismas columnas que el log de accesos.

### API REST

Registro de las peticiones recibidas por las rutas de API REST, con las mismas columnas que el log de accesos.
