Files
executor/PRODUCTION_CHECKLIST.md
Jongheon Kim 9c41a458cb Fix STATIC_ROOT configuration and improve production settings
- Add STATIC_ROOT and MEDIA_ROOT settings with environment variable support
- Update settings.py to use environment variables for SECRET_KEY, DEBUG, ALLOWED_HOSTS, TIME_ZONE
- Improve docker-entrypoint.sh to auto-create static/media directories
- Always run collectstatic in Docker (not just production)
- Add check_settings.py script for configuration verification
- Add PRODUCTION_CHECKLIST.md for deployment guide
- Update .env.example with all configuration options
- Update .gitignore for proper static/media file handling

This fixes the ImproperlyConfigured error when deploying with Docker.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 00:17:29 +09:00

7.3 KiB
Raw Blame History

프로덕션 배포 체크리스트

배포 전 필수 확인 사항

1. 환경 설정 (.env)

# .env 파일 생성
cp .env.example .env
nano .env

필수 변경 항목:

  • DJANGO_SECRET_KEY - 새로운 시크릿 키 생성

    python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
    
  • DJANGO_DEBUG=False - 반드시 False로 설정

  • DJANGO_ALLOWED_HOSTS - 실제 도메인 설정

    DJANGO_ALLOWED_HOSTS=yourdomain.com,www.yourdomain.com
    

2. 정적 파일 설정

# 로컬에서 테스트
python manage.py collectstatic --noinput

# 정상 동작 확인
python check_settings.py

확인 항목:

  • STATIC_ROOT 설정됨
  • STATIC_URL 설정됨
  • staticfiles 디렉토리 생성됨
  • mediafiles 디렉토리 생성됨

3. 데이터베이스

# 마이그레이션 확인
python manage.py showmigrations

# 미적용 마이그레이션 적용
python manage.py migrate

확인 항목:

  • 모든 마이그레이션 적용됨
  • 전략 초기화 완료
    python manage.py init_strategies
    

4. Docker 설정

docker-compose.yml 확인:

environment:
  - DJANGO_ENV=production
  - DJANGO_DEBUG=False
  - DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY}
  - DJANGO_ALLOWED_HOSTS=${DJANGO_ALLOWED_HOSTS}

확인 항목:

  • .env 파일 존재
  • 환경 변수 올바르게 설정됨
  • 볼륨 마운트 설정 확인
  • 포트 설정 확인

5. 보안

settings.py 확인:

  • DEBUG = False
  • SECRET_KEY 환경 변수에서 로드
  • ALLOWED_HOSTS 제한적으로 설정
  • HTTPS 강제 (프로덕션 환경)
    SECURE_SSL_REDIRECT = True
    SECURE_HSTS_SECONDS = 31536000
    SECURE_HSTS_INCLUDE_SUBDOMAINS = True
    SESSION_COOKIE_SECURE = True
    CSRF_COOKIE_SECURE = True
    

6. 성능

gunicorn 설정:

  • Worker 수 적절히 설정 (CPU 코어 수 × 2 + 1)

    # docker-compose.yml
    command: gunicorn --bind 0.0.0.0:8000 --workers 4 executor.wsgi:application
    
  • 타임아웃 설정

    --timeout 120
    

🚀 배포 단계

1. 로컬 테스트

# 설정 확인
python check_settings.py

# 정적 파일 수집
python manage.py collectstatic --noinput

# 개발 서버로 테스트
python manage.py runserver

2. Docker 빌드

# 이미지 빌드
docker-compose build web

# 빌드 확인
docker images | grep quantbench

3. 컨테이너 시작

# 백그라운드 실행
docker-compose up -d web

# 로그 확인
docker-compose logs -f web

4. 헬스 체크

# API 응답 확인
curl http://localhost:8000/strategies/

# 전략 목록 확인
curl http://localhost:8000/strategies/ | python -m json.tool

# 콜백 기능 테스트
python test_callback.py

5. 모니터링

# 컨테이너 상태
docker-compose ps

# 리소스 사용량
docker stats quantbench-executor

# 로그 실시간 확인
docker-compose logs -f

🔧 문제 해결

STATIC_ROOT 오류

증상:

ImproperlyConfigured: You're using the staticfiles app without having set the STATIC_ROOT setting

해결:

# settings.py 확인
grep STATIC_ROOT executor/settings.py

# 디렉토리 생성
mkdir -p staticfiles mediafiles

# collectstatic 실행
python manage.py collectstatic --noinput

환경 변수 로드 안됨

증상:

Using default SECRET_KEY (insecure)

해결:

# .env 파일 확인
cat .env

# Docker에서 환경 변수 전달 확인
docker-compose config

# 컨테이너 내부 확인
docker-compose exec web env | grep DJANGO

정적 파일 404 오류

해결:

  1. 개발 환경:

    # settings.py
    DEBUG = True  # 자동으로 정적 파일 서빙
    
  2. 프로덕션 환경:

    # nginx 설정 필요
    location /static/ {
        alias /app/staticfiles/;
    }
    

마이그레이션 충돌

해결:

# 컨테이너에서 마이그레이션 초기화
docker-compose exec web python manage.py migrate --run-syncdb

# 또는 DB 초기화
docker-compose down -v
docker-compose up -d

📊 성능 최적화

1. Gunicorn Worker 조정

CPU 4코어 기준:

workers = 9  # (4 × 2) + 1

docker-compose.yml:

command: gunicorn --bind 0.0.0.0:8000 --workers 9 --timeout 120 executor.wsgi:application

2. 데이터베이스 최적화

PostgreSQL 사용 권장:

# .env
DATABASE_URL=postgresql://user:pass@db:5432/executor

# docker-compose.yml에 PostgreSQL 서비스 추가

3. 캐싱

Redis 캐시 추가:

# settings.py
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.redis.RedisCache',
        'LOCATION': 'redis://redis:6379/1',
    }
}

4. 로깅

프로덕션 로깅 설정:

# settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': '/app/logs/django.log',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': True,
        },
    },
}

🔐 보안 강화

1. HTTPS 강제

# settings.py (프로덕션)
if not DEBUG:
    SECURE_SSL_REDIRECT = True
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
    SECURE_HSTS_SECONDS = 31536000
    SECURE_HSTS_INCLUDE_SUBDOMAINS = True
    SECURE_HSTS_PRELOAD = True
    SESSION_COOKIE_SECURE = True
    CSRF_COOKIE_SECURE = True

2. CORS 설정

# 필요시 django-cors-headers 설치
uv add django-cors-headers
# settings.py
INSTALLED_APPS += ['corsheaders']
MIDDLEWARE.insert(0, 'corsheaders.middleware.CorsMiddleware')

CORS_ALLOWED_ORIGINS = [
    "https://yourdomain.com",
]

3. Rate Limiting

# django-ratelimit 설치
uv add django-ratelimit
# views.py
from django_ratelimit.decorators import ratelimit

@ratelimit(key='ip', rate='10/m')
def execute_strategy(request):
    ...

📝 배포 후 확인

즉시 확인

  • 서비스 응답 확인 (HTTP 200)
  • 전략 목록 조회 가능
  • 전략 실행 정상 작동
  • 콜백 기능 테스트

24시간 후

  • 에러 로그 확인
  • 메모리 사용량 확인
  • CPU 사용량 확인
  • 디스크 사용량 확인

주간 점검

  • 로그 파일 로테이션
  • 데이터베이스 백업
  • 보안 업데이트 확인
  • 성능 지표 분석

🆘 롤백 계획

# 1. 이전 이미지로 복구
docker-compose down
docker-compose pull  # 이전 이미지
docker-compose up -d

# 2. 데이터베이스 백업에서 복구
cat backup.sql | docker-compose exec -T web python manage.py dbshell

# 3. 로그 확인
docker-compose logs --tail=100 web

📚 참고 문서