- Python 51.6%
- Dockerfile 48.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .forgejo/workflows | ||
| i18n | ||
| patches | ||
| workflows | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| AGENTS.md | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
ComfyUI2API (CI/CD)
Этот репозиторий не содержит исходного кода — он существует только для того,
чтобы автоматически собирать Docker-образ ComfyUI2API (OpenAI-совместимый API
поверх ComfyUI: /v1/images/generations, /v1/images/edits, /v1/videos/* и
т.д.) и размещать его в локальном Container Registry.
Откуда берётся код
Исходники: https://github.com/Einzieg/Comfyui2api. Автор не публикует готовые
Docker-образы (в upstream проект запускается через docker-compose + uv),
поэтому образ собирается здесь. Dockerfile лежит в этом репозитории:
workflow клонирует исходники в upstream/, а сборка использует корневой
Dockerfile.
Как это работает
Workflow: .forgejo/workflows/ci-cd.yml
- каждое утро (06:00, Asia/Qostanay) проверяет HEAD
main-ветки upstream черезgit ls-remote(без полного клона); - если появился новый коммит — клонирует его с GitHub, собирает образ
docker buildxи пушит в registry; - если новых коммитов нет — сборка пропускается (последний собранный SHA запоминается в кэше раннера).
Upstream не выкладывает релизные теги
X.Y.Z, поэтому версией образа выступает SHA коммита, а не номер релиза.
Запустить вручную можно из вкладки Actions → Run workflow:
опционально указать конкретный commit (короткий или полный SHA) и/или
force (пересобрать уже собранный коммит).
Русский дашборд
Upstream-дашборд (/ui/) написан на китайском. Этот образ собирает его
на русском: Dockerfile содержит стадию webui, которая
- применяет словарь перевода
i18n/ru.jsonк исходникам фронтенда черезi18n/apply_i18n.py; - пересобирает дашборд (
vite build); - подменяет предсобранный
src/comfyui2api/webui_distрусским бандлом.
Скрипт перевода в конце проверяет, что в исходниках не осталось ни одного
китайского символа; если upstream добавит новые строки — сборка упадёт с
списком непровернутых фрагментов. Тогда нужно расширить i18n/ru.json
(ключи — точные китайские сегменты из upstream) и пересобрать.
Патчи из community-форков
Помимо локализации, образ накатывает набор полезных правок, которых пока нет в upstream, взятых из публичных форков (все — MIT, как и upstream):
| Патч | Источник | Что даёт |
|---|---|---|
| Случайный seed на каждую задачу | xundaoai a1501a7 |
Повторные генерации не дают идентичный результат (рандомизируются KSampler/SamplerCustom/RandomNoise). |
size/width/height → resizeFlag для img2img |
opq007 |
Запрошенный размер реально применяется; неполная пара width/height отбрасывается. |
Батч-параметр n |
opq007 |
n/batchsize/numimages сопоставляются с batch_size в workflow (несколько изображений за запрос). |
| Rate-limit на admin-авторизацию | opq007 |
После 10 неудачных попыток входа в /v1/admin/* — блок на 60 с (защита от brute-force). |
Правки лежат одним файлом patches/fork-fixes.patch
и применяются в Dockerfile через patch -p1 --fuzz=0. Регрессионные тесты —
в tests/test_fork_patches.py (добавляются патчем). Если upstream изменит
затронутые файлы (jobs.py, workflow_params.py, admin_routes.py), строгое
применение patch упадёт и сборка прервётся — тогда патч нужно перегенерировать
против нового upstream.
Образы
Регистр: git.maydayoffice.kz, пакет maydayoffice/comfyui2api.
Каждый собранный коммит получает теги:
| Тег | Значение |
|---|---|
sha-<7 символов> |
конкретный коммит (читабельно) |
<полный SHA> |
тот же коммит, полный тег |
latest |
самый свежий собранный HEAD main |
Пример:
git.maydayoffice.kz/maydayoffice/comfyui2api:latest
git.maydayoffice.kz/maydayoffice/comfyui2api:sha-383e62c
git.maydayoffice.kz/maydayoffice/comfyui2api:383e62c5da952d0f7095d7fd69a8b622c197a1b4
Использование
Быстрый старт: docker compose
В репозитории есть docker-compose.yml
(restart, extra_hosts, env_file, volumes, healthcheck, logging)
и пример txt2img-воркфлоу в API-формате
workflows/txt2img.example.json.
Вся конфигурация (включая секреты) — в .env:
# 1. Создайте .env из шаблона и ЗАМЕНИТЕ API_TOKEN (и при желании прочее)
cp .env.example .env
# 2. Положите свои воркфлоу (ComfyUI → File → Export (API)) в ./workflows
cp workflows/txt2img.example.json workflows/txt2img.json # переименуйте по вкусу
# 3. Запустите
docker compose up -d
# 4. Проверьте (model = имя файла без .json)
curl -s -X POST http://localhost:8000/v1/images/generations \
-H "Authorization: Bearer <ваш API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"model": "txt2img", "prompt": "a red apple on a wooden table"}' | python3 -m json.tool
.envне коммитится (.gitignore); шаблон с описанием всех переменных —.env.example.
Ручной запуск
docker login git.maydayoffice.kz
docker pull git.maydayoffice.kz/maydayoffice/comfyui2api:latest
Минимальный запуск (ComfyUI на хосте):
docker run -d --name comfyui2api \
-p 8000:8000 \
-e COMFYUI_BASE_URL=http://host.docker.internal:8188 \
-e API_TOKEN=your-api-token \
-e COMFYUI_STARTUP_CHECK=false \
-v $(pwd)/workflows:/app/comfyui-api-workflows \
-v comfyui2api-runs:/app/runs \
--add-host host.docker.internal:host-gateway \
git.maydayoffice.kz/maydayoffice/comfyui2api:latest
workflows/— JSON-воркфлоу в формате File → Export (API) из ComfyUI (имя файла без.json= значениеmodelв API-запросах; UI-формат сnodes/linksне поддерживается);API_TOKEN— Bearer-токен, защищающий API (без него API открыт!);COMFYUI_STARTUP_CHECK=false— не ронять старт, если ComfyUI ещё не поднялся;--add-host host.docker.internal:host-gateway— чтобы контейнер видел ComfyUI на хост-машине (без негоhost.docker.internalне резолвится).
Доступные эндпоинты: /v1/images/generations, /v1/images/edits,
/v1/images/variations, /v1/videos/generations, /v1/videos/edits,
/v1/videos, /v1/models, /v1/workflows, /v1/jobs (+ WebSocket-прогресс).
Полное описание — в upstream README.