Communitygithub.com

patrones-de-despliegue

Flujos de trabajo de despliegue en producción, patrones de CI/CD, contenerización con Docker, health checks, estrategias de rollback y listas de verificación de preparación para producción para aplicaciones web. Útil al configurar CI/CD, contenerizar una app o verificar la preparación para producción antes de un lanzamiento.

¿Qué es patrones-de-despliegue?

Esta skill proporciona una guía completa sobre patrones de despliegue y mejores prácticas de CI/CD para aplicaciones web. Cubre estrategias de despliegue como rolling, blue-green y canary, explicando sus pros, contras y cuándo usarlas. Incluye ejemplos detallados de Dockerfiles multi-etapa para Node.js, Go y Python/Django, siguiendo las mejores prácticas de seguridad y optimización de tamaño. También ofrece pipelines de CI/CD con GitHub Actions, implementación de health checks, configuración de entorno según la metodología Twelve-Factor App, y estrategias de rollback con listas de verificación. Finaliza con una lista de verificación de preparación para producción que abarca aplicación, infraestructura, monitoreo, seguridad y operaciones. Compatible con cualquier plataforma de despliegue (Kubernetes, Vercel, Railway, etc.).

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/deployment-patterns

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Patrones de Despliegue

Flujos de trabajo de despliegue en producción y mejores prácticas de CI/CD.

Cuándo Activar

  • Configurar pipelines de CI/CD
  • Contenerizar una aplicación
  • Planificar la estrategia de despliegue (blue-green, canary, rolling)
  • Implementar health checks y readiness probes
  • Preparar un lanzamiento a producción
  • Configurar ajustes específicos de entorno

Estrategias de Despliegue

Despliegue Rolling (Predeterminado)

Reemplazar instancias gradualmente: las versiones antigua y nueva se ejecutan simultáneamente durante el despliegue.

Instancia 1: v1 → v2  (actualizar primero)
Instancia 2: v1        (todavía ejecutando v1)
Instancia 3: v1        (todavía ejecutando v1)

Instancia 1: v2
Instancia 2: v1 → v2  (actualizar segundo)
Instancia 3: v1

Instancia 1: v2
Instancia 2: v2
Instancia 3: v1 → v2  (actualizar último)

Pros: Tiempo de inactividad cero, despliegue gradual Contras: Dos versiones se ejecutan simultáneamente: requiere cambios compatibles con versiones anteriores Usar cuando: Despliegues estándar, cambios compatibles con versiones anteriores

Despliegue Blue-Green

Ejecutar dos entornos idénticos. Cambiar el tráfico de forma atómica.

Blue  (v1) ← tráfico
Green (v2)   inactivo, ejecutando nueva versión

# Después de la verificación:
Blue  (v1)   inactivo (se convierte en modo de espera)
Green (v2) ← tráfico

Pros: Rollback instantáneo (volver a blue), corte limpio Contras: Requiere 2x infraestructura durante el despliegue Usar cuando: Servicios críticos, tolerancia cero a problemas

Despliegue Canary

Enrutar un pequeño porcentaje de tráfico a la nueva versión primero.

v1: 95% del tráfico
v2:  5% del tráfico  (canary)

# Si las métricas se ven bien:
v1: 50% del tráfico
v2: 50% del tráfico

# Final:
v2: 100% del tráfico

Pros: Detecta problemas con tráfico real antes del despliegue completo Contras: Requiere infraestructura de división de tráfico, monitoreo Usar cuando: Servicios de alto tráfico, cambios arriesgados, feature flags

Docker

Dockerfile Multi-Etapa (Node.js)

# Etapa 1: Instalar dependencias
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --production=false

# Etapa 2: Compilar
FROM node:22-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
RUN npm prune --production

# Etapa 3: Imagen de producción
FROM node:22-alpine AS runner
WORKDIR /app

RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001
USER appuser

COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:appgroup /app/dist ./dist
COPY --from=builder --chown=appuser:appgroup /app/package.json ./

ENV NODE_ENV=production
EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1

CMD ["node", "dist/server.js"]

Dockerfile Multi-Etapa (Go)

FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /server ./cmd/server

FROM alpine:3.19 AS runner
RUN apk --no-cache add ca-certificates
RUN adduser -D -u 1001 appuser
USER appuser

COPY --from=builder /server /server

EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:8080/health || exit 1
CMD ["/server"]

Dockerfile Multi-Etapa (Python/Django)

FROM python:3.12-slim AS builder
WORKDIR /app
RUN pip install --no-cache-dir uv
COPY requirements.txt .
RUN uv pip install --system --no-cache -r requirements.txt

FROM python:3.12-slim AS runner
WORKDIR /app

RUN useradd -r -u 1001 appuser
USER appuser

COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin
COPY . .

ENV PYTHONUNBUFFERED=1
EXPOSE 8000

HEALTHCHECK --interval=30s --timeout=3s CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health/')" || exit 1
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "4"]

Mejores Prácticas de Docker

# BUENAS prácticas
- Usar tags de versión específicos (node:22-alpine, no node:latest)
- Compilaciones multi-etapa para minimizar el tamaño de la imagen
- Ejecutar como usuario no root
- Copiar primero los archivos de dependencias (caché de capas)
- Usar .dockerignore para excluir node_modules, .git, tests
- Agregar la instrucción HEALTHCHECK
- Establecer límites de recursos en docker-compose o k8s

# MALAS prácticas
- Ejecutar como root
- Usar tags :latest
- Copiar todo el repositorio en una sola capa COPY
- Instalar dependencias de desarrollo en la imagen de producción
- Almacenar secretos en la imagen (usar variables de entorno o un gestor de secretos)

Pipeline CI/CD

GitHub Actions (Pipeline Estándar)

