Skip to main content

Implantação

Atualmente, a aplicação está implantada em uma máquina virtual na intranet do Censipam, utilizando Docker e Traefik como proxy reverso. O acesso é feito via endereço IP, com suporte a HTTPS usando certificado autoassinado.

Infraestrutura

  • Local: Máquina virtual (VM) na intranet do Censipam
  • SO da VM: Debian 12 (Bookworm)
  • Docker: versão 28.1.1
  • Serviços rodando:
    • Traefik
    • App Next.js
    • App Bokeh
    • Backend
    • API

Serviços Externos à VM

Além dos serviços hospedados na VM principal (Next.js, Bokeh, Backend, Manual e API), existem componentes do sistema que ainda estão hospedados em outras máquinas. São eles:

  • Keycloak: está sendo utilizada a instância da UFPA com o realm sipam, acessível em https://authhidro.sipam.gov.br
  • Banco de Dados: está sendo utilizada uma instância hospedada em outra VM da intranet do Censipam.

Endereços e Proxy

A implantação utiliza o Traefik como proxy reverso, escolhido por sua simplicidade na integração com contêineres. Ele permite a definição de entrypoints, nos quais requisições para determinados endereços são roteadas para as respectivas aplicações.

A implantação atual define os seguintes endereços:

  • https://172.21.8.6 => Aplicação frontend em Next.js;
  • https://172.21.8.6/bokeh => Aplicação frontend em Bokeh;

Há também outros endereços que são utilizados dentro da aplicação (como a API e o Backend), mas estes não precisam ser expostos à intranet e, portanto, podem ser seguramente navegados a partir de uma rede Docker.

Passos de Implantação

Antes de iniciar a implantação, verifique:

  • Acesso SSH à máquina com permissões para rodar Docker e gerenciar arquivos.
  • Docker instalado (versão recomendada: 28.1.1 ou superior)
  • Docker Compose instalado (versão recomendada: v2.35.1 ou superior).
  • Arquivos .tar.gz das aplicações disponíveis para transferência.

1. Acesso ao Servidor

Conecte-se à máquina onde os serviços serão implantados.

2. Transferência dos Arquivos Compactados

Transfira os arquivos .tar.gz de cada serviço para uma pasta no servidor.

3. Extração de Cada Serviço

No servidor, realize a extração para cada serviço:

tar -xvzf frontend-nextjs.tar.gz
tar -xvzf traefik.tar.gz
tar -xvzf backend.tar.gz
tar -xvzf API.tar.gz
tar -xvzf extracao-dados-ana.tar.gz
tar -xvzf banco_censipam.tar.gz
tar -xvzf instancia-keycloak.tar.gz
tar -xvzf manual-censipam.tar.gz

4. Configuração das Variáveis de Ambiente

Para cada serviço, configure as variáveis de ambiente nos arquivos .env. Caso haja dúvidas sobre o significado ou a necessidade de alguma variável, consulte a documentação técnica do projeto.

5. Subir os containers de cada serviço

# Criar a rede Docker
docker network create mynetwork --driver bridge

# Subir os containers (substitua com os caminhos corretos)
cd /caminho/para/banco_censipam
docker compose up -d --build

cd /caminho/para/instancia-keycloak
docker compose up -d --build

cd /caminho/para/API
docker compose -f docker-compose.prod.yml up -d --build

cd /caminho/para/backend
docker compose -f docker-compose.prod.yml up -d --build

cd /caminho/para/extracao-dados-ana
docker compose up -d --build

cd /caminho/para/traefik
docker compose up -d --build

cd /caminho/para/frontend-nextjs
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build

cd /caminho/para/manual-censipam
docker compose up -d --build

5.1 Manutenção das imagens

Depois de utilizar o comando docker compose up -d --build, o Docker reconstrói as imagens, fazendo com que elas se acumulem ao longo do tempo e ocupando espaço no armazenamento. Para visualizar as imagens existentes, utilize docker images. Para limpar as imagens que não são mais utilizadas, rode o comando docker system prune, mas cuidado, ele irá remover todas as imagens que não estiverem rodando, então garanta que todos os serviços estejam funcionando antes de utilizá-lo.

