AkJeond commited on
Commit
0546432
·
1 Parent(s): 842644b

fix: Dockerfile 및 FastAPI CORS 설정 개선

Browse files
Files changed (2) hide show
  1. Dockerfile +78 -69
  2. app/main.py +9 -2
Dockerfile CHANGED
@@ -1,92 +1,101 @@
1
  # ============================================================================
2
- # SmartEyeSsen Backend - Production Dockerfile
3
- # Multi-stage build for optimized image size
4
- # Python 3.9 기반 (Project/requirements.txt 호환)
 
 
 
5
  # ============================================================================
6
 
7
- # Stage 1: Builder - Install dependencies
8
- FROM python:3.9-slim as builder
9
 
10
- # Set working directory
11
- WORKDIR /app
 
 
12
 
13
- # Install system dependencies for Tesseract OCR and OpenCV
14
  RUN apt-get update && apt-get install -y --no-install-recommends \
 
15
  tesseract-ocr \
16
  tesseract-ocr-kor \
17
  tesseract-ocr-eng \
 
18
  libgl1 \
19
  libglib2.0-0 \
 
20
  gcc \
21
  g++ \
 
 
 
 
22
  && rm -rf /var/lib/apt/lists/*
23
 
24
- # Verify Tesseract installation
25
- RUN tesseract --version && tesseract --list-langs
 
 
26
 
27
- # Copy Backend requirements (pymysql, gunicorn 포함)
28
- COPY requirements.txt .
 
 
 
29
 
30
- # Install Python dependencies
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  RUN pip install --no-cache-dir --upgrade pip && \
32
- pip install --no-cache-dir -r requirements.txt && \
33
- pip install --no-cache-dir doclayout-yolo
 
 
34
 
35
  # ============================================================================
36
- # Stage 2: Runtime - Minimal production image
37
- FROM python:3.9-slim
 
38
 
39
- # Set working directory
40
- WORKDIR /app
 
 
 
 
 
41
 
42
- # Install runtime dependencies only
43
- RUN apt-get update && apt-get install -y --no-install-recommends \
44
- tesseract-ocr \
45
- tesseract-ocr-kor \
46
- tesseract-ocr-eng \
47
- libgl1 \
48
- libglib2.0-0 \
49
- locales \
50
- && rm -rf /var/lib/apt/lists/*
51
 
52
- # Set UTF-8 locale (한글 인코딩 문제 해결)
53
- RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
54
- sed -i '/ko_KR.UTF-8/s/^# //g' /etc/locale.gen && \
55
- locale-gen
56
- ENV LANG=ko_KR.UTF-8 \
57
- LANGUAGE=ko_KR:en \
58
- LC_ALL=ko_KR.UTF-8
59
-
60
- # Copy Python packages from builder
61
- COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
62
- COPY --from=builder /usr/local/bin /usr/local/bin
63
-
64
- # Copy application code
65
- COPY . .
66
-
67
- # Create necessary directories
68
- RUN mkdir -p /app/uploads /app/static /app/test_pipeline_outputs && \
69
- chmod -R 755 /app/uploads /app/static /app/test_pipeline_outputs
70
-
71
- # Set environment variables
72
- ENV PYTHONUNBUFFERED=1 \
73
- PYTHONDONTWRITEBYTECODE=1 \
74
- PATH="/usr/local/bin:$PATH"
75
-
76
- # Expose port
77
- EXPOSE 8000
78
-
79
- # Health check
80
- HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
81
- CMD python -c "import requests; requests.get('http://localhost:8000/health', timeout=5)"
82
-
83
- # Run with gunicorn for production
84
- # Workers: 1 (메모리 최적화 - 전시회 환경, 1.7GB 사용)
85
- # Timeout: 300s (AI 모델 추론 시간 고려)
86
- CMD ["gunicorn", "app.main:app", \
87
- "--workers", "1", \
88
- "--worker-class", "uvicorn.workers.UvicornWorker", \
89
- "--bind", "0.0.0.0:8000", \
90
- "--timeout", "300", \
91
- "--access-logfile", "-", \
92
- "--error-logfile", "-"]
 
1
  # ============================================================================
2
+ # SmartEyeSsen Backend - Hugging Face Spaces Dockerfile
3
+ # ============================================================================
4
+ # Hugging Face Spaces 배포 전용 Dockerfile
5
+ # - 16GB RAM 활용 (DocLayout-YOLO + PyTorch)
6
+ # - 비-루트 사용자 실행 (보안 요구사항)
7
+ # - 포트 7860 필수 (HF Spaces 표준)
8
  # ============================================================================
9
 
10
+ FROM python:3.9-slim
 
11
 
12
+ # ============================================================================
13
+ # 1. 시스템 패키지 설치 (Root 권한 필요)
14
+ # ============================================================================
15
+ USER root
16
 
 
17
  RUN apt-get update && apt-get install -y --no-install-recommends \
18
+ # OCR 엔진
19
  tesseract-ocr \
20
  tesseract-ocr-kor \
21
  tesseract-ocr-eng \
22
+ # OpenCV 의존성
23
  libgl1 \
24
  libglib2.0-0 \
25
+ # 빌드 도구
26
  gcc \
27
  g++ \
28
+ # Git (DocLayout-YOLO 설치용)
29
+ git \
30
+ # 로케일 설정
31
+ locales \
32
  && rm -rf /var/lib/apt/lists/*
33
 
34
+ # UTF-8 로케일 설정 (한글 지원)
35
+ RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
36
+ sed -i '/ko_KR.UTF-8/s/^# //g' /etc/locale.gen && \
37
+ locale-gen
38
 
39
+ # ============================================================================
40
+ # 2. 비-루트 사용자 생성 (Hugging Face Spaces 보안 요구사항)
41
+ # ============================================================================
42
+ RUN useradd -m -u 1000 user
43
+ USER user
44
 
45
+ # 환경 변수 설정
46
+ ENV HOME=/home/user \
47
+ PATH=/home/user/.local/bin:$PATH \
48
+ LANG=ko_KR.UTF-8 \
49
+ LANGUAGE=ko_KR:en \
50
+ LC_ALL=ko_KR.UTF-8 \
51
+ PYTHONUNBUFFERED=1 \
52
+ PYTHONDONTWRITEBYTECODE=1
53
+
54
+ # ============================================================================
55
+ # 3. 작업 디렉토리 설정
56
+ # ============================================================================
57
+ WORKDIR $HOME/app
58
+
59
+ # ============================================================================
60
+ # 4. Python 의존성 설치
61
+ # ============================================================================
62
+ # requirements.txt 먼저 복사 (Docker 캐시 활용)
63
+ COPY --chown=user requirements.txt .
64
+
65
+ # PyPI 패키지 설치
66
  RUN pip install --no-cache-dir --upgrade pip && \
67
+ pip install --no-cache-dir -r requirements.txt
68
+
69
+ # DocLayout-YOLO 설치 (Git 직접 설치)
70
+ RUN pip install --no-cache-dir git+https://github.com/opendatalab/DocLayout-YOLO.git
71
 
72
  # ============================================================================
73
+ # 5. 애플리케이션 코드 복사
74
+ # ============================================================================
75
+ COPY --chown=user . .
76
 
77
+ # ============================================================================
78
+ # 6. 임시 저장소 디렉토리 생성
79
+ # ============================================================================
80
+ # HF Spaces는 /tmp 외에는 쓰기 권한 제한될 수 있음
81
+ RUN mkdir -p /tmp/uploads && \
82
+ mkdir -p $HOME/app/uploads $HOME/app/static $HOME/app/test_pipeline_outputs && \
83
+ chmod -R 755 $HOME/app/uploads $HOME/app/static $HOME/app/test_pipeline_outputs
84
 
85
+ ENV TMPDIR=/tmp/uploads
 
 
 
 
 
 
 
 
86
 
87
+ # ============================================================================
88
+ # 7. Tesseract 설치 확인
89
+ # ============================================================================
90
+ RUN tesseract --version && tesseract --list-langs
91
+
92
+ # ============================================================================
93
+ # 8. 포트 설정 (HF Spaces 필수 포트)
94
+ # ============================================================================
95
+ EXPOSE 7860
96
+
97
+ # ============================================================================
98
+ # 9. 서버 실행
99
+ # ============================================================================
100
+ # Hugging Face Spaces는 7860 포트 필수
101
+ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "7860", "--timeout-keep-alive", "300"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/main.py CHANGED
@@ -73,9 +73,16 @@ app = FastAPI(
73
  # CORS 설정 (환경별 분리)
74
  # ============================================================================
75
  if ENVIRONMENT == "production":
76
- # 프로덕션: 엄격한 CORS (실제로는 Nginx Reverse Proxy로 Same-Origin 처리)
 
 
77
  CORS_ORIGINS_ENV = os.getenv("CORS_ORIGINS", "")
78
- CORS_ORIGINS = CORS_ORIGINS_ENV.split(",") if CORS_ORIGINS_ENV else ["*"]
 
 
 
 
 
79
  CORS_METHODS = ["GET", "POST", "PUT", "DELETE", "PATCH"]
80
  CORS_HEADERS = ["Content-Type", "Authorization", "X-Requested-With"]
81
  else:
 
73
  # CORS 설정 (환경별 분리)
74
  # ============================================================================
75
  if ENVIRONMENT == "production":
76
+ # 프로덕션: Vercel + HF Spaces 배포 환경
77
+ # 환경 변수로 CORS_ORIGINS 설정 가능 (쉼표로 구분)
78
+ # 예: CORS_ORIGINS="https://yourapp.vercel.app,https://www.yourapp.com"
79
  CORS_ORIGINS_ENV = os.getenv("CORS_ORIGINS", "")
80
+ if CORS_ORIGINS_ENV:
81
+ CORS_ORIGINS = CORS_ORIGINS_ENV.split(",")
82
+ else:
83
+ # 기본값: 모든 도메인 허용 (초기 배포/테스트용)
84
+ # 보안 강화가 필요하면 환경 변수로 특정 도메인 지정
85
+ CORS_ORIGINS = ["*"]
86
  CORS_METHODS = ["GET", "POST", "PUT", "DELETE", "PATCH"]
87
  CORS_HEADERS = ["Content-Type", "Authorization", "X-Requested-With"]
88
  else: