# Как запустить локальный сервер генерации изображений: ComfyUI, Stable Diffusion и API для своих приложений

> AI Release · @ai_release1 · https://ai-release.org/guides/kak-zapustit-lokalnyy-server-generatsii-izobrazheniy-co.html

## TL;DR

- Время выполнения: 40–60 минут (основное время уходит на скачивание весов модели)
- Уровень сложности: Intermediate
- Понадобится: Python 3.10+ (точную поддерживаемую версию сверьте с документацией ComfyUI), git, ComfyUI (репозиторий `comfyanonymous/ComfyUI`), файл чекпойнта Stable Diffusion в формате `.safetensors`, браузер, терминал
- Результат: локальный сервер на `http://127.0.0.1:8188` с веб-интерфейсом и HTTP API (`/prompt`, `/history`, `/view`), к которому можно обращаться из своего кода

## Требования и подготовка
![Иллюстрация к разделу «Требования и подготовка»](https://ai-release.org/guides/img/kak-zapustit-lokalnyy-server-generatsii-izobrazheniy-co-ru-1.jpg?v=1793090765)


- ОС: Linux, Windows или macOS. Команды ниже даны для Linux/macOS, в скобках — вариант для Windows.
- `git` и `python3` в PATH. Проверка: `git --version` и `python3 --version` печатают версии без ошибок.
- Свободное место на диске: под сам ComfyUI — сотни мегабайт, под чекпойнт Stable Diffusion — несколько гигабайт (точный размер смотрите на странице выбранной модели).
- GPU NVIDIA с установленным драйвером — не обязателен, но на CPU генерация идёт заметно медленнее (конкретные цифры зависят от железа, сверьтесь с документацией).
- Свободный локальный порт `8188` (порт по умолчанию у ComfyUI).
- Чекпойнт Stable Diffusion — модель, которая превращает шум в картинку по текстовому описанию (промпту). Где брать открытые веса, разобрано в гайде [Какие ИИ-модели имеют открытые веса и как их запустить бесплатно](https://ai-release.org/guides/kakie-ii-modeli-imeyut-otkrytye-vesa-i-kak-ih-zapustit.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).

Чек-лист перед стартом:

- [ ] `python3 --version` работает в терминале
- [ ] `git --version` работает
- [ ] `nvidia-smi` показывает видеокарту (если она есть)
- [ ] Скачан файл `.safetensors` с чекпойнтом
- [ ] Порт `8188` ничем не занят

Если вы ещё не запускали локальные модели и хотите сначала понять общую логику «модель на своём компьютере», начните с материала [Как запустить ИИ-модель локально на своём компьютере: гайд для начинающих](https://ai-release.org/guides/kak-zapustit-ii-model-lokalno-na-svoem-kompyutere-gayd.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).

## Шаг 1. Установка ComfyUI и изолированного окружения

**Что сделать:** склонировать репозиторий, создать виртуальное окружение и поставить зависимости.

**Зачем:** виртуальное окружение (`venv`) — отдельная папка с библиотеками Python, чтобы версии `torch` и прочих пакетов для ComfyUI не конфликтовали с другими вашими проектами.

```bash
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
python3 -m venv venv
source venv/bin/activate          # Windows: venv\Scripts\activate
pip install -r requirements.txt
```

**Пример:** после `source venv/bin/activate` приглашение терминала начинается с `(venv)`, например `(venv) user@host:~/ComfyUI$`. Это признак, что вы внутри окружения.

**Как проверить:** убедиться, что PyTorch встал и видит GPU.

```bash
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
```

Ожидаемый вывод: строка с версией и `True` на машине с NVIDIA (`False`, если GPU нет или драйвер не установлен). Почему это работает: `requirements.txt` тянет PyTorch, а `torch.cuda.is_available()` реально опрашивает драйвер, а не просто читает конфиг.

## Шаг 2. Запуск сервера и подключение модели
![Иллюстрация к разделу «Шаг 2. Запуск сервера и подключение модели»](https://ai-release.org/guides/img/kak-zapustit-lokalnyy-server-generatsii-izobrazheniy-co-ru-2.jpg?v=1793090769)


**Что сделать:** положить чекпойнт в папку моделей и запустить сервер.

**Зачем:** ComfyUI — это графовый редактор: ноды (узлы) соединяются в схему «текст → латентное представление → изображение». Файл модели должен лежать в конкретном каталоге, иначе нода `Load Checkpoint` его не увидит. Латентное представление — сжатая версия картинки, в которой диффузионная модель работает быстрее, чем с пикселями.

```bash
cp ~/Downloads/<ваш-чекпойнт>.safetensors models/checkpoints/
python main.py --listen 127.0.0.1 --port 8188
```

`<ваш-чекпойнт>` замените на имя скачанного файла. Флаг `--listen 127.0.0.1` означает «слушать только локально» — снаружи машины сервер недоступен, это безопасный вариант по умолчанию.

**Пример:** в логе появляется строка вида `Starting server` и адрес с портом `8188`; в браузере по `http://127.0.0.1:8188` открывается тёмный холст с нодами по умолчанию.

**Как проверить:** в интерфейсе найти ноду `Load Checkpoint` и раскрыть выпадающий список — в нём должен быть ваш файл. Если списка нет — модель не попала в `models/checkpoints/`; перезапустите сервер, он сканирует папку при старте.

## Шаг 3. Проверка API и вызов генерации из своего приложения
![Иллюстрация к разделу «Шаг 3. Проверка API и вызов генерации из своего приложения»](https://ai-release.org/guides/img/kak-zapustit-lokalnyy-server-generatsii-izobrazheniy-co-ru-3.jpg?v=1793090776)


**Что сделать:** собрать простую схему в интерфейсе, выгрузить её в API-формате и отправить на сервер HTTP-запросом.

**Зачем:** веб-интерфейс и API используют один и тот же движок. Схема, сохранённая через пункт меню сохранения в API-формате (кнопка сохранения в меню интерфейса, точное название пункта сверьте с документацией ComfyUI), — это JSON, который принимает эндпоинт `POST /prompt`.

```python
import json, time, urllib.request, urllib.parse

SERVER = "http://127.0.0.1:8188"

with open("workflow_api.json", encoding="utf-8") as f:
    workflow = json.load(f)

req = urllib.request.Request(
    f"{SERVER}/prompt",
    data=json.dumps({"prompt": workflow}).encode(),
    headers={"Content-Type": "application/json"},
)
resp = json.load(urllib.request.urlopen(req))
prompt_id = resp["prompt_id"]
print("prompt_id:", prompt_id)

while True:
    hist = json.load(urllib.request.urlopen(f"{SERVER}/history/{prompt_id}"))
    if prompt_id in hist:
        break
    time.sleep(1)

for node_id, out in hist[prompt_id]["outputs"].items():
    for img in out.get("images", []):
        q = urllib.parse.urlencode({"filename": img["filename"],
                                    "subfolder": img["subfolder"],
                                    "type": img["type"]})
        print("file:", f"{SERVER}/view?{q}")
```

**Пример:** первый ответ сервера выглядит как `{"prompt_id": "...", "number": 0, "node_errors": {}}`. Пустой `node_errors` — схема валидна. Скрипт печатает `prompt_id:` и затем ссылку вида `http://127.0.0.1:8188/view?filename=ComfyUI_00001_.png&subfolder=&type=output`.

**Как проверить:** открыть напечатанный URL в браузере — должна отобразиться сгенерированная картинка. Файл также лежит в `ComfyUI/output/`. Почему это работает: `/prompt` ставит задачу в очередь и возвращает идентификатор, `/history/{id}` отдаёт результат по завершении, `/view` раздаёт файл из выходного каталога.

## Возможные проблемы и решения

**Проблема. Сервер падает сразу после старта с ошибкой про torch**

- Ошибка: `ModuleNotFoundError: No module named 'torch'`
- Причина: зависимости ставились вне виртуального окружения либо `main.py` запущен другим интерпретатором Python (например, системным, а не из `venv`).
- Решение: активировать окружение и проверить, какой Python используется:

```bash
source venv/bin/activate
which python          # Windows: where python
pip install -r requirements.txt
python main.py
```

Путь в выводе `which python` должен заканчиваться на `ComfyUI/venv/bin/python`.

**Проблема. Генерация прерывается на середине**

- Ошибка: `torch.cuda.OutOfMemoryError: CUDA out of memory.`
- Причина: не хватает видеопамяти — обычно из-за большого разрешения, большого batch size или параллельно работающих программ на GPU.
- Решение: закрыть другие GPU-приложения (браузер с аппаратным ускорением, игры), уменьшить разрешение в ноде латентного изображения и перезапустить сервер с флагом экономии памяти (набор флагов и их поведение сверьте с документацией ComfyUI):

```bash
python main.py --listen 127.0.0.1 --port 8188 --lowvram
```

**Проблема. Сервер не стартует, порт занят**

- Ошибка: `OSError: [Errno 98] Address already in use`
- Причина: на порту `8188` уже висит другой процесс — часто забытый предыдущий запуск ComfyUI.
- Решение: найти и остановить процесс либо взять другой порт:

```bash
ss -ltnp | grep 8188
kill <PID>
python main.py --listen 127.0.0.1 --port 8189   # и обновить SERVER в скрипте
```

## Резюме и следующие шаги

Вы получили локальный сервер ComfyUI с веб-интерфейсом и HTTP API, который принимает JSON-схему через `/prompt` и возвращает готовые файлы через `/history` и `/view`. Дальше имеет смысл обернуть вызовы из Шага 3 в свою функцию или сервис, добавить очередь запросов и логирование времени генерации.

## FAQ

**Нужна ли обязательно видеокарта NVIDIA?**
Нет, ComfyUI запускается и на CPU, но генерация будет заметно медленнее. Способы запуска на CPU и поддерживаемые флаги сверьте с документацией ComfyUI.

**Где брать чекпойнты Stable Diffusion?**
В каталогах открытых весов; подходят файлы формата `.safetensors`, которые кладутся в `ComfyUI/models/checkpoints/`. Обзор открытых моделей — в [подборке гайдов по открытым весам](https://ai-release.org/guides/kakie-ii-modeli-imeyut-otkrytye-vesa-i-kak-ih-zapustit.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).

**Можно ли обращаться к серверу с другой машины в сети?**
Технически да — запуск с `--listen 0.0.0.0`. Но тогда сервер доступен всем в сети без пароля, поэтому ставьте его за reverse proxy с аутентификацией; конкретные настройки сверьте с документацией.

**Чем API отличается от веб-интерфейса?**
Ничем по результату: это один процесс и один движок. Интерфейс просто рисует граф, а API принимает тот же граф как JSON и возвращает пути к файлам.
