Repositorio de infraestructura local-first para Cloudflare DNS, Terraform, HCP Terraform y Ansible.
La prioridad actual es Terraform para manejar zonas y DNS en Cloudflare sin subir secretos al repo. El estado vive en HCP Terraform, pero los comandos se ejecutan desde la maquina local usando 1Password.
.
├── modules/
│ ├── cloudflare-zones/ # Modulo reutilizable para zonas y DNS
│ └── web-app-stack/ # Stack Vercel + Supabase + Cloudflare DNS
├── projects/
│ ├── cobosio/cobos-io/ # Org HCP cobosio, proyecto cobos.io
│ ├── cobosio/gamon-io/ # Org HCP cobosio, proyecto gamon.io
│ └── voltaflow/
│ ├── getdecant/ # Org HCP voltaflow
│ ├── voltaflow/
│ └── enkiflow/
├── scripts/
│ ├── bootstrap-macos.sh # Prerrequisitos para macOS
│ └── tf-local.sh # Wrapper local con 1Password
├── examples/web-app-stack/ # Ejemplo de stack web
├── wiki/ # Fuente para GitHub Wiki
├── ansible/ # Automatizacion existente de servidores
├── AGENTS.md
├── CLAUDE.md
├── SKILLS.md
└── Makefile
- Terraform oficial, no OpenTofu.
- HCP Terraform para state remoto y trazabilidad.
- Ejecucion local desde esta maquina. En HCP Terraform, configura los workspaces con execution mode local.
- Secretos via 1Password CLI con
op run. - Cloudflare por ahora solo zonas y DNS.
- Cloudflare Tunnel queda fuera.
- Un workspace por proyecto para reducir blast radius. No mezclar Cobos.io y Voltaflow en el mismo state.
- Web app stacks se modelan con
modules/web-app-stack: Vercel, Supabase, variables de entorno y DNS.
Instala las herramientas base:
./scripts/bootstrap-macos.shLuego prepara secretos locales:
cp .env.1password.example .env.1passwordEdita .env.1password con referencias reales de 1Password, no valores planos.
Variables esperadas:
CLOUDFLARE_API_TOKEN=op://Infrastructure/Cloudflare/CLOUDFLARE_API_TOKEN
TF_TOKEN_app_terraform_io=op://Infrastructure/HCP Terraform/TF_TOKEN_app_terraform_io
VERCEL_API_TOKEN=op://Infrastructure/Vercel/VERCEL_API_TOKEN
SUPABASE_ACCESS_TOKEN=op://Infrastructure/Supabase/SUPABASE_ACCESS_TOKENRevisar ambiente:
make doctorFormatear Terraform:
make fmtValidar un proyecto:
make validate PROJECT=cobosio/cobos-ioPlan:
make plan PROJECT=cobosio/cobos-ioApply manual:
make apply PROJECT=cobosio/cobos-ioplan y apply requieren .env.1password por defecto. Si intencionalmente quieres usar credenciales ya exportadas en el ambiente, usa ALLOW_AMBIENT_CREDENTIALS=1.
Validar todos:
make validate-allEl repo incluye .devcontainer/ para trabajar desde GitHub Codespaces con Terraform, Docker, Supabase CLI, Vercel CLI, GitHub CLI y 1Password CLI.
El Codespace no ejecuta Terraform plan ni apply automaticamente. Para mantener costos bajo control, usa la maquina default de 2 cores, baja el idle timeout a 15 o 30 minutos, arranca Supabase solo cuando lo necesites y apaga el Codespace al terminar.
Arrancar Supabase local en Codespaces:
make codespace-supabase-startAbrir Studio desde el puerto privado 55423 en la pestana Ports.
Detener Supabase:
make codespace-supabase-stopVer el runbook completo:
docs/runbooks/codespaces.md
| Proyecto local | HCP organization | HCP project | Workspace |
|---|---|---|---|
cobosio/cobos-io |
cobosio |
cobos.io |
cobos-io-cloudflare-dns |
cobosio/gamon-io |
cobosio |
gamon.io |
gamon-io-web-app-stack |
voltaflow/getdecant |
voltaflow |
getdecant |
getdecant-cloudflare-dns |
voltaflow/voltaflow |
voltaflow |
voltaflow |
voltaflow-cloudflare-dns |
voltaflow/enkiflow |
voltaflow |
enkiflow |
enkiflow-cloudflare-dns |
Cada proyecto tiene un terraform.tfvars.example. Copialo a terraform.tfvars localmente y llena el inventario real.
terraform.tfvars esta ignorado por git para no publicar inventarios privados en este repo.
Para una zona que ya existe en Cloudflare:
- Agrega la zona y sus records al
terraform.tfvarslocal. - Ejecuta
make init PROJECT=<org>/<project>. - Importa la zona al recurso del modulo.
- Importa cada DNS record existente antes del primer
apply. - Ejecuta
make plan PROJECT=<org>/<project>y confirma que no hay recreaciones inesperadas.
Ejemplo conceptual:
terraform -chdir=projects/cobosio/cobos-io import \
'module.cloudflare_zones.cloudflare_zone.managed["cobos.io"]' \
'<cloudflare_zone_id>'
terraform -chdir=projects/cobosio/cobos-io import \
'module.cloudflare_zones.cloudflare_dns_record.this["cobos.io/www-cname"]' \
'<cloudflare_zone_id>/<dns_record_id>'El diagrama base para renderizar en portfolio vive en:
docs/diagrams/cloudflare-platform.mmd
Tambien esta incluido en wiki/Portfolio-Diagram.md para GitHub Wiki.
Para crear un stack tipo web app usa:
modules/web-app-stack
examples/web-app-stack
Este modulo crea el proyecto en Vercel, el proyecto en Supabase, inyecta variables de Supabase en Vercel usando value_wo, y puede agregar dominios/DNS en Cloudflare.
La fuente del wiki vive en wiki/. Para publicarlo:
Nota: GitHub no crea
ErnestoCobos/Infrastructure.wiki.githasta guardar la primera pagina desde la UI. Sigit clonedevuelveRepository not found, abre https://github.com/ErnestoCobos/Infrastructure/wiki con sesion iniciada, crea una pagina temporalHome, guardala, y luego ejecuta estos comandos para reemplazarla con la fuente versionada.
git clone git@github.com:ErnestoCobos/Infrastructure.wiki.git /tmp/infra-wiki
rsync -av --delete wiki/ /tmp/infra-wiki/
git -C /tmp/infra-wiki add .
git -C /tmp/infra-wiki commit -m "docs: publish infrastructure wiki"
git -C /tmp/infra-wiki push- Terraform install
- HCP Terraform CLI workflow
- Terraform cloud block
- Cloudflare Terraform zones
- Cloudflare Terraform DNS records
- Vercel Terraform provider
- Supabase Terraform provider
- 1Password CLI secret environments
ansible/ y algunos workflows existentes vienen de la automatizacion previa de servidores. No son parte del nuevo flujo Terraform Cloudflare. No agregues automatizacion remota para Terraform sin una decision explicita.