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
常見原因:
-
資料庫連線失敗
# 檢查資料庫 docker compose exec db_postgres pg_isready # 驗證連線 docker compose exec api env | grep DB_ -
依賴服務未就緒
# 檢查 depends_on 配置 depends_on: db_postgres: condition: service_healthy -
環境變數配置錯誤
# 驗證必需變數 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 安全最佳實踐
-
定期更新金鑰
- 每 90 天輪換 SECRET_KEY
- 使用金鑰管理服務 (AWS KMS, HashiCorp Vault)
-
最小許可權原則
- 容器以非 root 使用者執行
- 資料庫使用者僅授予必需許可權
-
網路隔離
- 使用內部網路隔離敏感服務
- 透過 SSRF Proxy 控制外部存取
-
稽核日誌
- 啟用詳細日誌記錄
- 定期審查存取日誌和錯誤日誌
6.2 部署最佳實踐
-
環境分離
- 開發、測試、生產環境獨立
- 使用不同的配置和金鑰
-
自動化部署
- 使用 CI/CD 流水線
- 自動化測試和驗證
-
版本控制
- 配置檔案版本化 (排除敏感資訊)
- 使用 Git 管理基礎設施程式碼
-
監控和告警
- 配置全面的監控指標
- 設定合理的告警閾值
6.3 維運最佳實踐
-
備份策略
- 每日自動備份資料庫
- 定期測試恢復流程
-
容量規劃
- 監控資源使用趨勢
- 提前擴容避免效能問題
-
文件維護
- 記錄配置變更
- 維護維運手冊
-
應急響應
- 建立故障響應流程
- 定期演練恢復場景
📖 詳細文件: 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
- 01-workflow - 工作流設計
- 02-plugin - 外掛開發
- 03-performance - 效能最佳化
快速命令參考
# 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