Перейти к содержанию

Миграция инфры CPX62 → AX41

Завершена 3 мая 2026 — CPX62 удалён в Hetzner Cloud Console.

Переезд всех сервисов с shared CPX62 (16 vCPU, 32 GB RAM, €50.49/мес) на dedicated AX41-NVMe (Ryzen 5 3600 6c/12t, 64 GB DDR4, 2x512 GB NVMe RAID-1, €38.40+€39 setup).

Серверы

CPX62 (старый, удалён 3 мая) AX41-NVMe (текущий)
IP ~~46.62.238.135~~ 65.108.5.40
ДЦ Hetzner Helsinki HEL1 Hetzner Helsinki HEL1-DC6
Hostname lyumiHSE lyumiHSE
WAN iface eth0 enp9s0
Канал shared dedicated 1 Gbit/s
Hetzner аккаунт Cloud (deleted) Robot K0392788226
Статус 🗑️ Deleted ✅ Production

Расписание (фактическое)

  • 28 апр вечер — заказан AX41 (€39 setup, ~1 час провижнинг)
  • 28-29 апр ночь — pilot: миграция wiki MCP + апгрейд e5-large → bge-m3
  • 29 апр утро — миграция WireGuard
  • 29 апр день — OAuth persistence patch + B2 backup phase 1
  • 30 апр — fine-tune bge-m3-hse-v2 на vast.ai + 3-way benchmark, см. [[lyumi/finetune_apr30]]
  • 1 мая — миграция Lyumi-бота и ChromaDB на AX41, deploy v4 (SQL lookup + ACGIH), см. [[lyumi/sprints/2026-05-01-sql-acgih-ax41]]
  • 2 мая — марафон 8 спринтов: Doc Intelligence v2, Reasoning Layer, BiOT/NPA-450 evals, McNemar p<10⁻¹⁴, Voyage rerank deploy, Sprint Truth roadmap. См. [[lyumi/sprints/2026-05-02-biot-eval]] и [[lyumi/sprints/2026-05-02-sprint-truth-roadmap]]
  • 3 мая утроCPX62 удалён (на 2 дня раньше плана)

Итоговый timeline: 5 дней от заказа AX41 до удаления CPX62. Без downtime для юзеров.

Что переехало (всё done)

✅ Wiki MCP (29 апр 03:51)

Pilot завершён успешно. 54 страницы переиндексированы на bge-m3 (с e5-large), ChromaDB пересобран, OAuth flow работает через claude.ai web. DNS wiki.lyumihse.com → 65.108.5.40 (переключено в Cloudflare 29 апр).

Workflow проверен end-to-end: rsync → venv → patch wiki_mcp.py → chroma rebuild → Caddy + Let's Encrypt → systemd → Cloudflare DNS → OAuth.

✅ WireGuard (29 апр утро)

3 устройства Камала (iphone/ipad/mac) переехали на 65.108.5.40:51820. Server public key и preshared keys сохранены — на клиентах поменян только Endpoint.

✅ OAuth persistence patch (29 апр)

oauth_provider.py патчен: registered_clients и access_tokens снапшотятся в /opt/wiki-mcp/.cache/oauth_state.json через atomic write. Любой systemctl restart wiki-mcp безопасен — claude.ai сессия держится.

✅ B2 backup (29 апр)

Backblaze B2 (EU Central) + rclone + systemd timer. Bucket lyumi-backups, ежедневный backup 03:00 CEST, retention 14 дней, SSE-B2 encryption.

Бэкапим: wiki-mcp data (markdown + ChromaDB + OAuth state), /opt/lyumi/cards, /opt/lyumi/logs, /opt/lyumi/registry_v2.json, ChromaDB volumes через docker run.

✅ Fine-tune bge-m3-hse-v2 (30 апр)

См. [[lyumi/finetune_apr30]] — bge-m3-hse-v2 в HF, chroma_v2 на AX41, 3-way benchmark.

Итог: в прод v2 НЕ взят (trade-off: хорош на short structured, проседает на long natural). На проде остался vanilla BAAI/bge-m3 (ре-эмбед 164K чанков сделан 1 мая). v3 через LoRA через 1-2 месяца.

✅ Lyumi-бот (1 мая)

SSH key setup, ufw + Docker + dependencies на AX41. ChromaDB перевезён через chroma_v2.tar.gz с vast.ai (лежал с 30 апр). retriever.py патчен под manual-embed (single-model, vanilla bge-m3). Smoke test 20 типовых запросов ✅. Детали: [[lyumi/sprints/2026-05-01-sql-acgih-ax41]].

✅ Pushkin (ранее, 27 апр)

Отдельный image lyumi-pushkin (200MB), independent service.

✅ Voyage rerank (2 мая)

Заменил Cohere (Trial 429 hell + удалён аккаунт) и self-hosted Infinity bge-reranker-v2-m3 (CPU 60s timeouts). Voyage rerank-2.5 (full) на Tier 1 paid, ~2s × 4 parallel, $3-5/мес. Smoke 13.97s vs 204s до миграции. Single-path retriever без локальных контейнеров.

Финальное удаление CPX62 (3 мая утро)

Причина: AX41 работает stable 4 дня, все сервисы мигрированы, DNS переключен, B2 backup работает. Держать CPX62 дальше — пустые €50.49/мес.

