Правильный деплой Flask-приложения — это не только запуск python app.py. В этой статье разберём продакшн-конфигурацию с Docker Compose, Traefik в качестве reverse proxy и автоматическими HTTPS-сертификатами Let's Encrypt.

Почему Traefik?

Traefik — современный reverse proxy, который умеет автоматически обнаруживать контейнеры Docker и выписывать для них SSL-сертификаты через Let's Encrypt. Это избавляет от ручной настройки Nginx и certbot.

Структура проекта

Типичная структура выглядит так:

project/
├── app.py
├── Dockerfile
├── compose.yaml
└── .env

Dockerfile

Используйте официальный образ Python и gunicorn в качестве WSGI-сервера:

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]

compose.yaml

В compose.yaml опишите сервисы app и traefik. Traefik нужен доступ к Docker socket для обнаружения контейнеров.

Важные метки для контейнера приложения:

- traefik.enable=true
- traefik.http.routers.app.rule=Host(`your.domain.com`)
- traefik.http.routers.app.tls.certresolver=le

CI/CD с GitHub Actions

Автоматизируйте деплой через GitHub Actions: при пуше в main ветку workflow по SSH подключается к серверу и выполняет docker compose pull && docker compose up -d.

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

Итог

Связка Flask + Gunicorn + Docker + Traefik даёт надёжный продакшн-стек с минимальными усилиями по обслуживанию.