Конфигурация, окружения и деплой в продакшен

Финальный рубеж — вывести приложение в мир. Это значит: разделить настройки сред, спрятать секреты, заменить сервер разработки на боевой и пройти чеклист безопасности.
Разработка и продакшен — разные миры: разные базы, разный уровень отладки, разные секреты. Конфигурация выносится в классы/переменные окружения, debug выключается, а встроенный сервер заменяется на Gunicorn. Только тогда приложение готово к реальной нагрузке.

Главный принцип — настройки не живут в коде. SECRET_KEY, пароль базы, режим отладки берутся из переменных окружения. Это разделяет код (один на всех) и конфигурацию (своя в каждой среде) и не даёт секретам утечь в git.

# config.py
import os

class Config:
    SECRET_KEY = os.environ["SECRET_KEY"]
    SQLALCHEMY_DATABASE_URI = os.environ["DATABASE_URL"]

class DevConfig(Config):
    DEBUG = True

class ProdConfig(Config):
    DEBUG = False

Фабрика выбирает конфигурацию по среде:

def create_app():
    app = Flask(__name__)
    env = os.environ.get("FLASK_ENV", "production")
    app.config.from_object(DevConfig if env == "development" else ProdConfig)
    db.init_app(app)
    return app

В продакшене встроенный сервер не используют — он однопоточный и небезопасный. Его заменяют на WSGI-сервер Gunicorn, который держит много воркеров:

pip install gunicorn
gunicorn "blog:create_app()" --workers 4 --bind 0.0.0.0:8000

Деплой — это про разведение двух миров и про безопасность. Разработка и продакшен отличаются базой, уровнем отладки и секретами, и держать настройки в коде нельзя: SECRET_KEY и пароли живут в переменных окружения, иначе они утекут в git и в чужие руки. Конфигурацию удобно описывать классами (Config → DevConfig/ProdConfig) и выбирать нужный по среде в фабрике. На бою встроенный сервер заменяют на Gunicorn с несколькими воркерами, обычно за обратным прокси nginx, который берёт на себя TLS, отдачу статики и балансировку. Перед запуском пройди чеклист: DEBUG выключен, SECRET_KEY надёжный и из окружения, база — PostgreSQL, соединение по HTTPS, миграции применены, логирование включено.

Как работает под капотом

Gunicorn — это менеджер процессов-воркеров. Он держит N копий твоего приложения и распределяет входящие запросы между ними, обеспечивая параллельную обработку. Перед ним обычно ставят nginx как обратный прокси (статика, TLS, балансировка).

  Интернет
     │
     ▼
  nginx (TLS, статика, прокси)
     │
     ▼
  Gunicorn (master)
     ├─ worker 1 ─┐
     ├─ worker 2 ─┤ копии create_app()
     ├─ worker 3 ─┤ обрабатывают запросы
     └─ worker 4 ─┘ параллельно

Смоделируем выбор конфигурации по окружению обычным Python.

import os

CONFIGS = {
    "development": {"DEBUG": True, "DB": "sqlite:///dev.db"},
    "production": {"DEBUG": False, "DB": "postgresql://prod"},
}

def load_config(env_value):
    cfg = dict(CONFIGS.get(env_value, CONFIGS["production"]))
    # секрет — из окружения, с дефолтом только для демонстрации
    cfg["SECRET_KEY"] = os.environ.get("SECRET_KEY", "dev-only")
    return cfg

print("dev :", load_config("development"))
print("prod:", load_config("production"))
print("неизвестно → безопасный дефолт prod:", load_config("???")["DEBUG"])

Запусти: одно приложение, разные настройки по среде, а при неизвестном окружении — безопасный продакшен-дефолт (DEBUG выключен). Так фабрика разводит миры разработки и прода.

Частые ошибки

  • Секреты в коде/git. SECRET_KEY и пароли — только из окружения, никогда в репозитории.
  • debug=True в проде. Это критическая уязвимость; всегда DEBUG=False на бою.
  • Встроенный сервер в продакшене. flask run не держит нагрузку; нужен Gunicorn/uWSGI за nginx.

Best practices

  • Конфигурация — классами, секреты — из переменных окружения.
  • Продакшен: DEBUG=False, надёжный SECRET_KEY, PostgreSQL, HTTPS.
  • Подача через Gunicorn за nginx; миграции — Flask-Migrate; логирование включено.

Что запомнить

  • Настройки разводят по средам классами и переменными окружения.
  • Секреты (SECRET_KEY, пароли) — только из окружения, не из кода.
  • В продакшене DEBUG=False; встроенный сервер заменяют на Gunicorn за nginx.
  • Чеклист: HTTPS, PostgreSQL, миграции, логирование, надёжный SECRET_KEY.

Итог: конфигурация разводит среды классами и переменными окружения, секреты прячутся вне кода, debug выключается, а Gunicorn за nginx обслуживает реальную нагрузку. Это завершающий шаг — теперь ты можешь провести Flask-приложение от идеи до продакшена.

Проверьте себя
1. Откуда правильно брать SECRET_KEY и пароль базы в продакшене?
AХардкодить в config.py
BИз переменных окружения, не из репозитория
CИз шаблона Jinja2
DИз куки пользователя
2. Чем заменяют встроенный сервер Flask в продакшене?
AНичем, flask run подходит
BWSGI-сервером вроде Gunicorn (часто за nginx)
CJinja2
DSQLite