> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/sdks/backend-sdk/ine/installation/installation_instructions.md).

# Instalación y despliegue del servicio

## 1. Instalación y despliegue

El servicio está dockerizado, y existe una imagen Docker en un repositorio de Facephi.

```bash
docker login facephicorp.jfrog.io  
user: username
pass: token
```

```bash
docker pull facephicorp.jfrog.io/docker-pro-fphi/facephi-ine-service:#VERSION#
```

Donde `#VERSION#` es el número de versión concreto que se quiere descargar (por ejemplo, `1.6.0`).

## 2. docker-compose

Una forma de desplegar el servicio es crear un archivo `docker-compose.yml` con el siguiente contenido:

```yaml
version: '3.7'

services:
  ine-service:
    ports:
      - "6982:6982"
    volumes:
      - ./config:/service/config
      - ./logs:/service/logs
    image: facephicorp.jfrog.io/docker-pro-fphi/facephi-ine-service:latest
    container_name: facephi-ine-service
    environment:
      # Protección JWT opcional
      # - FACEPHI_INE_REST_AUTH_ENABLED=true
      # - FACEPHI_INE_REST_AUTH_JWT_SECRET=shared-secret
      # - FACEPHI_INE_REST_AUTH_ACCEPT_AUTHORIZATION_HEADER=true
      # - FACEPHI_INE_REST_AUTH_ACCEPT_API_KEY_HEADER=true
      # - FACEPHI_INE_REST_AUTH_API_KEY_HEADER_NAME=x-api-key
```

Observa los volúmenes que se montan en el contenedor. Estos volúmenes se utilizan para almacenar los archivos de configuración del servicio y escribir la salida del logger.

Ejecuta el siguiente comando, dentro de la carpeta donde se encuentra el archivo docker-compose.yml, para desplegar el servicio:

```bash
  docker compose up -d
```

## 3. Configuración

El archivo de configuración puede contener la siguiente información:

```json
{
    "port": 6982,                   # Número de puerto del servicio.
    "number_of_threads": 1,         # El número de hilos de E/S, 1 por defecto; si el valor es 0, el número de hilos es el número de núcleos de la CPU.
    "connection_timeout": 60,       # El tiempo de vida de la conexión sin lectura ni escritura.
    "keep_alive_request_number": 0, # Establece el número máximo de solicitudes que se pueden atender a través de una conexión keep-alive.
                                    # Una vez alcanzado el número máximo de solicitudes, la conexión se cierra.
                                    # El valor por defecto de 0 significa sin límite.
    "client_max_body_size": 50,     # El tamaño máximo del cuerpo permitido en las solicitudes, en Mb.
                                    # El valor por defecto es 100 Mb.
    "logger_path" : "/service",     # La ruta al archivo de log.
    "logger_file_prefix" : "ine",   # El prefijo de archivo usado para los archivos de log rotados.
    "logger_level" : "trace",       # Establece el nivel de log. [trace|debug|info|warn|error|fatal|off]
    "logger_rotation" : "daily",    # Establece la rotación de los logs. [hourly|daily]
    "logger_max_files" : 31,         # Establece el número máximo de archivos de log.
    "auth_enabled": false,           # Habilita o deshabilita la autenticación JWT.
    "auth_jwt_secret": "",          # Secreto compartido usado para validar JWTs HS256.
    "auth_accept_authorization_header": true,
    "auth_accept_api_key_header": true,
    "auth_api_key_header_name": "x-api-key"
}
```

El archivo de configuración se puede pasar como parámetro al servicio. Por defecto, el servicio buscará un archivo llamado `/service/config/config.json`.

El orden de precedencia de la configuración es:

1. Variables de entorno `FACEPHI_INE_REST_*`
2. `config.json`
3. Valores por defecto de la API establecidos por el servicio antes del arranque
4. Valores por defecto internos de `Rest::Manager`

La autenticación JWT es opcional y está deshabilitada por defecto.

* Los endpoints públicos permanecen accesibles sin autenticación: `GET /api/v1/health` y `GET /api/v1/version`.
* `POST /api/v1/facial/authentication` requiere un JWT válido cuando la autenticación JWT está habilitada.
* El servicio no expone endpoints `GET/POST /config` en tiempo de ejecución, por lo que la configuración JWT no se puede ver ni modificar a través de una API de configuración pública.

Variables de entorno JWT soportadas:

* `FACEPHI_INE_REST_AUTH_ENABLED`
* `FACEPHI_INE_REST_AUTH_JWT_SECRET`
* `FACEPHI_INE_REST_AUTH_ACCEPT_AUTHORIZATION_HEADER`
* `FACEPHI_INE_REST_AUTH_ACCEPT_API_KEY_HEADER`
* `FACEPHI_INE_REST_AUTH_API_KEY_HEADER_NAME`
