> For the complete documentation index, see [llms.txt](https://docs.vaultid.com.br/workspace/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.vaultid.com.br/workspace/cess/instalacao-e-configuracao.md).

# Instalação e configuração

### Pré-requisitos

Para a configuração do endpoint, utilizamos como base o Docker CE, um gerenciador de containers que permite simplificar a configuração e gestão da solução.\
&#x20;Consulte a [documentação oficial](https://www.docker.com/) para mais informações sobre o Docker e seu funcionamento.

\*\*\*A ferramenta oficial utilizada para execução do motor de assinaturas é o Docker. Qualquer outra ferramenta ou método de execução, que não seja o Docker, não será suportado pela equipe técnica da Soluti.

\*\*\****A responsabilidade pela máquina onde estão instalados o componente de assinaturas, Docker e Docker-Compose é inteiramente da instituição. Isso inclui a gestão, manutenção, configuração e suporte técnico do ambiente onde esses serviços estão em execução.***

***A Soluti fornece o suporte necessário para a utilização do componente de assinaturas, mas qualquer questão relacionada à infraestrutura da máquina em si, como permissões, disponibilidade, atualizações e conectividade, deve ser gerenciada diretamente pela equipe de TI da instituição.***

Segue abaixo as especificações:

* **Linux**\
  &#x20;Docker para [Debian](https://docs.docker.com/v17.12/install/linux/docker-ce/debian/#install-docker-ce)\
  &#x20;Docker para [Centos](https://docs.docker.com/v17.12/install/linux/docker-ce/centos/#install-docker-ce)[ stream](https://docs.docker.com/v17.12/install/linux/docker-ce/centos/#install-docker-ce)\
  &#x20;Docker para [Ubuntu](https://docs.docker.com/engine/install/ubuntu/)

Será necessário acesso à internet para instalação de ferramentas.

#### Requisitos de máquina conforme consumo

Até 2.500 assinaturas por dia:

* 2 Gb de memória RAM
* 1 núcleo de processamento
* 25 Gb de armazenamento

A partir de 5.000 assinaturas por dia:

* 4 Gb de memória RAM
* 2 núcleo de processamento
* 25 Gb de armazenamento

A partir de 10.000 assinaturas por dia:

* 8 Gb de memória RAM
* 2 núcleo de processamento
* 50 Gb de armazenamento

A partir de 50.000 assinaturas por dia:

* 10 Gb de memória RAM
* 5 núcleo de processamento
* 500 Gb de armazenamento

A partir de 100.000 assinaturas por dia:

* 20 Gb de memória RAM
* 10 núcleo de processamento
* 1 Tb de armazenamento

**Atenção**\
&#x20;É necessário a instalação do [Docker-compose](https://docs.docker.com/compose/install/#install-compose).

**Rede e conectividade**\
&#x20;Para o funcionamento do BirdID Pro é necessário acesso aos endpoints do provedor de assinaturas nas URLs:

* [https://apicloudid.vaultid.com.br](https://apicloudid.vaultid.com.br/) (produção)
* [https://api.birdid.com.br](https://api.birdid.com.br/) (produção)
* [https://apicloudid.hom.vaultid.com.br](https://apicloudid.hom.vaultid.com.br/) (homologação)
* [https://apihom.birdid.com.br](https://apihom.birdid.com.br/) (homologação)
* <https://harbor.lab.vaultid.com.br> (endpoint do harbor para baixar imagem do BirdID Pro)&#x20;
* [https://cess.lab.vaultid.com.br](https://cess.lab.vaultid.com.br/) (homologação)
* [https://billing.vaultid.com.br](http://billing.vaultid.com.br:443) (endpoint do Wings para fazer o download da licença do BirdID Pro - ambiente de produção) &#x20;

É necessário a liberação das URL's para download dos arquivos das LCR's (lista de certificados revogados) referentes aos certificados utilizados. Os repositórios variam de acordo com a Autoridade Certificadora responsável pela emissão do certificado.

Para clientes AC Soluti, os endpoints são:

* [https://ccd.acsoluti.com.br](https://ccd.acsoluti.com.br/)
* [https://ccd2.acsoluti.com.br](https://ccd2.acsoluti.com.br/)&#x20;

Para a utilização de carimbo do tempo, é necessário liberação através do time comercial.

A comunicação entre o BirdID Pro e os endpoints citados não pode ser realizada com inspeção SSL/TLS(proxy) ou algum tipo de homem do meio que intercepte e interfira na abertura de sessão.

O tráfego de saída pode ser limitado aos clientes que consomem os serviços e aos endpoints citados.

### Configurações

Para iniciar o download da imagem e execução do software utilizando o docker-compose, faça o  download do projeto do [BirdID PRO](https://github.com/VaultID/docker-cess/archive/refs/heads/master.zip) ou um [clone do repositório de demonstração](https://github.com/VaultID/docker-cess).

Os seguintes parâmetros podem ser definidos dentro do arquivo docker-compose.yaml.

* **clientIdMd -** Caso o cliente esteja utilizando o BirdID Pro para autenticação (/oauth), deverá configurar o clientIdMd e clientSecretMd e sua aplicação precisará passá-los na requisição.
* **clientSecretMd -** Caso o cliente esteja utilizando o cess para autenticação (/oauth), deverá configurar o clientIdMd e clientSecretMd e sua aplicação precisará passá-los na requisição.
* **redisHost**  - Caso o cliente opte por utilizar seu cluster previamente instalado, basta configurar o redis host (opcional, default=redis);
* **redisPort** - Caso o cliente opte por utilizar seu cluster previamente instalado, basta configurar o redis port (opcional, default=6379);
* **ttlCacheGeneric** - Tempo (segundos) de vida do cache (opcional, default=3600);
* **lifetime** - Tempo (segundos) que os arquivos (tcn) irão ficar armazenado no BirdID Pro (opcional, default=86400);
* **sleep** - Intervalo (segundos) que o garbage collector irá executar para limpar os arquivos (opcional);
* **limit** - Quantidade máxima de arquivos que serão apagados a cada iteração do garbage (opcional);
* **cessUrl** - Define a URL utilizada para conexão ao BirdID Pro.
* **level** - Level de log do BirdID Pro (opcional, default=INFO) {DEBUG/INFO/NOTICE/WARNING/ERROR/CRITICAL/ALERT/EMERGENCY};
* **urlsMultiCloud** - {"[https://apihom.birdid.com.br":{"id":"SOLUTI","client\\\_id":"SEU\\\_CLIENT\\\_ID","client\\\_secret":"SEU\\\_CLIENT\\\_SECRET"},"https://apicloudid.hom.vaultid.com.br":{"id":"VAULTID","client\\\_id":"SEU\\\_CLIENT\\\_ID","client\\\_secret":"SEU\\\_CLIENT\\\_SECRET"\\}}](https://docs.vaultid.com.br/workspace/cess/https:/apihom.birdid.com.br":{"id":"SOLUTI","client\\_id":"SEU\\_CLIENT\\_ID","client\\_secret":"SEU\\_CLIENT\\_SECRET"},"https:/apicloudid.hom.vaultid.com.br":{"id":"VAULTID","client\\_id":"SEU\\_CLIENT\\_ID","client\\_secret":"SEU\\_CLIENT\\_SECRET"\\}})';
* **redisCluster** - Caso queira utilizar redis cluster, deverá setar true (opcional);
* **seedsCluster** Caso habilite redisCluster=true, deverá configurar esta variável com os nós. \["ip1:port1", "ip2:port2"... , "ipn:portn"] (obrigatório apenas se redisCluster=true);
* **sendMonitoring** Caso não queira que seja coletado informações do container, deverá setar a variável como false (opcional);
* **validateCertificate** - validar certificado durante assinatura (default=true)
* **signatureOnly** - validar apenas assinatura (ignorar data da assinatura)
* **tsaAdapter** - Adapter utilizado quando configurado carimbo do tempo (default=GenericTsaAdapter)
* **tsaConfig** - Encodado em base64 (tsaConfig=eyJ1cmwiOiJodHRwczovL1NFVV9DTElFTlRfSUQ6U0VVX0NMSUVOVF9TRUNSRVRAYWN0LmFjc29sdXRpLmNvbS5ici9hcGkvYWN0In0u) Exemplo: {"url":"[https://SEU\_CLIENT\_ID:SEU\_CLIENT\_SECRET@act.acsoluti.com.br/api/act"}](https://SEU_CLIENT_ID:SEU_CLIENT_SECRET@act.acsoluti.com.br/api/act%22%7D.)

Teremos a seguinte configuração:

<figure><img src="/files/ADkKcf5RIyNFwEhiAT2O" alt=""><figcaption></figcaption></figure>

* **APACHE\_SSL**
  * Defina para true se deseja que o Apache do container forneça o serviço com TLS ativo.
  * Espera-se que o certificado digital e a respectiva chave sejam fornecidos através de um ponto de montagem no container. Descomente a sessão 'volumes' e configure os arquivos conforme orientação.
    * Arquivo **path\_crt**
      * Espera-se um arquivo com a parte pública do certificado digital concatenado com as cadeias intermediárias da Autoridade Certificado emissora. Todos os certificados devem estar no formato PEM (codificado em base64).
    * Arquivo **path\_key**
      * Espera-se um arquivo contendo apenas a chave privada correspondente ao certificado digital utilizado. A chave privada não pode ter senha e deve estar no formato PEM (codificada em base64).
* **PORTA\_EXTERNA** - Define a porta pela qual o serviço do BirdID Pro será exposto.

**Exemplo:**

Considerando o cenário:

* SSL ativo;
* Os certificados estão salvos na pasta /opt/certs/cert.pem e /opt/certs/cert.key;
* A porta que o container deve expor é a 443;

Teremos a seguinte configuração:

```
    ...
      # Se necessário, edite apenas as variávies abaixo: #
      - "cessUrl=https://cess.vaultid.com.br"
      - "APACHE_SSL=true"
    ports:
      # Definir a PORTA_EXTERNA pela qual o container será exposto na rede.
      - 443:8080
    volumes:
      - /opt/certs/cert.pem:/etc/apache2/cert/cert.pem
      - /opt/certs/cert.key:/etc/apache2/cert/cert.key
    ... 
```

### Atenção **(ambiente de homologação)**:

Caso esteja utilizando ambiente de homologação, é necessário configurar a cadeia de confiança do mesmo. Para isso basta descomentar a linhas 4**3** *- volumes:* e **44***-  ./hom-truststore:/var/www/data/trust* do arquivo **cess-compose.yaml.** Para mais detalhes, acesse [**https://github.com/VaultID/docker-cess**](https://github.com/VaultID/docker-cess)**.**

**Atenção (ambiente de Produção):**\
Caso esteja utilizando ambiente de produção, é necessário configurar o diretório do arquivo de licença. Para isso basta descomentar as linhas 43 - volumes: e 49- ./license:/var/www/data/license do arquivo docker-compose.yaml. O diretório "license" precisa ter permissão de leitura e escrita. Para mais detalhes, acesse <https://github.com/VaultID/docker-cess>.

No ambiente de produção, o diretório license deve possuir permissões completas de leitura e escrita para garantir o funcionamento adequado.

### Executando

* **Atenção:** Antes de continuar é necessário solicitar o acesso ao repositório de imagens do BirdID Pro diretamente à equipe de integração da Soluti. Esta solicitação deverá ser realizada através do seu gestor de contas na Soluti.

Após concluir e validar a instalação do docker e do docker-compose, salve e configure o arquivo docker-compose.yaml no servidor de escolhido. Pela linha de comando, navegue até a pasta de destino do arquivo e execute:

1 - Docker login.

De posse do usuário e senha fornecidos, execute:

```
docker login harbor.lab.vaultid.com.br
```

&#x20;[![](https://github.com/VaultID/docker-cess/raw/master/images/login.png)](https://github.com/VaultID/docker-cess/blob/master/images/login.png)

2 - Iniciando a aplicação.

OBS: Este comando executa **três etapas sequenciais** para reinicializar completamente o ambiente da aplicação utilizando Docker Compose.

&#x20;docker compose down && rm -f ./license/\* && docker compose up -d --build

1. Parar e remover os containers
2. Remover arquivos de licença
3. Recriar e iniciar os containers

```
docker-compose -f docker-compose.yaml up -d
```

&#x20;[![](https://github.com/VaultID/docker-cess/raw/master/images/dockerup.png)](https://github.com/VaultID/docker-cess/blob/master/images/dockerup.png)

3 - Verificando o estado da aplicação:

```
docker ps 
```

&#x20;[![](https://github.com/VaultID/docker-cess/raw/master/images/dockerps2.png)](https://github.com/VaultID/docker-cess/blob/master/images/dockerps2.png)

4 - Testando a aplicação:

Após a confirmação de execução da aplicação é possível validar o estado da mesma acessando a URL configurada em **cessUrl** ou, diretamente no servidor com a combinação **IP\_SERVIDOR:PORTA\_EXTERNA**.

&#x20;[![](https://github.com/VaultID/docker-cess/raw/master/images/teste.png)](https://github.com/VaultID/docker-cess/blob/master/images/teste.png)

### LOG

É importante acompanhar o log do container para detectar algum erro de configuração ou falha no serviço. Também é possível aumentar o nível de detalhes para debugar eventuais problemas (veja a variável **level** na [Configuração](/workspace/cess/instalacao-e-configuracao.md#configuracoes)).

### Configuração do cluster (Redis) - Docker

> Nesta etapa já pressupõe que o cliente tenha 3 máquinas distintas com o docker instalado.

Será instalado 2 redis (master e slave) em cada máquina.

Como exemplo utilizaremos 3 máquinas com os respectivos IPs: 192.168.0.16, 192.168.0.19 e 192.168.0.20:

Roda os seguintes comandos nos respectivos IPs<br>

> IP \[192.168.0.16]

$ docker run -d --name redis-7000 -p 7000:7000 --network host redis:alpine redis-server --port 7000 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes

$ docker run -d --name redis-7001 -p 7001:7001 --network host redis:alpine redis-server --port 7001 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes

> IP \[192.168.0.19]

$ docker run -d --name redis-7002 -p 7002:7002 --network host redis:alpine redis-server --port 7002 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes

$ docker run -d --name redis-7003 -p 7003:7003 --network host redis:alpine redis-server --port 7003 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes

> IP \[192.168.0.20]

$ docker run -d --name redis-7004 -p 7004:7004 --network host redis:alpine redis-server --port 7004 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes

$ docker run -d --name redis-7005 -p 7005:7005 --network host redis:alpine redis-server --port 7005 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes

E por fim execute o seguinte comando na máquina 1 (192.168.0.16): $ redis-cli --cluster create 192.168.0.16:7000 192.168.0.16:7001 192.168.0.19:7002 192.168.0.19:7003 192.168.0.20:7004 192.168.0.20:7005 --cluster-replicas 1

Este comando irá criar um master e um slave para cada máquina

Para testar o cluster, acesse o primeiro redis:

$ redis-cli -c -h 192.168.0.16 -p 7000\
&#x20;$ set chave valor

Acesse algum outro redis:

$ redis-cli -c -p 192.168.0.20 -p 7005\
&#x20;$ get chave

É necessário retornar "valor"
