Files
wan-22-comfy/README.md
T
2026-03-08 13:11:31 +03:00

264 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🎬 DaSiWa API Server для ComfyUI
Автономный API сервер для генерации видео через ComfyUI на выделенном GPU сервере.
Модель: **DaSiWa WAN 2.2 TastySin v8.1** (I2V / FLF2V, 4 шага, Lightx2v дистилляция).
**Безопасность:** HMAC подпись каждого запроса (timestamp + nonce + body). Перехват бесполезен — подпись уникальна.
---
## 📁 Структура
```
custom_comfyui/
├── server.py # API сервер (ставится на GPU машину)
├── client.py # Клиент (запускается на твоём ПК)
├── hmac_auth.py # HMAC авторизация (нужен и там, и там)
├── generate_keys.py # Генерация ключей (один раз)
├── setup.sh # Автоустановка: Python, зависимости, UFW, systemd
├── requirements.txt # Python зависимости
├── keys.json # 🔒 Ключи (НЕ коммитить!)
└── workflow_api.json # 🎨 ComfyUI workflow (TastySin v8.1)
```
---
## 🚀 Быстрый старт
### 1. Загрузка моделей на сервер
```powershell
$SERVER = "root@194.67.95.42"
# HIGH checkpoint (~9.7 GB)
scp "TastySin-HIGH-v8.1.safetensors" ${SERVER}:/ComfyUI/models/checkpoints/
# LOW checkpoint (~9.7 GB)
scp "TastySin-LOW-v8.1.safetensors" ${SERVER}:/ComfyUI/models/checkpoints/
# VAE (~335 MB)
scp "wan_2.1_vae.safetensors" ${SERVER}:/ComfyUI/models/vae/
# Text Encoder (~4.9 GB, fp8)
scp "umt5_xxl_fp8_e4m3fn_scaled.safetensors" ${SERVER}:/ComfyUI/models/text_encoders/
```
**Скачать модели:**
- **Checkpoints:** [DaSiWa WAN 2.2 TastySin v8.1](https://civitai.com/models/1329763) — скачай HIGH и LOW версии (Safetensors)
- **VAE:** [wan_2.1_vae.safetensors](https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/blob/main/split_files/vae/wan_2.1_vae.safetensors)
- **Text Encoder:** [umt5_xxl_fp8_e4m3fn_scaled.safetensors](https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors)
**Структура моделей на сервере:**
```
📂 ComfyUI/models/
├── checkpoints/
│ ├── TastySin-HIGH-v8.1.safetensors
│ └── TastySin-LOW-v8.1.safetensors
├── vae/
│ └── wan_2.1_vae.safetensors
└── text_encoders/
└── umt5_xxl_fp8_e4m3fn_scaled.safetensors
```
### 2. Генерация ключей (на любом ПК с Python)
```bash
cd custom_comfyui
python generate_keys.py
```
Появится файл `keys.json`. **Нужен и на сервере, и на клиенте.**
### 3. Загрузка на сервер
```powershell
# С Windows на Ubuntu сервер
$SERVER = "root@<ip_сервера>"
# Загрузить всю папку
scp -r custom_comfyui/ ${SERVER}:/root/
# ИЛИ по файлам
scp server.py hmac_auth.py generate_keys.py setup.sh requirements.txt keys.json workflow_api.json ${SERVER}:/root/custom_comfyui/
```
### 4. Установка на сервере (одна команда)
```bash
ssh root@<ip_сервера>
cd /root/custom_comfyui
chmod +x setup.sh
sudo ./setup.sh
```
Скрипт автоматически:
- ✅ Установит Python, pip, wget
- ✅ Установит Python зависимости
- ✅ Настроит Firewall (открыт 22 + 8080, закрыт 8188)
- ✅ Создаст systemd сервис с автозапуском
- ✅ Сгенерирует ключи (если нет)
### 5. Скопируй keys.json на свой ПК
```powershell
scp root@<ip_сервера>:/root/custom_comfyui/keys.json .
```
Положи в папку `custom_comfyui/` на своём ПК.
### 6. Проверка
```bash
# На сервере:
curl http://localhost:8080/health
# Ответ:
# {"comfyui": "ok", "status": "ok", "queue": 0, "timestamp": 1234567890}
```
### 7. Генерация видео (с клиента)
```bash
cd custom_comfyui
# I2V — из одного изображения
python client.py \
--server http://<ip_сервера>:8080 \
--image photo.png \
--prompt "woman dancing gracefully" \
--output video.mp4
# FLF2V — из двух кадров
python client.py \
--server http://<ip_сервера>:8080 \
--image start.png \
--last-image end.png \
--prompt "smooth transition between poses" \
--output transition.mp4
```
Клиент работает асинхронно (как RunPod): отправляет задачу → поллит статус → забирает видео.
---
## 🔄 API Endpoints (асинхронный, как RunPod)
| Endpoint | Method | Описание |
|----------|--------|----------|
| `/run` | POST | Поставить задачу в очередь → `{"id": "...", "status": "IN_QUEUE"}` |
| `/status/<id>` | GET | Получить статус: `IN_QUEUE` / `IN_PROGRESS` / `COMPLETED` / `FAILED` |
| `/purge/<id>` | POST | Удалить задачу из памяти (освободить RAM) |
| `/health` | GET | Health check API + ComfyUI (без авторизации) |
| `/comfyui/status` | GET | Детальная проверка ComfyUI (без авторизации) |
**Пример потока:**
```
1. POST /run {image_base64: "...", prompt: "..."} → {id: "abc-123", status: "IN_QUEUE"}
2. GET /status/abc-123 → {id: "abc-123", status: "IN_PROGRESS"}
3. GET /status/abc-123 → {id: "abc-123", status: "COMPLETED", output: {video: "base64...", seed: 42, ...}}
4. POST /purge/abc-123 → {id: "abc-123", purged: true}
```
---
## ⚙️ Параметры генерации
| Параметр | По умолчанию | Описание |
|----------|-------------|----------|
| `--width` | 528 | Ширина (кратно 16) |
| `--height` | 768 | Высота (кратно 16) |
| `--length` | 81 | Кол-во кадров (~5 сек при 16fps) |
| `--steps` | 4 | Шаги (DaSiWa оптимизирован под 4) |
| `--cfg` | 1.0 | CFG scale (DaSiWa работает с 1.0) |
| `--seed` | -1 | Сид (-1 = рандом) |
| `--fps` | 16 | Кадров в секунду |
---
## 🔐 Как работает безопасность
```
Клиент:
1. Берёт тело запроса (JSON)
2. Создаёт timestamp + nonce (случайная строка)
3. Подписывает: HMAC-SHA256(secret_key, timestamp.nonce.body)
4. Отправляет: body + заголовки (client_id, timestamp, nonce, signature)
Сервер:
1. Проверяет client_id
2. Проверяет timestamp (не старше 5 минут)
3. Проверяет nonce (не использован ранее — защита от replay)
4. Вычисляет подпись и сравнивает
5. Если всё ОК — выполняет запрос
```
**Почему это безопасно:**
- Без secret_key нельзя создать валидную подпись
- Каждый запрос уникален (nonce) — replay-атака невозможна
- Timestamp — протухшие запросы отклоняются
- secret_key **никогда** не передаётся по сети
---
## 🔧 Управление
```bash
# Статус API
systemctl status dasiwa-api
# Перезапуск
systemctl restart dasiwa-api
# Логи (live)
journalctl -u dasiwa-api -f
# Стоп
systemctl stop dasiwa-api
```
### 📦 Логирование
- `journalctl -u dasiwa-api -f` — стримит лог в реальном времени и сохраняет их в системном журнале, так что падения не теряют логи.
- `journalctl -u dasiwa-api --since "10 minutes ago"` выведет историю за последний период.
- Чтобы журнал системd сохранял файлы между перезагрузками, в `/etc/systemd/journald.conf` установите `Storage=persistent` и перезапустите `systemd-journald`.
- Для дополнительного файла добавьте в `dasiwa-api.service` параметры:
```ini
[Service]
StandardOutput=append:/var/log/dasiwa-api.log
StandardError=inherit
```
После `sudo systemctl daemon-reload && sudo systemctl restart dasiwa-api` лог будет доступен в `/var/log/dasiwa-api.log` и его можно собирать отдельно.
---
## 🔥 Firewall
Открытые порты:
- **22** — SSH
- **8080** — API (Python напрямую)
Закрытые:
- **8188** — ComfyUI UI (только localhost)
---
## ❓ Troubleshooting
**ComfyUI недоступен:**
```bash
# Проверь что ComfyUI запущен
curl http://localhost:8188
# Посмотри процесс
ps aux | grep comfy
```
**API не отвечает:**
```bash
journalctl -u dasiwa-api -n 50
systemctl restart dasiwa-api
```
**Ошибка авторизации (401):**
- Проверь что `keys.json` одинаковый на клиенте и сервере
- Проверь время на обоих машинах (`date` на сервере, часы на ПК)