eletrotupi / tcc/ commit / e953693

thesis: discourse on infra/automatization

Pedro Lucas Porcellis porcellis@eletrotupi.com 14 days ago e95369371855208056f9243ac68d0ace4cac4cb3
Parents: 3b69074
2 file(s) changed
  • monografia/chapters/tech.tex +97 -0
  • monografia/monografia.bib +28 -15
monografia/chapters/tech.tex
1 1
\chapter{Tecnologias}
2 2

3 3
Este capítulo apresenta as principais tecnologias empregadas no desenvolvimento
4 4
do aplicativo, organizadas de acordo com a camada da arquitetura em que
5 5
atuam: front-end, back-end e infraestrutura/persistência de dados.
▸ 98 unchanged lines
104 104
O Prisma foi escolhido por permitir a manutenção do esquema do banco de dados
105 105
de forma versionada e sincronizada com o código da aplicação, reduzindo a
106 106
chance de divergência entre a estrutura do banco e as entidades manipuladas
107 107
pelo back-end, além de prover checagem de tipos em tempo de compilação para
108 108
as consultas realizadas.
109 +

110 +
\section{Implantação e Automação}
111 +

112 +
\subsection{Docker e Docker Compose}
113 +

114 +
Docker é uma plataforma de conteinerização que permite empacotar uma
115 +
aplicação e suas dependências em uma unidade isolada e portátil, capaz de ser
116 +
executada de forma consistente em diferentes ambientes \citep{docker:2026}. O
117 +
Docker Compose é uma ferramenta complementar que permite definir e orquestrar
118 +
múltiplos contêineres --- e as relações entre eles --- por meio de um único
119 +
arquivo de configuração declarativo \citep{dockercompose:2026}.
120 +

121 +
No projeto, o Docker Compose é utilizado tanto no ambiente de desenvolvimento
122 +
quanto no ambiente de produção para orquestrar os serviços de banco de dados
123 +
(PostgreSQL), armazenamento em memória (Valkey) e da própria API, garantindo
124 +
que as versões e configurações desses serviços sejam idênticas entre as
125 +
máquinas de desenvolvimento e o servidor de produção.
126 +

127 +
O uso de \textit{healthchecks} em conjunto com a diretiva \texttt{depends\_on} e a
128 +
condição \texttt{service\_healthy} assegura que a API só seja iniciada após o
129 +
banco de dados e o \textit{Valkey} estarem de fato prontos para aceitar conexões,
130 +
evitando falhas de inicialização por condição de corrida.
131 +

132 +
% TODO: Add the listing here
133 +

134 +
A adoção do Docker se justifica, no contexto de uma aplicação de saúde
135 +
mental de código aberto, pelo objetivo de garantir a reprodutibilidade do
136 +
ambiente de execução: qualquer pessoa que clone o repositório --- seja para
137 +
contribuir com o projeto, auditar seu funcionamento ou realizar sua própria
138 +
implantação --- consegue reproduzir o ambiente completo sem depender de
139 +
configurações manuais específicas do sistema operacional hospedeiro, o que
140 +
reforça o caráter \textit{self-service} do projeto.
141 +

142 +
\subsection{GitHub Actions}
143 +

144 +
GitHub Actions é uma plataforma de integração e entrega contínuas (CI/CD)
145 +
nativa do GitHub, que permite a definição de fluxos de trabalho automatizados
146 +
--- disparados por eventos como \textit{push} ou \textit{pull request} ---
147 +
descritos de forma declarativa em arquivos YAML \citep{githubactions:2026}.
148 +

149 +
No projeto, o fluxo de trabalho de CI/CD é dividido em três etapas
150 +
sequenciais e dependentes entre si. A primeira etapa (\texttt{test}) sobe um
151 +
serviço efêmero de PostgreSQL e executa a suíte de testes automatizados da
152 +
API a cada \textit{push} ou \textit{pull request} que modifique arquivos do
153 +
diretório da API. A segunda etapa (\texttt{build-and-push}), condicionada ao
154 +
sucesso da primeira e restrita a eventos de \textit{push}, constrói a imagem
155 +
Docker de produção da API e a publica no GitHub Container Registry (GHCR),
156 +
com marcação automática pelo SHA do \textit{commit} e, condicionalmente, pela
157 +
tag \texttt{latest} quando o \textit{push} ocorre na \textit{branch}
158 +
\texttt{master}. A terceira etapa (\texttt{deploy-production}), restrita à
159 +
\textit{branch} \texttt{master}, conecta-se ao servidor de produção via SSH e
160 +
realiza a atualização do serviço da API por meio da atualização da tag da
161 +
imagem no arquivo \texttt{.env} e da recriação do contêiner correspondente
162 +
via Docker Compose.
163 +

164 +
Essa automação elimina a necessidade de intervenção manual para a maior
165 +
parte do ciclo de implantação, restringindo a ação humana direta sobre o
166 +
servidor de produção a situações excepcionais, o que reduz a superfície de
167 +
erro humano e aumenta a confiabilidade do processo de entrega de novas
168 +
versões da aplicação.
169 +

