Add ADR after migration to timeweb cloud

This commit is contained in:
2026-05-24 14:50:45 +03:00
parent e45e1db002
commit 2f2c1b0754
2 changed files with 83 additions and 3 deletions
@@ -0,0 +1,79 @@
# Переезд сервера с Yandex Cloud на Timeweb VPS
- Дата: 2026-05-23
## Контекст
`rivendell-v2` жил на VM в Yandex Cloud. Одновременно копились три
проблемы:
- **Цена.** ≈ 2 887 ₽/мес за конфигурацию, которую другие провайдеры
дают дешевле и мощнее.
- **Потолок RAM.** 4 ГБ, ≈ 80 % заняты на штатной нагрузке. Любой
всплеск (миграции БД, индексация Outline, restic) — конкуренция за
память и риск OOM. Расти на этом тарифе дальше — только заметно
дороже.
- **Медленный диск.** Чтобы сдержать цену в YC, использовался дешёвый
HDD вместо SSD/NVMe — страдала отзывчивость (Gitea, Outline, тёплый
старт контейнеров, restic check/forget).
Это личный сервер — допустим мягкий даунтайм.
## Рассмотренные варианты
- **Остаться в YC, поднять тариф** (больше RAM/SSD на месте). Отвергнуто:
YC уже дороже альтернатив, апгрейд поднимает цену непропорционально
приросту — те же три проблемы решаются дороже, чем переездом.
- **Свой / домашний сервер** (железо под контролем, без ежемесячной
аренды). Отвергнуто: дома нет надёжного аптайма 24/7 (питание,
интернет-канал, железо), а сервисы должны быть всегда доступны.
- **Переезд на Timeweb Cloud VPS** — выбранный вариант.
## Решение
Переносим на Timeweb Cloud VPS: ≈ 1 980 ₽/мес, 8 ГБ RAM (×2), 4 ядра
(×2, гарантия CPU 100 % вместо 50 %), 80 ГБ NVMe вместо 120 ГБ HDD.
Один переезд закрывает все три причины сразу.
Рамки решения:
- Переезжает **только compute** (VM с приложениями). S3 (restic, бекапы),
Container Registry, Postbox SMTP и DNS-зона `vakhrushev.me` остаются
в Yandex и используются с новой машины.
- Стратегия — **cold cutover**: погасить сервисы на источнике, раскатать
ansible на новом сервере без запуска приложений (сохраняя uid/gid), перенести
данные `rsync`'ом, запустить, переключить DNS.
- Диск: фаза 1 — один 80 ГБ NVMe (всего 22 ГБ данных, влезает с
запасом). «Холодный» второй диск под крупные данные — отдельная
фаза 2, не на критическом пути.
- Источник не удаляется сразу после cutover: держим «холодным запасным»
пару недель ради отката.
Детальный план — [`../drafts/timeweb.md`](../drafts/timeweb.md),
фактическое выполнение —
[`../drafts/timeweb-migration-log.md`](../drafts/timeweb-migration-log.md).
## Последствия
- `+` 907 ₽/мес (≈ −31 %) при вдвое большем RAM и CPU и NVMe-диске —
закрыты все три исходные проблемы.
- `+` Запас по RAM убирает OOM-риск при всплесках нагрузки.
- `+` Диверсификация по облакам: раньше сервер и данные были в одном
аккаунте Yandex Cloud, теперь compute в Timeweb, а бэкапы (S3) — в
Yandex. Если заблокируют или потеряем доступ к одному провайдеру,
данные остаются доступны через другой.
- `-` Диск меньше (80 ГБ NVMe против 120 ГБ HDD), но сейчас занят
примерно наполовину — запас есть, фаза 2 с холодным диском не срочная.
- `-` Сохраняется зависимость от Yandex Cloud (S3, Container Registry,
Postbox SMTP, DNS) — переезд её не устраняет.
- `-` Timeweb активно блокирует Telegram (в отличие от YC) — интеграция
отвалилась. Затронуты `transcriber`, `remembos` и нотификации о
бэкапах. Ожидаемо; нотификации остались через почту, второй канал
рассматривается через Matrix.
- `-` Из-за тех же блокировок Timeweb перестали обновляться некоторые
RSS-фиды в `miniflux`.
- `-` Для доступа к `cr.yandex` вне YC появился долгоживущий OAuth-токен
Яндекса в vault (`yc_oauth_token`) с широким blast radius. При желании
сузить — IAM-ключ сервисного аккаунта отдельной итерацией.
- Инвентарь временно раздвоен (`production.yml` + `timeweb.yml`); после
стабилизации источник удаляется, `timeweb.yml``production.yml`.