5.2 Implantação do Banco de Dados

  1. Gere um dump do banco de dados com o comando pg_dump -h localhost -U meu_usuario -F c -f arquivo.sql. A documentação oficial do postgres detalha como utilizar este comando. Obs: É necessário garantir que o dump e o servidor tenham a mesma versão do Postgres, caso o dump tenha sido gerado com a opção custom.
  2. Restaure o banco de dados no servidor com o comando pg_restore com as flags --disable-triggers -verbose. Obs: As triggers do banco são acionadas para cada uma das 26 milhões de tuplas, o que deixa o processo lento. Então, é necessário desativar as triggers. Também não pode existir nenhum serviço ativo que esteja inserindo tuplas nas tabelas ao mesmo tempo que a restauração do banco esteja em progresso. Pois pode acabar acontecendo uma violação de duplicidade de tuplas, que vai resultar no encerramento da restauração.

6. Verificação dos Serviços

Após a inicialização, verifique se os containers estão em execução e acompanhe os logs para identificar possíveis erros ou mensagens de inicialização. Para verificar, utilize o comando:

docker ps

6.1 Acesso aos Logs dos Serviços

As operações realizadas nos conteineres são mostradas em logs, e é possível acessá-los da seguinte forma:

  • extrator: Utilize o comando docker exec -it extrator /bin/bash para entrar no conteiner, e cat /var/log/cron.log para visualizar os logs.
  • extrator_diario: Utilize o comando docker exec -it extrator_diario /bin/bash para entrar no conteiner, e cat /var/log/cron.log para visualizar os logs.
  • api: Utilize o comando docker logs api para verificar os logs.
  • db_censipam: Utilize o comando docker logs db_censipam para verificar os logs.
  • backend-api: Caso queira acompanhar as operações mais recentes, utilize o comando docker logs backend-api. E para verificar operações mais antigas, utilize o comando cd app/logs/ na raiz da pasta do projeto e será possível ver os arquivos de logs compactados. Para descompactar, rode o comando: tar -xvzf arquivo.tar.gz.
  • next-app: Utilize o comando docker logs next-app para verificar os logs.
  • bokeh: Caso queira verificar os logs mais recentes, utilize o comando docker logs bokeh. Mas também existe a alternativa de consultar os arquivos completos de logs que são gerados a cada minuto, ou ver os logs mais antigos. Para isso, entre no conteiner com o comando docker exec -it bokeh /bin/bash e utilize cd logs para entrar na pasta. Os arquivos .log podem ser vistos com o comando cat arquivo.log, e os arquivos compactados podem ser descompactados utilizando gzip -d -k arquivo.log.gz.
  • keycloak: Utilize o comando docker logs keycloak para verificar os logs.
  • traefik: Utilize o comando docker logs traefik para verificar os logs.
  • manual-censipam: Utilize o comando docker logs manual-serve-1 para verificar os logs.

