Laboratório prático de DevOps construído com Java, Spring Boot, PostgreSQL, Docker, GitHub Actions e Terraform.
O objetivo deste projeto é estudar e praticar conceitos de desenvolvimento backend, containers, CI, infraestrutura como código e networking, mantendo toda a infraestrutura executando localmente.
Este projeto foi desenvolvido como um laboratório de estudos, mas segue uma estrutura próxima de um projeto real.
- Java 25
- Spring Boot 4
- Spring Data JPA
- Hibernate
- PostgreSQL 17
- Maven
- Docker
- Docker Compose
- Terraform
- GitHub Actions
- Testcontainers
Toda a infraestrutura deste laboratório roda localmente utilizando Docker.
Não é necessário utilizar AWS, Azure ou qualquer outro serviço cloud para executar o projeto.
GitHub
│
▼
GitHub Actions
│
┌──────────┴──────────┐
│ │
Tests Build
│ │
Testcontainers ▼
│ Docker Image
│ │
└──────────┬──────────┘
│
▼
Terraform
│
Docker Engine
│
devops-fundamentals-network
┌───────┴───────┐
│ │
▼ ▼
Spring Boot PostgreSQL
API DB
A documentação detalhada da arquitetura está em:
docs/ARCHITECTURE.md
Este projeto funciona como um laboratório para estudar o fluxo:
Código
↓
Testes
↓
Build
↓
Docker
↓
CI
↓
Terraform
↓
Infraestrutura local
A ideia é aprender DevOps fazendo, e não apenas estudando comandos isolados.
Se você está começando em Terraform, não tente entender todos os arquivos de uma vez.
Siga a evolução abaixo.
Entre na pasta:
cd terraformVeja os arquivos:
terraform/
├── environments/
│ ├── dev/
│ │ └── main.tf
│ └── prod/
│ └── main.tf
├── main.tf
├── variables.tf
├── outputs.tf
└── .terraform.lock.hcl
O Terraform trata todos os arquivos .tf de um mesmo diretório como uma única configuração.
No main.tf existe:
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.6"
}
}
}
provider "docker" {}O provider permite que o Terraform converse com o Docker.
A ideia é:
Terraform
│
▼
Docker Provider
│
▼
Docker Engine
Estude primeiro:
terraformrequired_providersprovider
O projeto utiliza resources como:
resource "docker_network" "app_network" {
...
}e:
resource "docker_container" "postgres" {
...
}A estrutura básica é:
resource "TIPO" "NOME" {
configuração
}Por exemplo:
resource "docker_network" "app_network" {
name = "devops-fundamentals-network"
}Leia esses resources e tente identificar:
- qual recurso está sendo criado;
- qual provider está sendo utilizado;
- quais propriedades são configuradas;
- quais recursos dependem de outros.
O projeto utiliza:
variables.tf
Exemplo:
variable "postgres_db" {
description = "PostgreSQL database name"
type = string
default = "devops_fundamentals"
}Aprenda:
variable
description
type
default
sensitive
Depois veja como a variável é utilizada:
${var.postgres_db}A senha do PostgreSQL não fica diretamente no código.
Ela é fornecida através de:
export TF_VAR_postgres_password='devops_local_secret_2026'O Terraform reconhece automaticamente:
TF_VAR_<nome_da_variável>
como valor da variável Terraform correspondente.
Por exemplo:
TF_VAR_postgres_password
│
▼
var.postgres_password
Isso permite estudar gerenciamento de variáveis sem colocar a senha diretamente no .tf.
O arquivo:
outputs.tf
define informações que o Terraform pode apresentar depois da execução.
Exemplo:
output "postgres_container" {