136 lines
5.6 KiB
Markdown
136 lines
5.6 KiB
Markdown
# MpakoImageAIbot
|
||
|
||
Telegram-бот для генерации и редактирования изображений через удалённый ComfyUI API.
|
||
|
||
## Что умеет
|
||
|
||
- **Text-to-image**: текст → изображение (Z-Image Turbo, 1024×1024).
|
||
- **Image-to-image**: фото + подпись → редактирование (Krea2 edit).
|
||
- **Reply-to-image**: ответ текстом на готовую картинку бота → редактирование этой картинки.
|
||
- **Веб-история**: просмотр запросов с фильтрами по `user_id`, статусу и режиму, просмотр изображений.
|
||
- Глобальная очередь с одной активной задачей на пользователя.
|
||
- Позиция в очереди и прогресс генерации через WebSocket ComfyUI.
|
||
- SQLite: запросы, статусы, seed, пути к файлам.
|
||
|
||
## Требования
|
||
|
||
- Python 3.10+ (проверено на 3.13).
|
||
- ComfyUI с доступом по сети, например:
|
||
```text
|
||
python main.py --listen 0.0.0.0 --port 8188
|
||
```
|
||
- Установленные кастомные ноды для текущих workflow: `Krea2ModelLoader`, `TextEncodeQwenImageEdit`, `UnetLoaderGGUF`, `CLIPLoaderGGUF`.
|
||
- Модели, указанные в `workflows/txt2img.json` и `workflows/img2img.json`.
|
||
|
||
## Настройка
|
||
|
||
```powershell
|
||
Copy-Item .env.example .env
|
||
```
|
||
|
||
Заполнить `.env`:
|
||
|
||
- `BOT_TOKEN` — токен от `@BotFather`.
|
||
- `TELEGRAM_PROXY` — прокси для Telegram API (пусто — напрямую).
|
||
- `COMFY_BASE_URL` — например `http://192.168.31.113:8188`.
|
||
- Остальные параметры можно оставить по умолчанию.
|
||
|
||
### Прокси для Telegram
|
||
|
||
Если сервер не имеет прямого доступа к Telegram, укажи прокси V2RayA/HTTP/SOCKS5:
|
||
|
||
```dotenv
|
||
# Docker на Linux (V2RayA слушает на хосте)
|
||
TELEGRAM_PROXY=http://host.docker.internal:20171
|
||
|
||
# Запуск без Docker, на том же хосте
|
||
# TELEGRAM_PROXY=http://127.0.0.1:20171
|
||
```
|
||
|
||
Для SOCKS5 используй `socks5h://host.docker.internal:20170`; зависимость `socksio` уже включена в `requirements.txt`.
|
||
|
||
## Запуск
|
||
|
||
```powershell
|
||
py -3 -m venv .venv
|
||
.\.venv\Scripts\Activate.ps1
|
||
pip install -r requirements.txt
|
||
python bot.py
|
||
```
|
||
|
||
Бот работает в приватных чатах. Пользователь отправляет текст или фото с подписью.
|
||
|
||
## Docker
|
||
|
||
```powershell
|
||
docker compose up -d --build
|
||
```
|
||
|
||
Каталоги `./storage` и `./data` монтируются как volume. Для ComfyUI на другой машине используйте её LAN-IP, а не `localhost`.
|
||
|
||
## CI
|
||
|
||
При push в `main` или `master` Gitea Actions собирает образ на сервере, где запущен runner, и пушит его в Gitea Registry:
|
||
|
||
- `git.mpakosrv.ru/mpakobecex/mpakoimageaibot:latest`
|
||
- `git.mpakosrv.ru/mpakobecex/mpakoimageaibot:<sha>`
|
||
- локально: `mpakoimageaibot:latest`
|
||
|
||
Workflow: `.gitea/workflows/docker-build.yml`. Runner использует label `ubuntu-latest` и смонтированный Docker socket. Для входа в registry нужны секреты `REGISTRY_USER` и `REGISTRY_TOKEN`.
|
||
|
||
## Веб-история
|
||
|
||
После `docker compose up -d` доступна страница:
|
||
|
||
```text
|
||
http://192.168.31.158:8099
|
||
```
|
||
|
||
Возможности:
|
||
|
||
- фильтр по Telegram `user_id` (с подсказкой известных пользователей);
|
||
- фильтр по статусу и режиму (`t2i`/`i2i`);
|
||
- пагинация;
|
||
- карточка запроса с полным промптом, ошибкой, seed и изображениями.
|
||
|
||
Доступ защищается HTTP Basic, если задан `WEB_PASSWORD`:
|
||
|
||
```dotenv
|
||
WEB_USERNAME=admin
|
||
WEB_PASSWORD=change-me
|
||
```
|
||
|
||
Если `WEB_PASSWORD` пустой — страница открыта без пароля. Не оставляй её публично доступной.
|
||
|
||
После успешной сборки обновление контейнера:
|
||
|
||
```bash
|
||
docker compose up -d
|
||
```
|
||
|
||
Без `--build`: Compose возьмёт готовый образ `mpakoimageaibot:latest`.
|
||
|
||
## Workflow
|
||
|
||
- `workflows/txt2img.json` — Z-Image Turbo: `EmptySD3LatentImage → KSampler → VAEDecode → SaveImage`.
|
||
- `workflows/img2img.json` — Krea2 edit: `LoadImage → TextEncodeQwenImageEdit → KSamplerAdvanced → VAEDecode → SaveImage`.
|
||
- `workflows/mapping.json` — ID узлов, в которые подставляются prompt, negative, seed и входное изображение.
|
||
- `workflows/Krea2.json` и `workflows/ZImage.json` — исходные экспорты.
|
||
|
||
Если меняются workflow, обновите `mapping.json`. При старте бот проверяет, что все узлы и поля существуют.
|
||
|
||
## Тесты
|
||
|
||
```powershell
|
||
pip install -r requirements-dev.txt
|
||
pytest
|
||
```
|
||
|
||
## Ограничения текущей версии
|
||
|
||
- Один воркер и одна активная задача на пользователя.
|
||
- Нет `/cancel` и удаления задачи из очереди.
|
||
- Нет автоочистки `storage/` и `data/`.
|
||
- Прогресс в процентах зависит от WebSocket; при его недоступности используется polling без процентов.
|
||
- При рестарте задача в статусе `running` помечается `failed`.
|