SystemTce/dify-skills

Guide complet sur les bonnes pratiques de sécurité, le déploiement et l'exploitation de la plateforme Dify, couvrant la protection SSRF, le bac à sable, le déploiement Docker/Kubernetes, la surveillance, les alertes et la reprise après incident.

Qu'est-ce que dify-skills ?

Ce SKILL fournit un guide complet pour sécuriser, déployer et exploiter la plateforme Dify en environnement de production. Il couvre la configuration de la protection SSRF via un proxy Squid pour bloquer les accès aux adresses internes, l'isolation du code utilisateur avec un bac à sable, le chiffrement des données en transit (TLS/HTTPS) et au repos, ainsi que la gestion des clés API et l'intégration OAuth 2.0 pour l'authentification. Le guide détaille le déploiement avec Docker Compose (architecture des services, limitation des ressources, healthchecks) et Kubernetes via un chart Helm (haute disponibilité, auto-scaling, anti-affinité des pods). Il aborde également la mise en place d'une surveillance avec OpenTelemetry et Sentry, l'agrégation de logs, le monitoring des files d'attente, ainsi que les procédures de diagnostic et de reprise après incident (base de données, redémarrage des services). Enfin, il propose des templates de configuration pour les environnements de développement, de production et haute disponibilité, ainsi qu'une checklist de sécurité pré- et post-déploiement.

Compatible avec✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/SystemTce/dify-skills/tree/main/04-security

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

SKILL Sécurité et Déploiement Dify

Aperçu

Ce SKILL fournit un guide complet sur les bonnes pratiques de sécurité et l'exploitation de la plateforme Dify, aidant les développeurs et les opérateurs à construire un environnement de production sécurisé, stable et performant.

Scénarios d'utilisation

Utilisez ce SKILL lorsque vous avez besoin de :

  • 🚀 Déployer Dify en production (Docker/Kubernetes)
  • 🔒 Configurer des mécanismes de protection (SSRF, bac à sable, chiffrement)
  • 🔧 Résoudre des problèmes de déploiement (échec de démarrage des conteneurs, configuration réseau, goulots d'étranglement de performance)
  • 📊 Optimiser l'environnement de production (surveillance, alertes, haute disponibilité, reprise après incident)
  • ✅ Effectuer un audit de sécurité et une validation de configuration

Capacités principales

  • Protection de sécurité : Protection SSRF, bac à sable pour le code, chiffrement des données, gestion des autorisations
  • Déploiement Docker : Déploiement rapide, configuration de production, architecture réseau, optimisation des ressources
  • Déploiement Kubernetes : Architecture haute disponibilité, mise à l'échelle automatique, déploiement Helm
  • Surveillance et alertes : OpenTelemetry, Sentry, agrégation de logs, surveillance des performances
  • Reprise après incident : Diagnostic des problèmes, processus de restauration, stratégies de sauvegarde

Démarrage rapide

Configuration de déploiement minimale

# 1. Cloner le dépôt
git clone https://github.com/langgenius/dify.git
cd dify/docker

# 2. Copier les variables d'environnement
cp .env.example .env

# 3. Modifier les configurations de sécurité clés
# Modifier le fichier .env :
SECRET_KEY=$(openssl rand -base64 42)
DB_PASSWORD=votre-mot-de-passe-fort
REDIS_PASSWORD=votre-mot-de-passe-redis
SANDBOX_API_KEY=$(openssl rand -base64 32)

# 4. Démarrer les services
docker compose up -d

# 5. Vérifier le déploiement
docker compose ps
curl http://localhost/health

Checklist de sécurité

Vérifications avant déploiement

  • SECRET_KEY a été remplacée par une clé forte (utiliser openssl rand -base64 42)
  • Mot de passe de la base de données a été modifié par rapport à la valeur par défaut
  • Mot de passe Redis a été défini
  • Proxy SSRF a été configuré pour bloquer les accès au réseau interne
  • Bac à sable (Sandbox) a été activé avec un proxy réseau
  • Certificat HTTPS/TLS a été configuré (environnement de production)
  • Mécanisme de gestion des clés API a été activé
  • Limite de taille des fichiers téléchargés a été définie (UPLOAD_FILE_SIZE_LIMIT)
  • Variables d'environnement sensibles sont stockées de manière chiffrée

Vérifications en cours d'exécution

  • Permissions des conteneurs : exécution avec un utilisateur non-root
  • Isolement réseau : le réseau ssrf_proxy_network fonctionne correctement
  • Vérifications de santé : tous les services sont en bonne santé
  • Journalisation : activée et produisant des sorties normales
  • Surveillance et alertes : configurées (OpenTelemetry/Sentry)
  • Stratégie de sauvegarde : mise en œuvre (base de données, stockage de fichiers)
  • Limites de ressources : limites CPU/mémoire configurées
  • Certificat SSL : vérification de validité et renouvellement automatique

Structure des répertoires

04-security/
├── SKILL.md                    # Ce fichier - Vue d'ensemble de la sécurité et du déploiement
├── security/                   # Bonnes pratiques de sécurité
│   ├── ssrf-protection.md     # Configuration de la protection SSRF
│   ├── sandbox.md             # Isolation du code via bac à sable
│   ├── encryption.md          # Chiffrement des données et TLS
│   └── auth.md                # Authentification et gestion des autorisations
├── deployment/                 # Guides de déploiement
│   ├── docker-compose.md      # Déploiement Docker Compose
│   ├── kubernetes.md          # Déploiement Kubernetes
│   ├── serverless.md          # Déploiement Serverless
│   └── high-availability.md   # Architecture haute disponibilité
├── operations/                 # Pratiques d'exploitation
│   ├── monitoring.md          # Surveillance et alertes
│   ├── logging.md             # Gestion des logs
│   ├── backup.md              # Sauvegarde et restauration
│   └── troubleshooting.md     # Dépannage
└── best-practices.md           # Résumé des bonnes pratiques

1. Mécanismes de protection de sécurité

1.1 Protection SSRF

Dify utilise un proxy Squid pour implémenter la protection SSRF (Server-Side Request Forgery), empêchant l'accès aux adresses internes.

Configuration principale :

# squid.conf - Liste noire des adresses internes
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

# Refuser l'accès au réseau interne
http_access deny localnet

# Ports autorisés
acl Safe_ports port 80 443 1025-65535
http_access deny !Safe_ports

Méthode de vérification :

# Tester que l'accès au réseau interne est bloqué
docker compose exec api curl -x http://ssrf_proxy:3128 http://127.0.0.1
# Doit retourner 403 Forbidden

# Tester que l'accès externe fonctionne
docker compose exec api curl -x http://ssrf_proxy:3128 https://api.openai.com
# Doit retourner une réponse normale

📖 Documentation détaillée : security/ssrf-protection.md

1.2 Bac à sable pour le code

Le service Sandbox fournit un environnement d'exécution de code sécurisé, isolant le code utilisateur.

Configuration principale :

# config.yaml
app:
  key: dify-sandbox  # Modifier avec une clé forte
max_workers: 4
worker_timeout: 15
enable_network: true  # Accès externe via le proxy SSRF
proxy:
  http: 'http://ssrf_proxy:3128'
  https: 'http://ssrf_proxy:3128'

Caractéristiques de sécurité :

  • ✅ Liste blanche des appels système limitée
  • ✅ Gestion des quotas de ressources (CPU, mémoire, timeout)
  • ✅ Accès réseau via le proxy SSRF
  • ✅ Isolation du système de fichiers

📖 Documentation détaillée : security/sandbox.md

1.3 Chiffrement des données

Chiffrement en transit (TLS/HTTPS) :

# Configuration .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

Chiffrement des connexions à la base de données :

# SSL PostgreSQL
DB_HOST=db_postgres
POSTGRES_SSL_MODE=require

# SSL Redis
REDIS_USE_SSL=true
REDIS_SSL_CERT_REQS=CERT_REQUIRED

📖 Documentation détaillée : security/encryption.md

1.4 Gestion des autorisations

Gestion des clés API :

# Générer des clés fortes
SECRET_KEY=$(openssl rand -base64 42)
PLUGIN_DAEMON_KEY=$(openssl rand -base64 42)
PLUGIN_DIFY_INNER_API_KEY=$(openssl rand -base64 42)

Intégration OAuth 2.0 :

  • Prise en charge de l'autorisation de services tiers
  • Rafraîchissement automatique des jetons d'accès
  • Contrôle des périmètres d'autorisation

📖 Documentation détaillée : security/auth.md


2. Déploiement Docker

2.1 Déploiement rapide

Démarrage en une commande :

cd dify/docker
cp .env.example .env
# Modifier les mots de passe et les clés dans .env
docker compose up -d

Architecture des services :

nginx (80/443)
  ├── web (3000) - Interface utilisateur
  ├── api (5001) - Logique métier
  ├── worker - Tâches en arrière-plan
  ├── beat - Tâches planifiées
  ├── plugin_daemon (5002) - Gestion des plugins
  └── sandbox (8194) - Exécution de code

Services de base :
  ├── db_postgres (5432) - Base de données principale
  ├── redis (6379) - Cache et files d'attente
  ├── weaviate (8080) - Base de données vectorielle
  └── ssrf_proxy (3128) - Protection SSRF

📖 Documentation détaillée : deployment/docker-compose.md

2.2 Configuration de production

Limitation des ressources :

# docker-compose.yaml
services:
  api:
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G
        reservations:
          cpus: '1'
          memory: 2G

Vérifications de santé :

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:5001/health"]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 40s

Gestion des logs :

logging:
  driver: "json-file"
  options:
    max-size: "10m"
    max-file: "3"

📖 Documentation détaillée : deployment/docker-compose.md

2.3 Architecture réseau

Isolement réseau :

networks:
  # Réseau interne - impossible d'accéder à l'extérieur
  ssrf_proxy_network:
    driver: bridge
    internal: true

  # Réseau par défaut - accès externe possible
  default:
    driver: bridge

Communication entre services :

  • API/Worker/Sandbox → ssrf_proxy → API externes
  • Nginx → API/Web (proxy inverse)
  • API → Database/Redis (communication interne)

📖 Documentation détaillée : deployment/docker-compose.md


3. Déploiement Kubernetes

3.1 Déploiement rapide avec Helm

# Ajouter le dépôt Helm
helm repo add dify https://borispolonsky.github.io/dify-helm
helm repo update

# Installer Dify
helm install my-dify dify/dify \
  --set postgresql.enabled=true \
  --set redis.enabled=true \
  --set weaviate.enabled=true

# Voir l'état
kubectl get pods -l app.kubernetes.io/name=dify

3.2 Architecture haute disponibilité

Déploiement multi-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-affinité des Pods :

affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - dify-api
        topologyKey: kubernetes.io/hostname

📖 Documentation détaillée : deployment/kubernetes.md

3.3 Intégration de services managés

Utilisation des services managés des fournisseurs cloud :

# Utiliser RDS PostgreSQL
postgresql:
  enabled: false
externalDatabase:
  host: votre-endpoint-rds.rds.amazonaws.com
  port: 5432
  database: dify
  username: dify
  password: votre-mot-de-passe

# Utiliser ElastiCache Redis
redis:
  enabled: false
externalRedis:
  host: votre-redis.cache.amazonaws.com
  port: 6379
  password: votre-mot-de-passe

Avantages :

  • ✅ Sauvegarde et restauration automatiques
  • ✅ Haute disponibilité et basculement
  • ✅ Surveillance et optimisation des performances
  • ✅ Réduction de la charge d'exploitation

📖 Documentation détaillée : deployment/high-availability.md


4. Surveillance et alertes

4.1 Configuration 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

Indicateurs de surveillance :

  • Latence et débit des requêtes
  • Taux d'erreur et de succès
  • Utilisation des ressources (CPU, mémoire, disque)
  • État du pool de connexions à la base de données
  • Profondeur et vitesse de traitement des files d'attente

4.2 Suivi des erreurs avec Sentry

# .env
API_SENTRY_DSN=https://votre-cl@ sentry.io/project-id
API_SENTRY_TRACES_SAMPLE_RATE=1.0
WEB_SENTRY_DSN=https://[email protected]/project-id
PLUGIN_SENTRY_ENABLED=true

4.3 Agrégation de logs

# Configuration des logs
LOG_LEVEL=INFO
LOG_OUTPUT_FORMAT=json
LOG_FILE=/app/logs/server.log
LOG_FILE_MAX_SIZE=20
LOG_FILE_BACKUP_COUNT=5

Consultation des 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

📖 Documentation détaillée : operations/monitoring.md

4.4 Surveillance des files d'attente

# .env
QUEUE_MONITOR_THRESHOLD=200
[email protected],[email protected]
QUEUE_MONITOR_INTERVAL=30
ENABLE_DATASETS_QUEUE_MONITOR=true

5. Dépannage

5.1 Problèmes courants

Échec de démarrage des conteneurs

Symptôme : Les conteneurs redémarrent en boucle ou ne peuvent pas démarrer

Diagnostic :

# Voir l'état des conteneurs
docker compose ps

# Voir les logs
docker compose logs api

# Vérifier l'état de santé
docker compose exec api curl http://localhost:5001/health

Causes courantes :

  1. Échec de connexion à la base de données

    # Vérifier la base de données
    docker compose exec db_postgres pg_isready
    # Vérifier la connexion
    docker compose exec api env | grep DB_
    
  2. Service de dépendance non prêt

    # Vérifier la configuration depends_on
    depends_on:
      db_postgres:
        condition: service_healthy
    
  3. Erreur de configuration des variables d'environnement

    # Vérifier les variables requises
    docker compose config | grep -E "SECRET_KEY|DB_PASSWORD"
    

Problèmes de connexion réseau

Symptôme : Impossible d'accéder aux API externes ou aux services internes

Diagnostic :

# Tester le proxy SSRF
docker compose exec api curl -x http://ssrf_proxy:3128 https://api.openai.com

# Tester les services internes
docker compose exec api curl http://redis:6379
docker compose exec api curl http://db_postgres:5432

Problèmes de performance

Symptôme : Réponses lentes, timeouts, épuisement des ressources

Diagnostic :

# Voir l'utilisation des ressources
docker stats

# Voir les connexions à la base de données
docker compose exec db_postgres psql -U postgres -d dify -c "SELECT count(*) FROM pg_stat_activity;"

# Voir la mémoire Redis
docker compose exec redis redis-cli INFO memory

📖 Documentation détaillée : operations/troubleshooting.md

5.2 Processus de reprise après incident

Panne de base de données

# 1. Vérifier l'état
docker compose ps db_postgres

# 2. Voir les logs
docker compose logs db_postgres

# 3. Redémarrer le service
docker compose restart db_postgres

# 4. Vérifier la connexion
docker compose exec db_postgres pg_isready

# 5. Vérifier l'intégrité des données
docker compose exec db_postgres psql -U postgres -d dify -c "SELECT count(*) FROM accounts;"

Ordre de redémarrage des services

# 1. Services de base
docker compose restart db_postgres redis

# 2. Services principaux
docker compose restart api worker beat

# 3. Services frontend
docker compose restart web nginx

# 4. Vérification
docker compose ps
curl http://localhost/health

📖 Documentation détaillée : operations/backup.md


6. Bonnes pratiques

6.1 Bonnes pratiques de sécurité

  1. Mise à jour régulière des clés

    • Rotation de SECRET_KEY tous les 90 jours
    • Utilisation d'un service de gestion des clés (AWS KMS, HashiCorp Vault)
  2. Principe du moindre privilège

    • Conteneurs exécutés avec un utilisateur non-root
    • Utilisateurs de base de données avec uniquement les privilèges nécessaires
  3. Isolement réseau

    • Utilisation d'un réseau interne pour isoler les services sensibles
    • Contrôle de l'accès externe via le proxy SSRF
  4. Journaux d'audit

    • Activation de la journalisation détaillée
    • Revue régulière des logs d'accès et d'erreurs

6.2 Bonnes pratiques de déploiement

  1. Séparation des environnements

    • Environnements de développement, test et production indépendants
    • Utilisation de configurations et de clés différentes
  2. Déploiement automatisé

    • Utilisation de pipelines CI/CD
    • Tests et validation automatisés
  3. Contrôle de version

    • Versionnement des fichiers de configuration (à l'exclusion des informations sensibles)
    • Utilisation de Git pour gérer le code d'infrastructure
  4. Surveillance et alertes

    • Configuration d'indicateurs de surveillance complets
    • Définition de seuils d'alerte raisonnables

6.3 Bonnes pratiques d'exploitation

  1. Stratégie de sauvegarde

    • Sauvegarde automatique quotidienne de la base de données
    • Test régulier du processus de restauration
  2. Planification de capacité

    • Surveillance des tendances d'utilisation des ressources
    • Mise à l'échelle anticipée pour éviter les problèmes de performance
  3. Maintenance de la documentation

    • Enregistrement des modifications de configuration
    • Tenue d'un manuel d'exploitation
  4. Réponse aux incidents

    • Établissement d'un processus de réponse aux incidents
    • Exercices réguliers de scénarios de reprise

📖 Documentation détaillée : best-practices.md


7. Modèles de configuration

7.1 Modèle pour l'environnement de développement

# .env.development
DEBUG=true
LOG_LEVEL=DEBUG
MIGRATION_ENABLED=true

# Utiliser les mots de passe par défaut (environnement de développement uniquement)
DB_PASSWORD=difyai123456
REDIS_PASSWORD=difyai123456

# Désactiver HTTPS
NGINX_HTTPS_ENABLED=false

7.2 Modèle pour l'environnement de production

# .env.production
DEBUG=false
LOG_LEVEL=INFO
DEPLOY_ENV=PRODUCTION

# Clés fortes (doivent être modifiées)
SECRET_KEY=$(openssl rand -base64 42)
DB_PASSWORD=<mot-de-passe-fort>
REDIS_PASSWORD=<mot-de-passe-fort>

# Activer HTTPS
NGINX_HTTPS_ENABLED=true
NGINX_SSL_CERT_FILENAME=fullchain.pem
NGINX_SSL_CERT_KEY_FILENAME=privkey.pem

# Activer la surveillance
ENABLE_OTEL=true
API_SENTRY_DSN=<votre-sentry-dsn>

7.3 Modèle pour la haute disponibilité

# 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. Références

Documentation officielle

Ressources communautaires

SKILLs associés


Référence rapide des commandes

# Déploiement Docker
docker compose up -d                    # Démarrer tous les services
docker compose ps                       # Voir l'état des services
docker compose logs -f api              # Voir les logs de l'API
docker compose restart api              # Redémarrer le service API
docker compose down                     # Arrêter tous les services

# Vérifications de santé
curl http://localhost/health            # Vérifier la santé du service
docker compose exec db_postgres pg_isready  # Vérifier la base de données
docker compose exec redis redis-cli ping    # Vérifier Redis

# Consultation des logs
docker compose logs --tail=100 api      # Voir les 100 dernières lignes de logs
docker compose logs -f worker           # Voir les logs du worker en temps réel

# Opérations sur la base de données
docker compose exec db_postgres psql -U postgres -d dify  # Se connecter à la base de données
docker compose exec db_postgres pg_dump -U postgres dify > backup.sql  # Sauvegarder

# Kubernetes
kubectl get pods -l app=dify            # Voir l'état des Pods
kubectl logs -f deployment/dify-api     # Voir les logs
kubectl describe pod <nom-du-pod>       # Voir les détails du Pod
kubectl exec -it <nom-du-pod> -- /bin/bash  # Entrer dans le conteneur

Version : 1.0.0 Dernière mise à jour : 2026-03-04 Mainteneur : Dify SKILL Team

Individual skills in this repo

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

Skills associés