# 🎬 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@" # Загрузить всю папку 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@ 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@:/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://:8080 \ --image photo.png \ --prompt "woman dancing gracefully" \ --output video.mp4 # FLF2V — из двух кадров python client.py \ --server http://: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/` | GET | Получить статус: `IN_QUEUE` / `IN_PROGRESS` / `COMPLETED` / `FAILED` | | `/purge/` | 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` на сервере, часы на ПК)