> 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/docs.facephi-pt-br/sdks/backend-sdk/backend1n/installation/installation_instructions.md).

# Instalação e implantação do serviço

## 1. Instalação e implantação

O serviço está dockerizado e existe uma imagem Docker em um repositório da Facephi.

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

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

Onde `#VERSION#` é o número de versão específico que queremos baixar (por exemplo, `4.2.0`).

## 2. Bancos de dados.

Antes do início do serviço, o administrador deverá criar e configurar os bancos de dados pertinentes, bem como um usuário específico para o serviço. Este **usuário/senha deverá ser indicado na string de conexão**. A tecnologia de BD que o serviço utilizará será decidida na inicialização, em função do prefixo desta string de conexão.

## 2.1 MongoDB

Deverá ser criada a variável de ambiente `DATABASE_CONNECT_STRING` apontando para o MongoDB.

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

O próprio serviço criará um banco de dados chamado `db-backend`, se não existir previamente. Nele hospedará duas coleções:

* `media` para armazenar images.
* `patterns` para armazenar padrões biométricos.

## 2.2 PostgreSQL

Da mesma forma, deve ser criada a variável de ambiente `DATABASE_CONNECT_STRING` apontando para o PostgreSQL.

```bash
# Prefixos aceitos para PostgreSQL.
# postgres://
# postgresql://
export DATABASE_CONNECT_STRING=postgresql://user:pass@localhost:32903/db_backend
```

O caso do PostgreSQL difere ligeiramente do MongoDB. Um banco de dados com o nome `db_backend` deve ter sido criado previamente pelo administrador do sistema. PostgreSQL dificulta a criação de bancos de dados a partir do próprio cliente. Um exemplo dos comandos prévios que o administrador deveria executar seria:

```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 do BD PostgreSQL, o serviço criará duas tabelas, assim como acontecia com MongoDB:

* `media` para armazenar images.
* `patterns` para armazenar padrões biométricos.

## 3. docker-compose

Uma forma de implantar o serviço é criar um arquivo `docker-compose.yml` com o seguinte conteúdo, alterando o valor das variáveis conforme necessário.

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

Primeiro, você deve criar um diretório de usuário com permissões de leitura e escrita, por exemplo `~/backend1n/config`, e colocar estes dois arquivos:

* O arquivo de licença do SelphID `license.lic` (obrigatório).
* O arquivo de configuração do serviço `config.json` (opcional).

> Nesse mesmo diretório, o serviço gravará os arquivos de log.

Além disso, você deve informar a variável de ambiente `DATABASE_CONNECT_STRING` com a string de conexão com o banco de dados (por exemplo, `mongodb://127.0.0.1:27017`). Para fins de depuração, você pode desabilitar as operações de banco de dados fornecendo o valor `no-db`. Exemplo: `DATABASE_CONNECT_STRING=no-db`

Execute o seguinte comando, dentro da pasta onde se encontra o arquivo `docker-compose.yml`, para implantar o serviço:

```
docker compose up
```

## 4. Configuração adicional

Seguindo os passos da **seção 2**, o serviço fica pronto para iniciar. Se você precisar criar volumes adicionais para os diferentes tipos de recursos, pode seguir estas configurações adicionais.

### 4.1 Licença

Você pode montar um volume adicional e definir a variável de ambiente `LICENSE_PATH`, caso queira instalar a licença fora do diretório de configuração 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` é uma pasta com o arquivo `license.lic` e permissões de leitura e escrita. Neste exemplo, `~/backend1n/license/license.lic`.

### 4.2 Configuração do serviço

Você pode especificar outro local para o arquivo `config.json` com os parâmetros do serviço:

```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` é o caminho para o arquivo de configuração no volume adicional.

Se nenhum `config.json`, serão usados estes dados padrão:

```json
{
    "port": 6969,                   # Número da porta do serviço.
    "number_of_threads": 0,         # O número de threads de E/S, 0 = o número de núcleos da CPU.
    "connection_timeout": 0,        # O tempo de vida da conexão sem leitura nem escrita.
    "keep_alive_request_number": 0, # Define o número máximo de solicitações que podem ser atendidas por meio de uma conexão keep-alive.
                                    # Uma vez atingido o número máximo de solicitações, a conexão é encerrada.
                                    # O valor padrão de 0 significa sem limite.
    "client_max_body_size": 100,    # O tamanho máximo do body permitido nas solicitações, em Mb.
                                    # O valor padrão é 100 Mb.
    "logger_path" : "./logs",       # Define o caminho onde os arquivos de log são armazenados.
    "logger_level" : "info",        # Os valores possíveis são [trace|debug|info|warning|error|critical|off].
    "logger_rotation" : "daily",    # Os valores possíveis são [hourly|daily].
    "logger_max_files" : 0,         # O valor padrão de 0 significa sem limite.
    "auth_enabled": false,          # Habilita a autenticação JWT para os endpoints protegidos.
    "auth_jwt_secret": "",         # Segredo compartilhado usado para validar assinaturas JWT HS256.
    "auth_accept_authorization_header": true, # Aceita Authorization: Bearer <jwt>.
    "auth_accept_api_key_header": true,       # Aceita o cabeçalho de API Key com o token JWT.
    "auth_api_key_header_name": "x-api-key" # Nome do cabeçalho de API Key quando está habilitada.
}
```

Os mesmos parâmetros de JWT podem ser injetados por meio de variáveis de ambiente usando o prefixo `FACEPHI_BACKEND1N_REST_`. Por exemplo:

```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 Caminho de depuração e de uso

Por fim, você pode especificar um volume/caminho específico com permissões de leitura e escrita para as informações de depuração do SDK e os dados de uso do SDK, por meio das variáveis de ambiente `DEBUG_PATH` e `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 Configuração de rede

Para poder se conectar com nossos servidores de licenças, você deve adicionar às regras do seu firewall as seguintes regras:

| IP           | Porta | 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 |

Em seguida, adicione os seguintes `DNS` à sua lista de permissões:

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