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

Onde `#VERSION#` é o número concreto da versão que se deseja baixar (por ex. `3.0.0`).

## 2. docker-compose

Uma forma de implantar o serviço é criar um arquivo `docker-compose.yml` com o seguinte conteúdo:

```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:
      # Proteção 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
```

Observe os volumes que são montados no contêiner. Esses volumes são usados para armazenar os arquivos de configuração do serviço e a licença, e para escrever a saída do logger.

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

```bash
    docker-compose up
```

## 3. Configuração

### 3.1 Configuração de licença e recursos

Para usar este serviço, você precisa dispor de um arquivo de configuração válido.

O arquivo de configuração poderia conter as seguintes informações:

```bash
CONFIG_DIR=             # Caminho para a pasta de configuração onde os recursos estão localizados
LICENSE_TYPE=           # Tipo de licença, pode ser MACHINE, SHARED ou LOCAL
LICENSE_BEHAVIOUR=      # Comportamento da licença, pode ser ONLINE ou OFFLINE
LICENSE_KEY=            # Chave de licença
LICENSE_ID=             # ID do produto
LICENSE_DATA=           # Dados do produto
LICENSE_URL=            # URL do servidor de licenças. Só é necessário se LICENSE_TYPE for LOCAL
LICENSE_PATH_OFFLINE=   # Caminho para um arquivo local com os dados para a ativação offline. Só é necessário se LICENSE_TYPE for MACHINE e LICENSE_BEHAVIOUR for OFFLINE
```

O arquivo de configuração e de licença pode ser passado como parâmetro ao serviço. Por padrão, o serviço buscará um arquivo chamado `/service/config/config.cfg`. No caso do contêiner Docker, o arquivo de configuração poderia estar localizado em um volume montado em `/service/config`.

### 3.2 Configuração do serviço

O arquivo de configuração poderia conter as seguintes informações:

```json
{
    "port": 6982,                   # Número da porta do serviço.
    "number_of_threads": 1,         # Número de threads de E/S, 1 por padrão; se o valor for 0, o número de threads é o número de núcleos da CPU.
    "connection_timeout": 60,       # 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 da mesma conexão keep-alive.
                                    # Uma vez alcançado o número máximo de solicitações, a conexão é fechada.
                                    # O valor padrão de 0 significa sem limite.
    "client_max_body_size": 50,     # Tamanho máximo do corpo permitido nas solicitações, em Mb.
                                    # O valor padrão é 100 Mb.
    "logger_path" : "/service",     # Caminho para o arquivo de log.
    "logger_level" : "trace",       # Define o nível de log. [trace|debug|info|warn|error|fatal|off]
    "logger_rotation" : "daily",    # Define a rotação do log. [hourly|daily]
    "logger_max_files" : 31,        # Define o número máximo de arquivos de log.
    "auth_enabled": false,          # Habilita a proteção JWT para os endpoints não públicos.
    "auth_jwt_secret": "",         # Segredo compartilhado usado para validar os tokens JWT HS256.
    "auth_accept_authorization_header": true,
    "auth_accept_api_key_header": true,
    "auth_api_key_header_name": "x-api-key"
}
```

O arquivo de configuração pode ser passado como parâmetro ao serviço. Por padrão, o serviço buscará um arquivo chamado `/service/config/config.json`. No caso do contêiner Docker, o arquivo de configuração poderia estar localizado em um volume montado em `/service/config`.

A autenticação JWT é opcional e está desativada por padrão. Os ajustes de inicialização anteriores também podem ser fornecidos por meio de variáveis de ambiente com o prefixo `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`

Quando o JWT está habilitado, `GET /api/v1/version`, `GET /api/v1/health` e as solicitações de preflight `OPTIONS` continuam públicas. O restante dos endpoints requer um JWT válido por meio de `Authorization: Bearer <jwt>` ou o cabeçalho de API key configurado.

Os ajustes de inicialização do JWT são aplicados somente quando o serviço é iniciado. `GET /api/v1/config` não expõe esses campos e `POST /api/v1/config` rejeita as tentativas de modificá-los.

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