Ответ
Мой стандартный подход к деплою 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)
Процесс сборки, тестирования и развертывания автоматизируется. При каждом пуше в основную ветку запускается пайплайн, который:
- Собирает Docker-образ.
- Прогоняет тесты.
- Пушит образ в Docker Registry (Docker Hub, GitLab Registry).
- Подключается к серверу и обновляет запущенный контейнер.
Пример .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для сбора метрик и визуализации состояния системы.