Skip to content

ErnestoCobos/Infrastructure

Repository files navigation

Infrastructure

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.

Arquitectura

.
├── 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

Decisiones

  • 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.

Prerrequisitos macOS

Instala las herramientas base:

./scripts/bootstrap-macos.sh

Luego prepara secretos locales:

cp .env.1password.example .env.1password

Edita .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_TOKEN

Uso

Revisar ambiente:

make doctor

Formatear Terraform:

make fmt

Validar un proyecto:

make validate PROJECT=cobosio/cobos-io

Plan:

make plan PROJECT=cobosio/cobos-io

Apply manual:

make apply PROJECT=cobosio/cobos-io

plan 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-all

GitHub Codespaces

El 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-start

Abrir Studio desde el puerto privado 55423 en la pestana Ports.

Detener Supabase:

make codespace-supabase-stop

Ver el runbook completo:

docs/runbooks/codespaces.md

Proyectos Terraform

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.

Adoptar zonas existentes

Para una zona que ya existe en Cloudflare:

  1. Agrega la zona y sus records al terraform.tfvars local.
  2. Ejecuta make init PROJECT=<org>/<project>.
  3. Importa la zona al recurso del modulo.
  4. Importa cada DNS record existente antes del primer apply.
  5. 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>'

Portfolio

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.

Web App Stack

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.

GitHub Wiki

La fuente del wiki vive en wiki/. Para publicarlo:

Nota: GitHub no crea ErnestoCobos/Infrastructure.wiki.git hasta guardar la primera pagina desde la UI. Si git clone devuelve Repository not found, abre https://github.com/ErnestoCobos/Infrastructure/wiki con sesion iniciada, crea una pagina temporal Home, 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

Documentacion oficial usada

Ansible existente

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.

About

Infrastructure as Code repository for Terraform, Cloudflare DNS, HCP Terraform, 1Password, and Ansible

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors