Миграция инфры 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 дней)
-
OAuth: только claude.ai web, не Claude Desktop. Desktop шлёт битый
redirect_uri. Известные баги: GitHub issues #11814, #24870, #29507, #36215. -
OAuth tokens в RAM = теряются при restart — patch решил 29 апр (atomic snapshot в oauth_state.json).
-
ChromaDB permissions после rebuild от root — SQLite файлы становятся root-owned, unprivileged service падает. Фикс:
chown -R wiki-mcp:wiki-mcp ...после каждого rebuild. -
Caddy vs nginx по 80 — до Caddy остановить любой другой web server (acme challenge не пройдёт иначе).
-
apt install --reinstall caddyзатирает Caddyfile — держать/etc/caddy/Caddyfile.bakвсегда. -
rsync исключает .cache, logs, venv — на новом сервере папки создать вручную + chown.
-
B2 backup: tar warnings не fatal. SQLite WAL выдаёт exit 1 (warning). Решение:
set -uo pipefailбез-e, ручная проверка exit code (> 1 = fatal, == 1 = OK). -
vast.ai disk overlay = 16 GB hard limit. При fine-tune day приёмы: streaming tar через ssh,
rm tar.gz сразу после tar -xzf,TMPDIR=/dev/shm pip installкогда / забит. -
vast.ai destroy обнуляет всё — SSH ключ добавлять заново на new instance, или хранить backup'ы на AX41 стороне.
-
Не держать 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 система