Первый релиз всегда торопят, и самые дорогие ошибки делаются именно тогда: бэкапов ещё нет, тестовый режим платёжки забыли выключить, DEBUG включён, отката нет. Ниже — короткий список, который стоит пройти до открытия сайта. Подробности по каждому разделу — в уроках курса «DevOps для веб-проекта на одном VPS».
Сервер
- [ ] Вход по SSH только по ключу,
PasswordAuthentication no,PermitRootLogin no(илиprohibit-password). - [ ] Ключ разработчика защищён пассфразой и загружается в ssh-agent, а резервная копия ключа хранится в надёжном месте.
- [ ] Файрвол (ufw, nftables): открыты только 22, 80 и 443. Порты БД, Redis и приложения наружу закрыты.
- [ ] Postgres и Redis слушают только localhost, у Redis задан пароль.
- [ ] Включены автоматические обновления безопасности (
unattended-upgrades). - [ ] Настроены часовой пояс и NTP, в журнале и логах правильное время.
- [ ] Есть swap или включён
systemd-oomdс понятной политикой: на маленьком VPS сборка фронта илиpip installбез этого убивают сайт.
Деплой
- [ ] Деплой выполняется одной командой и заливает ровно закоммиченный код.
- [ ] На проде нет
.git,.envне раздаётся (проверено черезcurl). - [ ] Перед заливкой создаётся снапшот, откат выполняется одной командой и проверен.
- [ ] На проде есть
REVISIONс sha, веткой, датой и автором деплоя. - [ ] Перед миграциями делается бэкап БД, при ошибке миграции деплой останавливается.
- [ ] После рестарта скрипт ждёт
/health/и проходит smoke ключевых страниц. - [ ] Есть блокировка
flockот параллельного деплоя. - [ ] CI прогоняет тесты на той же СУБД, что и прод.
Процессы
- [ ] Приложение, воркеры и SSR работают как юниты systemd с
Restart=, а при user-юнитах включён linger. - [ ] Приложение слушает 127.0.0.1 или unix-сокет.
- [ ] Периодические задачи запускаются таймерами с
flock, расписание лежит в репозитории. - [ ] Логи ротируются (journald с лимитом или logrotate), диск не заполнится за месяц.
Бэкапы
- [ ] Ежедневный дамп БД на сервере по таймеру, права 600, проверка дампа, ротация.
- [ ] Офсайт-копия (restic в S3 или на другой сервер), пароль хранится вне сервера.
- [ ] Загрузки пользователей тоже бэкапятся.
- [ ] Секреты лежат в зашифрованной копии, и известно, где именно.
- [ ] Восстановление проверено хотя бы один раз до запуска, а не в день аварии.
nginx и HTTPS
- [ ] TLS-сертификат с автопродлением, проверено через
certbot renew --dry-run. - [ ] Редирект http на https, HSTS включён (сначала с коротким
max-age). - [ ] Заголовки
X-Content-Type-Options,Referrer-Policy,X-Frame-Optionsили CSPframe-ancestors. - [ ]
X-Real-IPиX-Forwarded-Protoперезаписываются, XFF дописывается. - [ ]
/media/иuploadsотдаются сnosniffиCSP sandbox, html/svg — как attachment. - [ ] Приватные файлы закрыты через
^~или отдаются через X-Accel-Redirect. - [ ] Хешированная статика кэшируется на год,
index.htmlотдаётся сno-cache. - [ ] Включено сжатие gzip или brotli.
- [ ]
client_max_body_sizeсоответствует реальным лимитам загрузки.
Приложение
- [ ]
DEBUGвыключен, Swagger и debug-панели закрыты или выключены. - [ ] Встроенная проверка конфигурации проходит без предупреждений (
manage.py check --deploy, аналог для вашего стека), и деплой останавливается при её провале. - [ ] Cookie сессии и CSRF помечены
Secure,HttpOnly,SameSite. - [ ] Платёжная система переведена в боевой режим, вебхук сверяет платёж через API провайдера.
- [ ] Секреты лежат в env или секрет-файле с правами 600, а не в репозитории. Дефолтные и тестовые ключи заменены.
- [ ] Вход, регистрация, сброс пароля и 2FA ограничены rate-limit по доверенному IP.
- [ ] Все объекты скоупятся по владельцу (IDOR), а изменения выполняются только через POST.
- [ ] Загрузки файлов проверяются по содержимому.
- [ ] Письма уходят с настроенными SPF, DKIM и DMARC, иначе они попадут в спам.
- [ ] Есть страницы 404 и 500 без трейсбэков.
Мониторинг
- [ ] Внешний uptime-мониторинг
/health/с уведомлением в мессенджер. - [ ] Сбор ошибок (Sentry или аналог) с тегом релиза из
REVISION, без персональных данных. - [ ] Пинг «мёртвого выключателя» от бэкапа и важных таймеров.
- [ ] Алерт на заполнение диска (больше 80%) и на срок действия сертификата.
Юридическое и организационное
- [ ] Политика обработки персональных данных и согласия в формах.
- [ ] Записано, где лежат доступы: регистратор домена, DNS, хостинг, платёжка, почта, хранилище бэкапов. Доступ не должен держаться на одном человеке.
- [ ] Есть план «что делать, если сайт лежит» (см. статью про откат за минуту).
Пройдите список и честно отметьте невыполненное. Всё, что осталось без галочки, — это известный риск, который вы приняли осознанно, а не сюрприз в день запуска.
