Community程式設計與開發github.com

SystemTce/dify-skills

Dify 安全实践與部署維運完整指南,涵蓋 SSRF 防護、程式碼沙箱、Docker/Kubernetes 部署、監控告警與故障恢復

dify-skills 是什麼?

此技能提供 Dify 平台的安全實踐與部署維運完整指南,協助開發者與維運人員建構安全、穩定且高效的生產環境。它詳細說明了如何防範 SSRF 攻擊(使用 Squid 代理程式)、隔離使用者程式碼(透過沙箱服務)、設定傳輸與資料庫加密,並整合 OAuth 2.0 進行許可權管理。在部署方面,內容涵蓋了 Docker Compose 的一鍵部署、生產級資源限制與健康檢查配置,以及 Kubernetes 的 Helm 部署與高可用架構(多副本、Pod 反親和性)。此外,此技能也指導如何透過 OpenTelemetry 與 Sentry 實現監控告警、管理佇列與日誌,並提供常見故障的診斷步驟(如容器啟動失敗、網路連線問題)與標準化恢復流程。它支援 Docker 與 Kubernetes 兩種主要部署平台,並附有開發、生產與高可用環境的配置範本,是一套從安全入門到生產維運的完整解決方案。

相容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/SystemTce/dify-skills/tree/main/04-security

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Dify 安全與部署 SKILL

概述

本 SKILL 提供 Dify 平台的安全實踐與部署維運完整指南,協助開發者與維運人員建構安全、穩定、高效的生產環境。

觸發場景

使用本 SKILL 當你需要:

  • 🚀 部署 Dify 到生產環境 (Docker/Kubernetes)
  • 🔒 配置安全防護機制 (SSRF、沙箱、加密)
  • 🔧 解決部署問題 (容器啟動失敗、網路配置、效能瓶頸)
  • 📊 優化生產環境 (監控告警、高可用、故障恢復)
  • ✅ 進行安全稽核 與配置驗證

核心能力

  • 安全防護: SSRF 防護、程式碼沙箱、資料加密、許可權管理
  • Docker 部署: 快速部署、生產配置、網路架構、資源優化
  • Kubernetes 部署: 高可用架構、自動擴展、Helm 部署
  • 監控告警: OpenTelemetry、Sentry、日誌聚合、效能監控
  • 故障恢復: 問題診斷、恢復流程、備份策略

快速開始

最小部署配置

# 1. 複製倉庫
git clone https://github.com/langgenius/dify.git
cd dify/docker

# 2. 複製環境變數
cp .env.example .env

# 3. 修改關鍵安全配置
# 編輯 .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. 啟動服務
docker compose up -d

# 5. 驗證部署
docker compose ps
curl http://localhost/health

安全檢查清單

部署前檢查

  • SECRET_KEY 已更改為強金鑰 (使用 openssl rand -base64 42)
  • 資料庫密碼 已修改預設值
  • Redis 密碼 已設定
  • SSRF Proxy 已配置並阻止內網存取
  • Sandbox 沙箱 已啟用網路代理
  • HTTPS/TLS 憑證已配置 (生產環境)
  • API Key 管理 機制已啟用
  • 檔案上傳限制 已設定 (UPLOAD_FILE_SIZE_LIMIT)
  • 敏感環境變數 已加密儲存

運行時檢查

  • 容器許可權 以非 root 使用者執行
  • 網路隔離 ssrf_proxy_network 正常工作
  • 健康檢查 所有服務健康狀態正常
  • 日誌記錄 已啟用並正常輸出
  • 監控告警 已配置 (OpenTelemetry/Sentry)
  • 備份策略 已實施 (資料庫、檔案儲存)
  • 資源限制 CPU/記憶體限制已配置
  • SSL 憑證 有效期檢查和自動續期

目錄結構

