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
Serviço REST | Versão |
---|---|
1.3.0 |
|
3.1 |
|
1.16.0 |
|
1.9 |
|
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.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:
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.
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
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, |
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 é 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.
cd ~/polare-projeto/polare
./mvnw spring-javaformat:apply clean install -Pjar -B -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Ddependency-check.skip=true
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
:
polare/polare-frontend-restrito/target/polare-frontend-restrito.jar
polare/polare-frontend-publico/target/polare-frontend-publico.jar
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 |
---|---|---|
|
|
Informa ao spring framework qual usuário do banco de dados que ele irá usar para se conectar ao banco de dados do Polare. |
|
|
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. |
|
|
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 |
|
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. |
|
Define a URL do serviço de token do OAuth. |
spring.security.oauth2.client.provider.ufrn.user-info-uri |
|
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 |
|
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 |
---|---|---|
|
|
O client-id é um identificador para aplicativos. Aqui deve usar o client-id que foi cadastrado no OAuth. |
|
|
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. |
|
|
Define o tipo de escopo |
|
|
Define o tipo de flow do OAuth. |
|
|
Define o tipo de flow do OAuth. |
|
|
Um request para a URL definida em redirect-uri irá iniciar |
|
|
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 |
---|---|---|
|
|
O client-id é um identificador para aplicativos. Aqui deve usar o client-id que foi cadastrado no OAuth. |
|
|
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. |
|
|
Define o tipo de escopo |
|
|
Define o tipo de flow do OAuth. |
|
|
Define o tipo de flow do OAuth. |
|
|
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. |
|
|
Define a URL do serviço de token do OAuth. |
|
|
|
|
|
|
4.5. Autenticação aos serviços da API
4.6. API de serviços remotos
Nome do parâmetro | Valor possível | Descrição |
---|---|---|
|
|
Chave para conseguir consultar os serviços da API |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4.7. Parâmetros negociais
Nome do parâmetro | Valor possível | Descrição |
---|---|---|
|
|
|
|
|
|
|
|
|
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
epolare-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.
# 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. |
# 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.war
→polare-restrito.instituicao.br
-
polare-frontend-publico.war
→polare-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:
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.
mv polare-frontend-restrito.war polare.war (1)
1 | polare-restrito.instituicao.br:8080/polare |
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
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
.
docker build --build-arg JAR_FILE=polare/polare-frontend-restrito/target/polare-frontend-restrito.jar -t instituicao/polare-frontend-restrito .
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
.
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 |
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:
-
Copie o bundle do seu certificado SSL/TSL para cá;
-
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:
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 partersa: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.
Serviço REST | Versão |
---|---|
|
Contém os scripts de Startup, Shutdown e outros necessários para o funcionamento da instância. Os arquivos |
|
Contém os arquivos de configuração de servidor tomcat. Os arquivos main importantes aqui são o |
|
É o diretório padrão para armazenamento de logs. |
|
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
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)
.
● 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
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[]