Community코딩 & 개발github.com

SystemTce/dify-skills

Dify 보안 실천 및 배포 운영 종합 가이드: SSRF 보호, 코드 샌드박스, Docker/Kubernetes 배포, 모니터링 알림 및 장애 복구를 다룹니다.

dify-skills란 무엇인가요?

이 SKILL은 Dify 플랫폼의 보안 실천과 배포 운영에 대한 완전한 가이드를 제공합니다. 개발자와 운영자가 안전하고 안정적이며 고성능의 프로덕션 환경을 구축하는 데 도움을 줍니다. SSRF 보호, 코드 샌드박스, 데이터 암호화, 권한 관리와 같은 핵심 보안 메커니즘을 다루며, Docker Compose 및 Kubernetes를 통한 배포 전략을 상세히 설명합니다. 또한 OpenTelemetry 및 Sentry를 활용한 모니터링 및 알림, 장애 진단 및 복구 절차, 그리고 백업 전략과 같은 운영 모범 사례를 포함합니다. 이 가이드는 Dify를 프로덕션 환경에 배포하고 안전하게 운영하려는 모든 사용자에게 필수적인 참고 자료입니다.

지원 대상✓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에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

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

일반적인 원인:

  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 프록시 테스트
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 보안 모범 사례

  1. 정기적인 키 업데이트

    • 90일마다 SECRET_KEY 교체
    • 키 관리 서비스 사용 (AWS KMS, HashiCorp Vault)
  2. 최소 권한 원칙

    • 컨테이너는 root가 아닌 사용자로 실행
    • 데이터베이스 사용자에게 필요한 권한만 부여
  3. 네트워크 격리

    • 내부 네트워크를 사용하여 민감한 서비스 격리
    • SSRF 프록시를 통해 외부 접근 제어
  4. 감사 로그

    • 상세 로그 기록 활성화
    • 접근 로그 및 오류 로그 정기 검토

6.2 배포 모범 사례

  1. 환경 분리

    • 개발, 테스트, 프로덕션 환경 독립적으로 운영
    • 각각 다른 구성과 키 사용
  2. 자동화된 배포

    • CI/CD 파이프라인 사용
    • 자동화된 테스트 및 검증
  3. 버전 관리

    • 구성 파일 버전 관리 (민감한 정보 제외)
    • Git을 사용한 인프라 코드 관리
  4. 모니터링 및 알림

    • 포괄적인 모니터링 지표 구성
    • 적절한 알림 임계값 설정

6.3 운영 모범 사례

  1. 백업 전략

    • 데이터베이스 매일 자동 백업
    • 복구 절차 정기 테스트
  2. 용량 계획

    • 리소스 사용 추세 모니터링
    • 사전 확장으로 성능 문제 방지
  3. 문서 유지 관리

    • 구성 변경 사항 기록
    • 운영 매뉴얼 유지
  4. 비상 대응

    • 장애 대응 절차 수립
    • 복구 시나리오 정기 훈련

📖 상세 문서: 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


빠른 명령어 참조

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

Individual skills in this repo

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

관련 스킬