VPS Ops
Один сервер, без Docker: nginx + systemd + postgres + redis. Конфиги пишутся локально, применяются на Linux-сервере. Цель — конфигурация, которая переживает рестарт и ребут, не теряет данные, не светит секреты, и о поломке которой ты узнаёшь раньше пользователей.
Шаг 0. Выбери режим
| Режим | Когда | Куда дальше |
|---|---|---|
| deploy | сервис едет на сервер; или «проверь мой деплой» | разделы «Контекст» → «Риски» → справочники конфигов |
| observe | «как я узнаю, что прод упал»; наблюдаемости нет или она дырявая | references/observability.md |
| triage | прод уже сломан, нужна причина | references/triage.md — сначала улики, потом рестарт |
Режим не всегда назван прямо. «Сервис падает после рестарта» — это deploy (конфиг), а не triage. «Сервис упал час назад, что случилось» — triage. Если инцидент уже потушен и вопрос «как не проспать следующий» — observe.
При инциденте не начинай с чтения конфигов: открой triage и собери улики, пока состояние процесса живо.
Контекст — установить ПЕРВЫМ делом (для любого режима)
- Тип приложения — Django (gunicorn/WSGI или uvicorn/ASGI), FastAPI (uvicorn), aiogram-бот (polling-воркер, без HTTP). Определяет unit, нужен ли nginx и есть ли вообще healthcheck-эндпоинт.
- Привязка процесса — unix-socket (предпочтительно за nginx) или TCP-порт.
- Внешние зависимости — postgres и/или redis; нужны ли в
After=юнита. - Домен и TLS — есть ли домен под certbot; HTTP-only в проде недопустим.
- Сервисный пользователь — НЕ root, отдельный системный пользователь.
- Что уже есть — не дублируй:
grepпо проекту (sentry_sdk,LOGGING,/health),systemctl cat,/etc/nginx/, cron/таймеры.
Режим deploy
- Собери факты: unit-файлы (
/etc/systemd/system/*.service),systemctl status, server-блоки nginx, конфиги postgres/redis, бэкапы,ufw status, под кем запускается процесс, где лежат секреты. - Прогони чеклист ниже и справочники конфигов.
- Классифицируй риск и объясни, что именно отвалится на его сетапе.
- Выдай рабочий конфиг или правку; для аудита — отчёт по references/output-format.md.
Чеклист (детали — в справочниках)
- Сервис под не-root пользователем,
Restart=always,enable-нут (поднимется после ребута)? TimeoutStopSecхватает на graceful shutdown (gunicorn/uvicorn/бот закрывают пулы и сессии)?- Секреты в
EnvironmentFile(права600, владелец — сервис), а НЕ в репо и не в строке unit? - HTTP за nginx: TLS с автопродлением, редирект 80→443, security-заголовки, gzip?
- nginx проксирует на unix-socket, статика и медиа отдаются nginx, а не приложением?
- postgres: отдельные пользователь и БД,
pg_hbaбезtrust, проверенный бэкапpg_dumpпо расписанию? - redis:
bind 127.0.0.1,maxmemory+ policy (если cache), persistence (если broker/FSM)? - Firewall: открыты только 22/80/443; БД и redis не смотрят наружу?
- Число воркеров согласовано с CPU и с
max_connectionspostgres? - Миграции при деплое применяются безопасно (→
migration-safety-auditor)?
Уровни риска (общие для deploy и observe)
- CRITICAL — потеря данных или сервис уязвим: нет бэкапов postgres (или они
ни разу не восстанавливались), сервис/postgres/redis слушает
0.0.0.0без firewall, секреты в репозитории, приложение под root, нет TLS, ошибок не видно вообще (ни Sentry, ни доступных логов). - HIGH — сервис падает и не встаёт, или падение заметят пользователи: нет
Restart=always, неenable-нут, redis безmaxmemoryкак cache (OOM), куцыйTimeoutStopSecрвёт graceful shutdown,max_connectionsне согласован с воркерами, нет liveness-проверки. - MEDIUM — нет security-заголовков и
server_tokens off, бэкап безlock_timeoutи не в off-peak, redis без persistence там, где он broker/FSM, нет лимитов ресурсов юнита, дефолтные таймауты nginx, нет ротации логов и алертов на ресурсы, нет fail2ban/rate-limit на SSH. - LOW — именование юнитов, стиль, мелкие улучшения логирования.
После инцидента
- Короткий постмортем: симптом → причина → фикс → как не допустить (в docs проекта или Obsidian).
- Пользователи заметили раньше тебя → режим observe: какой слой поймал бы.
- Причина в конфиге (нет
Restart=, лимитов, ротации) → режим deploy.
Связь с библиотекой навыков
migration-safety-auditor— применение миграций в процессе деплоя.postgres-performance— причина в медленных запросах, а не в падении.aiogram-bot-auditor— систематические проблемы бота после тушения пожара.python-project-audit— готовность самого кода к проду перед деплоем.harness-engineering— зафиксировать процедуру деплоя в Makefile/runbook и DoD.
Справочники
- references/systemd.md — unit-файлы для gunicorn,
uvicorn и polling-бота;
Restart,TimeoutStopSec,EnvironmentFile, не-root, sandboxing, число воркеров. - references/nginx.md — reverse-proxy, TLS (certbot), 80→443, статика и медиа, gzip, таймауты, security-заголовки.
- references/postgres-redis.md — пользователь и
БД,
pg_hba,max_connections, бэкап с проверкой восстановления; redis:bind,maxmemory, RDB/AOF под cache против broker/FSM. - references/security.md — не-root, ufw, секреты, least privilege, SSH-hardening, fail2ban, права на файлы, обновления.
- references/observability.md — режим observe: четыре слоя (Sentry, liveness, логи, ресурсные алерты), генерация и аудит.
- references/triage.md — режим triage: дерево симптомов, быстрая триада команд, чеклист «собрать до рестарта».
- references/output-format.md — формат отчёта аудита.