Сколько нужно окружений для проекта?

«Сколько нужно окружений для проекта?» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Минимальный жизнеспособный набор — это три изолированных окружения, каждое со своей целью и конфигурацией:

  1. Development (локальное/Dev)

    • Цель: Активная разработка и unit-тестирование.
    • Конфигурация: Максимальный уровень логирования, отладочные инструменты (Xdebug, Telescope), могут использоваться «облегченные» или моковые сервисы (например, Mailhog вместо реального SMTP).
    • Инструменты: Docker Compose, Laravel Valet/Homestead, XAMPP.
  2. Staging/Pre-production

    • Цель: Интеграционное тестирование, приемка фич QA-инженерами, проверка деплоя и финальная демонстрация продукта.
    • Конфигурация: Максимально приближена к Production (та же версия ОС, СУБД, PHP), но с тестовыми данными. Включены мониторинг и логирование, но отладочный режим отключен.
    • Ключевое отличие: Отдельная база данных и внешние сервисы (например, тестовый платежный шлюз).
  3. 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 # Продакшн-кэш