# Обновление ОС пересборкой на свежем сервере - Дата: 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](ADR-2025-12-07-app-data-on-separate-disk.md)) — диск с данными прицепляется к новому серверу. - **Фиксированные uid/gid.** Заранее закрепили uid/gid всех пользователей приложений (роль `owner`, коммит `c2ea2cd`). Это критично: иначе при пересоздании пользователей на новом сервере uid/gid могли бы сдвинуться, и данные приложений на отдельном диске оказались бы с чужим владельцем. Порядок: сначала вся подготовка (отдельный диск, перенос данных на него, фиксация uid/gid), затем пересборка на новом обновлённом сервере. Перенос прошёл без проблем. ## Последствия - `+` Обновление ОС без риска для живой системы; откат = вернуться на старый сервер. - `+` Получился воспроизводимый процесс миграции — позже переиспользован при переезде в Timeweb как «cold cutover» ([ADR-2026-05-23](ADR-2026-05-23-migrate-to-timeweb.md)). - `+` Фиксация uid/gid стала постоянным инвариантом проекта. - `-` Метод требует заранее подготовленных предпосылок (фикс uid/gid + данные на отдельном диске); без них он не работает.