Проверки перед удалением: - dig wiki.lyumihse.com +short → 65.108.5.40 (не 46.62.238.135) ✅ - du -sh /opt/wiki-mcp/ на AX41 = 9.6 GB > CPX62 7.8 GB (данные свежее) ✅ - docker ps -a на CPX62 — контейнеры Exited 45h ✅ - Caddy на CPX62 работал вхолостую — DNS давно не указывал на CPX62 ✅

Очистка перед Hetzner Delete (manual sanity):

systemctl stop wiki-mcp caddy
docker stop $(docker ps -aq); docker system prune -a --volumes -f
rm -rf /opt/lyumi/ /opt/wiki-mcp/ /opt/lyumi-pushkin/ /opt/lyumi-digest/
rm -rf /etc/caddy/ /var/lib/caddy/
journalctl --vacuum-time=1s; rm -rf /var/log/*.log /var/log/journal/*
> ~/.bash_history && history -c

Удаление: Hetzner Cloud Console → CPX62 server → Delete (подтверждение именем). Сервер удалён. Hetzner zero-outит block storage автоматически.

Экономия: €50.49/мес × 12 = €605/год. На AX41 (€38.40/мес + €39 setup) net разница €10/мес × 12 = €120/год, плюс dedicated CPU и NVMe RAID-1.

Уроки миграции (итогово после 5 дней)

  1. OAuth: только claude.ai web, не Claude Desktop. Desktop шлёт битый redirect_uri. Известные баги: GitHub issues #11814, #24870, #29507, #36215.

  2. OAuth tokens в RAM = теряются при restart — patch решил 29 апр (atomic snapshot в oauth_state.json).

  3. ChromaDB permissions после rebuild от root — SQLite файлы становятся root-owned, unprivileged service падает. Фикс: chown -R wiki-mcp:wiki-mcp ... после каждого rebuild.

  4. Caddy vs nginx по 80 — до Caddy остановить любой другой web server (acme challenge не пройдёт иначе).

  5. apt install --reinstall caddy затирает Caddyfile — держать /etc/caddy/Caddyfile.bak всегда.

  6. rsync исключает .cache, logs, venv — на новом сервере папки создать вручную + chown.

  7. B2 backup: tar warnings не fatal. SQLite WAL выдаёт exit 1 (warning). Решение: set -uo pipefail без -e, ручная проверка exit code (> 1 = fatal, == 1 = OK).

  8. vast.ai disk overlay = 16 GB hard limit. При fine-tune day приёмы: streaming tar через ssh, rm tar.gz сразу после tar -xzf, TMPDIR=/dev/shm pip install когда / забит.

  9. vast.ai destroy обнуляет всё — SSH ключ добавлять заново на new instance, или хранить backup'ы на AX41 стороне.

  10. Не держать warm fallback дольше 4 дней. Изначальный план был 5 мая, реально достаточно 4 дней. Двойные сервера с одинаковым hostname запутывают — разноцветный bash prompt помогал, но лучше закрывать быстро.

Откат (obsolete — CPX62 удалён)

~~До 5 мая CPX62 держим как warm fallback...~~

Сейчас fallback исключительно через B2 backup: восстановление на новом сервере из b2://lyumi-backups/ax41/<date>/. RTO — ~2-3 часа (провижнинг нового сервера + restore data + DNS swap).

Если AX41 ляжет и Hetzner Robot не восстановит в SLA — заказывать новый AX41 или EX в Robot, restore из B2.

Why была миграция

Камал поймал на сравнении моделей суть: e5-large не «лучшая в мире», но лучший выбор «для текущей точки» с учётом стоимости миграции. Тогда же решили: одни большие выходные с коммитом на foundation — dedicated server + offsite backup + fine-tune + caching. Это закрывает 5 из 5 критичных infra-задач + даёт +10-15% retrieval quality + −50% LLM costs.

Pilot run 28-29 апр выбран не случайно: получили отработанный workflow rsync → venv → patch → rebuild → готовая копия и список граблей перед основной миграцией. Wiki MCP мал (54 страницы) и без трафика — идеальный полигон для Lyumi.

Что дальше в Lyumi на AX41

Миграция инфры закрыта. Следующие milestones (все на AX41):

  • Sprint Truth — architectural trust enforcement, [[lyumi/sprints/2026-05-02-sprint-truth-roadmap]] (Tier 1: refuse mode + Citations API + numerical verification + eval cleanup)
  • Sprint Direct — миграция на direct Anthropic+Perplexity (prereq для Citations API)
  • LoRA bge-m3 v3 — через 1-2 месяца на mixed dataset (без trade-off short vs long)
  • Coverage audit — ТК РК + электробезопасность (две слабые категории по BiOT eval)
  • Казахские оригиналы НПА — task #15 pending

Связанные wiki-страницы

  • [[lyumi/finetune_apr30]] — fine-tune bge-m3-hse-v2 day
  • [[lyumi/sprints/2026-05-01-sql-acgih-ax41]] — Sprint 1 мая (SQL lookup, ACGIH, Lyumi-бот на AX41)
  • [[lyumi/sprints/2026-05-02-biot-eval]] — BiOT competency assessment
  • [[lyumi/sprints/2026-05-02-sprint-truth-roadmap]] — Sprint Truth roadmap
  • [[lyumi/v4_structured_retrieval]] — SQL lookup архитектура
  • [[system/wiki_architecture]] — wiki-mcp система