name: CI/CD

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    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 lint
      - run: npm run typecheck
      - run: npm test -- --coverage
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: coverage
          path: coverage/

  build:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-buildx-action@v3
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v5
        with:
          push: true
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

  deploy:
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    environment: production
    steps:
      - name: Desplegar a producción
        run: |
          # Comando de despliegue específico de la plataforma
          # Railway: railway up
          # Vercel: vercel --prod
          # K8s: kubectl set image deployment/app app=ghcr.io/${{ github.repository }}:${{ github.sha }}
          echo "Desplegando ${{ github.sha }}"

Etapas del Pipeline

PR abierta:
  lint → typecheck → pruebas unitarias → pruebas de integración → despliegue de vista previa

Fusionado a main:
  lint → typecheck → pruebas unitarias → pruebas de integración → compilar imagen → desplegar staging → smoke tests → desplegar producción

Health Checks

Endpoint de Health Check

// Health Check simple
app.get("/health", (req, res) => {
  res.status(200).json({ status: "ok" });
});

// Health Check detallado (para monitoreo interno)
app.get("/health/detailed", async (req, res) => {
  const checks = {
    database: await checkDatabase(),
    redis: await checkRedis(),
    externalApi: await checkExternalApi(),
  };

  const allHealthy = Object.values(checks).every(c => c.status === "ok");

  res.status(allHealthy ? 200 : 503).json({
    status: allHealthy ? "ok" : "degradado",
    timestamp: new Date().toISOString(),
    version: process.env.APP_VERSION || "desconocido",
    uptime: process.uptime(),
    checks,
  });
});

async function checkDatabase(): Promise<HealthCheck> {
  try {
    await db.query("SELECT 1");
    return { status: "ok", latency_ms: 2 };
  } catch (err) {
    return { status: "error", message: "Base de datos inaccesible" };
  }
}

Sondas de Kubernetes

livenessProbe:
  httpGet:
    path: /health
    port: 3000
  initialDelaySeconds: 10
  periodSeconds: 30
  failureThreshold: 3

readinessProbe:
  httpGet:
    path: /health
    port: 3000
  initialDelaySeconds: 5
  periodSeconds: 10
  failureThreshold: 2

startupProbe:
  httpGet:
    path: /health
    port: 3000
  initialDelaySeconds: 0
  periodSeconds: 5
  failureThreshold: 30    # 30 * 5s = 150s de tiempo máximo de inicio

Configuración de Entorno

Patrón Twelve-Factor App

# Toda la configuración a través de variables de entorno, nunca en el código
DATABASE_URL=postgres://user:pass@host:5432/db
REDIS_URL=redis://host:6379/0
API_KEY=${API_KEY}           # inyectado por el gestor de secretos
LOG_LEVEL=info
PORT=3000

# Comportamiento específico del entorno
NODE_ENV=production          # o staging, development
APP_ENV=production           # entorno de aplicación explícito

Validación de Configuración

import { z } from "zod";

const envSchema = z.object({
  NODE_ENV: z.enum(["development", "staging", "production"]),
  PORT: z.coerce.number().default(3000),
  DATABASE_URL: z.string().url(),
  REDIS_URL: z.string().url(),
  JWT_SECRET: z.string().min(32),
  LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
});

// Validar al inicio: fallar rápido si la configuración es incorrecta
export const env = envSchema.parse(process.env);

Estrategia de Rollback

Rollback Instantáneo

# Docker/Kubernetes: apuntar a la imagen anterior
kubectl rollout undo deployment/app

# Vercel: promover despliegue anterior
vercel rollback

# Railway: redeshacer commit anterior
railway up --commit <sha-anterior>

# Base de datos: revertir migración (si es reversible)
npx prisma migrate resolve --rolled-back <nombre-migracion>

Lista de Verificación de Rollback

  • La imagen/artefacto anterior está disponible y etiquetado
  • Las migraciones de base de datos son compatibles con versiones anteriores (sin cambios destructivos)
  • Los feature flags pueden deshabilitar nuevas funcionalidades sin desplegar
  • Alertas de monitoreo configuradas para picos de tasa de error
  • Rollback probado en staging antes del lanzamiento a producción

Lista de Verificación de Preparación para Producción

Antes de cualquier despliegue en producción:

Aplicación

  • Todas las pruebas pasan (unitarias, integración, E2E)
  • No hay secretos codificados en el código o archivos de configuración
  • El manejo de errores cubre todos los casos extremos
  • El registro es estructurado (JSON) y no contiene PII
  • El endpoint de health check devuelve un estado significativo

Infraestructura

  • La imagen Docker se compila de forma reproducible (versiones fijas)
  • Las variables de entorno están documentadas y validadas al inicio
  • Límites de recursos establecidos (CPU, memoria)
  • Escalado horizontal configurado (instancias mín/máx)
  • SSL/TLS habilitado en todos los endpoints

Monitoreo

  • Métricas de la aplicación exportadas (tasa de solicitudes, latencia, errores)
  • Alertas configuradas para tasa de error > umbral
  • Agregación de registros configurada (registros estructurados, buscables)
  • Monitoreo de tiempo de actividad en el endpoint de health

Seguridad

  • Dependencias escaneadas en busca de CVEs
  • CORS configurado solo para orígenes permitidos
  • Límite de tasa habilitado en endpoints públicos
  • Autenticación y autorización verificadas
  • Cabeceras de seguridad establecidas (CSP, HSTS, X-Frame-Options)

Operaciones

  • Plan de rollback documentado y probado
  • Migración de base de datos probada con datos de tamaño de producción
  • Runbook para escenarios de fallo comunes
  • Rotación de guardias y ruta de escalamiento definidas

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

Skills relacionados