Files
pet-project-server/docs/adr/ADR-2026-05-23-migrate-to-timeweb.md
T
2026-05-24 15:40:28 +03:00

5.5 KiB
Raw Blame History

Переезд сервера с 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 ГБ данных + 17 ГБ системных, влезает с запасом). «Холодный» второй диск под крупные данные — отдельная фаза 2, не на критическом пути.
  • Источник не удаляется сразу после cutover: держим «холодным запасным» пару недель ради отката.

Детальный план — ../drafts/timeweb.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.ymlproduction.yml.