프로젝트 배포 자동화 가이드 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 활용
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (730)
      • 스마트팜 (1)
      • 상품 추천 (223)
      • DataBase (0)
        • MongoDB (4)
        • PostgreSQL (0)
      • 하드웨어 (19)
      • 일기장 (4)
      • 파이썬 (131)
        • Basic (42)
        • 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 (5)
      • 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)
  • 인기 글

  • 태그

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

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

티스토리툴바