Среды: development, staging, production

Development, staging и production — три изолированные среды с разной конфигурацией: разработчик работает в dev, тестирует на staging (копия прода), а изменения доходят до production только после проверки.

Зачем нужно

Тестирование прямо на продакшне опасно: ошибка затронет реальных пользователей. Staging — зеркало продакшна для финальной проверки перед релизом. Без отдельных сред разработчики либо боятся вносить изменения, либо пользователи регулярно сталкиваются с багами от незрелых фич.

Где используется

  • Web-приложения: три окружения с разными URL и конфигурациями БД
  • CI/CD пайплайн: автодеплой на staging при merge в develop, на production при merge в main
  • Feature flags: функциональность включена на dev и staging, отключена на production до готовности

Основной контент

Типичные характеристики сред

Параметр Development Staging Production
Запуск Локально Сервер/облако Сервер/облако
URL localhost:3000 staging.myapp.com myapp.com
База данных Локальная / seed-данные Копия продакшн структуры Реальные данные
Логирование Verbose (debug) Info Info / Error
Внешние сервисы Моки / sandbox Sandbox (тест-ключи) Production (боевые ключи)
SSL Нет Да Да
Оплата (Stripe) sk_test_ ключ sk_test_ ключ sk_live_ ключ

Конфигурация через NODE_ENV

// config.js
const config = {
  development: {
    database: 'postgres://localhost/myapp_dev',
    logLevel: 'debug',
    emailProvider: 'console',  // печатать email в консоль
  },
  staging: {
    database: process.env.DATABASE_URL,
    logLevel: 'info',
    emailProvider: 'sendgrid',
    stripe: { key: process.env.STRIPE_TEST_KEY },
  },
  production: {
    database: process.env.DATABASE_URL,
    logLevel: 'warn',
    emailProvider: 'sendgrid',
    stripe: { key: process.env.STRIPE_LIVE_KEY },
  },
};

module.exports = config[process.env.NODE_ENV || 'development'];

.env файлы для каждой среды

.env                  # development (в .gitignore)
.env.staging          # staging значения (в .gitignore)
.env.production       # production (НЕ хранить локально, только в CI)
.env.example          # шаблон без секретов (в Git)
# Запуск для конкретной среды
NODE_ENV=staging node server.js
NODE_ENV=production node server.js

CI/CD пайплайн для нескольких сред

# .github/workflows/deploy.yml
name: Deploy

on:
  push:
    branches:
      - develop     # → staging
      - main        # → production

jobs:
  deploy-staging:
    if: github.ref == 'refs/heads/develop'
    runs-on: ubuntu-latest
    environment: staging          # GitHub Environment с отдельными secrets
    steps:
      - uses: actions/checkout@v4
      - name: Deploy to staging
        run: ./scripts/deploy.sh
        env:
          NODE_ENV: staging
          SERVER: ${{ secrets.STAGING_SERVER }}
          DATABASE_URL: ${{ secrets.STAGING_DATABASE_URL }}

  deploy-production:
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    environment: production       # Requires manual approval в GitHub Settings
    steps:
      - uses: actions/checkout@v4
      - name: Deploy to production
        run: ./scripts/deploy.sh
        env:
          NODE_ENV: production
          SERVER: ${{ secrets.PROD_SERVER }}
          DATABASE_URL: ${{ secrets.PROD_DATABASE_URL }}

Стратегия seed-данных для dev

// scripts/seed-dev.js — только для development!
if (process.env.NODE_ENV !== 'development') {
  console.error('Seed script only for development!');
  process.exit(1);
}

await db.user.createMany({
  data: [
    { email: 'admin@test.com', role: 'admin' },
    { email: 'user@test.com', role: 'user' },
  ],
});

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

  • Staging БД с реальными пользовательскими данными — нарушение GDPR; staging должна содержать анонимизированные или тестовые данные
  • Одинаковые секреты (JWT, Stripe) для staging и production — разные ключи для каждой среды
  • Деплой напрямую в production без staging-проверки — любой баг сразу у пользователей
  • NODE_ENV=development в production — Express отключает оптимизации и кэширование

Связанные темы

Ресурсы