Проект разработан.
Основные сценарии работают.
Тесты проходят.
На локальном компьютере всё выглядит готовым.
Остаётся перенести приложение на VPS, подключить домен и открыть доступ пользователям.
Именно в этот момент особенно легко решить:
Раз локально работает — можно запускать.
Но локальная готовность и production readiness — далеко не одно и то же.
На production появляется целый слой вещей, которых почти не существует в локальной среде:
DNS
HTTPS
Nginx
firewall
production secrets
реальная база данных
backup
email
object storage
background workers
внешние API
кеширование
мониторинг
нагрузка
rollbackМожно получить идеально работающий frontend и при этом запустить продукт, у которого:
не создаются резервные копии;или:
Service Worker продолжает отдавать старую версию;или:
worker вообще не запущен;или:
доступ к приватным файлам открыт напрямую;или:
после первой миграции базы невозможно вернуться на предыдущий release.Поэтому перед запуском мы бы задавали не один вопрос:
Работает ли приложение?
А четыре:
Работает ли оно в production?
Безопасно ли оно работает?
Поймём ли мы, что оно сломалось?
Сможем ли мы его восстановить?
Если хотя бы на последний вопрос нет уверенного ответа, проект ещё рано считать полностью готовым к запуску.
Production начинается не с копирования файлов на сервер
Одна из типичных ошибок — воспринимать deployment как финальную команду:
docker compose up -dили:
npm startСам запуск процесса — только небольшой этап.
Production-система выглядит скорее так:
Пользователь
↓
DNS
↓
HTTPS
↓
Nginx / Reverse Proxy
↓
Application
↓
┌──────────┬──────────┬───────────┐
│ │ │ │
PostgreSQL Redis Storage Worker
│ │
Backup Background jobsЕсли хотя бы один критичный элемент этой цепочки не проверен, пользовательский интерфейс может открываться, но продукт уже находится в неопределённом состоянии.
Перед запуском полезно зафиксировать release candidate
Не стоит одновременно:
деплоить production;
доделывать последнюю функцию;
менять зависимости;
править дизайн;
изменять миграцию.Сначала полезно определить конкретную сборку:
Release:
3.4.0
Commit:
a8f2...
Build:
2026-09-28И именно её проверять.
Иначе QA тестирует одну версию, а через час в production оказывается уже немного другая.
У релиза должен существовать однозначный ответ на вопрос:
Какой именно код сейчас запущен?
Это кажется мелочью до первого инцидента.
Когда возникает проблема, информация:
production version = ?становится одной из самых важных.
Первый слой — DNS
До запуска приложение обычно доступно через:
localhostили временный IP.
Но пользователь приходит по:
example.ruИ первым техническим компонентом на его пути становится DNS.
Нужно проверить не только наличие A-записи.
Например, могут существовать:
example.ru
www.example.ru
api.example.ruи каждый адрес должен иметь понятное назначение.
Особенно опасны старые DNS-записи
Компания могла раньше использовать другой VPS.
В DNS остались:
старый A;
старый AAAA;
старый CNAME.Часть пользователей попадает на новый сервер.
Часть — на старый.
Разработчик проверяет:
example.ruи видит правильный IP.
Но через IPv6 пользователь получает совершенно другую машину.
Поэтому перед запуском нужно проверить весь relevant DNS zone, а не только одну запись.
Нужно заранее решить судьбу www
Например:
example.ruявляется основным адресом.
Тогда:
www.example.ruможет делать постоянный redirect:
www.example.ru
↓
example.ruИли наоборот.
Главное — иметь один canonical вариант.
Иначе поисковые системы и пользователи могут видеть сайт сразу по нескольким URL.
DNS и почта тоже связаны
Если домен одновременно используется для сайта и корпоративной почты, изменение зоны требует осторожности.
Нельзя удалить:
MX;
SPF;
DKIM;
DMARCтолько потому, что:
Сейчас меняем DNS для сайта.
Веб-проект заработает.
Корпоративная почта перестанет.
Production checklist должен смотреть на домен как на общую инфраструктуру, а не исключительно на адрес приложения.
Второй слой — HTTPS
После DNS нужно проверить сертификат.
Не просто:
Замочек появился.
А:
сертификат выдан правильному hostname;цепочка корректна;сертификат не истекает прямо сейчас;HTTP переводится на HTTPS;renewal автоматизирован.Если сертификат установлен вручную и никто не следит за его продлением, текущая проверка:
HTTPS ✓мало что означает.
Через несколько месяцев сервис может внезапно начать показывать предупреждение безопасности.
Автоматическое продление нужно проверять до окончания сертификата
Плохое время для проверки:
А работает ли renew?
— день истечения сертификата.
Если используется автоматизация, она должна быть частью эксплуатационного контура.
И желательно отдельно контролировать дату окончания сертификата мониторингом.
HTTP должен иметь предсказуемое поведение
Пользователь вводит:
http://example.ruи должен оказаться на:
https://example.ruа не получить:
connection refusedили отдельную незащищённую версию приложения.
Особенно важно проверить:
cookies;
redirect URI;
OAuth callback;
WebSocket;
API URL.Все они могут зависеть от итогового production-origin.
Третий слой — сам VPS
Перед размещением приложения нужно проверить сервер как инфраструктурный ресурс.
Например:
CPU
RAM
disk
filesystem
network
OS
timeПроект может успешно собраться на машине разработчика с 32 ГБ RAM и упасть на VPS с 1 ГБ сразу после запуска нескольких контейнеров.
Особенно важен свободный диск
На одном VPS обычно находятся не только файлы приложения.
Диск постепенно используют:
PostgreSQL;
Docker;
логи;
backup;
releases;
temporary files;
uploads.Если перед запуском свободно:
1,5 ГБа первая резервная копия требует:
2 ГБ,проект уже запускается с будущим инцидентом.
Поэтому мы бы проверяли не:
Есть ли немного свободного места?
А:
Достаточно ли его для нормальной эксплуатации, следующего deployment и резервного копирования?
Production должен иметь запас
Если файловая система заполнена на:
99%приложение может пока открываться.
Но это не здоровое состояние.
PostgreSQL, логам и временным файлам тоже нужно пространство.
Полезно заранее определить safety reserve, ниже которого система начинает предупреждать администратора или ограничивать операции, способные быстро заполнить диск.
Время сервера тоже имеет значение
Неправильное системное время способно влиять на:
сессии;
JWT;
TLS;
отложенные задачи;
логи;
платежи;
уведомления.Поэтому clock synchronization — ещё одна маленькая проверка, последствия которой могут быть совсем не маленькими.
Четвёртый слой — сеть и firewall
Открывать наружу нужно только то, что действительно должно быть доступно.
Обычно пользователю требуются:
80
443и, в ограниченной форме, администратору:
SSHНо PostgreSQL не обязан быть доступен всему интернету.
То же относится к:
Redis;
внутреннему Object Storage;
служебным портам приложения.Например, если Node.js работает на:
4173
4174это ещё не означает, что оба порта должны быть публичными.
Нормальная схема:
Internet
↓
80 / 443
↓
Nginx
↓
internal application portsПятый слой — production-конфигурация
Здесь встречается огромное количество ошибок.
Например локально:
NODE_ENV=developmentслучайно попал в production.
Или:
API_BASE_URL=http://localhost:4173Или CORS по-прежнему разрешает тестовый origin.
Или application secret совпадает с development.
Production secrets не должны быть частью frontend
Если значение оказывается в JavaScript bundle браузера, оно больше не является секретом.
Там нельзя хранить:
database password;
private API key;
encryption master key;
SMTP password;
admin secret.Frontend по определению находится у пользователя.
Настоящие secrets должны оставаться на серверной стороне.
Перед запуском полезно проверить каждый обязательный env
Не просто:
.env существует.А:
Все ли переменные действительно production?
Например:
DATABASE_URL
APP_BASE_URL
SMTP_HOST
SMTP_USER
SMTP_PASSWORD
STORAGE_ENDPOINT
STORAGE_KEY
ENCRYPTION_KEYДля критичных переменных полезен fail-fast.
Если:
ENCRYPTION_KEYотсутствует, приложение лучше вообще не запускать, чем тихо перейти в небезопасный fallback.
Production не должен автоматически использовать development fallback
Опасная конструкция:
const secret =
process.env.SECRET ||
'development-secret';На компьютере разработчика она удобна.
В production одна опечатка превращает:
SECRET отсутствуетв:
вся система работает
с публично известным fallback.Лучше разделять режимы явно.
Шестой слой — PostgreSQL и миграции
До первого production deployment база может быть пустой.
Но уже через месяц она станет одним из самых ценных компонентов всего продукта.
Поэтому первое правило:
production migration — не просто ещё одна команда запуска.
Сначала нужно проверить, какая схема ожидается
Например приложение версии:
3.4.0ожидает migration:
20260928_add_payment_eventsЕсли backend обновился, а migration нет, приложение может начать падать только на определённом endpoint.
То есть главная страница будет работать.
Часть системы — нет.
Перед опасной миграцией нужен backup
Особенно если migration:
удаляет колонку;
меняет тип;
массово переписывает данные;
создаёт новую структуру.Предрелизный вопрос:
Что мы будем делать, если migration прервётся на середине?
должен иметь ответ до запуска.
Хорошая migration должна быть повторяемой или иметь понятное состояние
Плохо, если после ошибки разработчик не знает:
она не началась?
выполнилась наполовину?
выполнилась полностью,
но runner этого не записал?Migration lifecycle должен быть наблюдаемым.
Нельзя забывать индексы
Небольшая локальная база:
100 записейработает быстро даже с плохим запросом.
Production:
2 000 000 записейуже нет.
Например:
SELECT *
FROM messages
WHERE project_id = $1
ORDER BY created_at DESC;без подходящего индекса может со временем стать заметной проблемой.
Поэтому production readiness включает не только правильную схему, но и базовые query patterns.
Connection pool тоже требует проверки
На локальной машине существует:
1 backend process.В production:
API #1
API #2
Worker
SchedulerЕсли каждый открывает десятки соединений, PostgreSQL может получить существенно больше connections, чем ожидалось.
Поэтому:
max connections;
pool size;
количество процессовнужно рассматривать вместе.
Седьмой слой — пользовательские файлы
Если продукт хранит:
PDF;
изображения;
архивы;
чеки;
договоры,нужно проверить не только upload.
Нужен полный lifecycle:
upload
↓
metadata
↓
storage
↓
download
↓
permission check
↓
deleteПриватный файл не должен становиться публичным по прямой ссылке
Например клиентский договор находится в Object Storage.
Если его можно открыть:
https://storage.example/contract.pdfбез проверки пользователя, permission layer приложения фактически обходится.
Для приватных объектов разумнее:
User
↓
Backend
↓
Authorization
↓
Temporary signed URLили controlled proxy download.
Нужно проверить реальные ограничения файла
Не только frontend:
Максимум 20 МБ.
Но и:
Nginx;
backend parser;
storage;
quota.Если frontend разрешает 20 МБ, а Nginx:
client_max_body_size 5M;функция работает локально и ломается только после deployment.
Восьмой слой — фоновые процессы
Одна из самых коварных production-ошибок:
API работает, значит приложение работает.
Но продукт может иметь:
worker;
scheduler;
cron;
job queue.Например frontend принимает заявку.
Backend сохраняет её.
А email должен отправить worker.
Если worker не запущен:
заявка создаётся ✓
email ✗Пользователь видит лишь половину проблемы.
Нужно тестировать не наличие процесса, а реальную работу
Не достаточно:
worker container = running.Полезнее создать настоящую тестовую задачу и убедиться:
job создан;
worker взял;
job завершён;
результат появился.Process health и business health — разные вещи.
То же относится к scheduler
Если система должна:
публиковать статьи;
отправлять напоминания;
выполнять cleanup;
проверять интеграциипо расписанию, нужно убедиться, что production scheduler действительно запускается и использует правильную timezone.
Девятый слой — email и уведомления
Фраза:
SMTP подключён.
недостаточна.
Нужно фактически отправить письмо из production.
Проверить:
From;
Reply-To;
ссылки;
production domain;
кодировку;
верстку.Особенно часто в письме остаётся:
http://localhost:3000/reset-password/...потому что application base URL не был переключён.
Восстановление пароля — один из лучших smoke-тестов
Он одновременно проверяет:
frontend;
backend;
database;
token generation;
email;
production URL;
HTTPS.Поэтому перед запуском полезно реально пройти сценарий:
Забыли пароль
↓
Email
↓
Ссылка
↓
Новый пароль
↓
LoginДесятый слой — authentication и permissions
Проверить:
Я могу войти как администратор.
недостаточно.
Нужно проверить несколько ролей.
Например:
Admin
Manager
Client
ViewerОсобенно важны негативные проверки.
Не:
Admin видит проект?
а:
Client A точно не видит Project B?
Самый ценный access test часто состоит из двух пользователей
Создаём:
Organization A
User A
Project Aи:
Organization B
User B
Project BЗатем User A пытается получить:
/api/projects/BМеняет ID вручную.
Проверяет файл.
Поиск.
Экспорт.
WebSocket.
Если хоть один маршрут возвращает чужие данные, production запускать рано.
Скрытая кнопка не является проверкой прав
Frontend может не показывать:
[Удалить проект]обычному пользователю.
Но backend должен самостоятельно запретить:
DELETE /api/projects/1842Пользователь способен отправить HTTP-запрос без интерфейса.
Production checklist должен проверять реальные permissions API.
Одиннадцатый слой — платежи и webhook
Если продукт принимает оплату, перед запуском мало проверить:
открывается checkout.Нужно пройти полный lifecycle:
создание платежа
↓
confirmation
↓
webhook
↓
локальный status
↓
business effectRedirect после оплаты не должен быть единственным подтверждением
Пользователь может:
закрыть браузер;
потерять интернет;
не вернуться на сайт.Но сервер всё равно должен получить authoritative состояние платежа через предусмотренную интеграцию.
Обязательно нужно проверить повторный webhook
Отправляем одно событие дважды.
Ожидаем:
1 payment transition
1 order
1 license
1 начислениеа не два.
Так проверяется реальная идемпотентность.
Двенадцатый слой — внешние интеграции
Например:
1С;
CRM;
Telegram;
AI API;
SMS;
карты.На staging мог использоваться:
test API key.В production уже другой account.
Поэтому интеграцию нужно проверить именно из production environment.
Полезно проверить и failure path
Не только:
API ответил 200.
Но:
Что происходит при 500?
Что происходит при timeout?
Есть retry?
Появляется failed job?
Можно ли безопасно повторить?
Продукт готов к production, когда он умеет переживать не только успех внешней системы.
Тринадцатый слой — кеширование
Особенно важен для:
PWA;
Service Worker;
Nginx static cache;
CDN.Очень неприятный релиз:
сервер уже обновлён;
пользователь продолжает
видеть старый JS.Теперь frontend и backend принадлежат разным версиям продукта.
После deployment нужно проверить приложение как новый пользователь
Не только в браузере разработчика, где:
cache;
localStorage;
service workerсуществуют месяцами.
Полезны:
incognito;
новый browser profile;
другое устройство.А затем — отдельно upgrade старого клиента с предыдущей версии.
Для PWA это особенно важно
Нужно проверить:
новый install;
обновление существующей PWA;
offline fallback;
новый Service Worker;
удаление устаревших cache;
поведение после release.Если новый пользователь работает, а старый остаётся на старой версии, обычный smoke-test это не обнаружит.
Четырнадцатый слой — mobile
Responsive layout, который красиво выглядит на desktop DevTools, ещё не гарантирует нормальную работу на реальном смартфоне.
Проверяются:
маленькая ширина;
touch;
keyboard;
modal windows;
fixed header;
safe areas;
scroll.Особенно:
360 pxили другая минимальная поддерживаемая ширина проекта.
Модальные окна часто ломаются первыми
Например desktop показывает:
заголовок;
форму;
кнопки.На мобильном:
крестик оказался за экраном;
последняя кнопка не прокручивается;
keyboard перекрыл input.До production такие сценарии лучше проверить руками на реальном устройстве или полноценным мобильным E2E.
Пятнадцатый слой — performance
Перед запуском не обязательно добиваться:
100 / 100по каждой метрике.
Но нужно понимать базовое состояние.
Например:
главная страница;
login;
dashboard;
список проектов;
тяжёлая карточка.Если один endpoint уже до запуска отвечает:
4 секундыпод реальной нагрузкой он вряд ли станет быстрее сам.
Необходимо различать frontend и backend performance
Страница может медленно открываться из-за:
3 MB JavaScript bundleили из-за:
SQL query = 2.8 s.Это совершенно разные проблемы.
Production checklist нужен не для получения одной цифры, а для обнаружения очевидных bottleneck до пользователей.
Шестнадцатый слой — SEO публичной части
Если проект имеет индексируемые страницы, перед запуском нужно убедиться, что production случайно не остался в режиме staging.
Очень неприятная строка:
Disallow: /в production robots.txt.
Или:
noindexна всех страницах.
Нужно проверить канонический production URL
Например canonical не должен вести на:
staging.example.ruТак же проверяются:
sitemap;
robots;
title;
description;
canonical;
HTTP status;
redirect.Особенно после изменения домена.
Но не все страницы должны индексироваться
Например:
/login
/admin
/accountне являются SEO-страницами.
Production checklist должен проверять не:
Индексируется ли всё?
А:
Индексируется ли только то, что должно быть публичным?
Семнадцатый слой — мониторинг
Запускать production без мониторинга — значит ждать, пока роль системы наблюдения возьмут на себя пользователи.
Минимально хочется понимать:
сайт доступен?
API ready?
ошибки выросли?
диск заканчивается?
backup свежий?
worker работает?Health-check должен проверять нужный уровень
Endpoint:
/healthкоторый всегда отвечает:
{"ok": true}пока Node.js process жив, имеет ограниченную ценность.
Более полезно различать:
livenessи:
readiness.Приложение может быть живо, но не готово
Например:
Node.js ✓
PostgreSQL ✗
Redis ✓
Storage ✓Значит:
Alive: YES
Ready: NOЭто позволяет reverse proxy и monitoring правильно интерпретировать состояние.
Alert должен действительно куда-то приходить
Фраза:
У нас настроен мониторинг.
может означать красивый dashboard, который никто не открывает.
Monitoring становится operational инструментом только если критическое событие создаёт alert.
Например:
Disk < reserveили:
API unavailableили:
backup older than expectedдолжны попасть человеку, способному отреагировать.
Восемнадцатый слой — логи
До запуска нужно убедиться, что при ошибке возможно ответить хотя бы на вопросы:
Когда произошло?
На каком endpoint?
Какой request?
Какая ошибка?
Какая зависимость отказала?
Без этого первая production-проблема превращается в угадывание.
Но логи тоже способны сломать production
Если:
app.logрастёт без ограничений, через несколько месяцев он способен заполнить диск.
Поэтому проверяется:
rotation;
retention;
максимальный размер.И отдельно — отсутствие:
password;
token;
secret;
полного приватного payload.Девятнадцатый слой — backup
Это одна из самых важных частей всего checklist.
И одновременно та, которую легко проверить формально:
Backup task configured ✓Но этот checkbox почти ничего не гарантирует.
Настоящая проверка backup состоит из двух операций
Первая:
BACKUPВторая:
RESTOREЕсли backup никогда не восстанавливался, мы пока знаем только:
Был создан какой-то файл.
Но не:
Из него можно восстановить рабочую систему.
Что нужно восстанавливать
Зависит от архитектуры.
Например:
PostgreSQL;
user files;
object storage;
critical configuration.При этом secrets и encryption keys требуют отдельной стратегии.
Можно идеально сохранить encrypted database и потерять единственный ключ расшифровки.
Формально backup есть.
Практически данные потеряны.
Backup на том же VPS — не полноценная защита от потери VPS
Он помогает при:
случайном удалении;
неудачной migration;
повреждении конкретных данных.Но если исчезает весь сервер, одновременно исчезает:
production
+
backup.Поэтому серьёзному продукту нужна независимая копия.
Двадцатый слой — rollback
Перед deployment нужно знать:
Если новая версия окажется плохой, как вернуть предыдущую?
Не после инцидента.
До него.
Release лучше считать неизменяемым
Например:
/releases/
20260928-101500/
20260920-193000/
current → 20260928-101500
previous → 20260920-193000Тогда откат application code может быть быстрым и предсказуемым.
Вместо:
Сейчас попробуем вспомнить, какие файлы были до обновления.
Но база усложняет rollback
Если новый release выполнил:
DROP COLUMNстарое приложение может уже не запуститься.
Поэтому хороший deployment checklist должен задавать вопрос:
Совместима ли новая migration с возможным rollback?
Иногда безопаснее использовать постепенные изменения схемы:
add
↓
migrate
↓
switch
↓
remove laterвместо мгновенного destructive migration.
Двадцать первый слой — финальный smoke test
Когда production уже поднят, нужно пройти реальные критичные сценарии через реальный домен.
Например:
Открыть сайт
↓
Создать пользователя
↓
Подтвердить email
↓
Войти
↓
Выполнить основную операцию
↓
Загрузить файл
↓
Получить уведомление
↓
Выйти
↓
Войти сноваДля конкретного продукта набор будет свой.
Smoke-test должен проверять бизнес, а не страницы
Слабый:
GET / = 200Сильнее:
Новый клиент действительно способен пройти основную цепочку от первого входа до результата.
Например для CRM:
Login
↓
Create client
↓
Create deal
↓
Change stage
↓
Add documentДля SaaS:
Register
↓
Create workspace
↓
Invite user
↓
Use core functionДля магазина:
Add to cart
↓
Checkout
↓
Payment
↓
Order confirmedПосле запуска полезен период усиленного наблюдения
Production deployment закончился не в ту секунду, когда команда:
deployвернула success.
Первые реальные пользователи могут открыть сценарии, которых не было в тестах.
Поэтому после запуска особенно полезно следить за:
error rate;
latency;
disk;
jobs;
email;
external integrations.Если показатели остаются нормальными, release можно считать стабилизированным.
Go / No-Go решение должно приниматься по фактам
Иногда за час до запуска обнаруживается:
backup не проверен.Команда говорит:
Но всё остальное ведь готово.
И появляется соблазн запустить.
Правильное решение зависит от риска.
Для тестового лендинга отсутствие backup может быть несущественно.
Для CRM с историей клиентов — уже нет.
Production checklist нужен именно затем, чтобы критичные условия не превращались в:
Наверное, ничего не случится.
Практический production checklist
Перед запуском мы бы прошли хотя бы такой набор:
- Release: зафиксированы версия и сборка; тестируется именно тот артефакт, который пойдёт в production; известен предыдущий release и способ отката.
- DNS: основной домен указывает на правильный сервер; проверены
www, поддомены, A/AAAA/CNAME; почтовые записи не повреждены. - HTTPS: сертификат соответствует домену; HTTP перенаправляется на HTTPS; продление автоматизировано; срок сертификата контролируется.
- VPS: достаточно CPU, RAM и свободного диска; настроена синхронизация времени; production-data не лежат внутри временного release-каталога.
- Network: наружу открыты только необходимые порты; PostgreSQL, Redis и служебные API не опубликованы без необходимости.
- Secrets: используются production credentials; отсутствуют development fallback; секреты не попадают во frontend и репозиторий.
- Database: применены миграции; проверены constraints и ключевые индексы; connection pool соответствует количеству процессов; перед опасными изменениями существует backup.
- Files: upload/download/delete работают; приватные файлы требуют authorization; проверены ограничения размера и quota; Object Storage доступен.
- Workers: background worker и scheduler реально выполняют тестовые jobs, а не просто имеют статус
running. - Email: отправлено реальное production-письмо; работают восстановление пароля и ссылки с правильным доменом.
- Access: протестированы разные роли и негативные сценарии доступа к чужим объектам.
- Payments: проверены success, failure, webhook, повторный webhook и идемпотентность бизнес-эффекта.
- Integrations: production API keys корректны; проверены timeout/error/retry, а не только happy path.
- PWA/cache: новый пользователь получает свежую версию; старый клиент корректно обновляется; Service Worker не удерживает устаревший release.
- Mobile: проверена минимальная поддерживаемая ширина и реальные Android/iOS-сценарии, если они входят в продукт.
- Performance: критичные страницы и API не имеют очевидных bottleneck; зафиксировано базовое состояние latency.
- SEO:
robots.txt, sitemap, canonical, redirects, title/description и HTTP status соответствуют production. - Monitoring: настроены liveness/readiness и реальные alerts на критические проблемы.
- Logs: ошибки можно диагностировать; включена rotation/retention; чувствительные данные не записываются без необходимости.
- Backup: резервная копия действительно создаётся; есть независимое хранение там, где оно требуется; выполнен тестовый restore.
- Recovery: документированы rollback, restore и действия при потере критичной зависимости.
- Smoke test: основной пользовательский путь пройден через настоящий production-домен после deployment.
Если несколько пунктов ещё находятся в состоянии:
«потом настроим»полезно хотя бы осознанно определить их риск.
Но для критичных компонентов:
permissions;
payments;
backup;
secrets;
database;«потом» может оказаться слишком поздно.
Хороший checklist должен зависеть от самого проекта
У лендинга нет:
PostgreSQL;
worker;
payments;
private files.Значит половина проверок не нужна.
У SaaS может быть:
organizations;
billing;
webhooks;
file storage;
background jobs.И checklist становится значительно шире.
Поэтому production readiness — не один универсальный PDF на все проекты.
Это набор общих слоёв плюс проверки конкретной архитектуры.
Что заказчик должен получить после проверки
Результат запуска полезно фиксировать не словами:
Всё вроде работает.
А коротким release report.
Например:
Release:
3.4.0
Production:
https://example.ru
DNS:
PASS
HTTPS:
PASS
Database migrations:
PASS
Critical E2E:
PASS
Backup:
PASS
Restore:
PASS
Monitoring:
PASS
Known issues:
none critical
Rollback:
3.3.2 availableТак запуск становится проверяемым техническим событием.
Особенно полезно фиксировать известные ограничения
Например:
Known limitation:
Safari Push not enabledЭто намного лучше, чем обнаружить через месяц и спорить:
Это баг или мы изначально так запускались?
Production report фиксирует реальное состояние продукта в момент передачи.
Production checklist полезен и через год
Он нужен не только для первого запуска.
Через год происходит:
major update;
смена VPS;
смена домена;
миграция PostgreSQL;
переезд storage.Большая часть тех же проверок снова становится актуальной.
Поэтому хороший checklist постепенно превращается в release procedure.
Чем зрелее продукт, тем меньше запуск зависит от памяти разработчика
В начале процесс может выглядеть:
Михаил помнит, что после deployment нужно вручную перезапустить worker.
Это хрупко.
Зрелая система:
deploy script
↓
migration
↓
API restart
↓
readiness
↓
worker
↓
smoke testsделает правильную последовательность автоматически или хотя бы документирует её.
Automation не отменяет checklist
Она превращает его часть в исполняемые проверки.
Например вместо пункта:
Убедиться, что /api/ready работает.Deployment script самостоятельно проверяет:
GET /api/readyи останавливается при ошибке.
Вместо:
Не забыть применить migration.
Release process проверяет schema version.
Лучший checklist со временем становится не длиннее, а автоматизированнее.
Но некоторые проверки всё равно остаются человеческими
Например:
Удобно ли пользоваться мобильной модалкой?
Или:
Правильно ли сформулировано письмо?
Или:
Визуально корректно ли выглядит критичный пользовательский сценарий?
E2E не заменяет полностью ручной просмотр.
Автоматизация и человеческая проверка дополняют друг друга.
Самая важная проверка — способность восстановиться
Можно идеально выполнить:
DNS ✓
HTTPS ✓
API ✓
UI ✓и всё равно иметь хрупкий production.
Представим:
03:20
VPS потерян.Теперь главный вопрос:
Сколько времени потребуется вернуть сервис?
Если ответ:
Не знаем. Backup вроде есть.
система была не полностью готова к production.
RPO и RTO можно обсуждать даже в небольшом проекте
Не обязательно употреблять сложную терминологию.
Достаточно ответить на два вопроса.
Первый:
Сколько данных мы готовы потерять?
Если backup раз в сутки:
до 24 часов изменений.Второй:
Сколько времени может занимать восстановление?
30 минут?
4 часа?
сутки?Эти ответы помогают выбрать реальную backup-стратегию.
Backup без restore — предположение
Это настолько важная мысль, что её стоит повторить.
Можно год видеть:
Backup completed successfullyи только после аварии обнаружить:
архив повреждён;
ключ потерян;
версия несовместима;
инструкция устарела.Поэтому тест восстановления должен быть частью эксплуатационной культуры, а не аварийным экспериментом.
Когда продукт действительно готов к запуску
Не тогда, когда разработчик говорит:
У меня всё работает.
Не тогда, когда:
npm testзелёный.
И даже не тогда, когда открывается production URL.
Мы бы считали систему готовой, когда можем ответить «да» на более широкий набор вопросов:
Пользователь способен пройти основной сценарий?
Чужие данные защищены?
Production-конфигурация корректна?
Внешние сервисы действительно работают?
Система переживает повтор webhook и сетевой сбой?
Мы увидим серьёзную проблему автоматически?
У нас есть рабочая резервная копия?
Мы проверили восстановление?
Мы знаем, как откатить неудачный release?
Другой технический специалист сможет понять, как устроен production?
Тогда речь идёт уже не просто о работающем коде.
Речь идёт о готовом к эксплуатации веб-продукте.
Вместо вывода
Перед запуском легко сосредоточиться на том, что видит пользователь:
дизайн;
формы;
кнопки;
страницы.Но основная часть production readiness находится глубже.
Пользователь никогда не увидит:
backup;
readiness probe;
rollback;
rotation logs;
database migration;
disk reserve.Именно до того момента, пока одна из этих вещей не окажется настроена неправильно.
Хороший production checklist проверяет сразу несколько слоёв:
Domain
↓
DNS
↓
HTTPS
↓
Infrastructure
↓
Configuration
↓
Database
↓
Application
↓
Workers / Integrations
↓
Security
↓
Monitoring
↓
Backup
↓
RecoveryГлавная идея проста:
готовность к запуску определяется не только способностью продукта работать, но и его способностью контролируемо переживать ошибки.
Если можно:
обнаружить проблему;понять:
почему она произошла;вернуть:
рабочую версию;и при необходимости:
восстановить данные,значит проект подготовлен к реальной эксплуатации намного лучше, чем система, у которой просто открывается главная страница.
Поэтому финальная проверка перед запуском — не бюрократия и не формальный последний этап разработки.
Это момент, когда готовый код превращается в работающий production-продукт.