Ответ
Минимальный жизнеспособный набор — это три изолированных окружения, каждое со своей целью и конфигурацией:
-
Development (локальное/Dev)
- Цель: Активная разработка и unit-тестирование.
- Конфигурация: Максимальный уровень логирования, отладочные инструменты (Xdebug, Telescope), могут использоваться «облегченные» или моковые сервисы (например, Mailhog вместо реального SMTP).
- Инструменты: Docker Compose, Laravel Valet/Homestead, XAMPP.
-
Staging/Pre-production
- Цель: Интеграционное тестирование, приемка фич QA-инженерами, проверка деплоя и финальная демонстрация продукта.
- Конфигурация: Максимально приближена к Production (та же версия ОС, СУБД, PHP), но с тестовыми данными. Включены мониторинг и логирование, но отладочный режим отключен.
- Ключевое отличие: Отдельная база данных и внешние сервисы (например, тестовый платежный шлюз).
-
Production
- Цель: Работа для реальных пользователей.
- Конфигурация: Оптимизирована для безопасности и производительности (OPcache, минимизированный уровень логирования, включенный кэш).
Расширенная схема (для mature-проектов):
- Testing/CI: Окружение, которое на каждый пул-реквест или коммит в main разворачивается автоматически в CI/CD (например, в GitLab) для прогона полного набора автотестов.
- Demo: Отдельный стенд с актуальной версией для демонстрации заказчику или менеджменту.
Пример различий в конфиге Laravel (.env):
# .env.local (Development)
APP_ENV=local
APP_DEBUG=true
LOG_LEVEL=debug
DB_DATABASE=myapp_dev
MAIL_MAILER=log
# .env.staging
APP_ENV=staging
APP_DEBUG=false
LOG_LEVEL=info
DB_DATABASE=myapp_staging
MAIL_MAILER=smtp # Но на тестовый адрес
SENTRY_DSN=https://... # Мониторинг ошибок включен
# .env.production
APP_ENV=production
APP_DEBUG=false
LOG_LEVEL=error # Только критические ошибки
DB_DATABASE=myapp_prod
MAIL_MAILER=smtp # Реальный SMTP
SENTRY_DSN=https://...
CACHE_DRIVER=redis # Продакшн-кэш Ответ 18+ 🔞
Давай разберём эту тему без соплей, как есть. Три окружения — это не какая-то там хитрая жопа, а базовый минимум, чтобы не получился пиздец. Если этого нет, то доверия к проекту — ебать ноль.
1. Development (Локальное / Dev) Это твоя песочница, где ты творишь и ломаешь. Цель — кодить и гонять юнит-тесты. Тут можно всё: логи на каждом шагу, Xdebug, чтобы дебажить, и вместо реальной почты — какая-нибудь мартышлюшка вроде Mailhog, которая письма в лог пишет. Инструменты — что душе угодно: Docker, Valet, XAMPP. Главное, чтобы работало у тебя на машине.
2. Staging / Pre-production А вот это уже серьёзно. Цель — собрать всё в кучу, дать тестировщикам потыкать, проверить, как это всё задеплоится, и показать заказчику, что не хуйню сделали. Конфиг должен быть как на проде, один в один: та же ОС, та же версия PHP, базы. Но! Данные — тестовые, платёжки — песочницы. Дебаг отключён, но логи и мониторинг (типа Sentry) уже включены. Ключевое отличие — это отдельная, своя база и свои ключи к внешним сервисам. Если на стейджег сломается продакшн-база — это пизда рулю и тебе конец.
3. Production Ну, тут всё ясно. Цель — чтобы реальные люди пользовались и не орали. Всё заточено под скорость и безопасность: кэши, OPcache, минимум логов, только ошибки. Никаких отладочных инструментов, ёпта.
А если проект большой, то можно и расшириться:
- Testing/CI — это когда на каждый твой коммит система сама разворачивает временный стенд и гоняет на нём все автотесты. Удобно, но требует настройки.
- Demo — отдельный сервер, куда выкатывается последняя стабильная версия, чтобы начальство или клиент могли посмотреть и покивать.
Ну и чтобы было совсем понятно, смотри как .env файлы отличаются:
# .env.local (Development) - тут можно овердохуища логов
APP_ENV=local
APP_DEBUG=true
LOG_LEVEL=debug
DB_DATABASE=myapp_dev
MAIL_MAILER=log # Письма просто в файл, и да похуй
# .env.staging - уже почти продакшн, но для своих
APP_ENV=staging
APP_DEBUG=false
LOG_LEVEL=info
DB_DATABASE=myapp_staging # СВОЯ база, блять!
MAIL_MAILER=smtp # Но шлёт на тестовые ящики
SENTRY_DSN=https://... # Ошибки ловим уже тут
# .env.production - тут уже терпения ноль, только бизнес
APP_ENV=production
APP_DEBUG=false
LOG_LEVEL=error # Только если всё горит
DB_DATABASE=myapp_prod
MAIL_MAILER=smtp # Реальная рассылка
SENTRY_DSN=https://... # Мониторим внимательно
CACHE_DRIVER=redis # По-взрослому
Короче, если этого не разделять, то рано или поздно на проде вылезет какая-нибудь хуйня из-за отладочной настройки, и будет тебе хиросима. Не усложняй, но и не халявь.