Este documento pretende auxiliar na implantação do Polare, abordando a configuração da infraestrutura e os parâmetros do sistema. Entretanto, aspectos negociais não cabe a este documento sendo necessário buscar tais informações no Documento Negocial.

A cada nova release este documento será alterado para refletir as melhorias sugeridas e para dar suporte as novas modificações realizadas no sistema.

© 2022-2023 Universidade Federal do Rio Grande do Norte

Cópias deste documento podem ser feitas para seu próprio uso e para distribuição a outros, desde que você não cobre nenhuma taxa por tais cópias e desde que cada cópia contenha este Aviso de Direitos Autorais, se distribuído impresso ou eletronicamente.

1. Introdução

O sistema Polare trata-se do gerenciador do PGD - Programa de Gestão de Desempenho dos servidores da técnico administrativo em educação e dos servidores com função de gestão da UFRN, regido pela resolução 011/2022 - CONSAD/UFRN e pela IN 65 de 30 de julho de 2020. Onde, a resolução 011/2022 tem por finalidade disciplinar a execução das atividades da força de trabalho, buscando a eficiência e a qualidade na prestação dos serviços ao usuário.

1.1. Dependências de infraestrutura

  • Java 17 [1]

  • PostgreSQL 13 [2]

  • Tomcat 9.0.x [3]

  • APIs REST que forneça dados sobre servidores, unidades e usuários. A implementação padrão usa os serviços REST da UFRN. Para mais detalhes consulte esta tabela.

Tabela 1. APIs da UFRN utilizadas
Serviço REST Versão

arquivo-services

1.3.0

security-services-v1

3.1

pessoa-services

1.16.0

unidade-services

1.9

usuario-services

1.7

Este guia foi desenvolvido pensando em um utilizador com o sistema operacional Linux Ubuntu 22.04.2 LTS [4].

1.2. Frameworks utilizados

Framework Versão

Spring-boot

2.7.7

Spring-session

2.7.0

JPA

2.2.3

Flyway

8.5.13

1.3. Estrutura do projeto

polare diagram
Figura 1. Hierarquia de dependência entre os módulos do sistema

1.4. Detalhes de implementação

O springboot é o framework base do Polare e foi escolhido por ser o framework com a maior base de conhecimento e adoção dentro da comunidade Java. Assim, toda a parte de comunicação REST, camada de banco de dados autenticação OAuth e segurança estão sendo fornecidas pelo Spring.

1.4.1. Sessão do usuário

A sessão do usuário está sendo salva no banco de dados nas tabelas spring_session e spring_session_attributes. O responsável por realizar este gerenciamento é o spring-session.

A vantagem desta abordagem é que mesmo que o tomcat pare de funcionar o usuário logado não vai perder o conteúdo da sessão. Assim, quando o tomcat for estartado novamente o usuário poderá continuar de onde parou.

1.4.2. Parâmetros

Como o spring é base do sistema, consultado Parâmetros irá observar que usamos muitos parâmetros do próprio spring e sempre começam com spring..

Os parâmetros que adicionamos para definir comportamentos do sistema ou comportamentos negociais estão com o prefixo app..

1.4.3. Integração com gov.br

O Polare suporta o login via gov.br, para tal, é preciso solicitar as credências de acesso em manual-roteiro-integracao-login-unico.servicos.gov.br/pt/stable/. Depois de receber as credenciais, consulte Autenticação de usuários via gov.br para mais detalhes sobre a configuração dos parâmetros necessários para o govbr.

1.5. Logotipos

1.5.1. Instruções para uso de logotipos

Este material tem como objetivo orientar as instituições que adotaram o sistema Polare e necessitam alterar o logotipo da UFRN para o seu próprio em áreas específicas ao longo do site/aplicativo, sendo dividido em três seções:

  • Formato (do arquivo do logotipo).

  • Espaçamento.

  • Usos indevidos.

Para maiores detalhes sobre as seções citadas acima, acesse este documento.

Espera-se que esse conteúdo possa contemplar possíveis dúvidas que venham surgir em relação às substituições de logotipos no sistema.

1.5.2. Implementação no código-fonte

A alteração dos logotipos podem ser feitas através do arquivo application.yml, localizado no seguinte caminho:

Polarepolare-domainpolare-rest-consumerpolare-persistencepolare-migrationpolare-frontend-sharedpolare-frontend-restritosrcmainresourcesapplication.ymlpolare-frontend-publicopolare-docs

Dentro do arquivo application.yml é necessário alterar as variáveis logo-login e logo-rodape pelos diretórios onde os arquivos dos logotipos estão localizados, com o nome do arquivo e sua extensão, como no código a seguir:

    logo-login: "static/img/logo-login.svg"
    logo-rodape: "static/img/logo-rodape.svg"

2. Código-fonte

O código-fonte do projeto está localizado no repositório Git[5]. O procedimento para fazer download do código-fonte do sistema será através da ferramenta de linha de comando git.

O primeiro passo é instalar o Git através do utilitário apt[6], o gerenciador de pacotes do Ubuntu.

apt update && apt install git

O comando abaixo fará download do projeto através do git clone. Em seguida faremos a mudança de tag para a versão desejada que será a base dos processos seguintes.

Cooperação
mkdir ~/polare-projeto
cd ~/polare-projeto
git clone https://gitcooperacao.info.ufrn.br/referencia/polare.git
cd polare
git checkout release_1.0.0 -b release_1.0.0
UFRN
mkdir ~/polare-projeto
cd ~/polare-projeto
git clone https://gitdesenvolvimento.info.ufrn.br/dev/polare.git
cd polare
# Na UFRN usamos a master para deploy em produção

Branch ou Tag?

As branchs fazem parte do dia a dia do desenvolvimento de software e agem como ponteiro para um conjunto de modificações de um desenvolvedor. Quando se deseja adicionar um novo recurso ou corrigir um bug, não importa quão grande ou pequeno, o desenvolvedor gera uma nova branch para encapsular suas alterações. A branch pode ser alterada a qualquer instante.

A Tag geralmente é usada para capturar um ponto na história para marcar um lançamento de versão, por exemplo, release_1.0.0. Uma tag é como uma branch que não muda. Ao contrário das branchs, as tags, depois de criadas, não mudam mais.

O comando git checkout release_1.0.0 -b release_1.0.0 faz o download da tag release_1.0.0 e imediatamente cria uma branch local com o mesmo nome.

Se desejar listar todas as versões disponíveis no repositório Git e escolher outra versão em particular, após clonar e entrar no diretório polare execute o comando:

git tag -l

O resultado será uma lista de todas as tags remotas que estão no repositório Git, onde cada tag representa uma versão do sistema. Escolha a tag que deseja e execute git checkout para ela.

3. Processo de build

Agora que temos o código-fonte do Polare iremos iniciar o processo de build. O build (construção em português), no contexto do desenvolvimento de software, é o processo ou o resultado da conversão dos arquivos de código-fonte em um ou mais artefatos de software que podem ser executados em um computador.

Nesta etapa iremos utilizar o Maven [7], uma ferramenta de automação de compilação utilizada amplamente em projetos Java. Ao final deste processo será gerado os artefatos que serão usados no deploy.

