Files
tg-sd/README.md
T
dinlo b88ccf3b4b Initial commit
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 18:46:09 +08:00

987 lines
37 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.
# Telegram Bot для генерации изображений через Stable Diffusion (Automatic1111)
Бот для генерации изображений через API Stable Diffusion WebUI (Automatic1111) с поддержкой профилей, управления хранением изображений и удобным интерфейсом.
## Возможности
- 🎨 **Генерация изображений (txt2img)** — создание изображений по текстовому описанию
- ⚙️ **Система профилей** — сохранение настроек (размер, модель, LoRA, сэмплер и т.д.)
- 🗃️ **Управление хранением** — настройка времени хранения изображений (автоочистка)
- 📊 **Мониторинг** — проверка статуса подключения к SD API
- 🐳 **Docker** — простая установка и запуск в контейнере
- 🛡️ **Админ-панель** — управление пользователями, лимитами и доступом
---
## Содержание
1. [Что умеет бот](#что-умеет-бот)
2. [Требования](#требования)
3. [Настройка Stable Diffusion WebUI](#настройка-stable-diffusion-webui)
4. [Создание Telegram бота](#создание-telegram-бота)
5. [Установка бота](#установка-бота)
6. [Настройка конфигурации](#настройка-конфигурации)
7. [Запуск бота](#запуск-бота)
8. [Использование бота](#использование-бота)
9. [Примеры промптов](#примеры-промптов)
10. [Структура проекта](#структура-проекта)
11. [FAQ](#faq)
12. [Устранение неполадок](#устранение-неполадок)
---
## Что умеет бот
### 🎨 Генерация изображений
Бот позволяет создавать изображения двумя способами:
**txt2img (текст → изображение)** — опишите словами, что хотите увидеть, и бот сгенерирует изображение. Вы вводите промпт (описание) и необязательный негативный промпт (чего НЕ должно быть на картинке), а бот передаёт запрос в Stable Diffusion и возвращает готовое изображение.
После генерации бот покажет все параметры: промпт, размер, количество шагов, CFG Scale, сэмплер, шедулер, seed, модель и время хранения изображения.
### ⚙️ Система профилей
Создавайте и сохраняйте профили с предустановленными настройками, чтобы не вводить их каждый раз заново:
| Параметр | Описание |
|----------|----------|
| **Размер изображения** | Предустановленные (512×512, 768×768, 512×768, 768×512, 1024×1024) или произвольный (64–2048 px) |
| **Количество шагов** | От 10 до 150. Больше шагов = выше качество, но дольше генерация |
| **CFG Scale** | От 1.0 до 30.0. Определяет, насколько строго модель следует промпту (стандарт: 7.0) |
| **Сэмплер** | Euler a, Euler, DPM++ 2M Karras, DPM++ SDE Karras, DDIM и другие — загружаются из SD API |
| **Шедулер** | Автоматически подбирается к сэмплеру |
| **Модель** | Выбор из всех доступных моделей в вашем SD WebUI |
| **LoRA** | Подключение LoRA с настраиваемой силой (0.0–1.0) |
| **Негативный промпт** | Описание того, чего НЕ должно быть на изображении |
Вы можете установить один профиль как **профиль по умолчанию** (⭐) — тогда при генерации будут автоматически применяться его настройки.
### 🛡️ Админ-панель
Администратор (указанный в `ADMIN_ID`) имеет доступ к панели управления:
- **Добавление пользователей** — выдача доступа по Telegram User ID
- **Типы доступа:**
- ♾️ **Без ограничений** — полный доступ навсегда
-**По времени** — доступ на заданное количество дней (1–3650)
- 🎨 **По количеству генераций** — лимит на число сгенерированных изображений
- **Список пользователей** — просмотр, пагинация, управление
- **Управление пользователями** — блокировка, разблокировка, обновление доступа, удаление
- **Очистка истёкших доступов** — автоматическая деактивация пользователей с истёкшим сроком
> **Как узнать свой User ID?** — Напишите боту [@userinfobot](https://t.me/userinfobot) в Telegram.
### 🗃️ Управление хранением
Каждый пользователь может настроить время хранения своих сгенерированных изображений:
- **Предустановленные варианты:** 12 ч, 24 ч (1 день), 48 ч (2 дня), 72 ч (3 дня), 168 ч (7 дней)
- **Произвольное значение** — от 1 часа до максимума (`MAX_IMAGE_TTL_HOURS`)
- **Автоматическая очистка** — фоновая задача удаляет просроченные изображения с заданным интервалом
### 📊 Мониторинг
Команда `/status` или кнопка «Статус SD API» покажет:
- Статус подключения к SD API
- Адрес API
- Текущую загруженную модель
### 🔐 Система доступа
Бот по умолчанию **не допускает** новых пользователей — только те, кого добавил администратор, могут пользоваться ботом. Это защищает от несанкционированного использования ваших ресурсов.
При попытке использования бота без доступа пользователь получит сообщение об ошибке.
### 📋 Команды бота
| Команда | Описание |
|---------|----------|
| `/start` | Запуск бота, приветствие и главное меню |
| `/menu` | Показать главное меню |
| `/status` | Проверка статуса SD API |
| `/cancel` | Отмена текущей операции |
| `/admin` | Админ-панель (только для администратора) |
---
## Требования
### Для сервера с ботом (Docker)
- **Операционная система:** Linux (Ubuntu 20.04+), Windows 10/11 с WSL2, macOS 12+
- **Docker:** версии 20.10+
- **Docker Compose:** версии 2.0+
- **Свободное место:** ~500 МБ для бота + место для изображений
- **Оперативная память:** минимум 256 МБ для контейнера бота
- **Сеть:** доступ к серверу Stable Diffusion по локальной сети
### Для сервера со Stable Diffusion
- **Stable Diffusion WebUI (Automatic1111)** — запущенный и доступный по сети
- **API режим** — включён флагом `--api`
- **Сетевой доступ** — слушает не только localhost (флаг `--listen`)
---
## Настройка Stable Diffusion WebUI
### 1. Запуск с поддержкой API
На сервере, где установлен Stable Diffusion WebUI, запустите его со следующими флагами:
```bash
# Для Linux
./webui.sh --api --listen
# Для Windows
webui.bat --api --listen
```
**Обязательные флаги:**
| Флаг | Описание |
|------|----------|
| `--api` | Включает программный API для бота |
| `--listen` | Позволяет подключаться не только с localhost |
**Опциональные флаги:**
| Флаг | Описание |
|------|----------|
| `--port 7860` | Указать порт (по умолчанию 7860) |
| `--nowatchdog` | Отключить watchdog (рекомендуется для серверов) |
| `--xformers` | Использовать xformers для ускорения (если поддерживается) |
**Пример полной команды:**
```bash
./webui.sh --api --listen --port 7860 --nowatchdog
```
### 2. Проверка доступности API
После запуска проверьте, что API доступен:
```bash
# С сервера с ботом (замените IP на ваш)
curl http://192.168.1.120:7860/sdapi/v1/options
```
Вы должны получить JSON-ответ с настройками API.
### 3. Настройка firewall (если необходимо)
Убедитесь, что порт 7860 открыт для подключения с сервера бота:
```bash
# Для Ubuntu/Debian (UFW)
sudo ufw allow 7860/tcp
# Для CentOS/RHEL (firewalld)
sudo firewall-cmd --permanent --add-port=7860/tcp
sudo firewall-cmd --reload
```
---
## Создание Telegram бота
### 1. Получение токена бота
1. Откройте Telegram и найдите бота **@BotFather**
2. Отправьте команду `/newbot`
3. Следуйте инструкциям:
- Введите **отображаемое имя** бота (например, `SD Generator`)
- Введите **username** бота (должен заканчиваться на `bot`, например `sd_gen_bot`)
4. BotFather отправит вам **токен** вида `123456789:ABCdefGHIjklMNOpqrsTUVwxyz`
### 2. Настройка описания бота (опционально)
В BotFather:
```
/setdescription — описание, которое видит пользователь до начала общения
/setabouttext — короткое описание для поиска ботов
/setuserpic — аватар бота
```
---
## Установка бота
### Способ 1: С помощью Docker Compose (рекомендуется)
#### 1. Клонирование или копирование файлов
Скопируйте все файлы проекта на сервер, где будет работать бот:
```
tg-sd/
├── main.py
├── config.py
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── .env
├── bot/
│ ├── __init__.py
│ ├── handlers_start.py
│ ├── handlers_generation.py
│ ├── handlers_profiles.py
│ └── handlers_settings.py
├── sd/
│ ├── __init__.py
│ └── sd_client.py
├── database/
│ ├── __init__.py
│ └── database.py
└── utils/
├── __init__.py
└── image_manager.py
```
#### 2. Настройка переменных окружения
Откройте файл `.env` и укажите ваши значения:
```bash
nano .env
```
**Обязательные параметры:**
```env
# Токен вашего бота (получите у @BotFather)
BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz
# Адрес Stable Diffusion API
SD_API_URL=http://192.168.1.120:7860
```
**Опциональные параметры:**
```env
# Время хранения изображений по умолчанию (часы)
DEFAULT_IMAGE_TTL_HOURS=48
# Максимальное время хранения (часы)
MAX_IMAGE_TTL_HOURS=168
# Период автоматической очистки (минуты)
CLEANUP_INTERVAL_MINUTES=30
```
#### 3. Создание необходимых директорий
```bash
mkdir -p images data
```
#### 4. Запуск бота
```bash
# Сборка и запуск
docker compose up -d --build
# Проверка логов
docker compose logs -f tg-sd-bot
```
#### 5. Остановка бота
```bash
# Остановка
docker compose down
# Остановка с удалением контейнера и volumes
docker compose down -v
```
### Способ 2: Без Docker (прямой запуск)
#### 1. Установка Python
Убедитесь, что установлен Python 3.10+:
```bash
python3 --version
```
#### 2. Создание виртуального окружения
```bash
python3 -m venv venv
source venv/bin/activate # Linux/macOS
# или
venv\Scripts\activate # Windows
```
#### 3. Установка зависимостей
```bash
pip install -r requirements.txt
```
#### 4. Настройка окружения
```bash
cp .env.example .env
nano .env # Укажите ваши значения
```
#### 5. Запуск бота
```bash
python main.py
```
---
## Настройка конфигурации
### Файл .env
| Параметр | Описание | По умолчанию | Обязательно |
|----------|----------|--------------|-------------|
| `BOT_TOKEN` | Токен Telegram бота | — | ✅ Да |
| `SD_API_URL` | URL Stable Diffusion API | `http://192.168.1.120:7860` | ✅ Да |
| `IMAGES_DIR` | Путь к папке изображений | `/app/images` | Нет |
| `DEFAULT_IMAGE_TTL_HOURS` | Время хранения по умолчанию | `48` | Нет |
| `MAX_IMAGE_TTL_HOURS` | Максимальное время хранения | `168` | Нет |
| `CLEANUP_INTERVAL_MINUTES` | Интервал очистки | `30` | Нет |
| `DB_PATH` | Путь к базе данных | `/app/data/bot.db` | Нет |
---
## Запуск бота
### Docker Compose
```bash
# Запуск
docker compose up -d
# Просмотр логов
docker compose logs -f
# Перезапуск
docker compose restart
# Остановка
docker compose down
# Обновление (после изменений в коде)
docker compose up -d --build
```
### Прямой запуск
```bash
# Активация окружения
source venv/bin/activate
# Запуск
python main.py
# Остановка: Ctrl+C
```
### Запуск как сервис (systemd, Linux)
Создайте файл сервиса:
```bash
sudo nano /etc/systemd/system/tg-sd-bot.service
```
Содержимое:
```ini
[Unit]
Description=Telegram SD Bot
After=network.target
[Service]
Type=simple
User=your_user
WorkingDirectory=/path/to/tg-sd
ExecStart=/path/to/tg-sd/venv/bin/python main.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
```
Активация:
```bash
sudo systemctl daemon-reload
sudo systemctl enable tg-sd-bot
sudo systemctl start tg-sd-bot
# Проверка статуса
sudo systemctl status tg-sd-bot
# Просмотр логов
sudo journalctl -u tg-sd-bot -f
```
---
## Использование бота
### Команды
| Команда | Описание |
|---------|----------|
| `/start` | Запуск бота, главное меню |
| `/menu` | Показать главное меню |
| `/status` | Проверка статуса SD API |
| `/cancel` | Отмена текущей операции |
### Генерация изображения (txt2img)
1. Нажмите **"🎨 Генерация (txt2img)"**
2. Введите описание изображения (промпт)
3. Введите негативный промпт (или `-` для пропуска)
4. Дождитесь результата
**Пример промпта:**
```
a beautiful sunset over mountains, golden hour, dramatic clouds, 4k, highly detailed
```
**Пример негативного промпта:**
```
blurry, low quality, watermark, text, deformed
```
### Генерация на основе изображения (img2img)
1. Нажмите **"🖼️ Генерация (img2img)"**
2. Отправьте изображение
3. Введите промпт
4. Выберите силу изменений
### Управление профилями
1. Нажмите **"⚙️ Профили"**
2. Создайте новый профиль
3. Настройте параметры:
- Размер изображения (512x512, 768x768, и т.д.)
- Количество шагов
- CFG Scale
- Сэмплер
- Модель
- LoRA и его сила
- Негативный промпт
4. Установите профиль по умолчанию (⭐)
### Настройки хранения
1. Нажмите **"🗑️ Настройки хранения"**
2. Выберите время хранения:
- 12 часов
- 24 часа (1 день)
- 48 часов (2 дня)
- 72 часа (3 дня)
- 168 часов (7 дней)
- Пользовательское значение
---
## Примеры промптов
### 📸 Фотореализм и портреты
```
professional portrait photograph of a young woman, natural lighting, soft focus, shallow depth of field, 85mm lens, film grain, highly detailed skin texture
```
```
elderly fisherman on a wooden boat at dawn, misty lake, warm golden light, cinematic composition, photorealistic, 4k
```
**Негативный промпт:**
```
blurry, low quality, watermark, text, deformed, extra fingers, bad anatomy, cartoon, illustration
```
### 🌄 Пейзажи и природа
```
majestic mountain range at sunset, snow-capped peaks, golden hour lighting, dramatic clouds reflected in a crystal clear alpine lake, wide angle, national geographic style
```
```
enchanted forest with bioluminescent mushrooms, fireflies, moonlight filtering through ancient trees, magical atmosphere, fantasy landscape, highly detailed
```
**Негативный промпт:**
```
urban, buildings, people, watermark, text, blurry, oversaturated
```
### 🏙️ Архитектура и города
```
futuristic cyberpunk city at night, neon lights, flying cars, towering skyscrapers with holographic advertisements, rain-soaked streets, cinematic lighting, blade runner style
```
```
ancient Greek temple ruins at sunrise, marble columns, overgrown with vines, peaceful atmosphere, warm morning light, archaeological photography style
```
**Негативный промпт:**
```
modern cars, people, watermark, text, low quality, distorted perspective
```
### 🐉 Фэнтези и фантастика
```
epic dragon perched on a volcanic cliff, iridescent scales, wings spread wide, stormy sky with lightning bolts, fantasy art, highly detailed, dramatic lighting, artstation trending
```
```
astronaut floating in a nebula, surrounded by cosmic dust and stars, surreal space scene, vivid colors, cinematic composition, digital art
```
**Негативный промпт:**
```
realistic, photograph, blurry, low resolution, watermark, text, bad anatomy
```
### 🎨 Художественные стили
```
oil painting of a Japanese garden in autumn, red maple trees, stone lantern, koi pond, impressionist style, visible brushstrokes, Monet inspired
```
```
watercolor illustration of a cozy cafe on a rainy day, warm interior light visible through windows, soft pastel colors, lo-fi aesthetic
```
```
pixel art of a medieval castle, 16-bit style, game sprite, clean pixels, side view
```
**Негативный промпт:**
```
photorealistic, 3d render, blurry, watermark, text
```
### 🍱 Аниме стили
```
anime girl with silver hair and blue eyes, wearing a school uniform, cherry blossom petals falling, soft lighting, Makoto Shinkai style, highly detailed anime art
```
```
anime scene of a samurai standing on a bridge at sunset, dramatic pose, katana drawn, wind blowing cloak, Studio Ghibli style, beautiful background art
```
**Негативный промпт:**
```
realistic, photograph, 3d, bad anatomy, extra limbs, watermark, text, low quality
```
### 🍔 Предметы и еда
```
professional food photography of a gourmet burger, melted cheese dripping, fresh ingredients, dark background, studio lighting, commercial photography style, 4k
```
```
luxury Swiss watch on a velvet cushion, macro photography, intricate details, dramatic side lighting, product photography, bokeh background
```
**Негативный промпт:**
```
amateur, blurry, watermark, text, bad lighting, distorted
```
### 💡 Советы по составлению промптов
1. **Используйте английский язык** — модели лучше понимают английские описания
2. **Будьте конкретны** — «sunset over mountains» лучше, чем просто «landscape»
3. **Добавляйте стиль** — укажите «oil painting», «photograph», «anime style» и т.д.
4. **Описывайте освещение** — «golden hour», «dramatic lighting», «soft morning light»
5. **Указывайте качество** — «4k», «highly detailed», «professional photography»
6. **Добавляйте композицию** — «close-up», «wide angle», «macro», «portrait»
7. **Используйте негативный промпт** — это убирает нежелательные элементы
### 🔗 Полезные ресурсы для промптов
- [PromptHero](https://prompthero.com/) — база промптов с примерами изображений
- [Lexica](https://lexica.art/) — поиск по Stable Diffusion изображениям и промптам
- [OpenArt](https://openart.ai/) — галерея с промптами
- [Civitai](https://civitai.com/) — модели, LoRA и примеры промптов
---
## FAQ
### Общие вопросы
#### ❓ Что нужно для работы бота?
Вам понадобятся:
1. **Telegram Bot Token** — получите у [@BotFather](https://t.me/BotFather)
2. **Запущенный Stable Diffusion WebUI (Automatic1111)** с флагами `--api --listen`
3. **Сервер** для запуска бота (Docker или Python)
Бот и SD WebUI могут работать на разных машинах — главное, чтобы бот имел сетевой доступ к SD API.
#### ❓ Можно ли использовать бота без своего GPU?
Да! Бот может работать на слабом сервере (даже на VPS с 256 МБ RAM), а Stable Diffusion — на мощной машине с GPU в вашей локальной сети. Бот лишь передаёт запросы и возвращает изображения.
#### ❓ Какие модели поддерживаются?
Любые модели, загруженные в ваш SD WebUI:
- **Stable Diffusion 1.5 / 2.1**
- **SDXL**
- **Кастомные модели** (ckpt/safetensors) — любые, которые вы загрузили
Бот автоматически подтягивает список доступных моделей из API.
#### ❓ Поддерживаются ли LoRA?
Да! При создании профиля вы можете выбрать LoRA из списка доступных и настроить его силу (0.0–1.0). Список LoRA загружается автоматически из SD WebUI.
#### ❓ Бот поддерживает ControlNet?
В текущей версии ControlNet не поддерживается. Если вам нужна эта функция — вы можете реализовать её, расширив `sd_client.py`.
---
### Генерация
#### ❓ Сколько времени занимает генерация?
Зависит от:
- **Количества шагов** — 20 шагов ≈ 5–15 секунд на GPU среднего уровня
- **Размера изображения** — 512×512 быстрее, чем 1024×1024
- **Модели** — SDXL медленнее, чем SD 1.5
- **Нагрузки на GPU** — если кто-то ещё использует GPU
Обычно генерация занимает **от 10 секунд до 2 минут**.
#### ❓ Почему генерация занимает слишком долго?
Возможные причины:
1. Слишком много шагов (попробуйте 20–30 вместо 50+)
2. Большой размер изображения (попробуйте 512×512 вместо 1024×1024)
3. Медленная модель (SDXL тяжелее, чем SD 1.5)
4. GPU загружен другими задачами
#### ❓ Что такое CFG Scale?
**CFG Scale** (Classifier-Free Guidance) определяет, насколько строго модель следует вашему промпту:
- **5.0** — модель более свободна, может добавлять свои детали
- **7.0** — стандарт, хороший баланс
- **9.0+** — модель строго следует промпту, но может стать «перегруженной»
#### ❓ Что такое сэмплер?
**Сэмплер** — алгоритм, который определяет, как модель «шаг за шагом» создаёт изображение из шума:
- **Euler a** — быстрый, хорошие результаты
- **DPM++ 2M Karras** — высокое качество, рекомендуемый
- **DPM++ SDE Karras** — ещё выше качество, но медленнее
- **DDIM** — быстрый, но менее детализированный
#### ❓ Можно ли использовать seed из предыдущей генерации?
После генерации бот показывает использованный seed. Вы можете создать профиль с конкретным seed (в текущей версии seed генерируется автоматически). Для точного воспроизведения используйте SD WebUI напрямую.
---
### Профили
#### ❓ Зачем нужны профили?
Профили сохраняют ваши любимые настройки. Вместо того чтобы каждый раз выбирать размер, модель, сэмплер и т.д., вы создаёте профиль один раз и используете его в один клик.
#### ❓ Сколько профилей можно создать?
Ограничений нет — создавайте столько, сколько нужно.
#### ❓ Что делает «профиль по умолчанию»?
Если профиль установлен как **по умолчанию** (⭐), его настройки будут автоматически применяться при генерации. Вы можете быстро генерировать, вводя только промпт.
---
### Доступ и администрирование
#### ❓ Почему бот не отвечает мне?
Бот работает в **закрытом режиме** — только пользователи, добавленные администратором, могут его использовать. Обратитесь к администратору, чтобы он добавил вас через админ-панель.
#### ❓ Как добавить пользователя?
1. Узнайте Telegram User ID пользователя (через [@userinfobot](https://t.me/userinfobot))
2. В админ-панели нажмите **«➕ Добавить пользователя»**
3. Введите User ID
4. Выберите тип доступа (без ограничений, по времени, по количеству генераций)
#### ❓ Как заблокировать пользователя?
В админ-панели: **Список пользователей** → выберите пользователя → **🚫 Заблокировать**.
#### ❓ Можно ли дать доступ всем?
В текущей версии бот работает только в закрытом режиме. Если вы хотите открыть доступ для всех, необходимо изменить код мидлвари `AccessCheckMiddleware`.
---
### Хранение изображений
#### ❓ Что происходит с изображениями по истечении срока?
Изображения **автоматически удаляются** с диска фоновой задачей. Записи в базе данных также очищаются.
#### ❓ Можно ли увеличить время хранения?
Да! В настройках хранения выберите нужное время или введите своё значение (до `MAX_IMAGE_TTL_HOURS`).
#### ❓ Где хранятся изображения?
В папке `images/` проекта. При использовании Docker эта папка примонтирована как volume: `./images:/app/images`.
#### ❓ Как скачать изображение?
Просто нажмите на изображение в Telegram и сохраните его. Все изображения отправляются как файлы.
---
### Технические вопросы
#### ❓ Можно ли запустить несколько экземпляров бота?
Теоретически да, но они будут использовать одну базу данных и одну папку изображений, что может привести к конфликтам. Рекомендуется запускать **один экземпляр**.
#### ❓ Как обновить бот?
```bash
docker compose down
# Скопируйте новые файлы
docker compose up -d --build
```
#### ❓ Как сделать резервную копию?
```bash
# База данных
cp data/bot.db backup_$(date +%Y%m%d).db
# Изображения
tar -czf images_backup_$(date +%Y%m%d).tar.gz images/
```
#### ❓ Как перенести бота на другой сервер?
1. Скопируйте все файлы проекта
2. Скопируйте `data/bot.db` (база данных)
3. Скопируйте `images/` (если нужны старые изображения)
4. Настройте `.env` на новом сервере
5. Запустите бот
#### ❓ Как ограничить доступ к SD API?
Используйте firewall, чтобы разрешить подключения только с IP сервера бота:
```bash
sudo ufw allow from <BOT_SERVER_IP> to any port 7860
```
---
## Структура проекта
```
tg-sd/
├── main.py # Точка входа, запуск бота
├── config.py # Настройки и конфигурация
├── requirements.txt # Зависимости Python
├── Dockerfile # Образ Docker
├── docker-compose.yml # Docker Compose конфигурация
├── .env # Переменные окружения (не в Git!)
├── .env.example # Пример переменных окружения
├── .gitignore # Игнорирование файлов Git
├── bot/ # Обработчики команд бота
│ ├── __init__.py
│ ├── handlers_start.py # /start, главное меню
│ ├── handlers_generation.py # Генерация изображений
│ ├── handlers_profiles.py # Управление профилями
│ └── handlers_settings.py # Настройки хранения
├── sd/ # Модуль Stable Diffusion
│ ├── __init__.py
│ └── sd_client.py # Клиент для SD API
├── database/ # Модуль базы данных
│ ├── __init__.py
│ └── database.py # SQLite операции
├── utils/ # Утилиты
│ ├── __init__.py
│ └── image_manager.py # Управление изображениями
├── images/ # Сгенерированные изображения (создаётся автоматически)
└── data/ # База данных (создаётся автоматически)
```
---
## Устранение неполадок
### Бот не запускается
**Проблема:** `BOT_TOKEN не установлен`
**Решение:** Убедитесь, что в файле `.env` указан корректный токен:
```env
BOT_TOKEN=ваш_реальный_токен_от_BotFather
```
### Ошибка подключения к SD API
**Проблема:** `SD API недоступно`
**Возможные причины и решения:**
1. **SD WebUI не запущен**
- Запустите WebUI с флагами `--api --listen`
2. **Неправильный адрес**
- Проверьте `SD_API_URL` в `.env`
- Убедитесь, что IP-адрес корректный
3. **Firewall блокирует порт**
```bash
# Проверьте доступность
curl http://192.168.1.120:7860/sdapi/v1/options
# Откройте порт на сервере SD
sudo ufw allow 7860/tcp
```
4. **WebUI слушает только localhost**
- Убедитесь, что используется флаг `--listen`
### Таймаут генерации
**Проблема:** Генерация занимает более 10 минут
**Решения:**
1. Уменьшите количество шагов в профиле
2. Уменьшите размер изображения
3. Используйте более быструю модель
4. Увеличьте таймаут в `sd_client.py` (параметр `timeout`)
### Изображения не сохраняются
**Проблема:** Ошибка сохранения файлов
**Решение:** Проверьте права доступа к директории:
```bash
# Для Docker
docker compose exec tg-sd-bot ls -la /app/
# Для прямого запуска
chmod 755 images/
chmod 755 data/
```
### Проблемы с базой данных
**Проблема:** Ошибки записи в БД
**Решение:** Убедитесь, что директория `data/` существует и доступна для записи:
```bash
mkdir -p data
chmod 755 data
```
### Логи бота
**Docker:**
```bash
docker compose logs -f tg-sd-bot
```
**Прямой запуск:**
Логи выводятся в консоль. Для записи в файл:
```bash
python main.py 2>&1 | tee bot.log
```
---
## Безопасность
1. **Никогда не коммитьте `.env` файл в Git** — он содержит токен бота
2. **Используйте firewall** — ограничьте доступ к порту SD API только для сервера бота
3. **Регулярно обновляйте зависимости** — проверяйте обновления пакетов
4. **Ограничьте доступ к боту** — при необходимости добавьте проверку `user_id` в обработчиках
---
## Обновление бота
```bash
# Остановка
docker compose down
# Копирование новых файлов
# Пересборка и запуск
docker compose up -d --build
```
---
## Резервное копирование
Для резервного копирования сохраните:
```bash
# База данных (профили и настройки)
cp data/bot.db backup_$(date +%Y%m%d).db
# Изображения (если нужно)
tar -czf images_backup_$(date +%Y%m%d).tar.gz images/
```
---
## Лицензия
Этот проект предоставляется "как есть" без каких-либо гарантий.
---
## Поддержка
При возникновении проблем:
1. Проверьте логи бота
2. Убедитесь, что SD API доступен
3. Проверьте корректность `.env` файла
4. Обратитесь к разделу [Устранение неполадок](#устранение-неполадок)