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 프록시가 구성되어 내부 네트워크 접근을 차단하는지 확인
- 샌드박스가 네트워크 프록시를 활성화했는지 확인
- 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.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:
http: 'http://ssrf_proxy:3128'
https: 'http://ssrf_proxy:3128'
보안 기능:
- ✅ 시스템 호출 화이트리스트 제한
- ✅ 리소스 할당 관리 (CPU, 메모리, 타임아웃)
- ✅ 네트워크 접근은 SSRF 프록시를 통해
- ✅ 파일 시스템 격리
📖 상세 문서: 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
2. 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
3. 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. 모니터링 및 알림
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. 문제 해결
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 프록시 테스트
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. 모범 사례
6.1 보안 모범 사례
-
정기적인 키 업데이트
- 90일마다 SECRET_KEY 교체
- 키 관리 서비스 사용 (AWS KMS, HashiCorp Vault)
-
최소 권한 원칙
- 컨테이너는 root가 아닌 사용자로 실행
- 데이터베이스 사용자에게 필요한 권한만 부여
-
네트워크 격리
- 내부 네트워크를 사용하여 민감한 서비스 격리
- SSRF 프록시를 통해 외부 접근 제어
-
감사 로그
- 상세 로그 기록 활성화
- 접근 로그 및 오류 로그 정기 검토
6.2 배포 모범 사례
-
환경 분리
- 개발, 테스트, 프로덕션 환경 독립적으로 운영
- 각각 다른 구성과 키 사용
-
자동화된 배포
- CI/CD 파이프라인 사용
- 자동화된 테스트 및 검증
-
버전 관리
- 구성 파일 버전 관리 (민감한 정보 제외)
- Git을 사용한 인프라 코드 관리
-
모니터링 및 알림
- 포괄적인 모니터링 지표 구성
- 적절한 알림 임계값 설정
6.3 운영 모범 사례
-
백업 전략
- 데이터베이스 매일 자동 백업
- 복구 절차 정기 테스트
-
용량 계획
- 리소스 사용 추세 모니터링
- 사전 확장으로 성능 문제 방지
-
문서 유지 관리
- 구성 변경 사항 기록
- 운영 매뉴얼 유지
-
비상 대응
- 장애 대응 절차 수립
- 복구 시나리오 정기 훈련
📖 상세 문서: best-practices.md
7. 구성 템플릿
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
8. 참고 자료
공식 문서
커뮤니티 리소스
관련 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 팀