Todos os detalhes sobre deploy serão tratados mais adiante, mas resumindo é importante dizer que ao final do processo de build serão gerados arquivos de extensão .jar e .war. Estes artefatos possuem finalidades distintas de acordo com tipo de deploy que será usado:

  • O .jar do polare possui o tomcat embarcado, então ele é muito útil para ambientes conteinerizados, seja simplesmente com o Docker ou em um ambiente mais complexo com o Kubernetes.

  • O .war por sua vez é interessante para instalações tradicionais, onde é usado máquinas virtuais ou físicas com Tomcat instalado. Este arquivo é então colocado dentro da pasta webapp do Tomcat para ser realizado o deploy.

Mas, afinal, o que é .jar e .war?

Um arquivo JAR (Java ARchive) é um formato de pacote de arquivo normalmente usado para agregar muitos arquivos de classe Java, metadados e recursos associados (texto, imagens, etc.) em um arquivo para distribuição. Arquivos JAR são arquivos compactados que incluem um arquivo de manifesto específico de Java. Eles são construídos no formato ZIP e geralmente têm uma extensão de arquivo .jar.

O arquivo WAR (Web Application Resource ou Web application ARchive) é um arquivo usado para distribuir uma coleção de arquivos JAR, JavaServer Pages (JSP), Java Servlets, classes Java, arquivos XML, bibliotecas de tags, páginas web estáticas (HTML e arquivos relacionados) e outros recursos que juntos constituem uma aplicação web.

Para realizar o build vamos utilizar o Maven que está embarcado dentro do projeto do Polare, assim não precisaremos nos preocupar em baixar e instalar o Maven manualmente na máquina.

Dentro do aquivo pom.xml, que é onde reside toda a configuração do Maven, constam dois profiles chamados war e jar. Eles são os responsáveis pela geração dos respectivos artefatos .war e .jar.

O parâmetro -P indica ao Maven quais profiles queremos utilizar, neste caso war ou jar.

jar
cd ~/polare-projeto/polare
./mvnw spring-javaformat:apply clean install -Pjar -B -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Ddependency-check.skip=true
war
cd ~/polare-projeto/polare
./mvnw spring-javaformat:apply clean install -Pwar -B -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Ddependency-check.skip=true

Dentre todos os arquivos gerados neste processo de build o que irá nos interessar no momento são os artefatos dos módulos polare-frontend-restrito e polare-frontend-publico:

jar
polare/polare-frontend-restrito/target/polare-frontend-restrito.jar
polare/polare-frontend-publico/target/polare-frontend-publico.jar
war
polare/polare-frontend-restrito/target/polare-frontend-restrito.war
polare/polare-frontend-publico/target/polare-frontend-publico.war
O pom.xml é um dos arquivos mais importantes em um projeto Maven, ele descreve uma série de configurações que o projeto terá e quais repositórios e dependências seu projeto irá precisar.

4. Parâmetros

Objetivo desta seção é descrever os parâmetros essenciais do sistema.

No java parâmetros são passados para JVM através do prefix -D, exemplo -Dspring.datasource.username=polare.

4.1. Datasource

Nome do parâmetro Valor possível Descrição

spring.datasource.username

*

Informa ao spring framework qual usuário do banco de dados que ele irá usar para se conectar ao banco de dados do Polare.

spring.datasource.password

*

Informa ao spring framework qual a senha do usuário do banco de dados que ele irá usar para se conectar ao banco de dados do Polare.

spring.datasource.url

jdbc:postgresql://<url_do_banco>:5432/<nome_do_banco>

Informa ao spring framework qual a URL do banco de dados que ele irá usar para se conectar ao banco de dados do Polare.

4.2. OAuth Provider da UFRN

Nome do parâmetro Valor possível Descrição

spring.security.oauth2.client.provider.ufrn.authorization-uri

URL

Define a url de autorização do OAuth. Para iniciar a autenticação, o polare precisa enviar os dados do usuário para esta URL.

spring.security.oauth2.client.provider.ufrn.

URL

Define a URL do serviço de token do OAuth.

spring.security.oauth2.client.provider.ufrn.user-info-uri

URL

Endpoint que vai retornar informações a respeito do usuário que esta efetuando o login.

spring.security.oauth2.client.provider.ufrn.user-name-attribute

pessoa

O atributo de identificação do usuário que vem na resposta da autenticação

4.3. Autenticação de usuários via SSO/OAuth fornecida pela UFRN

Nome do parâmetro Valor possível Descrição

spring.security.oauth2.client.registration.ufrn.client-id

*

O client-id é um identificador para aplicativos. Aqui deve usar o client-id que foi cadastrado no OAuth.

spring.security.oauth2.client.registration.ufrn.client-secret

*

O client-secret é uma senha que deve ser conhecido apenas pelo polare e pelo servidor de autorização. Aqui deve usar o client-secret que foi cadastrado no OAuth.

spring.security.oauth2.client.registration.ufrn.scope

read

Define o tipo de escopo

spring.security.oauth2.client.registration.ufrn.authorization-grant-type

authorization_code

Define o tipo de flow do OAuth. authorization_code normalmente é usado para autenticação por usuários.

spring.security.oauth2.client.registration.ufrn.redirect-uri

authorization_code

Define o tipo de flow do OAuth. authorization_code normalmente é usado para autenticação por usuários.

spring.security.oauth2.client.registration.ufrn.redirect-uri

URL

Um request para a URL definida em redirect-uri irá iniciar Authorization Request.

app.auth.logout.ufrn.logout-uri

URL

URL do OAuth que irá encerrar o login do usuário

4.4. Autenticação de usuários via gov.br

Nome do parâmetro Valor possível Descrição

spring.security.oauth2.client.registration.govbr.client-id

*

O client-id é um identificador para aplicativos. Aqui deve usar o client-id que foi cadastrado no OAuth.

spring.security.oauth2.client.registration.govbr.client-secret

*

O client-secret é uma senha que deve ser conhecido apenas pelo polare e pelo servidor de autorização. Aqui deve usar o client-secret que foi cadastrado no OAuth.

spring.security.oauth2.client.registration.govbr.scope

openid+(email/phone)+profile+govbr_empresa+govbr_confiabilidades

Define o tipo de escopo

spring.security.oauth2.client.registration.govbr.authorization-grant-type

authorization_code

Define o tipo de flow do OAuth. authorization_code normalmente é usado para autenticação por usuários.

spring.security.oauth2.client.registration.govbr.redirect-uri

authorization_code

Define o tipo de flow do OAuth. authorization_code normalmente é usado para autenticação por usuários.

spring.security.oauth2.client.provider.govbr.authorization-uri

URL

Define a url de autorização do OAuth. Para iniciar a autenticação, o polare precisa enviar os dados do usuário para esta URL.

spring.security.oauth2.client.provider.govbr.token-uri

URL

Define a URL do serviço de token do OAuth.

spring.security.oauth2.client.provider.govbr.jwk-set-uri

URL

spring.security.oauth2.client.provider.govbr.user-info-uri

URL Endpoint que vai retornar informações a respeito do usuário que esta efetuando o login.

spring.security.oauth2.client.provider.govbr.user-name-attribute

4.5. Autenticação aos serviços da API

Nome do parâmetro Valor possível Descrição

spring.security.oauth2.client.registration.ufrn-api.provider

