Какие инструменты и подходы вы используете для деплоя Python-приложений

«Какие инструменты и подходы вы используете для деплоя Python-приложений» — вопрос из категории Devops, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Мой стандартный подход к деплою Python-приложений основан на контейнеризации с Docker и автоматизации с помощью CI/CD (например, GitHub Actions или GitLab CI).

1. Контейнеризация (Docker)

Каждое приложение упаковывается в Docker-образ для изоляции и переносимости. Это гарантирует, что окружение будет одинаковым на машине разработчика и на продакшн-сервере.

Пример Dockerfile для веб-приложения:

# 1. Используем легковесный базовый образ
FROM python:3.10-slim

# 2. Устанавливаем рабочую директорию внутри контейнера
WORKDIR /app

# 3. Устанавливаем переменные окружения
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# 4. Копируем и устанавливаем зависимости
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 5. Копируем исходный код проекта
COPY . .

# 6. Запускаем приложение через Gunicorn
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "my_project.wsgi:application"]

2. Автоматизация (CI/CD)

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

  1. Собирает Docker-образ.
  2. Прогоняет тесты.
  3. Пушит образ в Docker Registry (Docker Hub, GitLab Registry).
  4. Подключается к серверу и обновляет запущенный контейнер.

Пример .github/workflows/deploy.yml:

name: Deploy to Production

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Build and push Docker image
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: your-repo/my-app:latest

      - name: Deploy on server
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            docker pull your-repo/my-app:latest
            docker-compose up -d --force-recreate

3. Серверная инфраструктура

  • Reverse Proxy: Nginx для обработки входящих запросов, терминирования SSL и раздачи статики.
  • Оркестрация: Docker Compose для простых проектов или Kubernetes для сложных систем, требующих масштабирования и отказоустойчивости.
  • Мониторинг: Prometheus + Grafana для сбора метрик и визуализации состояния системы.