Published on

FastAPI 배포 가이드: Docker부터 클라우드까지! 🚀

Authors
  • avatar
    Name
    devnmin
    Twitter

FastAPI 배포하기: 로컬에서 클라우드까지! 🎯

안녕하세요! 드디어 여러분의 멋진 FastAPI 앱을 세상에 공개할 시간이 왔어요! 배포가 어렵다구요? 걱정 마세요. 차근차근 함께 해봐요! 😊

1. Docker 컨테이너 만들기 🐳

Dockerfile 작성하기

# Dockerfile
# Python 3.11 이미지를 베이스로 사용할게요! 🐍
FROM python:3.11-slim

# 작업 디렉토리 설정 (우리 앱의 새로운 집이에요! 🏠)
WORKDIR /app

# 필요한 파일들 복사
COPY requirements.txt .
COPY ./app ./app

# 패키지 설치 (pip도 업그레이드하고, 필요한 패키지도 설치해요!)
RUN pip install --no-cache-dir --upgrade pip && \
    pip install --no-cache-dir -r requirements.txt

# 포트 설정 (FastAPI가 문을 열어둘 거예요! 🚪)
EXPOSE 8000

# 앱 실행 (드디어 출발~! 🚀)
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

Docker Compose 설정하기

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - '8000:8000'
    environment:
      - DATABASE_URL=postgresql://user:password@db:5432/dbname
    depends_on:
      - db

  db:
    image: postgres:15
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=dbname
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data: # 데이터를 안전하게 보관해요! 📦

2. 배포 전 체크리스트 ✅

# 환경 변수 설정하기
from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    # 프로덕션 설정은 따로 관리해요!
    DATABASE_URL: str
    SECRET_KEY: str
    ENVIRONMENT: str = "dev"  # prod로 바꿔주세요!

    class Config:
        env_file = ".env.prod"  # 프로덕션용 환경변수 파일

CORS 설정 (프론트엔드와 사이좋게 지내기 위해! 🤝)

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://yourfrontend.com"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

3. 클라우드 배포하기 ☁️

AWS Elastic Beanstalk 배포

# .elasticbeanstalk/config.yml
branch-defaults:
  main:
    environment: fastapi-production
environment-defaults:
  fastapi-production:
    branch: null
    repository: null
global:
  application_name: your-app-name
  default_ec2_keyname: null
  default_platform: Docker
  default_region: ap-northeast-2 # 서울 리전이에요! 🇰🇷
  sc: git

Heroku 배포

# Procfile
web: uvicorn app.main:app --host=0.0.0.0 --port=${PORT:-8000}

# 배포 명령어
heroku container:push web
heroku container:release web

4. 모니터링 설정하기 📊

Prometheus + Grafana 설정

from prometheus_fastapi_instrumentator import Instrumentator

# 메트릭 수집 시작! 📈
@app.on_event("startup")
async def startup():
    Instrumentator().instrument(app).expose(app)

로깅 설정

import logging

# 로그 설정 (모든 것을 지켜보고 있어요! 👀)
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

5. CI/CD 파이프라인 구축하기 🔄

GitHub Actions 워크플로우

# .github/workflows/deploy.yml
name: Deploy FastAPI

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Build and test 🏗️
        run: |
          docker-compose build
          docker-compose run web pytest

      - name: Deploy to production 🚀
        if: success()
        run: |
          # 여기에 배포 스크립트를 추가하세요!

실전 배포 팁! 💡

  1. 무중단 배포 설정
# nginx.conf
upstream fastapi {
    server web1:8000;
    server web2:8000 backup;  # 백업 서버 준비! 🔄
}
  1. 백업 설정
# 데이터베이스 백업 스크립트
#!/bin/bash
pg_dump dbname > backup_$(date +%Y%m%d).sql
# 매일 밤 12시에 백업해요! 🌙
  1. 성능 모니터링
# 응답 시간 측정 미들웨어
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

자주 하는 실수들 🚨

  1. 환경변수를 깃허브에 올리기

    • .gitignore에 .env* 추가하세요!
  2. DEBUG 모드로 배포하기

    • 프로덕션에서는 꼭 False로!
  3. 보안 설정 미흡

    • HTTPS 필수!
    • 적절한 CORS 설정!

다음 단계는? 🎯

  1. FastAPI 성능 최적화
  2. 로드 밸런싱 구현하기
  3. 마이크로서비스 아키텍처

Pro Tip: 처음부터 완벽할 순 없어요! 작게 시작해서 점진적으로 개선하세요. 로컬에서 충분히 테스트하고, 단계적으로 배포하는 게 좋아요! 😉

유용한 자료들 📚

다음 시간에는... FastAPI 성능 최적화하는 방법을 알아볼 거예요! 더 빠르게, 더 효율적으로! 🚀