04-security/
├── SKILL.md                    # 本檔案 - 安全和部署總覽
├── security/                   # 安全實踐
│   ├── ssrf-protection.md     # SSRF 防護配置
│   ├── sandbox.md             # 程式碼沙箱隔離
│   ├── encryption.md          # 資料加密和 TLS
│   └── auth.md                # 認證和許可權管理
├── deployment/                 # 部署指南
│   ├── docker-compose.md      # Docker Compose 部署
│   ├── kubernetes.md          # Kubernetes 部署
│   ├── serverless.md          # Serverless 部署
│   └── high-availability.md   # 高可用架構
├── operations/                 # 維運實踐
│   ├── monitoring.md          # 監控和告警
│   ├── logging.md             # 日誌管理
│   ├── backup.md              # 備份和恢復
│   └── troubleshooting.md     # 故障排查
└── best-practices.md           # 最佳實踐總結

一、安全防護機制

1.1 SSRF 防護

Dify 使用 Squid 代理實現 SSRF (Server-Side Request Forgery) 防護,阻止存取內網位址。

核心配置:

# squid.conf - 內網位址黑名單
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

# 拒絕存取內網
http_access deny localnet

# 允許的埠
acl Safe_ports port 80 443 1025-65535
http_access deny !Safe_ports

驗證方法:

# 測試內網存取被阻止
docker compose exec api curl -x http://ssrf_proxy:3128 http://127.0.0.1
# 應返回 403 Forbidden

# 測試外部存取正常
docker compose exec api curl -x http://ssrf_proxy:3128 https://api.openai.com
# 應正常返回

📖 詳細文件: security/ssrf-protection.md

1.2 程式碼沙箱

Sandbox 服務提供安全的程式碼執行環境,隔離使用者程式碼。

核心配置:

# config.yaml
app:
  key: dify-sandbox  # 修改為強金鑰
max_workers: 4
worker_timeout: 15
enable_network: true  # 透過 SSRF Proxy 存取外部
proxy:
  http: 'http://ssrf_proxy:3128'
  https: 'http://ssrf_proxy:3128'

安全特性:

  • ✅ 系統呼叫白名單限制
  • ✅ 資源配額管理 (CPU、記憶體、逾時)
  • ✅ 網路存取透過 SSRF Proxy
  • ✅ 檔案系統隔離

📖 詳細文件: security/sandbox.md

1.3 資料加密

傳輸加密 (TLS/HTTPS):

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

資料庫連線加密:

# PostgreSQL SSL
DB_HOST=db_postgres
POSTGRES_SSL_MODE=require

# Redis SSL
REDIS_USE_SSL=true
REDIS_SSL_CERT_REQS=CERT_REQUIRED

📖 詳細文件: security/encryption.md

1.4 許可權管理

API Key 管理:

# 生成強金鑰
SECRET_KEY=$(openssl rand -base64 42)
PLUGIN_DAEMON_KEY=$(openssl rand -base64 42)
PLUGIN_DIFY_INNER_API_KEY=$(openssl rand -base64 42)

OAuth 2.0 整合:

  • 支援第三方服務授權
  • 存取權杖自動重新整理
  • 許可權範圍控制

📖 詳細文件: security/auth.md


二、Docker 部署

2.1 快速部署

一鍵啟動:

cd dify/docker
cp .env.example .env
# 編輯 .env 修改密碼和金鑰
docker compose up -d

服務架構:

nginx (80/443)
  ├── web (3000) - 前端 UI
  ├── api (5001) - 業務邏輯
  ├── worker - 後臺任務
  ├── beat - 定時任務
  ├── plugin_daemon (5002) - 外掛管理
  └── sandbox (8194) - 程式碼執行

基礎服務:
  ├── db_postgres (5432) - 主資料庫
  ├── redis (6379) - 快取和佇列
  ├── weaviate (8080) - 向量資料庫
  └── ssrf_proxy (3128) - SSRF 防護

📖 詳細文件: deployment/docker-compose.md

2.2 生產級配置

資源限制:

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

健康檢查:

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

日誌管理:

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

📖 詳細文件: deployment/docker-compose.md

2.3 網路架構

網路隔離:

