- Published on
FastAPI 배포 가이드: Docker부터 클라우드까지! 🚀
- Authors
- Name
- devnmin
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: |
# 여기에 배포 스크립트를 추가하세요!
실전 배포 팁! 💡
- 무중단 배포 설정
# nginx.conf
upstream fastapi {
server web1:8000;
server web2:8000 backup; # 백업 서버 준비! 🔄
}
- 백업 설정
# 데이터베이스 백업 스크립트
#!/bin/bash
pg_dump dbname > backup_$(date +%Y%m%d).sql
# 매일 밤 12시에 백업해요! 🌙
- 성능 모니터링
# 응답 시간 측정 미들웨어
@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
자주 하는 실수들 🚨
환경변수를 깃허브에 올리기
- .gitignore에 .env* 추가하세요!
DEBUG 모드로 배포하기
- 프로덕션에서는 꼭 False로!
보안 설정 미흡
- HTTPS 필수!
- 적절한 CORS 설정!
다음 단계는? 🎯
Pro Tip: 처음부터 완벽할 순 없어요! 작게 시작해서 점진적으로 개선하세요. 로컬에서 충분히 테스트하고, 단계적으로 배포하는 게 좋아요! 😉
유용한 자료들 📚
다음 시간에는... FastAPI 성능 최적화하는 방법을 알아볼 거예요! 더 빠르게, 더 효율적으로! 🚀