ufrn

Esse parâmetro serve para herdar todos os parâmetros definidos em <<>>. Como a API da UFRN usa o mesmo servidor OAuth usado para login de usuários, podemos reaproveitar estes parâmetros.

spring.security.oauth2.client.registration.ufrn-api.client-id

*

spring.security.oauth2.client.registration.ufrn-api.client-secret

*

spring.security.oauth2.client.registration.ufrn-api.authorization-grant-type

client_credentials

Define o tipo de flow do OAuth. client_credentials normalmente é usado para autenticação entre aplicações.

4.6. API de serviços remotos

Nome do parâmetro Valor possível Descrição

app.api.ufrn.api-key

*

Chave para conseguir consultar os serviços da API

app.api.ufrn.services.arquivos

URL

app.api.ufrn.services.unidades

URL

app.api.ufrn.services.responsaveis

URL

app.api.ufrn.services.servidor-localizacoes

URL

app.api.ufrn.services.usuarios-sig

URL

app.api.ufrn.services.servidores

URL

app.api.ufrn.services.unidades-lotacao

URL

app.api.ufrn.services.pessoas

URL

app.api.ufrn.services.unidade-complementar

URL

4.7. Parâmetros negociais

Nome do parâmetro Valor possível Descrição

app.parametro-negocial.utiliza-plano-individual

true,false

app.parametro-negocial.utiliza-planejamento-institucional

true,false

app.parametro-negocial.utiliza-horario-funcionamento-unidade

true,false

Define se o horarário de funcionamento da unidade será utilizado no Plano Gerencial. Em caso positivo, haverá validações no cadastro de horário do servidor, impedindo o cadastro de horário divergente do horário de funcionamento.

4.8. Email

Nome do parâmetro Valor possível Descrição

app.email.estrategia

smtp, disabled

app.email.from-name

*

app.email.from-email

*

app.email.reply-email

*

4.9. Outros

Nome do parâmetro Valor possível Descrição

app.polare-publico-url

URL

URL para acessar o portal público

app.images.logo-login

File System

Caminho local do arquivo logotipo de login svg

app.images.logo-rodape

File System

Caminho local do arquivo logotipo de rodapé svg

5. Banco de dados

CREATE ROLE polare_group;
CREATE USER polare WITH PASSWORD 'polare';
GRANT polare_group TO polare;
CREATE DATABASE polare OWNER polare_group;

A criação de esquemas e tabelas é feito pelo próprio Polare durante o startup do sistema. O framework Flyway é o responsável pela execução dos scripts de sql. Desde que os parâmetros de datasource estejam configurados corretamente, tudo será executado.

6. Implantação

Aqui colocamos duas formas de fazer a implantação: tradicional ou containers. Na UFRN apesar de usarmos containers para a API e boa parte dos sites da instituição, para a maioria dos sistemas ainda usamos a forma tradicional abordada aqui, porém criamos a seção Ambiente de container para ajudar as instituições que desejam seguir essa abordagem.

No guia ensinamos como gerar certificados autoassinados, mas para o ambiente de produção não é o recomendado. Solicite ao responsável da sua instituição os certificados assinados.
Iremos usar o conceito de Terminação TLS/SSL, ou seja, apenas o proxy possuirá certificados.

6.1. Ambiente tradicional

Por Ambiente tradicional nos referimos a uma infraestrutura rodando em máquinas físicas ou virtuais e que era o modelo mais comum vigente na internet antes da popularização de soluções como Kubernetes, Docker Swarn, Hashicorp Nomad, etc.

É uma boa prática executar sistemas de forma isolada. Assim evitamos, por exemplo, o risco caso aconteça um pico de usuários no portal público a nossa area restrita seja afetada ou que uma eventual falha de segurança em um sistema tenha consequência em outros sistemas.

Outra vantagem é que podemos provisionar recursos conforme a demanda que o sistema específico necessite.

Então neste guia optamos por executar o polare-restrito e o polare-publico em máquinas virtuais diferentes.

6.1.1. Pré-requisitos

  • Possuir duas máquinas virtuais ou físicas com sistema operacional Ubuntu Server 22.04 LTS para execução do Tomcat. Vamos convencionar e chamar elas de polare-restrito.instituicao.br e polare-publico.instituicao.br;

  • Possuir uma máquina virtual ou física com o sistema operacional Ubuntu Server 22.04 LTS.para execução do HAProxy. Vamos convencionar e chamar ela de polare.instituicao.br.

  • Ter executado os comandos de criação da base de dados;

  • Ter executado o processo de build;

  • Ler o Apêndice Tomcat;

6.1.2. Os artefatos

Como discutido anteriormente, durante o processo de build dois tipos de artefatos podem ser gerados, .war ou .jar, dependendo do profile do maven escolhido. Para este modelo de deploy que convencionamos chamar de Ambiente tradicional, o tipo de artefato que nos interessa é o .war.

Dessa forma, consultando a listagem de artefatos produzidas vamos nos concentrar nos seguintes artefatos:

polare/polare-frontend-restrito/target/polare-frontend-restrito.war
polare/polare-frontend-publico/target/polare-frontend-publico.war

6.1.3. Configuração dos parâmetros

Aqui está um exemplo com os parâmetros mínimos para execução do polare que devem ser colocados dentro do arquivo tomcat/bin/setenv.sh. Mais informações sobre este arquivo foi descrito no apêndice do tomcat na seção Arquivo setenv.sh.

A intenção desse conjunto de parâmetros que disponibilizamos é para dar agilidade ao processo de implantação do Polare. Na seção Parametrização todos eles são detalhados, além de outros parâmetros que podem ser escolhidos. As linhas que possuem um número associado precisam ser substituídos conforme os parâmetros de sua instituição.

Na listagem abaixo tem dois conjuntos de parâmetros, um conjunto deve ser usado no setenv.sh do host polare-restrito e o outro conjunto de parâmetros no host do polare-publico.

