Вихідна ситуація: є 2 VPS у Hetzner (Ubuntu 22.04) для B2B SaaS (пікове навантаження до 800 одночасних користувачів, ~120 req/s). Зараз все крутиться на одному сервері: Nginx, PHP-FPM, PostgreSQL 14, Redis, cron, надсилання пошти. При списах з'являються 502/504, періодично забивається диск, бекапи робляться нерегулярно, оновлення ставляться руками. Другий VPS порожній, хочемо використовувати його для відмовостійкості та безпечних бекапів. Технічне середовище та обмеження: - Доступ: SSH root на обидва сервери, домен і DNS у Cloudflare - Не можна змінювати код програми та схему БД, допускаються лише зміни конфігурації ОС та сервісів - Допустиме вікно деградації/перемикання вночі – до 10 хвилин, повна недоступність – не більше 2 хвилин - Не можна купувати додаткові managed-сервіси, тільки можливості двох VPS та Cloudflare - Потрібно залишити можливість обслуговувати систему без Docker/Kubernetes (дозволено використовувати systemd та стандартні пакети) Що потрібно зробити за етапами: 1) Діагностика проблем продуктивності та надійності на поточному сервері - аналіз логів Nginx/PHP-FPM/PostgreSQL, навантажувальні вузькі місця, дискова підсистема, ліміти systemd, мережа, таймаути, налаштування keepalive, буфери, slow queries 2) Перерозмітка ролей на 2 VPS: - VPS-1 - frontend: Nginx, PHP-FPM, Redis (якщо потрібен локально), cron - VPS-2 - база та бекапи: PostgreSQL + реплікація/резервування, зберігання бекапів, мінімальні сервіси 3) Налаштування PostgreSQL з акцентом на стабільність – коректні параметри пам'яті/автовакуум, архівування WAL, контроль зростання, базовий hardening, моніторинг затримок 4) Резервне копіювання та перевірка відновлення – щоденні base backup + WAL (або інший обґрунтований підхід), ротація, шифрування, тестовий restore в окрему БД/каталог, документація процедури відновлення 5) Безпека та експлуатація: - firewall (ufw/nftables) з мінімально необхідними портами, обмеження доступу до PostgreSQL - SSH hardening (ключі, відключення паролів, fail2ban або аналог) - автоматичні оновлення безпеки (unattended-upgrades) з контрольованим перезавантаженням 6) Спостережливість: - метрики та алерти: завантаження CPU/RAM/disk, I/O wait, заповнення диска, кількість 5xx, час відповіді, реплікація/лаг, бекап-джоби - допускається Prometheus node_exporter + simple alerting (наприклад, через Alertmanager/telegram) або інший стек, але без важких платформ 7) План перемикання під час аварії - покрокова інструкція, як переключити додаток на резервний сервер/резервну БД у межах обмежень за часом Конкретний результат: - Два сервери з розділеними ролями, документованою схемою, з налаштованими бекапами та перевіреним відновленням - Конфіги Nginx/PHP-FPM/PostgreSQL та systemd-юніти приведені в стан, де їх можна відтворити (в ідеалі – через Ansible, але допустимі і акуратні скрипти + README) - Окремий файл з картою портів/доступів та списком внесених змін Вимірювані критерії приймання: - На стороні Nginx частка 5xx за 24 години під типовим навантаженням – не більше 0.1% - P95 часу відповіді за access-логами Nginx - не гірше поточного значення та цільове покращення мінімум на 20% після тюнінгу (фіксуємо базову лінію на початку робіт) - Бекап-ланцюжок проходить щодня, зберігається щонайменше 7 точок відновлення, і виконаний хоча б 1 тестовий restore зі звітом - При штучній недоступності VPS-1 або VPS-2 є робоча процедура перемикання, що укладається в обмеження (до 2 хвилини повної недоступності, до 10 хвилин деградації вночі) - Усі сервіси після перезавантаження серверів автоматично піднімаються без ручних дій Важливо: робота включає аналіз та відповідальність за зміни на проді. Перед внесенням ризикованих змін – погодження плану дій та відкату.