170 +
\subsection{Ansible}
171 +

172 +
Ansible é uma ferramenta de automação de infraestrutura que permite
173 +
descrever, de forma declarativa e idempotente, o estado desejado de um ou
174 +
mais servidores, dispensando a necessidade de um agente instalado na máquina
175 +
gerenciada, uma vez que se comunica com ela via SSH \citep{ansible:2026}.
176 +

177 +
No escopo deste projeto, o papel do Ansible é ortogonal ao do Docker Compose
178 +
e ao do GitHub Actions: enquanto estes automatizam, respectivamente, a
179 +
orquestração dos serviços da aplicação e o ciclo de integração e entrega
180 +
contínuas, o Ansible é responsável exclusivamente pelo provisionamento
181 +
inicial do servidor de produção, executado uma única vez --- ou sempre que um
182 +
novo servidor precisar ser provisionado. Esse provisionamento consiste em:
183 +
(i) criar o usuário dedicado à aplicação; (ii) adicionar a chave pública SSH
184 +
utilizada pelo GitHub Actions para se autenticar no servidor durante a etapa
185 +
de implantação; (iii) criar os diretórios da aplicação com as permissões
186 +
adequadas; e (iv) instalar o Docker no servidor. A cópia do arquivo de
187 +
variáveis de ambiente de produção (\texttt{.env.production}), por conter
188 +
segredos e credenciais sensíveis, é deliberadamente mantida como uma etapa
189 +
manual, não automatizada, e não é versionada no repositório.
190 +

191 +
A separação entre o provisionamento inicial (\textit{Ansible}), a orquestração de
192 +
execução (\textit{Docker Compose}) e a automação do ciclo de
193 +
entrega (\textit{GitHub Actions}) reflete uma decisão arquitetural:
194 +
cada ferramenta atua em uma camada distinta e bem delimitada do processo
195 +
de implantação, o que favorece a reprodutibilidade de todo o processo,
196 +
do zero, por qualquer pessoa que deseje hospedar sua própria instância da aplicação.
197 +

198 +
Essa preocupação é particularmente relevante no contexto de um
199 +
aplicativo de saúde mental de código aberto: ao reduzir a dependência
200 +
de serviços proprietários de implantação (\textit{walled gardens}) e
201 +
ao documentar e automatizar o processo de provisionamento, o projeto
202 +
favorece um modelo mais alinhado aos princípios de privacidade e de
203 +
autonomia sobre os dados dos usuários, permitindo que instituições ou
204 +
indivíduos preocupados com a confidencialidade de dados sensíveis de
205 +
saúde mental hospedem e controlem sua própria instância da aplicação.
monografia/monografia.bib
1 1
@article{Iwaya:22,
2 2
  title={On the privacy of mental health apps},
3 3
  volume={28},
4 4
  DOI={10.1007/s10664-022-10236-0},
5 5
  number={1},
▸ 370 unchanged lines
376 376
  url    = {https://www.prisma.io},
377 377
  year = {2026},
378 378
  note   = {Acessado em 13 jul. 2026}
379 379
},
380 380

381 -
@article{silva:18,
382 -
	title={Ambientações messiânicas: Um estudo acerca das idiocrassias},
383 -
	author={Silva, Luís Eduardo Talavera Pereira and Martins, Luisa Helena Madureira and Yang, Qu and Wang, Kim},
384 -
	journal={Pesquisas Estrambólicas},
385 -
	volume={20},
386 -
	number={1},
387 -
	pages={101--106},
388 -
	year={2018},
389 -
	publisher={Yegsidra},
390 -
	address={São Paulo, SP, Brasil},
381 +
@misc{docker:2026,
382 +
  author = {{Docker, Inc.}},
383 +
  title  = {Docker},
384 +
  url    = {https://www.docker.com},
385 +
  year   = {2026},
386 +
  note   = {Acessado em 13 jul. 2026}
387 +
},
388 +

389 +
@misc{dockercompose:2026,
390 +
  author = {{Docker, Inc.}},
391 +
  title  = {Docker Compose},
392 +
  url    = {https://docs.docker.com/compose/},
393 +
  year   = {2026},
394 +
  note   = {Acessado em 13 jul. 2026}
395 +
},
396 +

397 +
@misc{githubactions:2026,
398 +
  author = {{GitHub, Inc.}},
399 +
  title  = {GitHub Actions},
400 +
  url    = {https://github.com/features/actions},
401 +
  year   = {2026},
402 +
  note   = {Acessado em 13 jul. 2026}
391 403
},
392 404

393 -
@misc{site:15,
394 -
	title={Meu website},
395 -
	author={Giovane Torres},
396 -
	url={https://gdotorres.github.io},
397 -
	urldate={26 de outubro de 2018},
405 +
@misc{ansible:2026,
406 +
  author = {{Red Hat, Inc.}},
407 +
  title  = {Ansible},
408 +
  url    = {https://www.ansible.com},
409 +
  year   = {2026},
410 +
  note   = {Acessado em 13 jul. 2026}
398 411
}