polare-restrito
# setenv.sh do host polare-restrito
export JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m" (1)
export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.username=polare" (2)
export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.password=polare" (3)
export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.url=jdbc:postgresql://bd-polare.instituicao.br:5432/polare" (4)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.provider=ufrn"
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.client-id=polare-id" (5)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.client-secret=segredo" (6)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.authorization-grant-type=client_credentials"
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn.client-id=polare-id" (7)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn.client-secret=segredo" (8)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn.scope=read"
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn.authorization-grant-type=authorization_code"
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn.redirect-uri='https://polare.instituicao.br/polare/login/oauth2/code/ufrn'" (9)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.authorization-uri='https://autenticacao.instituicao.br/authz-server/oauth/authorize'" (10)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.token-uri='https://autenticacao.instituicao.br/authz-server/oauth/token'" (11)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.user-info-uri='https://api.instituicao.br/security/services/usuario/info'" (12)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.user-name-attribute=pessoa"
export JAVA_OPTS="$JAVA_OPTS -Dapp.auth.logout.ufrn.logout-uri='https://autenticacao.instituicao.br/authz-server/j_spring_cas_security_logout?service=https://polare.instituicao.br/polare'" (13)
export JAVA_OPTS="$JAVA_OPTS -Dapp.auth.logout.govbr.logout-uri='https://sso.staging.acesso.gov.br/logout?post_logout_redirect_uri=https://polare.instituicao.br/polare'" (14)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.api-key=segredo"  (15)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.arquivos=https://api.instituicao.br/file/v1/arquivos" (16)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades=https://api.instituicao.br/unidade/v1/unidades" (17)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.responsaveis=https://api.instituicao.br/pessoa/v1/responsaveis" (18)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.servidor-localizacoes=https://api.instituicao.br/pessoa/v1/localizacoes-servidores" (19)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.usuarios-sig=https://api.instituicao.br/usuario/v1/usuarios" (20)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.servidores=https://api.instituicao.br/pessoa/v1/servidores" (21)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades-lotacao=https://api.instituicao.br/pessoa/v1/unidades-lotacao" (22)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades-exercicios=https://api.instituicao.br/pessoa/v1/unidades-exercicios" (23)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades-localizacao=https://api.instituicao.br/pessoa/v1/unidades-localizacao" (24)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.pessoas=https://api.instituicao.br/pessoa/v1/pessoas" (25)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidade-complementar=https://api.instituicao.br/unidade-complementar/v2/unidades" (26)
export JAVA_OPTS="$JAVA_OPTS -Dapp.polare-publico-url=https://polare.instituicao.br/publico" (27)
export JAVA_OPTS="$JAVA_OPTS -Dapp.email.from-name=sistema-polare"
export JAVA_OPTS="$JAVA_OPTS -Dapp.email.from-email=naoresponder@instituicao.br"
export JAVA_OPTS="$JAVA_OPTS -Dapp.email.reply-email=naoresponder@instituicao.br"
export JAVA_OPTS="$JAVA_OPTS -Dapp.email.estrategia=disabled"
1 Ajuste a quantidade de memória para JVM. Um bom começo é 70% da memória total disponível do host.
2 Usuário do banco deve ser alterado.
3 Senha do banco deve ser alterado.
4 URL do banco deve ser alterado.
5 ID do cliente OAuth deve ser alterado. Este cliente é o responsável por consultas na API.
6 Senha do cliente OAuth deve ser alterado. Este cliente é o responsável por consultas na API.
7 Id do cliente OAuth deve ser alterado. Este cliente é o responsável pelo login do sistema.
8 Senha do cliente OAuth deve ser alterado. Este cliente é o responsável pelo login do sistema.
9 Mudar apenas a url do Host /polare em diante não muda.
10 URL do authorize do OAuth.
11 URL do token do OAuth.
12 URL do serviço onde o OAuth vai buscar informações do usuário que esta logando.
13 URL que vai usada como redirect após o logout.
14 URL que vai usada como redirect após o logout.
15 Senha do API-Key.
16 Serviço de arquivos.
17 Serviço de unidades.
18 Serviços de responsáveis por unidade.
19 Serviços com a localização dos servidores.
20 Serviço de usuários.
21 Serviços de servidores.
22 Serviço para unidades de lotação.
23 Serviço para unidades de exercício.
24 Serviço para unidades de localização.
25 Serviço para retornar dados pessoais.
26 Serviço para retornar dados complementares de unidades.
27 URL do portal público.
polare-publico
# setenv.sh do host polare-publico
export JAVA_OPTS="$JAVA_OPTS -server -Xms1024m -Xmx1024m" (1)
export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.username=polare" (2)
export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.password=polare" (3)
export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.url=jdbc:postgresql://bd-polare.instituicao.br:5432/polare" (4)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.provider=ufrn"
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.client-id=polare-id" (5)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.client-secret=segredo" (6)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.authorization-grant-type=client_credentials"
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.authorization-uri=https://autenticacao.instituicao.br/authz-server/oauth/authorize" (7)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.token-uri=https://autenticacao.instituicao.br/authz-server/oauth/token" (8)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.user-info-uri=https://api.instituicao.br/security/services/usuario/info" (9)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.user-name-attribute=pessoa"
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.api-key=segredo" (10)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.arquivos=https://api.instituicao.br/file/v1/arquivos" (11)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades=https://api.instituicao.br/unidade/v1/unidades" (12)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.responsaveis=https://api.instituicao.br/pessoa/v1/responsaveis" (13)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.servidor-localizacoes=https://api.instituicao.br/pessoa/v1/localizacoes-servidores" (14)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.usuarios-sig=https://api.instituicao.br/usuario/v1/usuarios" (15)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.servidores=https://api.instituicao.br/pessoa/v1/servidores" (16)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades-lotacao=https://api.instituicao.br/pessoa/v1/unidades-lotacao" (17)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades-exercicios=https://api.instituicao.br/pessoa/v1/unidades-exercicios" (18)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades-localizacao=https://api.instituicao.br/pessoa/v1/unidades-localizacao" (19)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.pessoas=https://api.instituicao.br/pessoa/v1/pessoas" (20)
export JAVA_OPTS="$JAVA_OPTS -Dapp.polare-url=https://polare.instituicao.br/polare/" (21)
1 Ajuste a quantidade de memória para JVM. Um bom começo é 70% da memória total disponível do host.
2 Usuário do banco deve ser alterado
3 Senha do banco deve ser alterado
4 URL do banco deve ser alterado
5 ID do cliente OAuth deve ser alterado
6 Senha do cliente OAuth deve ser alterado
7 URL do authorize do OAuth
8 URL do token do OAuth
9 URL do serviço onde o OAuth vai buscar informações do usuário que esta logando
10 Senha do API-Key
11 Serviço de arquivos
12 Serviço de unidades
13 Serviços de responsáveis por unidade
14 Serviços com a localização dos servidores
15 Serviço de usuários
16 Serviços de servidores
17 Serviço para unidades de lotação
18 Serviço para unidades de exercício
19 Serviço para unidades de localização
20 Serviço para retornar dados pessoais
21 URL da area restrita do Polare

6.1.4. Deploy

Copie os artefatos para os respectivos hosts remotos:

  • polare-frontend-restrito.warpolare-restrito.instituicao.br

  • polare-frontend-publico.warpolare-publico.instituicao.br

Partindo do diretório polare-projeto — que foi criado na seção Código-fonte e compilado em Processo de build —  os artefatos estão em:

Caminho para os artefatos .war
polare/polare-frontend-restrito/target/polare-frontend-restrito.war
polare/polare-frontend-publico/target/polare-frontend-publico.war

Após realizada a cópia dos artefatos, é preciso fazer um ajuste nos nomes dos artefatos. A mudança no nome do artefato é necessária porque o tomcat usa o nome do artefato .war ser o nome contexto web.

polare-restito
mv polare-frontend-restrito.war polare.war (1)
1 polare-restrito.instituicao.br:8080/polare
polare-publico
mv polare-frontend-publico.war publico.war (1)
1 polare-publico.instituicao.br:8080/publico

Após realizado o ajuste nos nomes dos artefatos mova cada artefato para o diretório /usr/local/tomcat/webapps/ em seu respectivo host.

Após mover o .war para pasta webapps, não esqueça de ajustar o owner dos novos arquivos para tomcat com o comando chown -R tomcat: /usr/local/tomcat/webapss/.
systemctl restart tomcat

O tomcat irá detectar o arquivo e vai iniciar a aplicação web automaticamente.

