- 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>
7.3 KiB
7.3 KiB
프로덕션 배포 체크리스트
✅ 배포 전 필수 확인 사항
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 = FalseSECRET_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 오류
해결:
-
개발 환경:
# settings.py DEBUG = True # 자동으로 정적 파일 서빙 -
프로덕션 환경:
# 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
📚 참고 문서
- Django Deployment Checklist
- Gunicorn Documentation
- Docker Best Practices
- 프로젝트 문서:
DEPLOYMENT_GUIDE.mdAPI_USAGE_GUIDE.mdCALLBACK_API_GUIDE.md