# Estrutura e Automações

## Estrutura do repositório

A estrutura do repositório segue o seguinte formato:

```
infra/
├── clusters/           # Um diretório por cluster Kubernetes
│   └── admin/          # Cluster admin (Terraform + Terragrunt)
├── modules/            # Módulos Terraform reutilizáveis
│   ├── vsphere-vm/     # Provisionamento de VM no vSphere
│   ├── k3s-cluster/    # Cluster k3s completo
│   ├── k3s-server/     # Nó servidor k3s
│   └── k3s-agent/      # Nó agente k3s
├── ansible/            # Playbooks de pós-configuração
│   ├── site.yml        # Configura clusters k8s (addons, discos, etc)
│   └── edge.yml        # Configura VMs de borda (nginx, firewall)
└── .gitlab-ci.yml      # Pipeline de CI
```

Cada diretório em `clusters/` é um módulo Terragrunt que referencia os módulos reutilizáveis de `modules/`. O estado do terraform está sendo salvo no próprio GitLab. Desse modo, todos os comandos do terraform devem ser executados diretamente pelo GitLab CI ou utilizando o estado remoto do GitLab.

---

## Nomenclatura de branches neste repositório

| Prefixo | Exemplo |
|---|---|
| `feat/` | `feat/cluster-portal` |
| `upgrade/` | `upgrade/k3s-1.32`, `upgrade/terraform-1.10` |
| `fix/` | `fix/rede-admin`, `fix/disco-node1` |
| `resize/` | `resize/admin-node1-memoria`, `resize/portal-node2-cpu` |
| `docs/` | `docs/tutorial-novo-cluster` |

---

## Pipeline de CI

O pipeline possui quatro stages executados em sequência:

```
validate ──► plan ──► apply ──► configure
```

| Stage | Quando roda | O que faz |
|---|---|---|
| `validate` | Todo push e todo MR | Valida a sintaxe dos arquivos Terraform |
| `plan` | Todo push e todo MR | Mostra o que seria criado, alterado ou destruído |
| `apply` | Somente na `main`, **manual** | Aplica as mudanças de infraestrutura no vSphere |
| `configure` | Somente na `main`, automático após apply | Roda Ansible para configurar k8s e VMs de borda |

O `apply` **nunca roda sozinho** — exige um clique manual de quem aprovou o MR. O `configure` roda automaticamente em seguida, se o `apply` for bem-sucedido.

---

## Variáveis de CI necessárias

Configuradas no grupo `dicom` do GitLab (Settings → CI/CD → Variables):

| Variável | Descrição |
|---|---|
| `VSPHERE_PASSWORD` | Senha do usuário de serviço no vSphere |
| `ANSIBLE_SSH_PUBLIC_KEY` | Chave pública SSH injetada nas VMs pelo Terraform |
| `ANSIBLE_SSH_PRIVATE_KEY` | Chave privada SSH usada pelo Ansible (em base64) |
| `CERT_MANAGER_TSIG_SECRET` | Chave TSIG para desafios DNS01 do cert-manager (Obsoleto: está sendo movido para repositório `stacks`) |

---