Acompanhe se o deploy foi bem-sucedido ou não através do arquivo /usr/local/tomcat/logs/catalina.out.

6.1.5. Proxy

Usaremos o HAProxy como proxy reverso e balanceador de carga, consulte o apêndice Instalação do HAProxy para mais detalhes sobre instalação.

O arquivo /etc/haproxy/haproxy.cfg é onde reside toda a configuração que precisamos ajustar. Edite este arquivo e coloque o conteúdo:

global
  log /dev/log local0
  log /dev/log local1 notice
  user haproxy
  group haproxy
  daemon
  ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:AES256-SHA
  ssl-default-bind-ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:TLS_RSA_WITH_AES_256_GCM_SHA384:TLS_RSA_WITH_AES_256_CBC_SHA
  ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets

defaults
  mode http
  log global
  option httplog
  option dontlognull
  option http-keep-alive
  option redispatch
  timeout connect 600s
  timeout client  600s
  timeout server  600s
  timeout http-keep-alive 600s
  errorfile 400 /etc/haproxy/errors/400.http
  errorfile 403 /etc/haproxy/errors/403.http
  errorfile 408 /etc/haproxy/errors/408.http
  errorfile 500 /etc/haproxy/errors/500.http
  errorfile 502 /etc/haproxy/errors/502.http
  errorfile 503 /etc/haproxy/errors/503.http
  errorfile 504 /etc/haproxy/errors/504.http

frontend stats
  bind *:1936 ssl crt /etc/ssl/private/polare-bundle.pem verify none ssl-min-ver TLSv1.2 alpn h2,http/1.1
  mode http
  stats enable
  stats uri /stats
  stats refresh 10s
  stats show-legends
  no log
  stats auth stats_user:HeJ35U8xX9Rk # IMPORTANTE: Mude essa senha (1)

frontend fe_polare
  option forwardfor
  acl is_root path /
  acl is_polare_restrito path_beg /polare
  acl is_polare_publico path_beg /publico
  mode http
  bind *:80
  bind *:443 ssl crt /etc/ssl/private/polare-bundle.pem verify none
  http-request redirect scheme https unless { ssl_fc }
  http-request redirect code 301 location https://%[hdr(host)]/polare if is_root
  http-response set-header Strict-Transport-Security max-age=63072000
  use_backend polare_restrito_servers if is_polare_restrito
  use_backend polare_publico_servers if is_polare_publico

backend polare_restrito_servers
  mode http
  balance roundrobin
  server polare-restrito  ip_do_host_polare-restrito:8080 (2)


backend polare_publico_servers
  mode http
  balance roundrobin
  server polare-publico  ip_do_host_polare-publico:8080 (3)
1 Use uma senha única
2 Substitua pelo IP correto
3 Substitua pelo IP correto

O HAProxy espera receber um arquivo que concatene o certificado do domínio, os certificados de CA intermediários (se houver) e a chave privada. Ensinamos a gerar esse aquivo em Bundle.

Consulte o responsável pelos certificados da sua instituição para obter os arquivos necessários. Pois o uso de certificados autoassinados para o ambiente de produção não é uma boa prática. Somente é justificável para ambientes de testes.

Para finalizar restarte o HAProxy e as urls polare.instituicao.br e polare.instituicao.br/publico devem estar disponíveis se tudo der certo.

systemctl restart haproxy

6.2. Ambiente de container

6.2.1. Pré-requisitos

  • Ler o apêndice Instalação do Docker;

  • Possuir um certificado SSL/TLS. Caso não possua consulte Certificados Autoassinados;

  • Possuir uma máquina virtual ou física com o sistema operacional Ubuntu Server 22.04 LTS.para execução do Docker. Vamos convencionar e chamá-la de polare-docker.instituicao.br.

6.2.2. Rede virtual

Crie uma rede virtual no Docker para conectar os containers que vamos criar mais adiante.

docker network create --driver=bridge polare_network

6.2.3. Construção das imagens

Entre no diretório polare-projeto (criado em Código-fonte) e crie o arquivo Dockerfile com o conteúdo abaixo.

cd ~/polare-projeto/
touch Dockerfile
Conteúdo do Dockerfile
FROM eclipse-temurin:17-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"]

Realize a construção da imagem do sistema que desejar fazer a implantação passando como argumento pelo parâmetro JAR_FILE.

polare-restrito
docker build --build-arg JAR_FILE=polare/polare-frontend-restrito/target/polare-frontend-restrito.jar -t instituicao/polare-frontend-restrito .
polare-publico
docker build --build-arg JAR_FILE=polare/polare-frontend-publico/target/polare-frontend-publico.jar -t instituicao/polare-frontend-publico.jar .

6.2.4. Execução do Tomcat

Execute os containers com o comando abaixo. Note que o polare-restrito sobe na porta 8080 e polare-publico na porta 8081.

polare-restrito
export JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m"
export JAVA_OPTS="$JAVA_OPTS -Dserver.servlet.context-path=/polare"
export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.username=polare" (1)
export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.password=polare" (2)
export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.url=jdbc:postgresql://bd-polare.instituicao.br:5432/polare" (3)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.provider=ufrn"
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.client-id=polare-id" (4)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.client-secret=segredo" (5)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.authorization-grant-type=client_credentials"
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn.client-id=polare-id" (6)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn.client-secret=segredo" (7)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn.scope=read"
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn.authorization-grant-type=authorization_code"
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn.redirect-uri=https://polare.instituicao.br/polare/login/oauth2/code/ufrn" (8)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.authorization-uri=https://autenticacao.instituicao.br/authz-server/oauth/authorize" (9)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.token-uri=https://autenticacao.instituicao.br/authz-server/oauth/token" (10)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.user-info-uri=https://api.instituicao.br/security/services/usuario/info" (11)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.user-name-attribute=pessoa"
export JAVA_OPTS="$JAVA_OPTS -Dapp.auth.logout.ufrn.logout-uri=https://autenticacao.instituicao.br/authz-server/j_spring_cas_security_logout?service=https://polare.instituicao.br/polare" (12)
export JAVA_OPTS="$JAVA_OPTS -Dapp.auth.logout.govbr.logout-uri=https://sso.staging.acesso.gov.br/logout?post_logout_redirect_uri=https://polare.instituicao.br/polare" (13)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.api-key=segredo"  (14)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.arquivos=https://api.instituicao.br/file/v1/arquivos" (15)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades=https://api.instituicao.br/unidade/v1/unidades" (16)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.responsaveis=https://api.instituicao.br/pessoa/v1/responsaveis" (17)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.servidor-localizacoes=https://api.instituicao.br/pessoa/v1/localizacoes-servidores" (18)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.usuarios-sig=https://api.instituicao.br/usuario/v1/usuarios" (19)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.servidores=https://api.instituicao.br/pessoa/v1/servidores" (20)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades-lotacao=https://api.instituicao.br/pessoa/v1/unidades-lotacao" (21)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades-exercicios=https://api.instituicao.br/pessoa/v1/unidades-exercicios" (22)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades-localizacao=https://api.instituicao.br/pessoa/v1/unidades-localizacao" (23)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.pessoas=https://api.instituicao.br/pessoa/v1/pessoas" (24)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidade-complementar=https://api.instituicao.br/unidade-complementar/v2/unidades" (25)
export JAVA_OPTS="$JAVA_OPTS -Dapp.polare-publico-url=https://polare.instituicao.br/publico" (26)
export JAVA_OPTS="$JAVA_OPTS -Dapp.email.from-name=sistema-polare"
export JAVA_OPTS="$JAVA_OPTS -Dapp.email.from-email=naoresponder@instituicao.br"
export JAVA_OPTS="$JAVA_OPTS -Dapp.email.reply-email=naoresponder@instituicao.br"
export JAVA_OPTS="$JAVA_OPTS -Dapp.email.estrategia=disabled"

