Saltearse al contenido

Guía de Despliegue en Producción

Esta guía describe los pasos para desplegar la API de Autenticación SaaS en un entorno de producción.

Prerrequisitos

  • Docker y Docker Compose
  • Un servidor o entorno en la nube (AWS, GCP, Azure, etc.)
  • Nombre de dominio y certificado SSL (recomendado)
  • Base de datos PostgreSQL (puede desplegarse como parte del stack o como servicio gestionado)
  • Instancia de Redis (puede desplegarse como parte del stack o como servicio gestionado)

Consideraciones de Seguridad

Antes de desplegar en producción, asegúrate de haber abordado estas consideraciones de seguridad:

  1. Cambiar secretos y contraseñas predeterminadas:

    • Secreto JWT
    • Salt de contraseñas
    • Contraseñas de la base de datos
    • Contraseñas de Redis
  2. Asegurar tus variables de entorno:

    • Utilizar un servicio de gestión de secretos cuando sea posible
    • No comprometer secretos en el control de versiones
  3. Configurar TLS/SSL adecuadamente:

    • Utilizar un certificado SSL válido
    • Configurar HTTPS correctamente
    • Implementar redirección de HTTP a HTTPS
  4. Configurar firewalls y seguridad de red:

    • Limitar el acceso a la base de datos y Redis solo a tus servidores de aplicación
    • Utilizar VPCs o aislamiento de red equivalente cuando sea apropiado

Configuración de Producción

Crea un archivo de configuración de producción (config/config.prod.yaml) con la configuración adecuada:

app:
name: saas-auth-api
version: 0.1.0
env: production
port: 3000
database:
host: tu-host-db
port: 5432
user: db_user
password: contraseña_segura
name: saas_auth
sslmode: require # Usar SSL en producción
max_open_conns: 50
max_idle_conns: 10
conn_max_lifetime: 30m
redis:
host: tu-host-redis
port: 6379
password: contraseña_redis_segura
db: 0
jwt:
secret: tu_clave_secreta_muy_larga_y_aleatoria
access_ttl: 15m
refresh_ttl: 24h
auth:
password_salt: tu_salt_aleatorio_para_contraseñas
api_key_prefix: sk-
api_key_length: 32
rate_limit:
enabled: true
requests: 100
duration: 1m

Opciones de Despliegue

Despliegue con Docker Compose

Para despliegues más simples o entornos más pequeños, puedes utilizar Docker Compose:

  1. Crea un archivo docker-compose para producción (incluido en el proyecto como docker-compose.yml).

  2. Despliega usando Docker Compose:

    Ventana de terminal
    docker-compose up -d

Despliegue en Kubernetes

