Infraestrutura como código e configuração GitOps do ACTA para hospedar, orquestrar e publicar os serviços que sustentam o ciclo PDCA (Plan, Do, Check, Act).
O acta-platform centraliza o estado desejado da infraestrutura de produção. O repositório provisiona uma instância EC2 na AWS com Terraform, instala K3s e componentes operacionais, e mantém manifests Kubernetes consumidos pelo Argo CD.
O fluxo separa duas responsabilidades:
- o Terraform cria a rede, a instância EC2 e o acesso ao cluster;
- o Argo CD acompanha a pasta
apps/na branchmaine reconcilia os workloads no namespaceacta-prod.
Atualmente, o estado GitOps inclui acta-pg-api, acta-mongo-api, acta-import-api e o worker de importação. As imagens são obtidas do GitHub Container Registry com tags imutáveis baseadas no SHA de cada serviço.
- Provisionamento de VPC, subnet pública, tabela de rotas, Security Group, EC2, volume GP3 criptografado e Elastic IP na AWS.
- Instalação de K3s, Argo CD, cert-manager, Helm e Infisical Secrets Operator.
- Orquestração de APIs e worker com Deployments, Services, probes e limites de recursos.
- Exposição HTTPS pelo Traefik com certificados emitidos pelo Let's Encrypt.
- Sincronização GitOps automatizada com
pruneeselfHealpelo Argo CD. - Entrega de segredos do Infisical para Secrets do Kubernetes sem versionar seus valores no Git.
- Validação de Terraform, Kustomize, schemas Kubernetes e estrutura da Application do Argo CD no GitHub Actions.
- Script PowerShell para conduzir o provisionamento, bootstrap, configuração do GitOps e verificações finais.
| Tecnologia | Uso |
|---|---|
| AWS | Hospedagem da rede e da instância EC2 |
| Terraform 1.13.3 | Provisionamento da infraestrutura como código |
| Docker e GHCR | Empacotamento e distribuição das imagens dos serviços |
| K3s / Kubernetes | Orquestração dos containers |
| Kustomize | Composição dos manifests do ambiente de produção |
| Argo CD 3.5.2 | Reconciliação GitOps do estado declarado no Git |
| Traefik | Entrada HTTP e HTTPS no cluster |
| cert-manager 1.21.2 | Emissão e renovação de certificados TLS |
| Infisical Secrets Operator 0.10.11 | Sincronização de segredos com o cluster |
| Kubeconform 0.6.7 | Validação dos schemas Kubernetes na CI |
| yq 4.52.1 | Validação estrutural da Application do Argo CD |
| GitHub Actions | Validação contínua da infraestrutura |
Para executar o processo de provisionamento, é necessário ter:
- conta e credenciais AWS com permissão para os recursos definidos no Terraform;
- AWS CLI, Terraform, OpenSSH e
kubectldisponíveis no PowerShell; - um EC2 Key Pair existente na região escolhida e sua chave privada local;
- um IPv4 administrativo informado como bloco
/32; - credenciais Universal Auth e projeto configurado no Infisical;
- imagens dos serviços publicadas no GHCR.
Crie infra/aws/terraform.tfvars somente no ambiente local:
aws_region = "sa-east-1"
key_name = "nome-do-key-pair"
admin_cidr = "203.0.113.10/32"
instance_type = "t3.medium"O arquivo terraform.tfvars, estados, planos, credenciais AWS e chaves privadas são ignorados pelo Git. Nunca versione esses arquivos.
Os manifests InfisicalSecret contêm apenas referências. Os valores reais de banco, Firebase, Cloudinary, Redis e tokens devem permanecer no Infisical.
Formate e valide o Terraform sem criar recursos:
terraform -chdir=infra/aws fmt -check
terraform -chdir=infra/aws init -backend=false -input=false
terraform -chdir=infra/aws validateRenderize os manifests e confira a estrutura produzida pelo Kustomize:
kubectl kustomize appsEsses comandos verificam formatação e configuração estática. Eles não confirmam acesso à AWS, criação dos recursos, sincronização do Argo CD ou saúde das aplicações.
Caution
O processo cria recursos cobráveis na AWS. Revise o terraform plan, a conta selecionada, a região e os custos antes de confirmar a aplicação.
Na raiz do repositório, execute:
.\infra\aws\deploy.ps1O script:
- confirma a identidade AWS e executa
terraform init,validateeplan; - exige a confirmação textual
APLICARantes doterraform apply; - aguarda o SSH e executa
bootstrap-k3s.shna EC2; - instala K3s, Argo CD, cert-manager e o operador do Infisical;
- cria o Secret de autenticação do Infisical a partir de entradas interativas;
- aplica
argocd/prod.yamle ajusta os hostssslip.ioao Elastic IP; - aguarda sincronização, workloads e certificados;
- consulta os endpoints públicos e exibe o estado final.
O kubeconfig obtido do servidor é salvo em ~/.kube/acta-aws.yaml. A chave privada esperada pelo script fica em .aws/labsuser.pem; esse caminho é local e está ignorado pelo Git.
flowchart LR
A[Alteração de infraestrutura] --> B[Branch]
B --> C[Pull Request]
C --> D[GitHub Actions valida]
D --> E[Code Review e aprovação]
E --> F[Merge em main]
F --> G[Argo CD reconcilia o cluster]
G --> H[Verificação dos workloads]
O fluxo esperado para mudanças é:
- criar uma branch e alterar somente os manifests ou o Terraform necessários;
- abrir uma Pull Request usando o template do repositório;
- aguardar a pipeline
teste-infrae solicitar Code Review; - obter a aprovação definida pela equipe antes do merge;
- após o merge em
main, acompanhar a reconciliação do Argo CD e verificar os workloads.
O Argo CD usa prune para remover recursos excluídos do estado desejado e selfHeal para corrigir divergências no cluster. Por isso, alterações manuais em recursos gerenciados podem ser revertidas automaticamente.
| Componente | Porta | Verificação de disponibilidade |
|---|---|---|
acta-pg-api |
8080 | GET /api/v1/health |
acta-mongo-api |
8081 | GET /api/v1/health |
acta-import-api |
8000 | GET /docs |
acta-import-worker |
— | Processo RQ sem Service HTTP |
Cada workload usa imagem imutável do GHCR, requests e limits de CPU/memória. As APIs possuem probes de inicialização, prontidão e vida configuradas nos respectivos manifests.
- SSH e a API Kubernetes são limitados ao
admin_cidrconfigurado. - HTTP e HTTPS são públicos nas portas 80 e 443.
- A instância exige IMDSv2 e usa volume raiz criptografado.
- As credenciais Universal Auth são criadas diretamente no cluster durante o deploy.
- O Infisical sincroniza os valores para Secrets do namespace
acta-prode pode reiniciar os pods quando houver atualização.
O repositório não deve receber chaves PEM, credenciais AWS, arquivos de estado do Terraform ou valores reais de segredos.
flowchart LR
R[acta-platform / main] --> T[Terraform]
T --> AWS[AWS: VPC, EC2 e Elastic IP]
AWS --> K3S[K3s / acta-prod]
R --> A[apps/]
A --> CD[Argo CD]
CD --> K3S
GHCR[GHCR] --> K3S
INF[Infisical] --> OP[Infisical Secrets Operator]
OP --> SEC[Kubernetes Secrets]
SEC --> K3S
K3S --> PG[acta-pg-api]
K3S --> MG[acta-mongo-api]
K3S --> IM[acta-import-api e worker]
NET[Internet] --> ING[Traefik e cert-manager]
ING --> PG
ING --> MG
ING --> IM
Terraform prepara a infraestrutura e o cluster. Ele não substitui o Argo CD: o Argo CD é responsável por manter os workloads iguais ao estado versionado em main.
.
├── .github/workflows/
│ └── teste-infra.yml # CI de validação da infraestrutura
├── apps/
│ ├── config/ # referências de segredos no Infisical
│ ├── *-api.yaml # Deployments e Services
│ ├── ingress.yaml # HTTPS, hosts e certificados
│ └── kustomization.yaml # agrega o estado de produção
├── argocd/
│ └── prod.yaml # Application do ambiente acta-prod
├── infra/aws/
│ ├── main.tf # rede, segurança, EC2 e Elastic IP
│ ├── variables.tf # entradas e validações do Terraform
│ ├── output.tf # IP, instância, SSH e URLs
│ ├── deploy.ps1 # orquestra o provisionamento e deploy
│ └── bootstrap-k3s.sh # instala componentes no cluster
├── PULL_REQUEST_TEMPLATE.md
└── README.md
- Repositório · Licença MIT ·
acta.institutojef@gmail.com - Contribuições: use issues e pull requests; há um
PULL_REQUEST_TEMPLATE.md. - Autoria: Equipe ACTA.