┌─────────────────────────────────────────────────────────────┐
│ Developer Interface │
│ (Portal Web / CLI / IDE Plugins / API) │
├─────────────────────────────────────────────────────────────┤
│ Orchestration Layer │
│ (Workflows, Templates, Policies) │
├─────────┬──────────┬──────────┬──────────┬─────────────────┤
│ CI/CD │ Infra │ Secrets │ Observe │ Security │
│ GitHub │ Terraform│ Vault │ Prom+ │ Policy-as-Code │
│ Actions │ Crossplan│ AWS SM │ Grafana │ OPA/Kyverno │
├─────────┴──────────┴──────────┴──────────┴─────────────────┤
│ Infrastructure Layer │
│ (Kubernetes / AWS / Azure / GCP) │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Developer Interface │
│ (Portal Web / CLI / IDE Plugins / API) │
├─────────────────────────────────────────────────────────────┤
│ Orchestration Layer │
│ (Workflows, Templates, Policies) │
├─────────┬──────────┬──────────┬──────────┬─────────────────┤
│ CI/CD │ Infra │ Secrets │ Observe │ Security │
│ GitHub │ Terraform│ Vault │ Prom+ │ Policy-as-Code │
│ Actions │ Crossplan│ AWS SM │ Grafana │ OPA/Kyverno │
├─────────┴──────────┴──────────┴──────────┴─────────────────┤
│ Infrastructure Layer │
│ (Kubernetes / AWS / Azure / GCP) │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Developer Interface │
│ (Portal Web / CLI / IDE Plugins / API) │
├─────────────────────────────────────────────────────────────┤
│ Orchestration Layer │
│ (Workflows, Templates, Policies) │
├─────────┬──────────┬──────────┬──────────┬─────────────────┤
│ CI/CD │ Infra │ Secrets │ Observe │ Security │
│ GitHub │ Terraform│ Vault │ Prom+ │ Policy-as-Code │
│ Actions │ Crossplan│ AWS SM │ Grafana │ OPA/Kyverno │
├─────────┴──────────┴──────────┴──────────┴─────────────────┤
│ Infrastructure Layer │
│ (Kubernetes / AWS / Azure / GCP) │
└─────────────────────────────────────────────────────────────┘
# backstage-template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata: name: nodejs-service title: Node.js Microservice description: Crea un microservicio Node.js con CI/CD, K8s y monitoreo
spec: owner: platform-team type: service parameters: - title: Service Info required: [name, owner] properties: name: title: Service Name type: string pattern: '^[a-z0-9-]+$' owner: title: Owner Team type: string ui:field: OwnerPicker description: title: Description type: string - title: Infrastructure properties: database: title: Database type: string enum: [none, postgresql, mongodb, dynamodb] default: none cache: title: Cache type: string enum: [none, redis, memcached] default: none steps: - id: create-repo name: Create Repository action: publish:github input: repoUrl: 'github.com?repo=${{ parameters.name }}&owner=my-org' defaultBranch: main - id: create-infra name: Provision Infrastructure action: terraform:apply input: template: microservice-base variables: service_name: ${{ parameters.name }} database: ${{ parameters.database }} cache: ${{ parameters.cache }} - id: register name: Register in Catalog action: catalog:register input: repoContentsUrl: ${{ steps['create-repo'].output.repoContentsUrl }} catalogInfoPath: '/catalog-info.yaml' output: links: - title: Repository url: ${{ steps['create-repo'].output.remoteUrl }} - title: Open in Backstage icon: catalog entityRef: ${{ steps['register'].output.entityRef }}
# backstage-template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata: name: nodejs-service title: Node.js Microservice description: Crea un microservicio Node.js con CI/CD, K8s y monitoreo
spec: owner: platform-team type: service parameters: - title: Service Info required: [name, owner] properties: name: title: Service Name type: string pattern: '^[a-z0-9-]+$' owner: title: Owner Team type: string ui:field: OwnerPicker description: title: Description type: string - title: Infrastructure properties: database: title: Database type: string enum: [none, postgresql, mongodb, dynamodb] default: none cache: title: Cache type: string enum: [none, redis, memcached] default: none steps: - id: create-repo name: Create Repository action: publish:github input: repoUrl: 'github.com?repo=${{ parameters.name }}&owner=my-org' defaultBranch: main - id: create-infra name: Provision Infrastructure action: terraform:apply input: template: microservice-base variables: service_name: ${{ parameters.name }} database: ${{ parameters.database }} cache: ${{ parameters.cache }} - id: register name: Register in Catalog action: catalog:register input: repoContentsUrl: ${{ steps['create-repo'].output.repoContentsUrl }} catalogInfoPath: '/catalog-info.yaml' output: links: - title: Repository url: ${{ steps['create-repo'].output.remoteUrl }} - title: Open in Backstage icon: catalog entityRef: ${{ steps['register'].output.entityRef }}
# backstage-template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata: name: nodejs-service title: Node.js Microservice description: Crea un microservicio Node.js con CI/CD, K8s y monitoreo
spec: owner: platform-team type: service parameters: - title: Service Info required: [name, owner] properties: name: title: Service Name type: string pattern: '^[a-z0-9-]+$' owner: title: Owner Team type: string ui:field: OwnerPicker description: title: Description type: string - title: Infrastructure properties: database: title: Database type: string enum: [none, postgresql, mongodb, dynamodb] default: none cache: title: Cache type: string enum: [none, redis, memcached] default: none steps: - id: create-repo name: Create Repository action: publish:github input: repoUrl: 'github.com?repo=${{ parameters.name }}&owner=my-org' defaultBranch: main - id: create-infra name: Provision Infrastructure action: terraform:apply input: template: microservice-base variables: service_name: ${{ parameters.name }} database: ${{ parameters.database }} cache: ${{ parameters.cache }} - id: register name: Register in Catalog action: catalog:register input: repoContentsUrl: ${{ steps['create-repo'].output.repoContentsUrl }} catalogInfoPath: '/catalog-info.yaml' output: links: - title: Repository url: ${{ steps['create-repo'].output.remoteUrl }} - title: Open in Backstage icon: catalog entityRef: ${{ steps['register'].output.entityRef }}
MVP típico: 1. Template para crear nuevo servicio (repo + CI/CD + deploy) 2. Self-service para ambientes efímeros (PR environments) 3. Catálogo de servicios (quién es dueño de qué) 4. Dashboards de observabilidad por servicio
MVP típico: 1. Template para crear nuevo servicio (repo + CI/CD + deploy) 2. Self-service para ambientes efímeros (PR environments) 3. Catálogo de servicios (quién es dueño de qué) 4. Dashboards de observabilidad por servicio
MVP típico: 1. Template para crear nuevo servicio (repo + CI/CD + deploy) 2. Self-service para ambientes efímeros (PR environments) 3. Catálogo de servicios (quién es dueño de qué) 4. Dashboards de observabilidad por servicio
Stack: Portal: Backstage (catalog + templates + TechDocs) CI/CD: GitHub Actions (build + test + deploy) GitOps: ArgoCD (sync K8s manifests from Git) IaC: Terraform + Terragrunt (infra provisioning) Secrets: AWS Secrets Manager + External Secrets Operator Observability: Prometheus + Grafana + Loki Security: Trivy (image scanning) + Kyverno (policies) DNS/TLS: External-DNS + cert-manager Flujo para nuevo servicio: 1. Developer abre Backstage → elige template "Node.js Service" 2. Backstage crea repo en GitHub con Dockerfile, CI/CD, K8s manifests 3. Developer hace push de código 4. GitHub Actions: build → test → push image → update K8s manifest 5. ArgoCD detecta cambio en manifest → despliega en cluster 6. Prometheus scrape métricas → Grafana dashboard automático 7. Alertas configuradas automáticamente via alerting rules template
Stack: Portal: Backstage (catalog + templates + TechDocs) CI/CD: GitHub Actions (build + test + deploy) GitOps: ArgoCD (sync K8s manifests from Git) IaC: Terraform + Terragrunt (infra provisioning) Secrets: AWS Secrets Manager + External Secrets Operator Observability: Prometheus + Grafana + Loki Security: Trivy (image scanning) + Kyverno (policies) DNS/TLS: External-DNS + cert-manager Flujo para nuevo servicio: 1. Developer abre Backstage → elige template "Node.js Service" 2. Backstage crea repo en GitHub con Dockerfile, CI/CD, K8s manifests 3. Developer hace push de código 4. GitHub Actions: build → test → push image → update K8s manifest 5. ArgoCD detecta cambio en manifest → despliega en cluster 6. Prometheus scrape métricas → Grafana dashboard automático 7. Alertas configuradas automáticamente via alerting rules template
Stack: Portal: Backstage (catalog + templates + TechDocs) CI/CD: GitHub Actions (build + test + deploy) GitOps: ArgoCD (sync K8s manifests from Git) IaC: Terraform + Terragrunt (infra provisioning) Secrets: AWS Secrets Manager + External Secrets Operator Observability: Prometheus + Grafana + Loki Security: Trivy (image scanning) + Kyverno (policies) DNS/TLS: External-DNS + cert-manager Flujo para nuevo servicio: 1. Developer abre Backstage → elige template "Node.js Service" 2. Backstage crea repo en GitHub con Dockerfile, CI/CD, K8s manifests 3. Developer hace push de código 4. GitHub Actions: build → test → push image → update K8s manifest 5. ArgoCD detecta cambio en manifest → despliega en cluster 6. Prometheus scrape métricas → Grafana dashboard automático 7. Alertas configuradas automáticamente via alerting rules template
mi-nuevo-servicio/
├── src/ # Código de la app
├── Dockerfile # Multi-stage, pre-configurado
├── .github/
│ └── workflows/
│ └── ci-cd.yaml # Pipeline completo
├── k8s/
│ ├── deployment.yaml # Con resource limits, probes
│ ├── service.yaml # ClusterIP service
│ ├── ingress.yaml # Con TLS automático
│ └── hpa.yaml # Autoescalado
├── monitoring/
│ ├── dashboard.json # Grafana dashboard
│ └── alerts.yaml # PrometheusRule
├── catalog-info.yaml # Registro en Backstage
└── docs/ └── index.md # TechDocs automáticos
mi-nuevo-servicio/
├── src/ # Código de la app
├── Dockerfile # Multi-stage, pre-configurado
├── .github/
│ └── workflows/
│ └── ci-cd.yaml # Pipeline completo
├── k8s/
│ ├── deployment.yaml # Con resource limits, probes
│ ├── service.yaml # ClusterIP service
│ ├── ingress.yaml # Con TLS automático
│ └── hpa.yaml # Autoescalado
├── monitoring/
│ ├── dashboard.json # Grafana dashboard
│ └── alerts.yaml # PrometheusRule
├── catalog-info.yaml # Registro en Backstage
└── docs/ └── index.md # TechDocs automáticos
mi-nuevo-servicio/
├── src/ # Código de la app
├── Dockerfile # Multi-stage, pre-configurado
├── .github/
│ └── workflows/
│ └── ci-cd.yaml # Pipeline completo
├── k8s/
│ ├── deployment.yaml # Con resource limits, probes
│ ├── service.yaml # ClusterIP service
│ ├── ingress.yaml # Con TLS automático
│ └── hpa.yaml # Autoescalado
├── monitoring/
│ ├── dashboard.json # Grafana dashboard
│ └── alerts.yaml # PrometheusRule
├── catalog-info.yaml # Registro en Backstage
└── docs/ └── index.md # TechDocs automáticos - Configurar un repositorio con CI/CD
- Crear recursos cloud (bases de datos, colas, storage)
- Configurar Kubernetes manifests (deployment, service, ingress)
- Gestionar secretos y variables de entorno
- Configurar monitoreo y alertas
- Gestionar certificados TLS
- Configurar DNS
- Solicitar permisos IAM - Ejecuta un comando o usa un portal web
- La plataforma configura todo lo demás automáticamente - Portal web: Backstage (Spotify), Port, Cortex, Humanitec
- CLI: Herramientas de línea de comandos custom
- Catálogo de servicios: Inventario de todos los servicios, owners y documentación
- Templates: Scaffolding para crear nuevos servicios con un clic - Workflows: Secuencias de pasos automatizados (crear repo, configurar CI/CD, desplegar infra)
- Templates: Blueprints reutilizables para diferentes tipos de servicio
- Policies: Reglas que garantizan compliance, seguridad y estándares - CI/CD: GitHub Actions, GitLab CI, ArgoCD
- IaC: Terraform, Crossplane, Pulumi
- Secrets: HashiCorp Vault, AWS Secrets Manager
- Observabilidad: Prometheus, Grafana, Loki, OpenTelemetry
- Seguridad: OPA, Kyverno, Trivy, Snyk - Clusters Kubernetes (EKS, AKS, GKE)
- Servicios cloud managed (RDS, ElastiCache, S3)
- Networking (VPCs, load balancers, DNS) - Cuánto tiempo pierden los developers en tareas de infraestructura
- Cuáles son los procesos más dolorosos (onboarding, deploys, debugging)
- Qué nivel de autonomía quieren los developers
- Cuál es la carga cognitiva actual - Product owner: Alguien que prioriza features basándose en impacto al developer
- User research: Feedback continuo de los developers
- Roadmap: Plan público de qué viene en la plataforma
- Docs: Documentación clara y actualizada
- SLOs: La plataforma tiene sus propios objetivos de confiabilidad
- Opt-in, no mandate: Los developers eligen usar la plataforma porque es mejor, no porque los obliguen - Code generation: Templates que generan código basado en prompts
- Troubleshooting asistido: IA que analiza logs y sugiere soluciones
- Cost optimization: Recomendaciones automáticas de right-sizing
- Security remediation: Detección y fix automático de vulnerabilidades - Configuración de Backstage como código
- Policies como código (OPA/Rego)
- Infrastructure como código (Terraform/Crossplane)
- Observabilidad como código (dashboards, alerts en Git)