Para entornos de producción, se recomienda Kubernetes:

  1. Crea los manifiestos de Kubernetes:

    deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: saas-auth-api
    labels:
    app: saas-auth-api
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: saas-auth-api
    template:
    metadata:
    labels:
    app: saas-auth-api
    spec:
    containers:
    - name: saas-auth-api
    image: tu-registro/saas-auth-api:latest
    ports:
    - containerPort: 3000
    env:
    - name: APP_ENV
    value: "production"
    - name: DB_HOST
    valueFrom:
    secretKeyRef:
    name: saas-auth-secrets
    key: db-host
    - name: DB_PORT
    valueFrom:
    secretKeyRef:
    name: saas-auth-secrets
    key: db-port
    - name: DB_USER
    valueFrom:
    secretKeyRef:
    name: saas-auth-secrets
    key: db-user
    - name: DB_PASSWORD
    valueFrom:
    secretKeyRef:
    name: saas-auth-secrets
    key: db-password
    - name: DB_NAME
    valueFrom:
    secretKeyRef:
    name: saas-auth-secrets
    key: db-name
    - name: REDIS_HOST
    valueFrom:
    secretKeyRef:
    name: saas-auth-secrets
    key: redis-host
    - name: REDIS_PORT
    valueFrom:
    secretKeyRef:
    name: saas-auth-secrets
    key: redis-port
    - name: REDIS_PASSWORD
    valueFrom:
    secretKeyRef:
    name: saas-auth-secrets
    key: redis-password
    - name: JWT_SECRET
    valueFrom:
    secretKeyRef:
    name: saas-auth-secrets
    key: jwt-secret
    livenessProbe:
    httpGet:
    path: /health
    port: 3000
    initialDelaySeconds: 30
    periodSeconds: 10
    readinessProbe:
    httpGet:
    path: /health
    port: 3000
    initialDelaySeconds: 5
    periodSeconds: 5

    service.yaml:

    apiVersion: v1
    kind: Service
    metadata:
    name: saas-auth-api
    spec:
    selector:
    app: saas-auth-api
    ports:
    - port: 80
    targetPort: 3000
    type: ClusterIP

    ingress.yaml:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: saas-auth-api
    annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
    spec:
    tls:
    - hosts:
    - auth-api.tudominio.com
    secretName: auth-api-tls
    rules:
    - host: auth-api.tudominio.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: saas-auth-api
    port:
    number: 80

    secrets.yaml:

    apiVersion: v1
    kind: Secret
    metadata:
    name: saas-auth-secrets
    type: Opaque
    data:
    db-host: valor-codificado-base64
    db-port: valor-codificado-base64
    db-user: valor-codificado-base64
    db-password: valor-codificado-base64
    db-name: valor-codificado-base64
    redis-host: valor-codificado-base64
    redis-port: valor-codificado-base64
    redis-password: valor-codificado-base64
    jwt-secret: valor-codificado-base64
  2. Aplica los manifiestos:

    Ventana de terminal
    kubectl apply -f deployment.yaml
    kubectl apply -f service.yaml
    kubectl apply -f ingress.yaml
    kubectl apply -f secrets.yaml

Construcción para Producción

  1. Construye la imagen Docker:

    Ventana de terminal
    docker build -t tu-registro/saas-auth-api:latest .
  2. Envía la imagen a tu registro de contenedores:

    Ventana de terminal
    docker push tu-registro/saas-auth-api:latest

Migración de Base de Datos en Producción

Siempre realiza una copia de seguridad de tu base de datos antes de ejecutar migraciones en producción:

Ventana de terminal
# Ejecutar migraciones
migrate -path ./migrations -database "postgres://usuario:contraseña@tu-host-db:5432/saas_auth?sslmode=require" up

Alternativamente, la aplicación puede ejecutar migraciones automáticamente al iniciar, pero este enfoque debe usarse con precaución en un entorno de múltiples instancias para evitar que varias instancias intenten realizar migraciones simultáneamente.

Consideraciones de Escalabilidad

Escalado Horizontal

La aplicación está diseñada para escalar horizontalmente. Considera lo siguiente al escalar:

  1. Agrupación de Conexiones a la Base de Datos:

    • Ajusta max_open_conns y max_idle_conns basándote en el número de instancias
    • Considera usar un agrupador de conexiones como PgBouncer para despliegues a gran escala
  2. Gestión de Conexiones Redis:

    • Similar a las conexiones de base de datos, monitorea y ajusta la configuración de conexiones Redis
  3. Gestión de Sesiones:

    • La aplicación utiliza Redis para el almacenamiento de sesiones, lo que permite instancias sin estado
  4. Limitación de Tasa:

    • La limitación de tasa se implementa con Redis, lo que funciona en múltiples instancias

Monitorización y Registro

Configura una monitorización y registro adecuados:

  1. Registros de Aplicación:

    • Configura un sistema de registro centralizado (ELK Stack, Loki, etc.)
    • Establece niveles de registro apropiados en producción (info o warn)
  2. Métricas:

    • Configura la recopilación de métricas Prometheus
    • Monitoriza tiempos de respuesta API, tasas de error y uso de recursos
  3. Alertas:

    • Configura alertas para tasas de error elevadas, tiempos de respuesta lentos y restricciones de recursos

