Развертывание приложения — это важная часть разработки, которая определяет, как ваше приложение будет работать в реальных условиях, в продакшн-среде. В этой статье мы рассмотрим ключевые шаги для развертывания FastAPI-приложения, подготовку проекта к продакшену, использование Docker и Docker Compose для упаковки приложения, настройку серверов для продакшн-использования с Gunicorn и Uvicorn, а также настройку CI/CD для автоматизации развертывания. В конце статьи мы реализуем практический пример, развернув приложение с использованием Docker на сервере.

Подготовка проекта к продакшену

Перед тем как развернуть ваше FastAPI-приложение в продакшн-среду, нужно удостовериться, что оно готово к работе под нагрузкой и в реальных условиях. Некоторые важные моменты:

Установка зависимостей

Убедитесь, что все зависимости для вашего проекта указаны в файле requirements.txt или pyproject.toml (для Poetry). Это важно для того, чтобы на сервере можно было быстро установить все необходимые библиотеки.

fastapi
uvicorn
gunicorn
pydantic
sqlalchemy

Настройка переменных окружения

Для работы приложения в продакшн-режиме рекомендуется использовать переменные окружения для конфигурации, а не жестко прописывать настройки в коде. Например, настройки базы данных, секреты и ключи API должны быть вынесены в переменные окружения.

from pydantic import BaseSettings

class Settings(BaseSettings):
    database_url: str
    secret_key: str

    class Config:
        env_file = ".env"

settings = Settings()

Логирование

Не забывайте о логировании — важный аспект для мониторинга приложения в продакшн-среде. FastAPI и Python предлагают простые способы для настройки логирования:

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@app.get("/")
def read_root():
    logger.info("Root endpoint accessed")
    return {"message": "Hello World"}

Развертывание с Docker и Docker Compose

Что такое Docker?

Docker — это инструмент для контейнеризации, который позволяет упаковать приложение с его зависимостями в изолированный контейнер. Контейнеры гарантируют, что ваше приложение будет работать одинаково в любой среде, независимо от конфигурации хоста.

Шаг 1: Написание Dockerfile

Первым шагом для контейнеризации вашего приложения будет создание Dockerfile. Это скрипт, который определяет, как будет собираться контейнер для вашего приложения.

# Используем официальный образ Python
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt

COPY . /app/
EXPOSE 8000

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

Шаг 2: Написание docker-compose.yml

Если ваше приложение использует дополнительные сервисы, например, базу данных, вы можете использовать Docker Compose для координации всех контейнеров.

version: "3.9"

services:
  app:
    build: .
    ports:
      - "8000:8000"
    depends_on:
      - db
    environment:
      DATABASE_URL: "postgresql://user:password@db/mydatabase"
  
  db:
    image: postgres:13
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"

Шаг 3: Сборка и запуск контейнеров

Соберите и запустите контейнеры с помощью команды:

docker-compose up --build

Настройка Gunicorn и Uvicorn

Gunicorn — это производительный WSGI-сервер для Python-приложений. Для ASGI-приложений, таких как FastAPI, он используется совместно с Uvicorn.

gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

Настройка конфигурации в Dockerfile:

CMD ["gunicorn", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "main:app"]

CI/CD для FastAPI-приложений

Для автоматизации процессов сборки, тестирования и развертывания можно настроить CI/CD с помощью таких инструментов, как GitHub Actions.

name: FastAPI CI/CD

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: '3.9'
    - name: Install dependencies
      run: |
        pip install -r requirements.txt
    - name: Run tests
      run: |
        pytest
    - name: Build Docker image
      run: |
        docker build -t fastapi-app .
    - name: Push Docker image
      run: |
        docker push fastapi-app

Заключение

В этой статье мы рассмотрели ключевые этапы развертывания FastAPI-приложений. Настройка Docker, Gunicorn, и CI/CD обеспечит стабильную работу приложения в продакшн-среде. Теперь вы готовы развернуть ваше приложение и автоматизировать этот процесс!