Правильный деплой 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 даёт надёжный продакшн-стек с минимальными усилиями по обслуживанию.