프로젝트 배포 자동화 가이드 Part 1: 개발 환경 구성

2025. 2. 3. 11:12·파이썬/Fast API
반응형

윈도우에서 개발한 FastAPI 프로젝트를 리눅스 환경에서 배포하는 과정을 자동화해보겠습니다. 특히 Python 버전과 의존성 관리를 자동화하여 편리하게 배포할 수 있도록 구성하겠습니다.

프로젝트 구조 설정

my-fastapi-project/
├── app/
│   ├── api/
│   ├── core/
│   ├── models/
│   └── main.py
├── tests/
├── .github/
│   └── workflows/
│       ├── ci.yml
│       └── cd.yml
├── scripts/
│   ├── generate_requirements.py
│   ├── get_python_version.py
│   └── start.sh
├── Dockerfile
├── docker-compose.yml
└── .env.example

Python 버전 감지 스크립트

현재 개발 환경의 Python 버전을 자동으로 감지하는 스크립트입니다.

# scripts/get_python_version.py
import sys
import json

def get_python_version():
    version = sys.version_info
    return {
        "major": version.major,
        "minor": version.minor,
        "micro": version.micro,
        "full": f"{version.major}.{version.minor}.{version.micro}"
    }

if __name__ == "__main__":
    version_info = get_python_version()
    print(json.dumps(version_info))

의존성 자동 생성 스크립트

현재 프로젝트의 의존성을 자동으로 감지하여 requirements.txt를 생성합니다.

# scripts/generate_requirements.py
import pkg_resources
import subprocess
from pathlib import Path

def generate_requirements():
    # 현재 환경의 모든 패키지 가져오기
    installed_packages = [
        f"{dist.key}=={dist.version}"
        for dist in pkg_resources.working_set
    ]

    # FastAPI 필수 패키지 추가
    required_packages = [
        "fastapi",
        "uvicorn[standard]",
        "python-dotenv",
        "sqlalchemy",
        "alembic",
        "pytest",
        "httpx"
    ]

    # requirements.txt 생성
    output_path = Path("requirements.txt")
    with output_path.open("w") as f:
        for package in required_packages:
            if any(p.startswith(package) for p in installed_packages):
                matching_pkg = next(p for p in installed_packages if p.startswith(package))
                f.write(f"{matching_pkg}\n")
            else:
                f.write(f"{package}\n")

if __name__ == "__main__":
    generate_requirements()
    print("requirements.txt has been generated successfully!")

동적 Dockerfile

Python 버전을 자동으로 감지하여 적용하는 Dockerfile입니다.

# Dockerfile
ARG PYTHON_VERSION
FROM python:${PYTHON_VERSION}-slim as builder

WORKDIR /app
ENV PYTHONPATH=/app

# 가상환경 생성
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

# 의존성 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 프로덕션 스테이지
FROM python:${PYTHON_VERSION}-slim

WORKDIR /app
ENV PYTHONPATH=/app

# 가상환경 복사
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

# 애플리케이션 코드 복사
COPY ./app /app/app

# 시작 스크립트 복사
COPY ./scripts/start.sh /app/start.sh
RUN chmod +x /app/start.sh

CMD ["/app/start.sh"]

GitHub Actions CI 워크플로우

Python 버전 감지와 의존성 생성을 자동화하는 CI 설정입니다.

# .github/workflows/ci.yml
name: CI Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  prepare:
    runs-on: ubuntu-latest
    outputs:
      python_version: ${{ steps.get_python_version.outputs.version }}

    steps:
    - uses: actions/checkout@v2

    - name: Get Python Version
      id: get_python_version
      run: |
        python_version=$(python scripts/get_python_version.py | jq -r .full)
        echo "version=${python_version}" >> $GITHUB_OUTPUT

    - name: Generate Requirements
      run: python scripts/generate_requirements.py

    - name: Cache requirements.txt
      uses: actions/cache@v2
      with:
        path: requirements.txt
        key: ${{ runner.os }}-requirements-${{ hashFiles('**/requirements.txt') }}

  test:
    needs: prepare
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: ${{ needs.prepare.outputs.python_version }}

    - name: Restore cached requirements
      uses: actions/cache@v2
      with:
        path: requirements.txt
        key: ${{ runner.os }}-requirements-${{ hashFiles('**/requirements.txt') }}

    - name: Install dependencies
      run: pip install -r requirements.txt

    - name: Run tests
      run: pytest tests/

docker-compose.yml

개발 환경 설정을 위한 docker-compose 파일입니다.

version: '3.8'

services:
  web:
    build:
      context: .
      args:
        - PYTHON_VERSION=${PYTHON_VERSION}
    ports:
      - "8000:8000"
    env_file:
      - .env
    volumes:
      - ./app:/app/app
    depends_on:
      - db
      - redis
    networks:
      - app-network

  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
    networks:
      - app-network

  redis:
    image: redis:6
    networks:
      - app-network

networks:
  app-network:

volumes:
  postgres_data:

이렇게 구성하면 개발자의 Python 버전을 자동으로 감지하고, 프로젝트의 의존성도 자동으로 관리할 수 있습니다. CI/CD 파이프라인에서도 이 정보들을 활용하여 일관된 환경을 구성할 수 있습니다.

저작자표시 비영리 변경금지 (새창열림)

'파이썬 > Fast API' 카테고리의 다른 글

FastAPI 프로젝트 배포 자동화 가이드 Part 3: 무중단 배포와 모니터링  (0) 2025.02.05
FastAPI 프로젝트 배포 자동화 가이드 Part 2: CD 파이프라인과 서버 배포  (2) 2025.02.04
FastAPI-Cache로 구현하는 효율적인 API 캐싱  (0) 2025.02.02
Router Tags 활용  (0) 2025.02.01
테스트, 배포, 성능 최적화 - Part 3  (0) 2025.01.31
'파이썬/Fast API' 카테고리의 다른 글
  • FastAPI 프로젝트 배포 자동화 가이드 Part 3: 무중단 배포와 모니터링
  • FastAPI 프로젝트 배포 자동화 가이드 Part 2: CD 파이프라인과 서버 배포
  • FastAPI-Cache로 구현하는 효율적인 API 캐싱
  • Router Tags 활용
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (725)
      • 스마트팜 (0)
      • 상품 추천 (223)
      • MongoDB (4)
      • 하드웨어 (17)
      • 일기장 (4)
      • 파이썬 (130)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    유니티
    스크립트 실행 순서
    스크립트 실행
    믈레코비타멸균우유
    devlife
    긴유통기한우유
    rtsp
    appdevelopment
    C#
    리스트
    파이썬
    리뷰관리
    상품 리뷰 크롤링
    Python
    cv2
    programming101
    셀레니움
    카페24리뷰
    list
    ipcamera
    unity
    learntocode
    쇼핑몰리뷰
    codingtips
    리뷰이관
    codingcommunity
    라떼우유
    programmerlife
    카페24리뷰이관
    스마트스토어리뷰
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
프로젝트 배포 자동화 가이드 Part 1: 개발 환경 구성
상단으로

티스토리툴바