docker run -d -p 8080:8080 \
  --name polare_restrito \
  --net polare_network \
  -e "JAVA_OPTS=$JAVA_OPTS" \
  instituicao/polare-frontend-restrito

unset JAVA_OPTS
1 Usuário do banco deve ser alterado
2 Senha do banco deve ser alterado
3 URL do banco deve ser alterado
4 ID do cliente OAuth deve ser alterado. Este cliente é o responsável por consultas na API
5 Senha do cliente OAuth deve ser alterado. Este cliente é o responsável por consultas na API
6 Id do cliente OAuth deve ser alterado. Este cliente é o responsável pelo login do sistema.
7 Senha do cliente OAuth deve ser alterado. Este cliente é o responsável pelo login do sistema.
8 Mudar apenas a url do Host /polare em diante não muda
9 URL do authorize do OAuth
10 URL do token do OAuth
11 URL do serviço onde o OAuth vai buscar informações do usuário que esta logando
12 URL que vai usada como redirect após o logout
13 URL que vai usada como redirect após o logout
14 Senha do API-Key
15 Serviço de arquivos
16 Serviço de unidades
17 Serviços de responsáveis por unidade
18 Serviços com a localização dos servidores
19 Serviço de usuários
20 Serviços de servidores
21 Serviço para unidades de lotação
22 Serviço para unidades de exercício
23 Serviço para unidades de localização
24 Serviço para retornar dados pessoais
25 Serviço para retornar dados complementares de unidades.
26 URL do portal público
polare-publico
export JAVA_OPTS="$JAVA_OPTS -server -Xms1024m -Xmx1024m"
export JAVA_OPTS="$JAVA_OPTS -Dserver.servlet.context-path=/publico"
export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.username=polare" (1)
export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.password=polare" (2)
export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.url=jdbc:postgresql://bd-polare.instituicao.br:5432/polare" (3)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.provider=ufrn"
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.client-id=polare-id" (4)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.client-secret=segredo" (5)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.registration.ufrn-api.authorization-grant-type=client_credentials"
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.authorization-uri=https://autenticacao.instituicao.br/authz-server/oauth/authorize" (6)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.token-uri=https://autenticacao.instituicao.br/authz-server/oauth/token" (7)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.user-info-uri=https://api.instituicao.br/security/services/usuario/info" (8)
export JAVA_OPTS="$JAVA_OPTS -Dspring.security.oauth2.client.provider.ufrn.user-name-attribute=pessoa"
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.api-key=segredo" (9)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.arquivos=https://api.instituicao.br/file/v1/arquivos" (10)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades=https://api.instituicao.br/unidade/v1/unidades" (11)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.responsaveis=https://api.instituicao.br/pessoa/v1/responsaveis" (12)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.servidor-localizacoes=https://api.instituicao.br/pessoa/v1/localizacoes-servidores" (13)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.usuarios-sig=https://api.instituicao.br/usuario/v1/usuarios" (14)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.servidores=https://api.instituicao.br/pessoa/v1/servidores" (15)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades-lotacao=https://api.instituicao.br/pessoa/v1/unidades-lotacao" (16)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades-exercicios=https://api.instituicao.br/pessoa/v1/unidades-exercicios" (17)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.unidades-localizacao=https://api.instituicao.br/pessoa/v1/unidades-localizacao" (18)
export JAVA_OPTS="$JAVA_OPTS -Dapp.api.ufrn.services.pessoas=https://api.instituicao.br/pessoa/v1/pessoas" (19)
export JAVA_OPTS="$JAVA_OPTS -Dapp.polare-url=https://polare.instituicao.br/polare/" (20)

docker run -d -p 8081:8080 \
  --name polare_publico \
  --net polare_network \
  -e "JAVA_OPTS=$JAVA_OPTS" \
  instituicao/polare-frontend-publico.jar

unset JAVA_OPTS
1 Usuário do banco deve ser alterado
2 Senha do banco deve ser alterado
3 URL do banco deve ser alterado
4 ID do cliente OAuth deve ser alterado
5 Senha do cliente OAuth deve ser alterado
6 URL do authorize do OAuth
7 URL do token do OAuth
8 URL do serviço onde o OAuth vai buscar informações do usuário que esta logando
9 Senha do API-Key
10 Serviço de arquivos
11 Serviço de unidades
12 Serviços de responsáveis por unidade
13 Serviços com a localização dos servidores
14 Serviço de usuários
15 Serviços de servidores
16 Serviço para unidades de lotação
17 Serviço para unidades de exercício
18 Serviço para unidades de localização
19 Serviço para retornar dados pessoais
20 URL da area restrita do Polare

6.2.5. Proxy

Dentro do diretório polare-projeto, vamos fazer duas ações:

  1. Copie o bundle do seu certificado SSL/TSL para cá;

  2. Crie o arquivo haproxy.cfg.

cd ~/polare-projeto/
cp /etc/ssl/private/polare-bundle.pem .
touch haproxy.cfg

Edite este arquivo e coloque o seguinte conteúdo:

Conteúdo do haproxy.cfg
global
  log /dev/log local0
  log /dev/log local1 notice
  user haproxy
  group haproxy
  daemon
  ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:AES256-SHA
  ssl-default-bind-ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:TLS_RSA_WITH_AES_256_GCM_SHA384:TLS_RSA_WITH_AES_256_CBC_SHA
  ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets

defaults
  mode http
  log global
  option httplog
  option dontlognull
  option http-keep-alive
  option redispatch
  timeout connect 600s
  timeout client  600s
  timeout server  600s
  timeout http-keep-alive 600s

frontend stats
  bind *:1936 ssl crt /usr/local/etc/ssl/private/polare-bundle.pem verify none ssl-min-ver TLSv1.2 alpn h2,http/1.1
  mode http
  stats enable
  stats uri /stats
  stats refresh 10s
  stats show-legends
  no log
  stats auth stats_user:HeJ35U8xX9Rk # IMPORTANTE: Mude essa senha (1)

frontend fe_polare
  option forwardfor
  acl is_root path /
  acl is_polare_restrito path_beg /polare
  acl is_polare_publico path_beg /publico
  mode http
  bind *:80
  bind *:443 ssl crt /usr/local/etc/ssl/private/polare-bundle.pem verify none
  http-request redirect scheme https unless { ssl_fc }
  http-request redirect code 301 location https://%[hdr(host)]/polare if is_root
  http-response set-header Strict-Transport-Security max-age=63072000
  use_backend polare_restrito_servers if is_polare_restrito
  use_backend polare_publico_servers if is_polare_publico