networks:
  # 內部網路 - 無法存取外部
  ssrf_proxy_network:
    driver: bridge
    internal: true

  # 預設網路 - 可存取外部
  default:
    driver: bridge

服務通訊:

  • API/Worker/Sandbox → ssrf_proxy → 外部 API
  • Nginx → API/Web (反向代理)
  • API → Database/Redis (內部通訊)

📖 詳細文件: deployment/docker-compose.md


三、Kubernetes 部署

3.1 Helm 快速部署

# 新增 Helm 倉庫
helm repo add dify https://borispolonsky.github.io/dify-helm
helm repo update

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

# 檢視狀態
kubectl get pods -l app.kubernetes.io/name=dify

3.2 高可用架構

多副本部署:

# 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

Pod 反親和性:

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

📖 詳細文件: deployment/kubernetes.md

3.3 託管服務整合

使用雲廠商託管服務:

# 使用 RDS PostgreSQL
postgresql:
  enabled: false
externalDatabase:
  host: your-rds-endpoint.rds.amazonaws.com
  port: 5432
  database: dify
  username: dify
  password: your-password

# 使用 ElastiCache Redis
redis:
  enabled: false
externalRedis:
  host: your-redis.cache.amazonaws.com
  port: 6379
  password: your-password

優勢:

  • ✅ 自動備份和恢復
  • ✅ 高可用和故障轉移
  • ✅ 效能監控和最佳化
  • ✅ 減少維運負擔

📖 詳細文件: deployment/high-availability.md


四、監控和告警

4.1 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

監控指標:

  • 請求延遲和吞吐量
  • 錯誤率和成功率
  • 資源使用 (CPU、記憶體、磁碟)
  • 資料庫連線池狀態
  • 佇列深度和處理速度

4.2 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 日誌聚合

# 日誌配置
LOG_LEVEL=INFO
LOG_OUTPUT_FORMAT=json
LOG_FILE=/app/logs/server.log
LOG_FILE_MAX_SIZE=20
LOG_FILE_BACKUP_COUNT=5

日誌檢視:

# 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

📖 詳細文件: operations/monitoring.md

4.4 佇列監控

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

五、故障排查

5.1 常見問題

容器啟動失敗

症狀: 容器反覆重啟或無法啟動

診斷:

# 檢視容器狀態
docker compose ps

# 檢視日誌
docker compose logs api

# 檢查健康狀態
docker compose exec api curl http://localhost:5001/health

常見原因:

  1. 資料庫連線失敗

    # 檢查資料庫
    docker compose exec db_postgres pg_isready
    # 驗證連線
    docker compose exec api env | grep DB_
    
  2. 依賴服務未就緒

    # 檢查 depends_on 配置
    depends_on:
      db_postgres:
        condition: service_healthy
    
  3. 環境變數配置錯誤

    # 驗證必需變數
    docker compose config | grep -E "SECRET_KEY|DB_PASSWORD"
    

網路連線問題

症狀: 無法存取外部 API 或內部服務

診斷:

# 測試 SSRF Proxy
docker compose exec api curl -x http://ssrf_proxy:3128 https://api.openai.com

# 測試內部服務
docker compose exec api curl http://redis:6379
docker compose exec api curl http://db_postgres:5432

效能問題

症狀: 響應慢、逾時、資源耗盡

診斷:

# 檢視資源使用
docker stats

# 檢視資料庫連線
docker compose exec db_postgres psql -U postgres -d dify -c "SELECT count(*) FROM pg_stat_activity;"

# 檢視 Redis 記憶體
docker compose exec redis redis-cli INFO memory

📖 詳細文件: operations/troubleshooting.md

5.2 故障恢復流程

資料庫故障

# 1. 檢查狀態
docker compose ps db_postgres

# 2. 檢視日誌
docker compose logs db_postgres

# 3. 重啟服務
docker compose restart db_postgres

# 4. 驗證連線
docker compose exec db_postgres pg_isready

# 5. 檢查資料完整性
docker compose exec db_postgres psql -U postgres -d dify -c "SELECT count(*) FROM accounts;"

服務重啟順序

# 1. 基礎服務
docker compose restart db_postgres redis

# 2. 核心服務
docker compose restart api worker beat

# 3. 前端服務
docker compose restart web nginx

# 4. 驗證
docker compose ps
curl http://localhost/health

📖 詳細文件: operations/backup.md


六、最佳實踐

6.1 安全最佳實踐

  1. 定期更新金鑰

    • 每 90 天輪換 SECRET_KEY
    • 使用金鑰管理服務 (AWS KMS, HashiCorp Vault)
  2. 最小許可權原則

    • 容器以非 root 使用者執行
    • 資料庫使用者僅授予必需許可權
  3. 網路隔離

    • 使用內部網路隔離敏感服務
    • 透過 SSRF Proxy 控制外部存取
  4. 稽核日誌

    • 啟用詳細日誌記錄
    • 定期審查存取日誌和錯誤日誌

6.2 部署最佳實踐

  1. 環境分離

    • 開發、測試、生產環境獨立
    • 使用不同的配置和金鑰
  2. 自動化部署

    • 使用 CI/CD 流水線
    • 自動化測試和驗證
  3. 版本控制

    • 配置檔案版本化 (排除敏感資訊)
    • 使用 Git 管理基礎設施程式碼
  4. 監控和告警

    • 配置全面的監控指標
    • 設定合理的告警閾值

6.3 維運最佳實踐

  1. 備份策略

    • 每日自動備份資料庫
    • 定期測試恢復流程
  2. 容量規劃

    • 監控資源使用趨勢
    • 提前擴容避免效能問題
  3. 文件維護

    • 記錄配置變更
    • 維護維運手冊
  4. 應急響應

    • 建立故障響應流程
    • 定期演練恢復場景

📖 詳細文件: best-practices.md


七、配置範本

7.1 開發環境範本

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

# 使用預設密碼 (僅開發環境)
DB_PASSWORD=difyai123456
REDIS_PASSWORD=difyai123456

# 停用 HTTPS
NGINX_HTTPS_ENABLED=false

7.2 生產環境範本

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

# 強金鑰 (必須修改)
SECRET_KEY=$(openssl rand -base64 42)
DB_PASSWORD=<strong-password>
REDIS_PASSWORD=<strong-password>

# 啟用 HTTPS
NGINX_HTTPS_ENABLED=true
NGINX_SSL_CERT_FILENAME=fullchain.pem
NGINX_SSL_CERT_KEY_FILENAME=privkey.pem

# 啟用監控
ENABLE_OTEL=true
API_SENTRY_DSN=<your-sentry-dsn>

7.3 高可用範本

# 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

八、參考資料

官方文件

社群資源

相關 SKILL


快速命令參考

# Docker 部署
docker compose up -d                    # 啟動所有服務
docker compose ps                       # 檢視服務狀態
docker compose logs -f api              # 檢視 API 日誌
docker compose restart api              # 重啟 API 服務
docker compose down                     # 停止所有服務

# 健康檢查
curl http://localhost/health            # 檢查服務健康
docker compose exec db_postgres pg_isready  # 檢查資料庫
docker compose exec redis redis-cli ping    # 檢查 Redis

# 日誌檢視
docker compose logs --tail=100 api      # 檢視最近 100 行日誌
docker compose logs -f worker           # 即時檢視 worker 日誌

# 資料庫操作
docker compose exec db_postgres psql -U postgres -d dify  # 連線資料庫
docker compose exec db_postgres pg_dump -U postgres dify > backup.sql  # 備份

# Kubernetes
kubectl get pods -l app=dify            # 檢視 Pod 狀態
kubectl logs -f deployment/dify-api     # 檢視日誌
kubectl describe pod <pod-name>         # 檢視 Pod 詳情
kubectl exec -it <pod-name> -- /bin/bash  # 進入容器

版本: 1.0.0 最後更新: 2026-03-04 維護者: Dify SKILL Team

Individual skills in this repo

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

相關技能