# CLI и конфигурация Имя команды: `gpu-rent`. Лаунчеры: `gpu-rent.bat` / `.\gpu-rent.ps1` / `./gpu-rent.sh` (создают `.venv` и вызывают `python -m gpu_rent`). Без аргументов CLI показывает **help**. Поднять GPU с двойного клика: в `gpu-rent.vars` → `GPU_RENT_DEFAULT_ARGS=up --yes`. --- ## Типичные сценарии ### Первый раз ```text gpu-rent doctor gpu-rent up --yes # … работа … gpu-rent stop ``` Подготовка ключей: [setup.md](setup.md). ### Обычная сессия ```text gpu-rent up --yes # Ctrl+C / Ctrl+D → stop GPU (диски остаются) gpu-rent tunnel --open gpu-rent hold gpu-rent stop ``` ### Только облако (туннель позже) ```text gpu-rent up --yes --no-tunnel gpu-rent tunnel --open ``` ### LLM рядом со SwarmUI ```text gpu-rent setup # или gpu-rent up --yes --ollama ``` Подробности: [llm.md](llm.md). --- ## Команды | Команда | Поведение | | --- | --- | | `gpu-rent setup` | Wizard: манифесты (в т.ч. ollama-models), `LLM_RUNTIME` (нумерованное меню), пресет, опционально local-watchdog | | `gpu-rent doctor` | Preflight **без** create. Exit ≠ 0 → сессию начинать нельзя | | `gpu-rent flavors` | Скан `SCAN_POOLS` по сегментам a/b/c × `FLAVOR_PREFERENCE` × `FLAVOR_SIZE_PRESET`, список в текущем регионе | | `gpu-rent dry-run` | План без mutating-вызовов | | `gpu-rent up` | Без `--yes`: меню LLM (если runtime none) → пресет → **Selectel**: flavor # / data GB / preemptible → confirm → create → туннель. Цветной лог (ошибки/warn/ok) | | `gpu-rent up --yes` | Без вопросов; flavor из `FLAVOR_PREFERENCE` / `DEFAULT_FLAVOR_ID` | | `up --keep-on-fail` | Не гасить GPU при ошибке install (по умолчанию `UP_STOP_ON_FAIL=true` → `stop`) | | `gpu-rent up -v` / `--verbose` | Полная таблица doctor на `up` (по умолчанию кратко) | | `gpu-rent up --ollama` / `--llm ollama` | Ollama рядом со SwarmUI | | `gpu-rent up --no-swarm` / `--llm-only` | Только Ollama (нужен `--ollama` / `LLM_RUNTIME=ollama`); без clone SwarmUI | | `gpu-rent up --no-update` | Без `git pull` SwarmUI/extensions (только недостающие clone) | | `gpu-rent up --no-tunnel` | Только облако | | `gpu-rent up --no-spot` | Не preemptible | | `gpu-rent up --flavor ID --yes` | Явный flavor; без `--flavor` + `--yes` — первый доступный из `FLAVOR_PREFERENCE` | | `gpu-rent tunnel` / `tunnel --open` | Повторный проброс; `--open` сразу браузер. **Ctrl+C / Ctrl+D** вызывают `stop` | | `gpu-rent open` / `open --llm` | Браузер на SwarmUI / LLM-порт (туннель уже должен слушать) | | `gpu-rent status` | State, Nova, диск, killer/hold, LLM, local-watchdog | | `gpu-rent diag` | SwarmUI/Comfy diagnostics с VM (API + journal + paths) | | `gpu-rent debug` | Локальный read-only Debug API (`:17821`) — для агента после `--no-tunnel` / без активного `up` | | `gpu-rent hold` / `--minutes N` / `--until ISO` / `--clear` | Пауза idle-killer (нужны живая VM + SSH) | | `gpu-rent stop` / `stop --no-pull` | Удалить compute (+ FIP), диски оставить; optional pull Output | | `gpu-rent destroy --i-understand-data-loss` | `stop` + диски | | `gpu-rent logs` | journalctl swarmui / cloud-init (полный дамп; после `up` хвост уже печатается сам) | | `gpu-rent ssh` | Оболочка на VM | | `gpu-rent seed-models` | Докачать новые строки Civitai-манифеста на живой диск | | `gpu-rent seed-extensions` | Доклонировать/обновить git-репы; restart swarmui | | `gpu-rent seed-personas` | Пуш `assistent-personas/` → overlay на VM (без полного up) | | `gpu-rent push` / `push-models` | Локальные деревья → VM | | `gpu-rent pull-output` | VM `Output/` → `./Output` | | `gpu-rent capture` / `capture all` | Инвентарь VM → merge **ссылок** в `models.yaml` + `extensions.yaml` (веса не качать) | | `gpu-rent capture models` / `--kind lora` | Только модели (фильтр по типу) | | `gpu-rent capture wanted` | Очередь Assistent Cards → `models.yaml` | | `gpu-rent capture extensions` | Только git Extensions / DLNodes | | `gpu-rent capture --dry-run` | Отчёт без записи файлов | | `gpu-rent resize-data --gb 400` | Data volume **только вверх** | | `gpu-rent watchdog install` / `uninstall` / `status` / `tick` | Локальный safety-net (см. ниже) | Второй `up` при живой VM: не создаёт второй GPU; autocomplete-check + push локальных папок; при `PULL_OUTPUT` — подтянуть Output. `--adopt` — подхватить тег без state. Нет команды `generate`. Локальный SwarmUI целиком не зеркалируем — только папки приложения ([local-folders.md](local-folders.md)). --- ## `doctor` Не создаёт сервер и не тратит GPU. Нужен до первого `up` и когда «вчера работало». Проверки (все печатаются в отчёт): 1. Читается `.env`, обязательные `OS_*` 2. Keystone выдаёт токен 3. Квота GPU > 0 (иначе текст про поддержку Selectel) 4. В сегменте есть flavor из `FLAVOR_PREFERENCE` 5. Volume type / место под data ~100 GB 6. SSH-ключ есть или будет создан в `.gpu-rent/` 7. Если есть `CIVITAI_API_TOKEN` — доступ к API-хосту; манифест парсится 8. `extensions.yaml` парсится, если есть 9. Предупреждения по огромным локальным `Models/` Exit 0 → можно `up`. Exit 1 → причина в таблице / кратком списке на `up`. --- ## `status` и `hold` **status** — без туннеля. При SSH: ещё `df` диска и состояние killer; иначе только OpenStack + локальный state. **hold** пишет на VM `/mnt/swarm_data/.gpu-rent-hold-until`. Killer не удаляет compute, пока `now < ts`. Без живой VM — ошибка (не «запомню на потом»). После unshelve hold на диске сохраняется. --- ## Debug API (localhost) На `gpu-rent up` и `gpu-rent tunnel` CLI поднимает **read-only** HTTP sidecar на `127.0.0.1:17821` (`DEBUG_LOCAL_PORT`). Ссылка печатается сразу и на access card. Агент: `GET /openapi.json` → `GET /snapshot` → точечные пути (`/progress`, `/events?since=`, `/checks`, `/logs`, `/diag`, `/gpu`, `/swarm`, `/ollama`, `/assistent`). Пока SSH нет — VM-эндпоинты отвечают `ssh_unavailable`; прогресс установщика всё равно виден в `/progress` и `/events`. После `up --no-tunnel` процесс завершается и sidecar гаснет — держи отдельно: ```text gpu-rent debug ``` Мутаций нет (restart/hold/stop — как раньше через CLI). --- ## Local watchdog (опционально) Основной авто-stop — **idle-killer на VM** (ноут можно закрыть). Local watchdog — если хочешь гасить GPU при «убили окно / ребут» без `stop`. 1. `gpu-rent watchdog install` (раз на машине, из корня репо) 2. Пока крутится `up`/`tunnel`, пишется heartbeat `.gpu-rent/local-lease.json` 3. **Ctrl+C / Ctrl+D** → `stop` (как `gpu-rent stop`) 4. Процесс умер / ребут → через `LOCAL_WATCHDOG_GRACE_MINUTES` (дефолт 10) → `stop` 5. `gpu-rent stop` чистит lease сам Без `install` поведение прежнее. При `up --no-tunnel` lease не вооружается. --- ## Конфигурация | Файл | Назначение | | --- | --- | | `.env` | Секреты и OpenStack (`OS_*`, токены). Не в git | | `gpu-rent.vars` | Несекретные дефолты; читают лаунчеры и CLI. Пример: `gpu-rent.vars.example` | | `models.yaml` / `extensions.yaml` / `ollama-models.yaml` | Манифесты (gitignore; из `*.example.yaml`) | ### Лаунчер (`gpu-rent.vars`) ```env # Двойной клик / запуск без аргументов у .ps1/.bat/.sh: GPU_RENT_DEFAULT_ARGS=up --yes # Дописать ко всем вызовам: # GPU_RENT_EXTRA_ARGS=--no-update UPDATE_GIT=true LLM_RUNTIME=none # DATA_VOLUME_SIZE_GB=100 # DEFAULT_FLAVOR_ID= # DEFAULT_SPOT=true ``` ### Основные переменные (`.env` / vars) ```env OS_AUTH_URL=https://cloud.api.selcloud.ru/identity/v3 OS_USER_DOMAIN_NAME= OS_USERNAME= OS_PASSWORD= OS_PROJECT_ID= OS_REGION_NAME=ru-7 GPU_RENT_AZ=ru-7a SSH_PRIVATE_KEY_PATH= SSH_USER=ubuntu # Пусто = авто /32 твоего IP. Для spike/WARP иногда 0.0.0.0/0: GPU_RENT_SSH_CIDR= BOOT_VOLUME_ID= DATA_VOLUME_ID= DATA_VOLUME_SIZE_GB=100 BOOT_SNAPSHOT_NAME=gpu-rent-boot-ok CIVITAI_API_TOKEN= CIVITAI_API_HOST=civitai.red MODELS_MANIFEST= LOCAL_MODELS_DIR= LOCAL_WILDCARDS_DIR= LOCAL_WORKFLOWS_DIR= LOCAL_OUTPUT_DIR= EXTENSIONS_MANIFEST= GIT_TOKEN= AUTOCOMPLETE_ENABLED=true SWARMUI_LOCAL_PORT=17801 LLM_RUNTIME=none OLLAMA_LOCAL_PORT=17811 DEBUG_LOCAL_PORT=17821 UPDATE_GIT=true DEFAULT_FLAVOR_ID= FLAVOR_PREFERENCE=4090-24,4090-48,a5000,a100-40 FLAVOR_FALLBACK=true FLAVOR_SIZE_PRESET=cheap SCAN_POOLS=ru-6,ru-7 DEFAULT_SPOT=true KEEP_FLOATING_IP=false IDLE_MINUTES=30 IDLE_GRACE_MINUTES=45 # LOCAL_WATCHDOG_GRACE_MINUTES=10 PULL_OUTPUT=false NOTIFY_READY=true ``` Flavor uuid в git не хардкодить. `FLAVOR_FALLBACK=false` — только `DEFAULT_FLAVOR_ID` / `--flavor`. Application credential для idle-killer CLI создаёт на `up` (узко: DELETE/GET **этого** server) и отзывает на `stop`. В `.env` ноутбука дублировать не нужно. Пути локальных папок по умолчанию: `Models/`, `Wildcards/`, `CustomWorkflows/`, `Output/` в корне репо. Полный шаблон: [`env.example`](../env.example). --- ## State `/.gpu-rent/state.json` — ids, фаза, timestamps (окно preempt 24 ч). Без паролей. Lockfile рядом — два `up` не создадут два сервера. --- ## Ожидание готовности Ориентир: **~20–40 мин** первый bootstrap, **~5–10 мин** unshelve. Порядок готовности: 1. Nova `ACTIVE` 2. TCP 22 / SSH 3. First-install Comfy (InstallConfirmWS, если backend был empty) → backend **ready (`running`)** → toast (если `NOTIFY_READY`) 4. На VM: HTTP сервисов стека (SwarmUI `:7801` / Ollama `:11434`) — `verify_stack_on_vm` 5. На VM: **nvidia-smi / CUDA** (fail-fast) + **torch+cuda** в Comfy venv при SwarmUI (ждём) — `verify_gpu_env` 6. В логе: строка **`тайминг up:`** (SSH / bootstrap / Idle / verify / …) 7. Туннель + проверка **localhost** тех же сервисов → access-card (красная рамка, если killer failed) → **дайджест journal** поднятых юнитов (~20 строк, без cloud-init) `gpu-rent logs --unit swarm|ollama|killer` — полный journalctl (и cloud-init при `--unit all` / по умолчанию). `gpu-rent status` — killer/hold, последний стек/GPU-env, тайминг up. Локальный порт UI: **17801** (на VM по-прежнему 7801 на loopback). --- ## Windows / notify `NOTIFY_READY`: toast + системный звук, когда backend ready (`running`). Если toast недоступен — только звук и лог, без падения CLI. ### Баланс Selectel (шаг 200 ₽) Нужны: 1. `SELECTEL_API_TOKEN` в `.env` — **статический ключ панели** (`X-Token`), не OpenStack password ([баланс API](https://docs.selectel.ru/api/balance/)). 2. `gpu-rent watchdog install` — тот же локальный тикер, что и аварийный stop. На `up` запоминается baseline баланса. Каждый tick watchdog: если с `up` ушло ещё ~200 ₽ (`BALANCE_NOTIFY_STEP_RUB`) — toast «Списано ~N ₽…». Пополнение сбрасывает baseline. Опционально `BALANCE_NOTIFY_LOW_RUB=300` — разовое «баланс низкий».