Конфигурация, окружения и деплой в продакшен
Финальный рубеж — вывести приложение в мир. Это значит: разделить настройки сред, спрятать секреты, заменить сервер разработки на боевой и пройти чеклист безопасности.
Разработка и продакшен — разные миры: разные базы, разный уровень отладки, разные секреты. Конфигурация выносится в классы/переменные окружения, 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-приложение от идеи до продакшена.