CI/CD de la infraestructura de Proxmox (terraform/): valida los cambios en
cada PR y los aplica automáticamente al mergear a main, en el runner
self-hosted ARC.
Resumen
La infraestructura de Proxmox (VMs k3s, discos, PCI) se define en terraform/.
Dos workflows de GitHub Actions automatizan su ciclo de vida: un plan en cada
PR (con comentario del resultado) y un apply al mergear a main. Ambos
corren en el runner self-hosted homelab (ARC, dentro de la LAN) para poder
llegar a la API de Proxmox, que ya no se publica en Internet.
Estado
| Campo |
Valor |
| Estado |
Operativo |
| Argo CD Application |
— (GitHub Actions; no vive en el cluster) |
| Namespace |
— |
Despliegue
| Campo |
Valor |
| Método |
Workflows de GitHub Actions |
| Runner |
ARC self-hosted runs-on: homelab (ver ARC) |
| Contenedor del job |
ubuntu:24.04 (el scale set usa containerMode: kubernetes) |
| Origen |
.github/workflows/terraform-plan.yml, .github/workflows/terraform-apply.yml |
| Objetivo |
API de Proxmox (https://192.168.1.10:8006/) |
| State |
R2 (homelab-infra-tfstate) |
Red
| Campo |
Valor |
| Service |
— (job en el runner; salida a 192.168.1.10:8006) |
| URL |
— |
| TLS |
Autofirmado en pveproxy; el provider usa insecure = true |
Acceso y usuarios
- Secrets de GitHub:
PROXMOX_API_TOKEN (token limitado al pool
k8s-homelab), R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY para el backend del
state.
- El endpoint de la API es el default de
terraform/variables.tf
(https://192.168.1.10:8006/); no se pasa por secreto.
Seguridad
- El token de Proxmox solo tiene ACL sobre
/pool/k8s-homelab; el state solo
contiene recursos de este repo y las VMs/discos tienen
lifecycle { prevent_destroy = true }.
- El repo es privado, los runners son efímeros y el
apply solo se dispara con
push a main (workflow_dispatch para re-ejecutar a mano).
- Los disparadores de PR usan
pull_request (nunca pull_request_target): un
PR de un fork no recibe secretos.
Configuración
terraform-plan.yml publica el plan como comentario en el PR y falla si
el plan falla.
terraform-apply.yml se dispara con push a main y workflow_dispatch;
tiene concurrency: terraform-apply y el state en R2 usa use_lockfile.
- Disparadores:
paths: terraform/** y el propio workflow.
- Los jobs declaran
container: ubuntu:24.04 porque el scale set ARC usa
containerMode: kubernetes; el primer step instala git, curl, unzip y
ca-certificates para actions/checkout y hashicorp/setup-terraform.
Almacenamiento
- State remoto en R2:
homelab-infra-tfstate.
Dependencias
- Depende de: ARC (runner), Proxmox (
192.168.1.10:8006) y R2.
- Usado por: —.
Backup y recuperación
- State remoto en R2; re-ejecutable desde Git. (El bucket se creó a mano; el versionado no está verificado.)
Monitorización
- No aplica (GitHub Actions; historial en la pestaña Actions).
Referencias
Notas / TODO
- Si el clúster (y por tanto ARC) está caído, el
workflow_dispatch también
queda en cola. Plan B: cd terraform && terraform apply desde un host de la
LAN con TF_VAR_proxmox_api_token (ver runbook de Proxmox).
- El plan corre también en cambios de
terraform/cloudflare/** por el patrón
terraform/** (apply no-op de Proxmox).