Despliega Backstage en Kubernetes: Tu Portal de Desarrolladores Interno Multiservicio
Hoy te traigo un proyecto puntero que está arrasando entre equipos DevOps y plataformas: Backstage de Spotify, el portal de desarrolladores más popular para orquestar servicios, documentación, catálogo de APIs, monitoreo y despliegue desde una interfaz central. Vamos a ver cómo puedes levantar tu propio Backstage autohospedado en un Kubernetes en tu VPS y por qué te interesará para centralizar tus proyectos, reducir la fricción y facilitar la colaboración, tanto en entornos corporativos como personales.
¿Qué es Backstage y por qué desplegarlo en Kubernetes?
- Portal central de desarrollo: Catálogo de servicios, documentación viva, plantillas de proyectos y conectores.
- Escalabilidad sencilla: Kubernetes te permite escalar Backstage bajo demanda o integrarlo con otros servicios, SSO o monitorización.
- Personalización y plugins: Añade integraciones como Github, Gitlab, Jenkins, Prometheus, herramientas de CI/CD, y mucho más.
- Plataforma de moda: Adoptada y arropada por la CNCF, Backstage es tendencia y cada mes lanza nuevas funcionalidades.
Arquitectura que desplegaremos
- Backstage App Server corriendo en un Deployment con autoscaling opcional.
- PostgreSQL como base de datos backend para almacenar la información interna.
- Servicios y volúmenes persistentes para soportar reinicios y upgrades.
- Ingress controller para exponer de forma segura la aplicación.
- Opción fácil de integrar un certificado Let’s Encrypt vía anotación o con Cert-Manager.
Ficheros YAML completos para Backstage en Kubernetes
A continuación tienes un ejemplo funcional adaptado para una instalación básica, que puedes personalizar. Incluye variables clave para el dominio y credenciales.
1. Secret para claves de la base de datos
apiVersion: v1
kind: Secret
metadata:
name: postgres-secret
type: Opaque
data:
POSTGRES_USER: YmFja3N0YWdl
POSTGRES_PASSWORD: c2VjdXJlcGFzcw==
POSTGRES_DB: YmFja3N0YWdlX2Ri
# Valores: echo -n 'usuario' | base64
2. PostgreSQL Deployment y PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
selector:
matchLabels:
app: postgres
replicas: 1
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:16
envFrom:
- secretRef:
name: postgres-secret
ports:
- containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: db-storage
volumes:
- name: db-storage
persistentVolumeClaim:
claimName: postgres-pvc
---
apiVersion: v1
kind: Service
metadata:
name: postgres
spec:
ports:
- port: 5432
selector:
app: postgres
3. Backstage Deployment y Service
apiVersion: apps/v1
kind: Deployment
metadata:
name: backstage
spec:
replicas: 2
selector:
matchLabels:
app: backstage
template:
metadata:
labels:
app: backstage
spec:
containers:
- name: backstage
image: backstage/backstage:latest
env:
- name: POSTGRES_HOST
value: "postgres"
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: postgres-secret
key: POSTGRES_USER
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: POSTGRES_PASSWORD
- name: POSTGRES_DB
valueFrom:
secretKeyRef:
name: postgres-secret
key: POSTGRES_DB
- name: BACKSTAGE_APP_BASE_URL
value: "https://tubackstage.tudominio.com"
ports:
- containerPort: 7007
---
apiVersion: v1
kind: Service
metadata:
name: backstage
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 7007
selector:
app: backstage
4. Ingress para exponer Backstage (con opción Let’s Encrypt)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: backstage-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
# Para cert-manager/Let's Encrypt descomenta esto:
# cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- tubackstage.tudominio.com
secretName: backstage-tls
rules:
- host: tubackstage.tudominio.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backstage
port:
number: 80
Cómo desplegarlo paso a paso
- Crea el Secret y el PVC para la base de datos:
kubectl apply -f postgres-secret.yaml
kubectl apply -f postgres-pvc.yaml
- Despliega PostgreSQL:
kubectl apply -f postgres-deployment.yaml
- Espera a que esté listo el pod y el servicio de PostgreSQL.
- Aplica los manifiestos de Backstage (ajusta el nombre de dominio):
kubectl apply -f backstage-deployment.yaml
- Configura el Ingress conectado a tu dominio. Si usas Cert-Manager, ajusta las anotaciones para obtener un certificado TLS.
- Tunea la configuración de Backstage editando su
app-config.yaml
(hay plugins e integraciones en la documentación oficial). - Abre
https://tubackstage.tudominio.com
y empieza a catalogar y monitorizar tus servicios 🎉
Consejos extra y troubleshooting
- Configuración avanzada: Añade plugins extra (Github, Jenkins, ArgoCD, Sentry, Prometheus…) editando el
app-config.yaml
y montándolo como ConfigMap. - Debug: Si Backstage no arranca o no conecta a la base de datos, revisa los logs con
kubectl logs deployment/backstage
y comprueba que las Secret estén bien codificadas (base64
). - Personalización: Cambia el logo, colores o flujos añadiendo tus propios plugins y recursos estáticos en la imagen (puedes construir tu propia imagen y subirla a Docker Hub o tu registry privado).
- Escalado horizontal: Sube
replicas
en el deployment según cantidad de usuarios concurrentes. - Problemas con las rutas: Backstage utiliza
pathType: Prefix
en el Ingress, ideal para instalarlo en raíz del dominio; si necesitas montar varios portales usa paths distintos (/backstage
,/grafana
…). - Seguridad: Implementa Single Sign-On (SSO) e integra RBAC adaptado para tu equipo, y limita acceso con políticas de red.
¡Y eso es todo! Ahora, conviértete en el rey 🦁 de la productividad y documentación interna con tu propio portal Backstage en Kubernetes.
¿Dudas, ideas de integración o quieres que preparemos algún plugin en otro artículo? ¡Déjalo en los comentarios!