Files
pet-project-server/docs/adr/ADR-2025-12-13-os-upgrade-via-server-rebuild.md
T
2026-05-24 15:40:28 +03:00

3.5 KiB

Обновление ОС пересборкой на свежем сервере

  • Дата: 2025-12-13

Контекст

На сервере стояла Ubuntu 22.04, и к концу 2025 пора было обновляться. Обновлять живую боевую систему in-place (do-release-upgrade) не хотелось — это рискованно и тяжело откатывается, если что-то пойдёт не так на работающем сервере.

Рассмотренные варианты

  • In-place обновление (do-release-upgrade на живой системе). Отвергнуто: риск сломать рабочий сервер, нет простого отката.
  • Пересборка на свежем сервере (выбран). Поднять новый сервер с целевой ОС, накатать ansible, прицепить диск с данными, развернуть приложения — старый сервер остаётся нетронутым как точка отката. Заодно почистить мусор от прошлой рабоыт сервера.

Решение

Обновляем ОС через пересборку на свежем сервере. Метод опирается на три предпосылки:

  • Деплой без запуска контейнеров. Сводные плейбуки (playbook-all-setup, playbook-all-applications) и тег run-app позволяют раскатать пользователей, каталоги и конфиги, но НЕ запускать приложения (--skip-tags run-app) — данные переносятся в «тихую» систему (коммиты 5b53cb3, 48bb8c9, 67df03e).
  • Данные на отдельном диске (ADR-2025-12-07) — диск с данными прицепляется к новому серверу.
  • Фиксированные uid/gid. Заранее закрепили uid/gid всех пользователей приложений (роль owner, коммит c2ea2cd). Это критично: иначе при пересоздании пользователей на новом сервере uid/gid могли бы сдвинуться, и данные приложений на отдельном диске оказались бы с чужим владельцем.

Порядок: сначала вся подготовка (отдельный диск, перенос данных на него, фиксация uid/gid), затем пересборка на новом обновлённом сервере. Перенос прошёл без проблем.

Последствия

  • + Обновление ОС без риска для живой системы; откат = вернуться на старый сервер.
  • + Получился воспроизводимый процесс миграции — позже переиспользован при переезде в Timeweb как «cold cutover» (ADR-2026-05-23).
  • + Фиксация uid/gid стала постоянным инвариантом проекта.
  • - Метод требует заранее подготовленных предпосылок (фикс uid/gid + данные на отдельном диске); без них он не работает.