6.2 Como Visualizar se os serviços estão ativos

  • api: Após seguir tutorial, o swagger da api fica disponível em http://localhost:8000/docs. A api possui um endpoint chamado /dev/status que pode ser acionado via swagger ou requisição pelo terminal. O endpoint retorna os status de todos os serviços, que pode ser uma alternativa tanto para ver quanto para mostrar em alguma aplicação os status. Também é possível verificar o funcionamento pelos logs, como foi explicado na seção 6.1.
  • next-app: Após seguir o tutorial, a aplicação ficará disponível em http://localhost:3000. Os logs da aplicação também ajudam a constatar seu funcionamento, como explicado na seção 6.1.Outra forma de confirmar o funcionamento é mandando uma requisição GET para a api no endereço /dev/status.
  • bokeh: É possível verificar o funcionamento através dos logs, como explicado na seção 6.1. Além disso, a aplicação está disponível no endereço http://localhost:5006/bokeh. Para verificar o funcionamento através da ferramenta, execute os passos mostrados no tutorial. Se os gráficos forem mostrados, está funcionando.Outra forma de confirmar o funcionamento é mandando uma requisição GET para a api no endereço /dev/status.
  • keycloak: Após seguir o tutorial, é possível verificar o funcionamento através dos logs, como explicado na seção 6.1. O serviço também pode ser acessado no endereço http://localhost:8080. Outra forma de confirmar o funcionamento é mandando uma requisição GET para a api no endereço /dev/status.
  • db_censipam: Após seguir o tutorial, o funcionamento pode ser verificado através dos logs, como explicado na seção 6.1. Também é possível verificar através do pgAdmin4. Após instalação do pgAdmin4, siga este tutorial para criar o servidor e o banco de dados. Certifique-se de que a porta do banco de dados seja a mesma do conteiner db_censipam, para isso, clique com o botão direito no servidor, clique em Properties, vá até a aba Connection e veja se o número em Port é o mesmo do que aparece no conteiner ao rodar o comando docker ps no terminal. Para testar o funcionamento do banco, clique com o botão direito no banco de dados, clique em Query Tool, escreva SELECT * FROM {nome_do_banco}.ana_estacao_unb; e aperte a tecla F5 para rodar a consulta. Os resultados da consulta devem aparecer se tudo estiver funcionando. Outra forma de confirmar o funcionamento é mandando uma requisição GET para a api no endereço /dev/status.
  • backend-api: Após seguir tutorial, o swagger do backend-api fica disponível em http://localhost:7788/docs. Outra forma de verificar o status do serviço é mandando uma requisição GET para o endereço /health ou mandar uma requisição para a api no endereço /dev/status. Também é possível verificar o funcionamento pelos logs, como foi explicado na seção 6.1.
  • traefik: Para verificar o funcionamento do serviço, olhe os logs conforme explicado na seção 6.1. Outra forma de confirmar o funcionamento é mandando uma requisição GET para a api no endereço /dev/status.
  • extrator: Primeiramente, siga o tutorial.Para verificar o status, confira os logs conforme explicado na seção 6.1. É possível também fazer consultas ao banco de dados para confirmar se as cotas ou estações estão sendo inseridas no mesmo. Outra forma de confirmar o funcionamento é mandando uma requisição GET para a api no endereço /dev/status.
  • extrator_diario: Primeiramente, siga o tutorial.Para verificar o status, confira os logs conforme explicado na seção 6.1. É possível também fazer consultas ao banco de dados para confirmar se as cotas ou estações estão sendo inseridas no mesmo. Outra forma de confirmar o funcionamento é mandando uma requisição GET para a api no endereço /dev/status.
  • manual-censipam: É possível verificar a disponibilidade através do endereço manual, ou utilizando o comando docker ps -a para verificar se o serviço está ativo.

Certificado

Por enquanto, está sendo usado um certificado autoassinado, o que pode gerar alertas no navegador. Alternativas ao uso do certificado autoassinado estão descritas aqui.

Limitações

Atualmente, a implantação apresenta algumas limitações importantes relacionadas à autenticação e à comunicação entre origens diferentes.

O frontend (Next.js e Bokeh) está acessível via endereço IP (172.21.8.6), enquanto o Keycloak utiliza o domínio authhidro.sipam.gov.br.

A aplicação Bokeh é incorporada no frontend Next.js por meio de um iframe. Devido a essa estrutura e ao fato de não estarem sob o mesmo domínio, navegadores modernos podem bloquear os cookies de terceiros necessários para manter a sessão autenticada no Bokeh.

Esse problema ocorre com mais frequência no modo de navegação anônima, onde os navegadores tendem a aplicar restrições mais rígidas ao uso de cookies de terceiros.

Além disso, devido ao uso do certificado autoassinado, o Firefox impede o carregamento do conteúdo mesmo fora do modo anônimo. Já o Chrome e Edge permitem esse carregamento.