backend polare_restrito_servers
  mode http
  balance roundrobin
  server polare-restrito polare_restrito:8080

backend polare_publico_servers
  mode http
  balance roundrobin
  server polare-publico polare_publico:8080
1 Use uma senha única
cd ~/polare-projeto/polare
docker run -d \
  --name haproxy \
  --net polare_network \
  -v $(pwd)/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro \
  -v $(pwd)/polare-bundle.pem:/usr/local/etc/ssl/private/polare-bundle.pem:ro \
  -p 80:80 \
  -p 443:443 \
  -p 1936:1936 \
  haproxytech/haproxy-alpine:2.4

Agora as URLs polare.instituicao.br e polare.instituicao.br/publico devem estar disponíveis se tudo der certo.

É necessário abrir as portas 80 e 443 no firewall local e no firewall de borda.

Apêndice A: Certificados Autoassinados

Essa seção é uma adaptação deste guia do DigitalOcean.

O TLS, ou Transport Layer Security, e seu antecessor SSL, que significa Secure Sockets Layer, são protocolos da web usados para agrupar o fluxo de dados normal em um invólucro protegido e criptografado.

Usando esta tecnologia, servidores podem enviar dados com segurança entre o servidor e o cliente porque mesmo que os dados sejam interceptados eles não podem ser lidos. O sistema de certificação também ajuda os usuários a verificar a identidade dos sites aos quais estão se conectando.

Um certificado autoassinado criptografará a comunicação entre seu servidor e qualquer cliente. No entanto, como não é assinado por nenhuma autoridade de certificação (CA) confiável incluída nos navegadores da web (chrome, firefox, opera, etc.), os usuários não podem usar o certificado para validar a identidade do seu servidor automaticamente.

Um certificado autoassinado pode ser apropriado se você não tiver um nome de domínio associado ao seu servidor ou para subir em ambientes de testes que não necessitem de tanto rigor. Se você tiver um nome de domínio, em muitos casos é melhor usar um certificado assinado por CA. Consulte o responsável da sua instituição pela emissão de certificados ou utilize o projeto Let’s Encrypt, com ele é possível configurar um certificado confiável e gratuito.

apt update && apt install openssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/polare-selfsigned.key -out /etc/ssl/certs/polare-selfsigned.crt
  • openssl: Esta é a ferramenta de linha de comando básica para criar e gerenciar certificados OpenSSL, chaves e outros arquivos.

  • req: Este subcomando especifica que queremos usar o gerenciamento de solicitação de assinatura de certificado (CSR) X.509. O X.509 é um padrão de infraestrutura de chave pública ao qual SSL e TLS aderem para seu gerenciamento de chave e certificado. Queremos criar um novo certificado X. 509, então estamos usando este subcomando.

  • -x509: Isso modifica ainda mais o subcomando anterior informando ao utilitário que queremos fazer um certificado autoassinado em vez de gerar uma solicitação de assinatura de certificado, como normalmente aconteceria.

  • -nodes: Isso diz ao OpenSSL para ignorar a opção de proteger nosso certificado com uma senha. Precisamos que o HAProxy consiga ler o arquivo, sem intervenção do usuário, quando o servidor inicializar. Uma senha impediria que isso acontecesse porque teríamos que inseri-la após cada reinicialização.

  • -days 365: Esta opção define o período de tempo que o certificado será considerado válido. Definimos isso por um ano aqui.

  • -newkey rsa:2048:Isso especifica que queremos gerar um novo certificado e uma nova chave ao mesmo tempo. Não criamos a chave necessária para assinar o certificado na etapa anterior, portanto, precisamos criá-la junto com o certificado. A parte rsa:2048 informa para criar uma chave RSA com 2.048 bits.

  • -keyout: Esta linha informa ao OpenSSL onde colocar o arquivo de chave privada gerado que estamos criando.

  • -out: Diz ao OpenSSL onde colocar o certificado que estamos criando.

Conforme mencionado anteriormente, essas opções criarão um arquivo de chave e um certificado. Após executar este comando, serão feitas algumas perguntas sobre o seu servidor para inserir as informações corretamente no certificado.

Preencha os questionamentos adequadamente. A linha mais importante é aquela que solicita Common Name (e.g. server FQDN or YOUR name). Você precisa inserir o nome de domínio associado ao seu servidor ou o endereço IP do seu servidor. Neste guia usaremos o nome de domínio.

Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Rio Grande do Norte
Locality Name (eg, city) []:Natal
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Instituição
Organizational Unit Name (eg, section) []:Superintendência de Tecnologia da Informação
Common Name (e.g. server FQDN or YOUR name) []:instituicao.ufrn.br
Email Address []:admin@instituicao.ufrn.br

Ambos os arquivos que você criou serão colocados nos subdiretórios apropriados do diretório /etc/ssl.

Ao usar o OpenSSL, você também deve criar um Diffie-Hellman forte, que é usado na negociação do Perfect Forward Secrecy com os clientes. While using OpenSSL, you should also create a strong Diffie-Hellman group, which is used in negotiating Perfect Forward Secrecy with clients.

Você pode fazer isso da seguinte forma o seguinte:

openssl dhparam -out /etc/haproxy/dhparam.pem 4096

Isso vai demorar um pouco, mas quando terminar você terá um grupo DH forte em /etc/nginx/dhparam.pem que será usado durante a configuração.

A.1. Bundle

Alguns softwares, como HAProxy, trabalham com um arquivo .pem sendo concatenação do arquivo de certificado do domínio, os certificados de CA intermediários (se houver) e a chave privada. Iremos chamar este o resultado desta concatenação de: Bundle.

Para o nosso guia a geração desse arquivo ocorre da seguinte forma:

cat /etc/ssl/private/polare-selfsigned.key /etc/ssl/certs/polare-selfsigned.crt > /etc/ssl/private/polare-bundle.pem
Neste guia não geramos certificados intermediários, mas é comum existir em certificados emitidos por instituições certificadoras como a RNP.

Apêndice B: Instalação do Tomcat

O Apache Tomcat é uma implementação de código-fonte aberto das tecnologias Java Servlet, JavaServer Pages, Java Expression Language e WebSocket. O software Apache Tomcat alimenta diversas aplicações web de grande escala e de missão crítica em inúmeras indústrias e organizações. Gerenciando recursos como conexões com bancos de dados, autenticação e recursos de hardware, possibilitando que estes sejam abstraídos pela aplicação.

Nessa configuração usaremos uma instância do Tomcat por máquina. Em um ambiente comum de produção podem haver diversos servidores para suprir a demanda existente. Essa estrutura aliada ao balanceamento de carga compõe um ambiente de aplicação escalável e redundante.

Nessa seção serão abordados os passo necessários para a obtenção e instalação do tomcat.

B.1. Usuário tomcat

O primeiro passo será a criação de um usuário que será o responsável por realizar as operações de gerenciamento do serviço do tomcat (startup, shutdown, etc…). Esta é uma etapa importante, pois é um risco de segurança executar o tomcat com um usuário com muitos privilégios.

useradd -r -m -U -s /sbin/nologin tomcat

B.2. Download

No link a seguir pode-se verificar a versão mais recente disponível do Apache Tomcat: tomcat.apache.org/download-90.cgi. Neste guia iremos usar a versão 9.0.74, mas se no momento que voce ler este guia existir uma versão mais recente, pode usá-la, desde que esta versão pertença a branch de hotfix 9.0.X.

