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.gzdas 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
- 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. - Restaure o banco de dados no servidor com o comando
pg_restorecom 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/bashpara entrar no conteiner, ecat /var/log/cron.logpara visualizar os logs. - extrator_diario: Utilize o comando
docker exec -it extrator_diario /bin/bashpara entrar no conteiner, ecat /var/log/cron.logpara visualizar os logs. - api: Utilize o comando
docker logs apipara verificar os logs. - db_censipam: Utilize o comando
docker logs db_censipampara 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 comandocd 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-apppara 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 comandodocker exec -it bokeh /bin/bashe utilizecd logspara entrar na pasta. Os arquivos.logpodem ser vistos com o comandocat arquivo.log, e os arquivos compactados podem ser descompactados utilizandogzip -d -k arquivo.log.gz. - keycloak: Utilize o comando
docker logs keycloakpara verificar os logs. - traefik: Utilize o comando
docker logs traefikpara verificar os logs. - manual-censipam: Utilize o comando
docker logs manual-serve-1para 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/statusque 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 psno terminal. Para testar o funcionamento do banco, clique com o bot ão direito no banco de dados, clique em Query Tool, escrevaSELECT * 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
/healthou 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 -apara 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.