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:
-
Cambiar secretos y contraseñas predeterminadas:
- Secreto JWT
- Salt de contraseñas
- Contraseñas de la base de datos
- Contraseñas de Redis
-
Asegurar tus variables de entorno:
- Utilizar un servicio de gestión de secretos cuando sea posible
- No comprometer secretos en el control de versiones
-
Configurar TLS/SSL adecuadamente:
- Utilizar un certificado SSL válido
- Configurar HTTPS correctamente
- Implementar redirección de HTTP a HTTPS
-
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:
-
Crea un archivo docker-compose para producción (incluido en el proyecto como
docker-compose.yml
). -
Despliega usando Docker Compose:
Ventana de terminal docker-compose up -d
Despliegue en Kubernetes
Para entornos de producción, se recomienda Kubernetes:
-
Crea los manifiestos de Kubernetes:
deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata:name: saas-auth-apilabels:app: saas-auth-apispec:replicas: 3selector:matchLabels:app: saas-auth-apitemplate:metadata:labels:app: saas-auth-apispec:containers:- name: saas-auth-apiimage: tu-registro/saas-auth-api:latestports:- containerPort: 3000env:- name: APP_ENVvalue: "production"- name: DB_HOSTvalueFrom:secretKeyRef:name: saas-auth-secretskey: db-host- name: DB_PORTvalueFrom:secretKeyRef:name: saas-auth-secretskey: db-port- name: DB_USERvalueFrom:secretKeyRef:name: saas-auth-secretskey: db-user- name: DB_PASSWORDvalueFrom:secretKeyRef:name: saas-auth-secretskey: db-password- name: DB_NAMEvalueFrom:secretKeyRef:name: saas-auth-secretskey: db-name- name: REDIS_HOSTvalueFrom:secretKeyRef:name: saas-auth-secretskey: redis-host- name: REDIS_PORTvalueFrom:secretKeyRef:name: saas-auth-secretskey: redis-port- name: REDIS_PASSWORDvalueFrom:secretKeyRef:name: saas-auth-secretskey: redis-password- name: JWT_SECRETvalueFrom:secretKeyRef:name: saas-auth-secretskey: jwt-secretlivenessProbe:httpGet:path: /healthport: 3000initialDelaySeconds: 30periodSeconds: 10readinessProbe:httpGet:path: /healthport: 3000initialDelaySeconds: 5periodSeconds: 5service.yaml:
apiVersion: v1kind: Servicemetadata:name: saas-auth-apispec:selector:app: saas-auth-apiports:- port: 80targetPort: 3000type: ClusterIPingress.yaml:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: saas-auth-apiannotations:kubernetes.io/ingress.class: nginxcert-manager.io/cluster-issuer: letsencrypt-prodspec:tls:- hosts:- auth-api.tudominio.comsecretName: auth-api-tlsrules:- host: auth-api.tudominio.comhttp:paths:- path: /pathType: Prefixbackend:service:name: saas-auth-apiport:number: 80secrets.yaml:
apiVersion: v1kind: Secretmetadata:name: saas-auth-secretstype: Opaquedata:db-host: valor-codificado-base64db-port: valor-codificado-base64db-user: valor-codificado-base64db-password: valor-codificado-base64db-name: valor-codificado-base64redis-host: valor-codificado-base64redis-port: valor-codificado-base64redis-password: valor-codificado-base64jwt-secret: valor-codificado-base64 -
Aplica los manifiestos:
Ventana de terminal kubectl apply -f deployment.yamlkubectl apply -f service.yamlkubectl apply -f ingress.yamlkubectl apply -f secrets.yaml
Construcción para Producción
-
Construye la imagen Docker:
Ventana de terminal docker build -t tu-registro/saas-auth-api:latest . -
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:
# Ejecutar migracionesmigrate -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:
-
Agrupación de Conexiones a la Base de Datos:
- Ajusta
max_open_conns
ymax_idle_conns
basándote en el número de instancias - Considera usar un agrupador de conexiones como PgBouncer para despliegues a gran escala
- Ajusta
-
Gestión de Conexiones Redis:
- Similar a las conexiones de base de datos, monitorea y ajusta la configuración de conexiones Redis
-
Gestión de Sesiones:
- La aplicación utiliza Redis para el almacenamiento de sesiones, lo que permite instancias sin estado
-
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:
-
Registros de Aplicación:
- Configura un sistema de registro centralizado (ELK Stack, Loki, etc.)
- Establece niveles de registro apropiados en producción (
info
owarn
)
-
Métricas:
- Configura la recopilación de métricas Prometheus
- Monitoriza tiempos de respuesta API, tasas de error y uso de recursos
-
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:
-
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
-
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:
-
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
-
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:
-
Con Kubernetes:
Ventana de terminal kubectl set image deployment/saas-auth-api saas-auth-api=tu-registro/saas-auth-api:nueva-versionKubernetes realizará una actualización continua.
-
Con Docker Compose:
Ventana de terminal docker-compose pulldocker-compose up -dEsto recreará los contenedores uno a uno.
Mantenimiento de Base de Datos
Programa tareas de mantenimiento regulares:
-
Vacuum y Analyze PostgreSQL:
VACUUM ANALYZE; -
Mantenimiento de Índices:
REINDEX DATABASE saas_auth; -
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:
-
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
-
Fugas de Memoria:
- Monitoriza el uso de memoria del contenedor
- Establece límites de memoria apropiados
- Comprueba si hay fugas de goroutine
-
Problemas de Conexión:
- Verifica la conectividad de red
- Comprueba las reglas del firewall
- Asegúrate de que el descubrimiento de servicios funcione correctamente
-
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:
-
Recuperación de Base de Datos:
- Documenta el proceso para restaurar desde copias de seguridad
- Prueba regularmente los procedimientos de restauración
-
Recuperación de Aplicación:
- Mantén la infraestructura como código
- Documenta los pasos para recrear todo el entorno
-
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