first commit

This commit is contained in:
Leonid Pershin
2026-08-21 02:42:48 +03:00
commit 167d07a733
46 changed files with 3334 additions and 0 deletions
+94
View File
@@ -0,0 +1,94 @@
# Roadmap
Код не начинать, пока не закрыты **0.0** (квота) и **0** (spike). Без GPU в квоте остальное — театр.
## 0.0 Квота GPU
Аккаунт есть, квота скорее 0.
- [ ] В панели: Облачные серверы → квоты / создание сервера с GPU
- [ ] Тикет в поддержку Selectel: 1× GPU (целевой: RTX 4090 24 GB или что дадут в пуле), проект gpu-rent
- [ ] Сервисный пользователь с правом только на этот проект
Пока квота 0, можно писать каркас CLI с dry-run и моками, но не считать этап 0 закрытым.
## 0. Ручной spike в панели
- [ ] RC-файл, `openstack token issue`
- [ ] Сегмент с GPU, `flavor list` / `image list` (GPU Driver **580**, без Docker)
- [ ] Сеть + SG :22 + FIP + keypair
- [ ] Boot-from-volume, тег `preemptible`, API 2.72, второй диск в том же AZ
- [ ] `nvidia-smi` на хосте; SwarmUI нативно `launch-linux.sh`
- [ ] SwarmUI на 127.0.0.1:7801, туннель на **17801**, UI + один вызов API
- [ ] `flavor list`: какие 4090 / A5000 / A100 есть; disabled vs capacity
- [ ] Скачать тестовую маленькую модель **через Civitai API** на VM (крошечный embedding) + sidecar json; убедиться, что установщик SwarmUI не качает свой SD
- [ ] Время: ACTIVE / SSH / UI / backend Idle / seed; ₽/час
- [ ] EXPIRED → `unshelve` → те же модели
- [ ] Delete VM, диски живы → create from boot volume
- [ ] Snapshot boot после первого Idle → create from snapshot
- [ ] Прототип idle-killer: скрипт на VM с application credential удаляет **этот** сервер
- [ ] JSON «качалка модели в UI» vs пустая очередь (или нет сигнала → только `hold`)
Заметки — `docs/spike-notes.md`, без секретов и личных имён файлов моделей.
## 1. Каркас
- [x] `pyproject.toml`, пакет `gpu_rent`, MIT
- [x] config / state / Typer по [cli.md](cli.md): `doctor` / `dry-run` / `status` / `open` живые; остальные команды есть и честно говорят, что mutating ещё нет
- [x] Windows: `python -m gpu_rent`
- [x] [setup.md](setup.md) — квота, сервисный пользователь, RC, Civitai
## 2. OpenStack-клиент
- [x] Token через openstacksdk (`authorize`), inventory flavors/квота/volume type
- [ ] Сеть find-or-create, SG, FIP, volumes, server, unshelve
- [ ] Preemptible tag 2.72, BDM boot+data, `delete_on_termination=false`
- [x] Flavor fallback по `FLAVOR_PREFERENCE` (ранжирование; create ещё нет)
- [x] `doctor`: Keystone, квота, flavor, диск, Civitai `.red`, манифесты
- [x] Тесты с моками / без облака
## 3. Сессия без туннеля
- [ ] `up` / `stop` / `status` / reconcile
- [ ] `status`: диск used/free, ₽/час, TTL preempt 24 ч, killer/hold
- [ ] Второй `up` не создаёт второй GPU
- [ ] `resize-data` вверх
- [ ] Генерация `~/.gpu-rent/id_ed25519` + keypair при первом `up`
- [ ] `seed-models` на живом диске (идемпотентно, SHA256)
- [ ] `push` / `push-models`: `Models/`, `Wildcards/`, `CustomWorkflows/`
- [ ] `pull-output` и `PULL_OUTPUT` на `stop` / повторный `up`
- [ ] `seed-extensions` + restart контейнера
- [ ] `destroy` только с флагом
## 4. Bootstrap SwarmUI + idle-killer
- [ ] Идемпотентный first-boot, маркер FS
- [ ] Bind-mounts data volume → `/opt/swarmui`, systemd `swarmui`, auth
- [ ] Clone `extensions.yaml` в Extensions / DLNodes до старта UI
- [ ] Autocomplete: danbooru.csv + Settings.fds; на каждом up — GitHub sha
- [ ] Civitai seed по манифесту; без токена — дефолт SwarmUI
- [ ] systemd idle-killer + application credential; льгота 45 мин; hold-файл; качалка в UI = busy; затем 30 мин пустой очереди; не вооружать до конца seed
- [ ] Один snapshot `gpu-rent-boot-ok` после первого backend Idle; следующие create — из snapshot если есть
- [ ] `gpu-rent hold` / `hold --clear` по SSH
- [ ] `ready` по HTTP, затем backend Idle
## 5. Туннель
- [ ] `gpu-rent tunnel` → 17801, Ctrl+C не делает `stop`
- [ ] `gpu-rent open` / `tunnel --open`
- [ ] EXPIRED → unshelve + reconnect, пока туннель жив
- [ ] Сниппет MCP в stdout
## 6. UX
- [ ] Живой список flavors, `--no-spot`, печать фоллбека и цены
- [ ] Оценка ₽, предупреждение про диск 24/7 и про idle-killer
- [ ] `NOTIFY_READY`: Windows toast + звук при backend Idle
- [ ] Пользовательский README поверх `docs/`
## Вне скоупа v1
- `generate` в CLI, S3 как источник моделей
- Автоправка Cursor `mcp.json`
- Несколько GPU, публичный URL, Terraform как основной путь
- Tailscale (туннеля достаточно; к сети с телефона не подключались)