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

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

## 2. Bases de datos.

Previamente al inicio del servicio, el administrador deberá crear y configurar las bases de datos pertinentes, así como un usuario específico para el servicio. Este **usuario/contraseña deberá indicarse en la cadena de conexión**. La tecnología de BD que utilizará el servicio se decidirá en el arranque, en función del prefijo de esta cadena de conexión.

## 2.1 MongoDB

Se deberá crear la variable de entorno `DATABASE_CONNECT_STRING` apuntando a MongoDB.

```bash
# MongoDB prefijos aceptados.
# mongodb://
# mongodb+srv://
export DATABASE_CONNECT_STRING=mongodb://user:pass@localhost:32902/?directConnection=true&serverSelectionTimeoutMS=5000
```

El propio servicio creará una base de datos denominada `db-backend`, si no existe previamente. En ella alojará dos colecciones:

* `media` para almacenar images.
* `patterns` para almacenar patrones biométricos.

## 2.2 PostgreSQL

De igual forma se debe crear la variable de entorno `DATABASE_CONNECT_STRING` apuntando a PostgreSQL.

```bash
# PostgreSQL prefijos aceptados.
# postgres://
# postgresql://
export DATABASE_CONNECT_STRING=postgresql://user:pass@localhost:32903/db_backend
```

El caso de PostgreSQL difiere ligeramente de MongoDB. Una BD con el nombre `db_backend` debe haber sido creada previamente por el administrador del sistema. PostgreSQL dificulta la creación de bases de datos desde el propio cliente. Un ejemplo de los comandos previos que debería ejecutar el administrador sería:

```bash
sudo -u postgres psql -c "CREATE ROLE backend1n WITH LOGIN PASSWORD 'backend1n';"
sudo -u postgres psql -c "CREATE DATABASE db_backend OWNER backend1n;"
sudo -u postgres psql -d db_backend -c "GRANT ALL ON SCHEMA public TO backend1n;"
```

Dentro de la BD PostgreSQL, el servicio creará dos tablas, al igual que ocurría con MongoDB:

* `media` para almacenar images.
* `patterns` para almacenar patrones biométricos.

## 3. docker-compose

Una forma de desplegar el servicio es crear un archivo `docker-compose.yml` con el siguiente contenido, cambiando el valor de las variables según sea necesario.

```yaml
version: '3.7'

services:
  backend1n-service:
    ports:
      - "6982:6982"
    volumes:
      - ~/backend1n/config:/service/config
    environment:
      DATABASE_CONNECT_STRING: mongodb://127.0.0.1:27017
    image: facephicorp.jfrog.io/docker-pro-fphi/facephi-backend1n-service:#VERSION#
    container_name: facephi-backend1n-service
```

Primero, debes crear un directorio de usuario con permisos de lectura y escritura, por ejemplo `~/backend1n/config`, y colocar estos dos archivos:

* El archivo de licencia de SelphID `license.lic` (obligatorio).
* El archivo de configuración del servicio `config.json` (opcional).

> En ese mismo directorio, el servicio escribirá los archivos de log.

Además, debes proporcionar la variable de entorno `DATABASE_CONNECT_STRING` con la cadena de conexión a la base de datos (por ejemplo, `mongodb://127.0.0.1:27017`). Para propósitos de depuración, puedes deshabilitar las operaciones de base de datos proporcionando el valor `no-db`. Ejemplo: `DATABASE_CONNECT_STRING=no-db`

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

```
docker compose up
```

## 4. Configuración adicional

Siguiendo los pasos de la **sección 2**, el servicio queda listo para arrancar. Si necesitas crear volúmenes adicionales para los distintos tipos de recursos, puedes seguir estas configuraciones adicionales.

### 4.1 Licencia

Puedes montar un volumen adicional y definir la variable de entorno `LICENSE_PATH`, en caso de que quieras instalar la licencia fuera del directorio de configuración habitual.

```yaml
version: '3.7'

services:
  backend1n-service:
    ports:
      - "6982:6982"
    volumes:
      - ~/backend1n/config/config.json:/service/config/config.json
      - ~/backend1n/config/license.lic:/service/license/license.lic
    environment:
      LICENSE_PATH: /service/license
      DATABASE_CONNECT_STRING: mongodb://127.0.0.1:27017
    image: facephicorp.jfrog.io/docker-pro-fphi/facephi-backend1n-service:#VERSION#
    container_name: facephi-backend1n-service
```