Os comandos abaixo irão executar os passos necessários:

apt update && apt install wget -y
cd /usr/local/
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.74/bin/apache-tomcat-9.0.74.tar.gz
tar xvfz apache-tomcat-9.0.74.tar.gz
ln -s /usr/local/apache-tomcat-9.0.74 /usr/local/tomcat
chown -R tomcat:tomcat /usr/local/tomcat/*

B.3. Arquivos e Diretórios Importantes

As tabelas a seguir listam alguns dos principais diretórios e arquivos relevantes para a configuração do Tomcat.

Tabela 2. Arquivos e diretórios
Serviço REST Versão

bin

Contém os scripts de Startup, Shutdown e outros necessários para o funcionamento da instância. Os arquivos .sh se referem a sistemas Unix e, os arquivos .bat a sistemas Windows.

conf

Contém os arquivos de configuração de servidor tomcat. Os arquivos main importantes aqui são o server.xml e o context.xml

logs

É o diretório padrão para armazenamento de logs.

webapps

Diretório onde aplicação deve ser colocada para que possa ser executada.

B.4. Systemd

Para gerenciar às ações de inicialização e parada do servidor tomcat, criaremos um serviço reconhecido pelo systemd das distribuições linux atuais de modo a facilitar a execução das ações.

Sendo assim, crie o arquivo tomcat.service dentro do diretório /usr/lib/systemd/system de modo que este possa ser reconhecido pelo systemd.

vim /usr/lib/systemd/system/tomcat.service

O conteúdo do arquivo deve ser:

# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking

ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

Feito isso, execute os seguintes comandos para que o serviço do tomcat possa ser reconhecido pelo systemd e iniciado automaticamente depois de um reboot da máquina.

systemctl daemon-reload
systemctl enable tomcat.service
systemctl start tomcat.service

B.5. Arquivo setenv.sh

Destacamos uma seção especial para o setenv.sh para enfatizar sua importância. Ele não vem por padrão com o tomcat e deve ser criado manualmente dentro do diretório bin do tomcat. Todas as variáveis de ambiente devem ser especificadas neste arquivo. O arquivo deve possuir permissão de leitura, mas como é frequente declarar senhas nele então é preciso um ajuste mais cuidadoso em suas permissões. O ideal é que apenas o usuário tomcat tenha acesso a este arquivo.

touch /usr/local/tomcat/bin/setenv.sh
chmod 600 /usr/local/tomcat/bin/setenv.sh

O setenv.sh é invocado pelo script tomcat/bin/catalina.sh durante o start do tomcat por isso não é preciso fazer nenhuma modificação além de criar o arquivo e depois colocar os parâmetros dos sistemas que deseja fazer deploy.

Uma das variáveis mais importante no contexto deste guia que iremos definir neste arquivo será o JAVA_OPTS. Nele colocaremos todos os parâmetros que devem ser passados para a JVM e para o próprio polare.

Diferença entre JVM, JRE e JDK

JVM: máquina virtual do Java, sendo uma importante ferramenta para interpretar o código em Java e rodá-lo em qualquer plataforma. Ele é instalado quando instalamos o JRE.

JRE: é o chamado Java Runtime Environment possui a JVM e bibliotecas necessárias para executar aplicações Java.

JDK: é o Java Development Kit, um pacote que inclui além do JRE, tudo o que é necessário para escrever aplicações Java.

B.6. Aspectos de segurança

Uma interessante medida de segurança com relação ao servidor tomcat é excluir o conteúdo do diretório webapps, o conteúdo padrão deste diretório contem ferramentas que pode se tornar uma eventual porta de acesso ao ambiente. Logo, execute o comando:

rm -rf  /usr/local/tomcat/webapps/*
Não esqueça de abrir a porta 8080 tanto no firewall local quanto no firewall de borda. Uma boa regra de segurança é permitir apenas que o proxy consiga acessar a porta 8080 do tomcat.

Apêndice C: Instalação do HAProxy

O HAProxy é um software de código aberto e gratuito que fornece um balanceador de carga e servidor proxy de alta disponibilidade para aplicativos baseados em TCP/IP e HTTP que espalha solicitações por vários servidores. Está escrito em C e tem uma reputação de ser rápido e eficiente (em termos de processador e uso de memória).

C.1. Pré-requisitos

  • Possuir um certificado SSL/TLS

  • Ubuntu 22.04 LTS

C.2. Instalação

Vamos utilizar o repositório apt chamado ppa:vbernat/haproxy que contém versões mais atualizadas do HAProxy em relação aos que estão disponíveis nos repositórios oficiais do Ubuntu.

apt update && apt install --no-install-recommends software-properties-common
add-apt-repository ppa:vbernat/haproxy-2.4 -y

Por fim vamos utilizar a versão 2.4.* do HAProxy. Execute a instalação conforme é informado nos comandos abaixo:

apt update && apt install haproxy=2.4.\*

O argumento haproxy=2.4.\* significa que caso tenha outras versões como 2.2, 2.6 ou 2.8, o apt vai usar somente a versão 2.4 e quando for atualizado — apt upgrade — ele so vai buscar atualizações dentro da branch da 2.4.

Por fim ative o HAProxy para ser iniciado no boot e execute um restart para aplicar as mudanças de configuração.

systemctl enable haproxy
Não esqueça de abrir as portas 80 e 443 tanto no firewall local quanto no firewall de borda.

Apêndice D: Instalação do Docker

Vamos instalar o Docker CE (Community Edition) através do repositório oficial da desenvolvedora. Execute os comandos abaixo para realizar adição do repositório.

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Verifique se a instalação do repositório foi realizada com sucesso:

sudo apt update
apt-cache policy docker-ce
Saída do comando apt-cache policy docker-ce
docker-ce:  Instalado: (nenhum)
  Candidato: 5:23.0.5-1~ubuntu.22.04~jammy
  Tabela de versão:
     5:23.0.5-1~ubuntu.22.04~jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
Quando executar o comando anterior, a versão do pacote exibido na saída do comando pode ser diferente da versão retratada neste guia. O Docker está em pleno desenvolvimento e novas versões podem sair a qualquer momento.

Agora que o sistema operacional possui acesso ao repositório APT do Docker CE, realize a instalação através do comando:

apt install docker-ce

Verifique se o docker esta executando sem erros:

systemctl status docker

Se tudo estiver certo voce deverá observar na saída do comando Active: active (running).

Output of apt-cache policy docker-ce
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-04-26 20:01:22 -03; 2min 16s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 13211 (dockerd)
      Tasks: 8
     Memory: 24.3M
     CGroup: /system.slice/docker.service
             └─13211 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Apenas para garantir que tudo esta funcionando corretamente, execute o comando abaixo para subir um container de teste.

docker run hello-world
Saída do comando docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:4e83453afed1b4fa1a3500525091dbfca6ce1e66903fd4c01ff015dbcb1ba33e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Agora que temos certeza que tudo esta certo, vamos habilitar o serviço do Docker para executar durante o boot do sistema operacional.

systemctl enable docker

Unresolved directive in index.adoc - include::apendice-api-rest.adoc[]