Configuración SSL/TLS

Para producción, siempre utiliza HTTPS. Tienes varias opciones:

  1. Terminar SSL en el Balanceador de Carga/Ingress (Recomendado):

    • Configura SSL en tu balanceador de carga o ingress de Kubernetes
    • Utiliza Let’s Encrypt para certificados gratuitos y de renovación automática
  2. SSL a nivel de Aplicación:

    • Configura SSL directamente en la aplicación
    • Esto no se recomienda ya que añade sobrecarga a la aplicación

Estrategia de Copias de Seguridad

Implementa una estrategia regular de copias de seguridad:

  1. Copias de Seguridad de Base de Datos:

    • Programa copias de seguridad completas regulares
    • Considera opciones de recuperación en un momento específico
    • Prueba los procedimientos de restauración regularmente
  2. Copias de Seguridad de Configuración:

    • Mantén los archivos de configuración en control de versiones
    • Documenta todos los ajustes específicos del entorno

Lista de Verificación para Producción

Antes de lanzar, asegúrate de haber abordado estos elementos:

  • Asegurar todas las credenciales y secretos
  • Configurar TLS/SSL adecuadamente
  • Configurar copias de seguridad de la base de datos
  • Implementar monitorización y alertas
  • Probar escalado horizontal
  • Realizar pruebas de carga
  • Implementar registro adecuado
  • Configurar comprobaciones de salud automatizadas
  • Crear manuales para tareas operativas comunes
  • Documentar el entorno de producción

Operaciones de Mantenimiento

Actualizaciones Continuas

Para realizar actualizaciones sin tiempo de inactividad:

  1. Con Kubernetes:

    Ventana de terminal
    kubectl set image deployment/saas-auth-api saas-auth-api=tu-registro/saas-auth-api:nueva-version

    Kubernetes realizará una actualización continua.

  2. Con Docker Compose:

    Ventana de terminal
    docker-compose pull
    docker-compose up -d

    Esto recreará los contenedores uno a uno.

Mantenimiento de Base de Datos

Programa tareas de mantenimiento regulares:

  1. Vacuum y Analyze PostgreSQL:

    VACUUM ANALYZE;
  2. Mantenimiento de Índices:

    REINDEX DATABASE saas_auth;
  3. Mantenimiento de Caché Redis: Monitoriza el uso de memoria y considera establecer políticas de desalojo apropiadas.

Solución de Problemas en Entornos de Producción

Problemas comunes y soluciones:

  1. Alta Carga de Base de Datos:

    • Verifica consultas lentas usando registros PostgreSQL
    • Revisa índices y optimización de consultas
    • Considera réplicas de lectura para cargas de trabajo con muchas lecturas
  2. Fugas de Memoria:

    • Monitoriza el uso de memoria del contenedor
    • Establece límites de memoria apropiados
    • Comprueba si hay fugas de goroutine
  3. Problemas de Conexión:

    • Verifica la conectividad de red
    • Comprueba las reglas del firewall
    • Asegúrate de que el descubrimiento de servicios funcione correctamente
  4. Tiempos de Respuesta Elevados:

    • Monitoriza las métricas de la aplicación
    • Comprueba el rendimiento de las consultas a la base de datos
    • Revisa los registros de la aplicación en busca de cuellos de botella

Recuperación ante Desastres

Prepárate para lo peor teniendo un plan de recuperación ante desastres:

  1. Recuperación de Base de Datos:

    • Documenta el proceso para restaurar desde copias de seguridad
    • Prueba regularmente los procedimientos de restauración
  2. Recuperación de Aplicación:

    • Mantén la infraestructura como código
    • Documenta los pasos para recrear todo el entorno
  3. Procedimientos de Conmutación por Error:

    • Si utilizas múltiples regiones, documenta los procedimientos de conmutación por error
    • Prueba la conmutación por error regularmente