제로에서 프로덕션까지: Fly.io와 GitHub Actions를 활용한 FastAPI 배포

코드를 main 브랜치에 푸시합니다. 테스트가 실행됩니다. 몇 분 후 API가 라이브 상태가 됩니다.

이것이 전문적인 배포 파이프라인을 구축하는 방법입니다. 이 설정을 위해 데이터베이스나 Redis는 필요하지 않습니다. 단 하나의 FastAPI 앱, 하나의 Docker 이미지, 하나의 YAML 설정, 그리고 하나의 GitHub Actions 워크플로우만 있으면 됩니다.

워크플로우는 다음과 같습니다: git push → GitHub Actions → 테스트 실행 → 이미지 빌드 → Fly.io로 배포 → 라이브

이 시스템은 세 가지 부분으로 구성됩니다:

  • FastAPI 앱. 어디서든 동일하게 실행될 수 있도록 Docker 이미지로 패키징합니다.
  • Fly.io. 작은 머신에서 이미지를 실행합니다. 라우팅과 상태 확인(health checks)을 대신 처리해 줍니다.
  • GitHub Actions. 코드를 감시하다가 푸시가 발생할 때마다 자동으로 배포합니다.

보안을 위해 권한이 제한된(scoped) 배포 토큰을 사용하세요. 개인 Fly API 토큰을 사용하지 마세요. 특정 앱 하나에만 접근할 수 있는 권한을 가진 토큰을 생성합니다. 이 토큰을 GitHub Secrets에 FLY_API_TOKEN으로 저장하세요.

설정을 위한 주요 기술적 세부 사항:

  • non-root 사용자를 사용하는 Dockerfile을 사용하세요. 이는 보안을 향상시킵니다.
  • Dockerfile에서 앱을 0.0.0.0에 바인딩하세요. 127.0.0.1을 사용하면 Fly가 앱에 접속할 수 없습니다.
  • fly.yaml 파일을 사용하세요. 이 파일은 설정의 기준(source of truth)이 됩니다. 리전, 메모리, 포트를 정의합니다.
  • FastAPI에 health check 엔드포인트를 설정하세요. Fly는 트래픽을 보내기 전에 앱이 정상적으로 실행 중인지 확인하기 위해 이를 사용합니다. 이를 통해 중단 없는(zero-downtime) 배포가 가능해집니다.

GitHub Actions 워크플로우에서 "needs: test" 명령을 사용하세요. 이는 테스트를 통과했을 때만 앱이 배포되도록 보장합니다. 코드가 잘못되었다면 파이프라인은 프로덕션에 도달하기 전에 중단됩니다.

이 설정은 확장이 가능합니다. fly.stg.yamlfly.prod.yaml과 같은 서로 다른 설정 파일을 사용하여 스테이징(staging) 및 프로덕션(production) 환경을 추가할 수 있습니다.

수동 배포를 멈추세요. "내 노트북에서만 돌아가는 코드"에서 "머지할 때마다 배포되는 코드"로 넘어가세요.

출처: https://dev.to/devded/zero-to-production-fastapi-on-flyio-and-github-actions-1ejo