Docker를 사용한 프로덕션 배포 가이드입니다.
[클라이언트] → [Nginx (port 80)] → React SPA (정적 파일)
→ /api/ → [Gunicorn (port 8000)] → Django
→ /media/ → [Gunicorn (port 8000)] → Django
→ /admin/ → [Gunicorn (port 8000)] → Django
- frontend 컨테이너: Nginx가 React 빌드 결과물을 서빙하고,
/api/,/media/,/admin/요청을 backend로 프록시 - backend 컨테이너: Gunicorn + Django가 API 요청 처리
- 데이터: SQLite DB와 업로드 파일은 Docker volume으로 영속 저장
-
Docker 설치
- Docker Desktop 또는 서버용 Docker Engine 설치
- 설치 확인:
docker --version docker compose version
-
소스 코드 클론
git clone <repository-url> cd <project-directory>
cp .env.example .env.env 파일을 열어서 아래 값들을 설정합니다:
# [필수] Django 비밀 키 — 아래 명령어로 생성
SECRET_KEY=생성한-랜덤-문자열
# [필수] 프로덕션에서는 반드시 False
DEBUG=False
# [필수] 접속 허용 도메인/IP (쉼표 구분)
ALLOWED_HOSTS=your-domain.com,서버IP
# [필수] 프론트엔드 접속 URL (쉼표 구분)
CSRF_TRUSTED_ORIGINS=https://your-domain.com
CORS_ALLOWED_ORIGINS=https://your-domain.com
# [선택] 이메일 발송 기능 사용 시 (Gmail SMTP)
EMAIL_HOST_USER=your-email@gmail.com
EMAIL_HOST_PASSWORD=gmail-앱-비밀번호SECRET_KEY 생성:
# 방법 1: Python
python3 -c "import secrets; print(secrets.token_urlsafe(50))"
# 방법 2: OpenSSL
openssl rand -base64 50# 이미지 빌드 + 컨테이너 시작 (백그라운드)
docker compose up -d --build# 데이터베이스 테이블 생성
docker compose exec backend python manage.py migrate
# Django 관리자 계정 생성
docker compose exec backend python manage.py createsuperuser| 확인 항목 | URL | 기대 결과 |
|---|---|---|
| 프론트엔드 | http://서버IP |
React 홈페이지 로드 |
| API 헬스체크 | http://서버IP/api/health |
{"ok": true} |
| Django Admin | http://서버IP/admin/ |
로그인 페이지 |
# 전체 로그 확인 (실시간)
docker compose logs -f
# 백엔드 로그만 확인
docker compose logs -f backend
# 컨테이너 상태 확인
docker compose ps
# 컨테이너 중지
docker compose down
# 컨테이너 재시작 (코드 변경 없을 때)
docker compose restart
# 코드 변경 후 재배포
docker compose up -d --build
# Django 쉘 접속
docker compose exec backend python manage.py shell
# DB 마이그레이션 (모델 변경 후)
docker compose exec backend python manage.py migrate코드가 업데이트되었을 때:
git pull origin main
docker compose up -d --build
docker compose exec backend python manage.py migrate # 모델 변경이 있을 경우80번 포트가 이미 사용 중이면 docker-compose.yml에서 변경:
# 예: 8080 포트로 변경
ports:
- "8080:80"| 볼륨 | 용도 | 경로 (컨테이너 내부) |
|---|---|---|
db_data |
SQLite 데이터베이스 | /app/db/db.sqlite3 |
media_data |
업로드 파일 (이미지, PDF 등) | /app/media/ |
# DB 백업
docker compose exec backend cp /app/db/db.sqlite3 /app/db/backup.sqlite3
docker cp $(docker compose ps -q backend):/app/db/backup.sqlite3 ./backup.sqlite3
# 미디어 파일 백업
docker cp $(docker compose ps -q backend):/app/media ./media_backupdocker compose down→ 컨테이너만 삭제 (데이터 유지)docker compose down -v→ 볼륨도 삭제 (데이터 삭제됨!)
docker compose logs backend # 에러 메시지 확인docker compose down && docker compose up -ddocker compose down -v # 볼륨 삭제
docker compose up -d # 재시작
docker compose exec backend python manage.py migrate # 테이블 재생성
docker compose exec backend python manage.py createsuperuser