> `LICENSE_PATH` es una carpeta con el archivo `license.lic` y permisos de lectura y escritura. En este ejemplo, `~/backend1n/license/license.lic`.

### 4.2 Configuración del servicio

Puedes especificar otra ubicación para el archivo `config.json` con los parámetros del servicio:

```yaml
version: '3.7'

services:
  backend1n-service:
    ports:
      - "6982:6982"
    volumes:
      - ~/backend1n/config:/service/config
      - ~/backend1n/service:/service
    environment:
      CONFIG_FILE: /service/config.json
      DATABASE_CONNECT_STRING: mongodb://127.0.0.1:27017
    image: facephicorp.jfrog.io/docker-pro-fphi/facephi-backend1n-service:#VERSION#
    container_name: facephi-backend1n-service
```

> `CONFIG_FILE` es la ruta al archivo de configuración en el volumen adicional.

Si no se especifica ningún `config.json`, se utilizarán estos datos por defecto:

```json
{
    "port": 6969,                   # Número de puerto del servicio.
    "number_of_threads": 0,         # El número de hilos de E/S, 0 = el número de núcleos de la CPU.
    "connection_timeout": 0,        # 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": 100,    # El tamaño máximo del body permitido en las solicitudes, en Mb.
                                    # El valor por defecto es 100 Mb.
    "logger_path" : "./logs",       # Establece la ruta donde se almacenan los archivos de log.
    "logger_level" : "info",        # Los valores posibles son [trace|debug|info|warning|error|critical|off].
    "logger_rotation" : "daily",    # Los valores posibles son [hourly|daily].
    "logger_max_files" : 0,         # El valor por defecto de 0 significa sin límite.
    "auth_enabled": false,          # Habilita la autenticación JWT para los endpoints protegidos.
    "auth_jwt_secret": "",         # Secreto compartido utilizado para validar firmas JWT HS256.
    "auth_accept_authorization_header": true, # Acepta Authorization: Bearer <jwt>.
    "auth_accept_api_key_header": true,       # Acepta la cabecera de API key con el token JWT.
    "auth_api_key_header_name": "x-api-key" # Nombre de la cabecera de API key cuando está habilitada.
}
```

Los mismos parámetros de JWT pueden inyectarse mediante variables de entorno usando el prefijo `FACEPHI_BACKEND1N_REST_`. Por ejemplo:

```yaml
services:
  backend1n-service:
    environment:
      DATABASE_CONNECT_STRING: mongodb://127.0.0.1:27017
      FACEPHI_BACKEND1N_REST_AUTH_ENABLED: "true"
      FACEPHI_BACKEND1N_REST_AUTH_JWT_SECRET: shared-secret
      FACEPHI_BACKEND1N_REST_AUTH_ACCEPT_AUTHORIZATION_HEADER: "true"
      FACEPHI_BACKEND1N_REST_AUTH_ACCEPT_API_KEY_HEADER: "true"
      FACEPHI_BACKEND1N_REST_AUTH_API_KEY_HEADER_NAME: x-api-key
```

### 4.3 Ruta de depuración y de uso

Por último, puedes especificar un volumen/ruta concreto con permisos de lectura y escritura para la información de depuración del SDK y los datos de uso del SDK, mediante las variables de entorno `DEBUG_PATH` y `USAGE_PATH`:

```yaml
version: '3.7'

services:
  backend1n-service:
    ports:
      - "6982:6982"
    volumes:
      - ~/backend1n/config:/service/config
      - ~/backend1n/debug:/service/debug
      - ~/backend1n/usage:/service/usage
    environment:
      DEBUG_PATH: /service/debug
      USAGE_PATH: /service/usage
      DATABASE_CONNECT_STRING: mongodb://127.0.0.1:27017
    image: facephicorp.jfrog.io/docker-pro-fphi/facephi-backend1n-service:#VERSION#
    container_name: facephi-backend1n-service
```

### 4.4 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
```
