Среды: 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 отключает оптимизации и кэширование
Связанные темы
- _MOC DevOps
- Переменные окружения -- .env
- Автоматический деплой
- Docker -- для разработки vs для продакшна