Habilidades de Seguridad y Despliegue de Dify SKILL
Resumen
Este SKILL proporciona una guía completa de prácticas de seguridad y operaciones de despliegue para la plataforma Dify, ayudando a desarrolladores y personal de operaciones a construir un entorno de producción seguro, estable y de alto rendimiento.
Escenarios de Activación
Utiliza este SKILL cuando necesites:
- 🚀 Desplegar Dify en un entorno de producción (Docker/Kubernetes)
- 🔒 Configurar mecanismos de protección de seguridad (SSRF, sandbox, cifrado)
- 🔧 Resolver problemas de despliegue (fallos de inicio de contenedores, configuración de red, cuellos de botella de rendimiento)
- 📊 Optimizar el entorno de producción (monitorización y alertas, alta disponibilidad, recuperación de fallos)
- ✅ Realizar auditorías de seguridad y verificación de configuración
Capacidades Principales
- Protección de seguridad: Protección SSRF, sandbox de código, cifrado de datos, gestión de permisos
- Despliegue con Docker: Despliegue rápido, configuración de producción, arquitectura de red, optimización de recursos
- Despliegue con Kubernetes: Arquitectura de alta disponibilidad, escalado automático, despliegue con Helm
- Monitorización y Alertas: OpenTelemetry, Sentry, agregación de logs, monitorización de rendimiento
- Recuperación de Fallos: Diagnóstico de problemas, procesos de recuperación, estrategias de backup
Inicio Rápido
Configuración Mínima de Despliegue
# 1. Clonar el repositorio
git clone https://github.com/langgenius/dify.git
cd dify/docker
# 2. Copiar variables de entorno
cp .env.example .env
# 3. Modificar configuraciones de seguridad clave
# Editar el archivo .env:
SECRET_KEY=$(openssl rand -base64 42)
DB_PASSWORD=your-strong-password
REDIS_PASSWORD=your-redis-password
SANDBOX_API_KEY=$(openssl rand -base64 32)
# 4. Iniciar servicios
docker compose up -d
# 5. Verificar despliegue
docker compose ps
curl http://localhost/health
Lista de Verificación de Seguridad
Verificaciones Previas al Despliegue
- SECRET_KEY ha sido cambiado a una clave segura (usa
openssl rand -base64 42) - Contraseña de la base de datos ha sido modificada del valor por defecto
- Contraseña de Redis ha sido configurada
- Proxy SSRF está configurado y bloquea el acceso a la red interna
- Sandbox tiene el proxy de red habilitado
- Certificado HTTPS/TLS está configurado (entorno de producción)
- Mecanismo de gestión de API Keys está habilitado
- Límite de subida de archivos está configurado (UPLOAD_FILE_SIZE_LIMIT)
- Variables de entorno sensibles están almacenadas cifradas
Verificaciones en Tiempo de Ejecución
- Permisos del contenedor se ejecutan como usuario no root
- Aislamiento de red ssrf_proxy_network funciona correctamente
- Chequeo de salud todos los servicios tienen estado saludable
- Registro de logs está habilitado y generando salida normalmente
- Monitorización y alertas están configuradas (OpenTelemetry/Sentry)
- Estrategia de backup está implementada (base de datos, almacenamiento de archivos)
- Límites de recursos Límites de CPU/memoria están configurados
- Certificado SSL comprobación de validez y renovación automática
Estructura de Directorios
04-security/
├── SKILL.md # Este archivo - Resumen de seguridad y despliegue
├── security/ # Prácticas de seguridad
│ ├── ssrf-protection.md # Configuración de protección SSRF
│ ├── sandbox.md # Aislamiento del sandbox de código
│ ├── encryption.md # Cifrado de datos y TLS
│ └── auth.md # Autenticación y gestión de permisos
├── deployment/ # Guías de despliegue
│ ├── docker-compose.md # Despliegue con Docker Compose
│ ├── kubernetes.md # Despliegue con Kubernetes
│ ├── serverless.md # Despliegue Serverless
│ └── high-availability.md # Arquitectura de alta disponibilidad
├── operations/ # Prácticas de operación
│ ├── monitoring.md # Monitorización y alertas
│ ├── logging.md # Gestión de logs
│ ├── backup.md # Backup y recuperación
│ └── troubleshooting.md # Resolución de problemas
└── best-practices.md # Resumen de mejores prácticas
1. Mecanismos de Protección de Seguridad
1.1 Protección SSRF
Dify utiliza un proxy Squid para implementar la protección contra SSRF (Server-Side Request Forgery), bloqueando el acceso a direcciones de red interna.
Configuración Principal:
# squid.conf - Lista negra de direcciones internas
acl localnet src 10.0.0.0/8
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
acl localnet src 127.0.0.0/8
# Denegar acceso a la red interna
http_access deny localnet
# Puertos permitidos
acl Safe_ports port 80 443 1025-65535
http_access deny !Safe_ports
Método de Verificación:
# Probar que el acceso a la red interna está bloqueado
docker compose exec api curl -x http://ssrf_proxy:3128 http://127.0.0.1
# Debería devolver 403 Forbidden
# Probar que el acceso externo funciona
docker compose exec api curl -x http://ssrf_proxy:3128 https://api.openai.com
# Debería devolver una respuesta normal
📖 Documentación Detallada: security/ssrf-protection.md
1.2 Sandbox de Código
El servicio Sandbox proporciona un entorno seguro para la ejecución de código, aislando el código del usuario.
Configuración Principal:
# config.yaml
app:
key: dify-sandbox # Cambiar a una clave segura
max_workers: 4
worker_timeout: 15
enable_network: true # Acceso externo a través del proxy SSRF
proxy:
http: 'http://ssrf_proxy:3128'
https: 'http://ssrf_proxy:3128'
Características de Seguridad:
- ✅ Restricciones de lista blanca de llamadas al sistema
- ✅ Gestión de cuotas de recursos (CPU, memoria, tiempo de espera)
- ✅ Acceso a la red a través del proxy SSRF
- ✅ Aislamiento del sistema de archivos
📖 Documentación Detallada: security/sandbox.md
1.3 Cifrado de Datos
Cifrado en Tránsito (TLS/HTTPS):
# Configuración .env
NGINX_HTTPS_ENABLED=true
NGINX_SSL_CERT_FILENAME=fullchain.pem
NGINX_SSL_CERT_KEY_FILENAME=privkey.pem
NGINX_SSL_PROTOCOLS=TLSv1.2 TLSv1.3
Cifrado de Conexión a la Base de Datos:
# PostgreSQL SSL
DB_HOST=db_postgres
POSTGRES_SSL_MODE=require
# Redis SSL
REDIS_USE_SSL=true
REDIS_SSL_CERT_REQS=CERT_REQUIRED
📖 Documentación Detallada: security/encryption.md
1.4 Gestión de Permisos
Gestión de API Keys:
# Generar claves seguras
SECRET_KEY=$(openssl rand -base64 42)
PLUGIN_DAEMON_KEY=$(openssl rand -base64 42)
PLUGIN_DIFY_INNER_API_KEY=$(openssl rand -base64 42)
Integración OAuth 2.0:
- Soporta autorización de servicios de terceros
- Actualización automática de tokens de acceso
- Control de alcance de permisos
📖 Documentación Detallada: security/auth.md
2. Despliegue con Docker
2.1 Despliegue Rápido
Inicio con un solo comando:
cd dify/docker
cp .env.example .env
# Editar .env para modificar contraseñas y claves
docker compose up -d
Arquitectura de Servicios:
nginx (80/443)
├── web (3000) - Interfaz de usuario frontend
├── api (5001) - Lógica de negocio
├── worker - Tareas en segundo plano
├── beat - Tareas programadas
├── plugin_daemon (5002) - Gestión de plugins
└── sandbox (8194) - Ejecución de código
Servicios base:
├── db_postgres (5432) - Base de datos principal
├── redis (6379) - Caché y colas
├── weaviate (8080) - Base de datos vectorial
└── ssrf_proxy (3128) - Protección SSRF
📖 Documentación Detallada: deployment/docker-compose.md
2.2 Configuración de Producción
Límites de Recursos:
# docker-compose.yaml
services:
api:
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
Chequeo de Salud:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5001/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Gestión de Logs:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
📖 Documentación Detallada: deployment/docker-compose.md
2.3 Arquitectura de Red
Aislamiento de Red:
networks:
# Red interna - sin acceso externo
ssrf_proxy_network:
driver: bridge
internal: true
# Red por defecto - con acceso externo
default:
driver: bridge
Comunicación entre Servicios:
- API/Worker/Sandbox → ssrf_proxy → API externa
- Nginx → API/Web (proxy inverso)
- API → Database/Redis (comunicación interna)
📖 Documentación Detallada: deployment/docker-compose.md
3. Despliegue con Kubernetes
3.1 Despliegue Rápido con Helm
# Añadir repositorio Helm
helm repo add dify https://borispolonsky.github.io/dify-helm
helm repo update
# Instalar Dify
helm install my-dify dify/dify \
--set postgresql.enabled=true \
--set redis.enabled=true \
--set weaviate.enabled=true
# Ver estado
kubectl get pods -l app.kubernetes.io/name=dify
3.2 Arquitectura de Alta Disponibilidad
Despliegue con Múltiples Réplicas:
# values.yaml
api:
replicaCount: 3
resources:
limits:
cpu: 2000m
memory: 4Gi
requests:
cpu: 1000m
memory: 2Gi
worker:
replicaCount: 2
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 80
Anti-Afinitad de Pods:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- dify-api
topologyKey: kubernetes.io/hostname
📖 Documentación Detallada: deployment/kubernetes.md
3.3 Integración con Servicios Gestionados
Usar servicios gestionados de proveedores cloud:
# Usar RDS PostgreSQL
postgresql:
enabled: false
externalDatabase:
host: your-rds-endpoint.rds.amazonaws.com
port: 5432
database: dify
username: dify
password: your-password
# Usar ElastiCache Redis
redis:
enabled: false
externalRedis:
host: your-redis.cache.amazonaws.com
port: 6379
password: your-password
Ventajas:
- ✅ Backup y recuperación automáticos
- ✅ Alta disponibilidad y conmutación por error
- ✅ Monitorización y optimización del rendimiento
- ✅ Reducción de la carga operativa
📖 Documentación Detallada: deployment/high-availability.md
4. Monitorización y Alertas
4.1 Configuración de OpenTelemetry
# .env
ENABLE_OTEL=true
OTLP_BASE_ENDPOINT=http://otel-collector:4318
OTEL_SAMPLING_RATE=0.1
OTEL_BATCH_EXPORT_SCHEDULE_DELAY=5000
OTEL_MAX_QUEUE_SIZE=2048
OTEL_METRIC_EXPORT_INTERVAL=60000
Métricas de Monitorización:
- Latencia y rendimiento de solicitudes
- Tasa de errores y éxito
- Uso de recursos (CPU, memoria, disco)
- Estado del pool de conexiones de la base de datos
- Profundidad de la cola y velocidad de procesamiento
4.2 Rastreo de Errores con Sentry
# .env
API_SENTRY_DSN=https://[email protected]/project-id
API_SENTRY_TRACES_SAMPLE_RATE=1.0
WEB_SENTRY_DSN=https://[email protected]/project-id
PLUGIN_SENTRY_ENABLED=true
4.3 Agregación de Logs
# Configuración de logs
LOG_LEVEL=INFO
LOG_OUTPUT_FORMAT=json
LOG_FILE=/app/logs/server.log
LOG_FILE_MAX_SIZE=20
LOG_FILE_BACKUP_COUNT=5
Visualización de Logs:
# Docker
docker compose logs -f api
docker compose logs --tail=100 worker
# Kubernetes
kubectl logs -f deployment/dify-api
kubectl logs -l app=dify-worker --tail=100
📖 Documentación Detallada: operations/monitoring.md
4.4 Monitorización de Colas
# .env
QUEUE_MONITOR_THRESHOLD=200
[email protected],[email protected]
QUEUE_MONITOR_INTERVAL=30
ENABLE_DATASETS_QUEUE_MONITOR=true
5. Resolución de Problemas
5.1 Problemas Comunes
Fallo al Iniciar el Contenedor
Síntoma: El contenedor se reinicia constantemente o no puede iniciarse.
Diagnóstico:
# Ver estado del contenedor
docker compose ps
# Ver logs
docker compose logs api
# Comprobar estado de salud
docker compose exec api curl http://localhost:5001/health
Causas Comunes:
-
Fallo de conexión a la base de datos
# Comprobar base de datos docker compose exec db_postgres pg_isready # Verificar conexión docker compose exec api env | grep DB_ -
Servicio dependiente no listo
# Comprobar la configuración depends_on depends_on: db_postgres: condition: service_healthy -
Error de configuración de variables de entorno
# Verificar variables obligatorias docker compose config | grep -E "SECRET_KEY|DB_PASSWORD"
Problemas de Conexión de Red
Síntoma: No se puede acceder a la API externa o a los servicios internos.
Diagnóstico:
# Probar Proxy SSRF
docker compose exec api curl -x http://ssrf_proxy:3128 https://api.openai.com
# Probar servicios internos
docker compose exec api curl http://redis:6379
docker compose exec api curl http://db_postgres:5432
Problemas de Rendimiento
Síntoma: Respuesta lenta, timeouts, agotamiento de recursos.
Diagnóstico:
# Ver uso de recursos
docker stats
# Ver conexiones a la base de datos
docker compose exec db_postgres psql -U postgres -d dify -c "SELECT count(*) FROM pg_stat_activity;"
# Ver memoria de Redis
docker compose exec redis redis-cli INFO memory
📖 Documentación Detallada: operations/troubleshooting.md
5.2 Proceso de Recuperación de Fallos
Fallo de la Base de Datos
# 1. Verificar estado
docker compose ps db_postgres
# 2. Ver logs
docker compose logs db_postgres
# 3. Reiniciar servicio
docker compose restart db_postgres
# 4. Verificar conexión
docker compose exec db_postgres pg_isready
# 5. Comprobar integridad de datos
docker compose exec db_postgres psql -U postgres -d dify -c "SELECT count(*) FROM accounts;"
Orden de Reinicio de Servicios
# 1. Servicios base
docker compose restart db_postgres redis
# 2. Servicios principales
docker compose restart api worker beat
# 3. Servicios frontend
docker compose restart web nginx
# 4. Verificar
docker compose ps
curl http://localhost/health
📖 Documentación Detallada: operations/backup.md
6. Mejores Prácticas
6.1 Mejores Prácticas de Seguridad
-
Rotación periódica de claves
- Rotar SECRET_KEY cada 90 días
- Usar servicios de gestión de claves (AWS KMS, HashiCorp Vault)
-
Principio de Mínimos Privilegios
- Los contenedores se ejecutan como usuario no root
- Los usuarios de la base de datos solo tienen los permisos necesarios
-
Aislamiento de Red
- Usar redes internas para aislar servicios sensibles
- Controlar el acceso externo a través del proxy SSRF
-
Registros de Auditoría
- Habilitar el registro detallado de logs
- Revisar periódicamente los logs de acceso y errores
6.2 Mejores Prácticas de Despliegue
-
Separación de Entornos
- Entornos de desarrollo, pruebas y producción independientes
- Usar diferentes configuraciones y claves
-
Despliegue Automatizado
- Usar pipelines CI/CD
- Pruebas y verificación automatizadas
-
Control de Versiones
- Versionar los archivos de configuración (excluyendo información sensible)
- Usar Git para gestionar el código de infraestructura
-
Monitorización y Alertas
- Configurar métricas de monitorización completas
- Establecer umbrales de alerta adecuados
6.3 Mejores Prácticas de Operaciones
-
Estrategia de Backup
- Backup automático diario de la base de datos
- Probar periódicamente el proceso de recuperación
-
Planificación de Capacidad
- Monitorizar las tendencias de uso de recursos
- Escalar preventivamente para evitar problemas de rendimiento
-
Mantenimiento de Documentación
- Registrar los cambios de configuración
- Mantener un manual de operaciones
-
Respuesta a Incidentes
- Establecer un proceso de respuesta a fallos
- Realizar simulacros periódicos de escenarios de recuperación
📖 Documentación Detallada: best-practices.md
7. Plantillas de Configuración
7.1 Plantilla para Entorno de Desarrollo
# .env.development
DEBUG=true
LOG_LEVEL=DEBUG
MIGRATION_ENABLED=true
# Usar contraseñas por defecto (solo para desarrollo)
DB_PASSWORD=difyai123456
REDIS_PASSWORD=difyai123456
# Deshabilitar HTTPS
NGINX_HTTPS_ENABLED=false
7.2 Plantilla para Entorno de Producción
# .env.production
DEBUG=false
LOG_LEVEL=INFO
DEPLOY_ENV=PRODUCTION
# Claves seguras (deben modificarse)
SECRET_KEY=$(openssl rand -base64 42)
DB_PASSWORD=<strong-password>
REDIS_PASSWORD=<strong-password>
# Habilitar HTTPS
NGINX_HTTPS_ENABLED=true
NGINX_SSL_CERT_FILENAME=fullchain.pem
NGINX_SSL_CERT_KEY_FILENAME=privkey.pem
# Habilitar monitorización
ENABLE_OTEL=true
API_SENTRY_DSN=<your-sentry-dsn>
7.3 Plantilla de Alta Disponibilidad
# docker-compose.ha.yaml
services:
api:
deploy:
replicas: 3
resources:
limits:
cpus: '2'
memory: 4G
restart_policy:
condition: on-failure
max_attempts: 3
worker:
deploy:
replicas: 2
resources:
limits:
cpus: '4'
memory: 8G
8. Referencias
Documentación Oficial
Recursos de la Comunidad
SKILLs Relacionados
- 01-workflow - Diseño de flujos de trabajo
- 02-plugin - Desarrollo de plugins
- 03-performance - Optimización del rendimiento
Referencia Rápida de Comandos
# Despliegue con Docker
docker compose up -d # Iniciar todos los servicios
docker compose ps # Ver estado de los servicios
docker compose logs -f api # Ver logs de la API
docker compose restart api # Reiniciar el servicio API
docker compose down # Detener todos los servicios
# Chequeo de Salud
curl http://localhost/health # Comprobar salud del servicio
docker compose exec db_postgres pg_isready # Comprobar base de datos
docker compose exec redis redis-cli ping # Comprobar Redis
# Visualización de Logs
docker compose logs --tail=100 api # Ver últimas 100 líneas de logs
docker compose logs -f worker # Ver logs de worker en tiempo real
# Operaciones con la Base de Datos
docker compose exec db_postgres psql -U postgres -d dify # Conectar a la base de datos
docker compose exec db_postgres pg_dump -U postgres dify > backup.sql # Backup
# Kubernetes
kubectl get pods -l app=dify # Ver estado de los Pods
kubectl logs -f deployment/dify-api # Ver logs
kubectl describe pod <pod-name> # Ver detalles del Pod
kubectl exec -it <pod-name> -- /bin/bash # Acceder al contenedor
Versión: 1.0.0 Última actualización: 2026-03-04 Mantenedor: Dify SKILL Team