From 2f2c1b075447822b09961644b0e19aad284c6696 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Sun, 24 May 2026 14:50:45 +0300 Subject: [PATCH] Add ADR after migration to timeweb cloud --- docs/adr/ADR-2026-05-23-migrate-to-timeweb.md | 79 +++++++++++++++++++ docs/adr/README.md | 7 +- 2 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 docs/adr/ADR-2026-05-23-migrate-to-timeweb.md diff --git a/docs/adr/ADR-2026-05-23-migrate-to-timeweb.md b/docs/adr/ADR-2026-05-23-migrate-to-timeweb.md new file mode 100644 index 0000000..bf9e180 --- /dev/null +++ b/docs/adr/ADR-2026-05-23-migrate-to-timeweb.md @@ -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`. diff --git a/docs/adr/README.md b/docs/adr/README.md index fac4835..5b53874 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -61,6 +61,7 @@ Новые сверху. -| Дата | Запись | Статус | -| ---------- | ------------------------------------------------------------------------------- | ------ | -| 0000-00-00 | [Вести историю решений в виде ADR](ADR-0000-00-00-record-architecture-decisions.md) | — | +| Дата | Запись | Статус | +| ---------- | ------------------------------------------------------------------------------------- | ------ | +| 2026-05-23 | [Переезд сервера с Yandex Cloud на Timeweb VPS](ADR-2026-05-23-migrate-to-timeweb.md) | — | +| 0000-00-00 | [Вести историю решений в виде ADR](ADR-0000-00-00-record-architecture-decisions.md) | — |