> 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/voice/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-voice-service:#VERSION#
```

Donde `#VERSION#` es el número de versión concreto que se desea descargar (p. ej. `3.0.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:
  voice-service:
    ports:
      - "6982:6982"
    volumes:
      - ~/facephi_voice_config:/service/config
      - ~/facephi_voice_config:/service/logs
    image: facephicorp.jfrog.io/docker-pro-fphi/facephi-voice-service:$VERSION
    container_name: facephi-voice-service
    environment:
      # Protección JWT opcional
      # - FACEPHI_VOICE_REST_AUTH_ENABLED=true
      # - FACEPHI_VOICE_REST_AUTH_JWT_SECRET=shared-secret
      # - FACEPHI_VOICE_REST_AUTH_ACCEPT_AUTHORIZATION_HEADER=true
      # - FACEPHI_VOICE_REST_AUTH_ACCEPT_API_KEY_HEADER=true
      # - FACEPHI_VOICE_REST_AUTH_API_KEY_HEADER_NAME=x-api-key
```

Fíjate en los volúmenes que se montan en el contenedor. Estos volúmenes se utilizan para almacenar los archivos de configuración del servicio y la licencia, y para 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
```

## 3. Configuración

### 3.1 Configuración de licencia y recursos

Para usar este servicio, necesitas disponer de un archivo de configuración válido.

El archivo de configuración podría contener la siguiente información:

```bash
CONFIG_DIR=             # Ruta a la carpeta de configuración donde se encuentran los recursos
LICENSE_TYPE=           # Tipo de licencia, puede ser MACHINE, SHARED o LOCAL
LICENSE_BEHAVIOUR=      # Comportamiento de la licencia, puede ser ONLINE u OFFLINE
LICENSE_KEY=            # Clave de licencia
LICENSE_ID=             # ID del producto
LICENSE_DATA=           # Datos del producto
LICENSE_URL=            # URL del servidor de licencias. Solo necesario si LICENSE_TYPE es LOCAL
LICENSE_PATH_OFFLINE=   # Ruta a un archivo local con los datos para la activación offline. Solo necesario si LICENSE_TYPE es MACHINE y LICENSE_BEHAVIOUR es OFFLINE
```

El archivo de configuración y de licencia puede pasarse como parámetro al servicio. Por defecto, el servicio buscará un archivo llamado `/service/config/config.cfg`. En el caso del contenedor Docker, el archivo de configuración podría estar ubicado en un volumen montado en `/service/config`.

### 3.2 Configuración del servicio

El archivo de configuración podría contener la siguiente información:

```json
{
    "port": 6982,                   # Número de puerto del servicio.
    "number_of_threads": 1,         # 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,       # Tiempo de vida de la conexión sin lectura ni escritura.
    "keep_alive_request_number": 0, # Establece el número máximo de peticiones que pueden atenderse a través de una misma conexión keep-alive.
                                    # Una vez alcanzado el número máximo de peticiones, la conexión se cierra.
                                    # El valor por defecto de 0 significa sin límite.
    "client_max_body_size": 50,     # Tamaño máximo del cuerpo permitido en las peticiones, en Mb.
                                    # El valor por defecto es 100 Mb.
    "logger_path" : "/service",     # Ruta al archivo de log.
    "logger_level" : "trace",       # Establece el nivel de log. [trace|debug|info|warn|error|fatal|off]
    "logger_rotation" : "daily",    # Establece la rotación del log. [hourly|daily]
    "logger_max_files" : 31,        # Establece el número máximo de archivos de log.
    "auth_enabled": false,          # Habilita la protección JWT para los endpoints no públicos.
    "auth_jwt_secret": "",         # Secreto compartido utilizado para validar los tokens JWT 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 puede pasarse como parámetro al servicio. Por defecto, el servicio buscará un archivo llamado `/service/config/config.json`. En el caso del contenedor Docker, el archivo de configuración podría estar ubicado en un volumen montado en `/service/config`.

La autenticación JWT es opcional y está deshabilitada por defecto. Los ajustes de arranque anteriores también pueden proporcionarse mediante variables de entorno con el prefijo `FACEPHI_VOICE_REST_AUTH_`:

* `FACEPHI_VOICE_REST_AUTH_ENABLED`
* `FACEPHI_VOICE_REST_AUTH_JWT_SECRET`
* `FACEPHI_VOICE_REST_AUTH_ACCEPT_AUTHORIZATION_HEADER`
* `FACEPHI_VOICE_REST_AUTH_ACCEPT_API_KEY_HEADER`
* `FACEPHI_VOICE_REST_AUTH_API_KEY_HEADER_NAME`

Cuando el JWT está habilitado, `GET /api/v1/version`, `GET /api/v1/health` y las peticiones de preflight `OPTIONS` siguen siendo públicas. El resto de endpoints requieren un JWT válido mediante `Authorization: Bearer <jwt>` o la cabecera de API key configurada.

Los ajustes de arranque del JWT se aplican únicamente cuando el servicio se inicia. `GET /api/v1/config` no expone estos campos y `POST /api/v1/config` rechaza los intentos de modificarlos.

### 3.3 Configuración de red

Para poder conectar con nuestros servidores de licencias, debes añadir a las reglas de tu firewall las siguientes reglas:

| IP           | Puerto | Tipo   |
| ------------ | ------ | ------ |
| 52.223.22.71 | 443    | TCP/IP |
| 35.71.188.31 | 443    | TCP/IP |
| 75.2.113.112 | 443    | TCP/IP |
| 99.83.149.57 | 443    | TCP/IP |

A continuación, añade los siguientes `DNS` a tu lista blanca:

```bash
https://api.cryptlex.com:443
https://api.eu.cryptlex.com:443
```
