DevOps sin dolor: el setup mínimo que tu equipo necesita | Backend Survivor

DevOps sin dolor: el setup mínimo que tu equipo necesita

Por Backend Survivor

Hay dos extremos en DevOps:

  1. El extremo “no necesitamos DevOps”: deploy manual por FTP, no hay tests, no hay CI, los viernes se deploya “porque sí”. El resultado: domingos arreglando producción.

  2. El extremo “DevOps enterprise”: Jenkins con 200 plugins, ArgoCD, Flux, Prometheus + Grafana + Loki + Tempo, Terraform con 50 módulos, Kubernetes con service mesh. El resultado: necesitás un equipo dedicado solo para mantener las herramientas.

Este post es sobre el punto medio: el setup mínimo que te da el 80% de los beneficios con el 20% de la complejidad.

Los 5 pilares del setup mínimo

1. CI/CD con GitHub Actions (gratis para repos públicos, $4/mes para privados)

# .github/workflows/deploy.yml
name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm
      - run: npm ci
      - run: npm run build
      - run: npm run test --if-present
      - uses: cloudflare/pages-action@v1
        with:
          apiToken: ${{ secrets.CF_API_TOKEN }}
          accountId: ${{ secrets.CF_ACCOUNT_ID }}
          projectName: mi-proyecto
          directory: dist

Esto te da: build automático en cada push, tests antes de deployar, deploy a producción en < 3 minutos. No necesitás nada más para empezar.

Regla de oro: si el build o los tests fallan, no se deploya. Punto.

2. Preview environments (gratis con Cloudflare Pages / Vercel)

Cada PR genera un URL preview. Tu PM puede ver los cambios antes de mergear. Tu QA puede testear sin acceder a staging.

# Cloudflare Pages lo hace automáticamente
# Vercel lo hace automáticamente
# Netlify lo hace automáticamente

No hay configuración. Funciona out of the box. Es la feature más subestimada de estas plataformas.

3. Observabilidad básica (logs + errores)

No necesitás Prometheus + Grafana para empezar. Necesitás dos cosas:

a) Error tracking: Sentry (free tier: 5k eventos/mes) o Better Stack (free tier: 100k eventos/mes).

// Sentry — 3 líneas de código
import * as Sentry from "@sentry/astro";
Sentry.init({ dsn: "https://...", tracesSampleRate: 0.1 });

b) Logs centralizados: si usás Cloudflare, los logs están en el dashboard. Si usás un VPS, usá docker compose logs o un servicio como Better Stack Logs ($0-25/mes).

Regla: si un usuario reporta un bug, deberías poder ver el error en Sentry en < 30 segundos sin pedirle screenshots.

4. Backups automáticos (porque va a pasar)

#!/bin/bash
# backup.sh — correr daily con cron
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

# PostgreSQL
pg_dump -h localhost -U deploy mi_db | gzip > /tmp/backup_$TIMESTAMP.sql.gz

# Subir a S3 / R2
aws s3 cp /tmp/backup_$TIMESTAMP.sql.gz s3://mi-backups/db/

# Retención: borrar backups de más de 30 días
aws s3 ls s3://mi-backups/db/ | awk '{print $4}' | \
  grep "backup_" | sort | head -n -30 | \
  xargs -I {} aws s3 rm s3://mi-backups/db/{}

Coste: ~$1/mes en storage S3/R2. Tiempo: 10 minutos de setup. Valor: tu negocio si la base de datos se corrompe.

Regla: un backup que no se testeó no es un backup. Una vez al mes, restaurá un backup a un entorno de test y verificá que funciona.

5. Health checks y alertas básicas

# healthcheck.yaml — GitHub Actions cada 5 minutos
name: Health Check
on:
  schedule:
    - cron: '*/5 * * * *'

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - run: |
          STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://misitio.com/api/health)
          if [ "$STATUS" != "200" ]; then
            echo "Site is down! Status: $STATUS"
            # Enviar alerta (Slack, email, SMS)
            curl -X POST $SLACK_WEBHOOK -d "{\"text\": \"🚨 Site down! Status: $STATUS\"}"
            exit 1
          fi

O usá un servicio como Better Stack Uptime (free tier: 10 monitores) o UptimeRobot (free tier: 50 monitores).

El stack completo

ComponenteHerramientaCoste
CI/CDGitHub Actions$0-4/mes
HostingCloudflare Pages$0/mes
Preview environmentsCloudflare Pages$0/mes
Error trackingSentry free tier$0/mes
LogsCloudflare dashboard$0/mes
BackupsS3/R2 + script~$1/mes
Health checksBetter Stack free$0/mes
Total~$5/mes

Lo que NO necesitás (todavía)

  • Kubernetes: hasta que tengas > 10 servicios
  • Terraform/Pulumi: hasta que tengas > 3 infraestructuras diferentes
  • Service mesh (Istio/Linkerd): probablemente nunca
  • ELK stack: hasta que tengas > 50GB de logs/día
  • ArgoCD/Flux: hasta que tengas Kubernetes (ver punto 1)

La regla del “justo a tiempo”

No implementes herramientas que no necesitás hoy. Cuando las necesites, vas a saberlo porque:

  • Los deploys tardan > 10 minutos → necesitás CI más rápido o parallelización
  • No podés encontrar errores en los logs → necesitás observabilidad estructurada
  • Deployar un cambio requiere 5 pasos manuales → necesitás más automatización
  • Tu VPS no aguanta el tráfico → necesitás auto-scaling o managed containers

Cada herramienta tiene un coste de aprendizaje y mantenimiento. No lo pagues hasta que el dolor de no tenerla sea mayor que el coste de implementarla.

La madurez en DevOps no se mide por cuántas herramientas usás. Se mide por cuántas veces tu equipo duerme tranquilo.