Свое API генерации картинок на VPS
Готовый WebUI хорош для ручной работы, но для сайта или бота нужен чистый HTTP-эндпоинт: отправил промпт — получил картинку. Соберем свое API на FastAPI поверх Stable Diffusion и задеплоим на VPS.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Архитектура решения
Задача — спрятать тяжелую модель за легким HTTP-слоем. Схема простая: FastAPI принимает запрос, кладет задачу в очередь, воркер генерирует картинку, клиент забирает результат по ссылке или в base64.
- FastAPI — тонкий веб-слой с авторизацией по ключу
- Модель — diffusers или готовый WebUI в режиме --api
- Очередь — чтобы параллельные запросы не убивали RAM
- nginx — TLS, лимиты, проксирование
Главное правило: модель грузится в память один раз при старте процесса и живет там постоянно, а веб-слой лишь передает ей задачи. Поэтому решающий ресурс — RAM под веса плюс быстрый диск, чтобы первая загрузка модели не растягивалась на минуты. Именно эту связку закрывает конфигурация AMD EPYC + NVMe у MAATRIX.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для API генерацииСтавим зависимости
apt update && apt install -y python3 python3-venv git
python3 -m venv ~/api-venv
source ~/api-venv/bin/activate
pip install fastapi uvicorn diffusers transformers accelerate torch --index-url https://download.pytorch.org/whl/cpu
pip install fastapi uvicorn
Библиотека diffusers от Hugging Face дает прямой доступ к модели из Python — не нужен посредник в виде WebUI.
Нужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Код API на FastAPI
Минимальный сервер app.py, который грузит модель один раз и генерирует по запросу:
from fastapi import FastAPI, Header, HTTPException
from diffusers import StableDiffusionPipeline
import torch, base64, io
app = FastAPI()
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", torch_dtype=torch.float32)
pipe = pipe.to("cpu")
API_KEY = "secret-key-change-me"
@app.post("/generate")
def generate(prompt: str, steps: int = 25, x_api_key: str = Header(None)):
if x_api_key != API_KEY:
raise HTTPException(401, "bad key")
img = pipe(prompt, num_inference_steps=steps).images[0]
buf = io.BytesIO()
img.save(buf, format="PNG")
return {"image": base64.b64encode(buf.getvalue()).decode()}
Модель грузится при старте процесса и висит в памяти — поэтому важен запас RAM, а не только диск.
Запуск и systemd
Локальный тест:
uvicorn app:app --host 127.0.0.1 --port 8000
Продакшн-запуск оборачиваем в сервис /etc/systemd/system/img-api.service:
[Unit]
Description=Image Gen API
After=network.target
[Service]
User=root
WorkingDirectory=/root/imgapi
ExecStart=/root/api-venv/bin/uvicorn app:app --host 127.0.0.1 --port 8000
Restart=always
[Install]
WantedBy=multi-user.target
systemctl daemon-reload && systemctl enable --now img-api
TLS и защита через nginx
Выставляем API в интернет только через nginx с HTTPS. Получаем сертификат и проксируем:
apt install -y nginx certbot python3-certbot-nginx
certbot --nginx -d api.example.com
location /generate {
proxy_pass http://127.0.0.1:8000;
proxy_read_timeout 300;
client_max_body_size 20M;
}
Таймаут поднят до 300 секунд, потому что генерация на CPU занимает десятки секунд. AMD EPYC + NVMe у MAATRIX сокращают это время и держат несколько последовательных запросов без деградации.
Очередь и частые ошибки
Если ждешь параллельные запросы, не генерируй в том же процессе синхронно — иначе один тяжелый промпт заблокирует всех. Ставь очередь (Celery + Redis или простой asyncio-семафор), ограничивающую число одновременных генераций до 1–2.
- 502 от nginx — увеличь proxy_read_timeout, генерация не успевает.
- OOM Killer убил процесс — модель + параллельные запросы съели RAM, ставь семафор.
- Первый запрос очень долгий — идет загрузка весов, прогрей модель при старте.
Проверка боем:
curl -X POST "https://api.example.com/generate?prompt=egyptian+cat+god&steps=20" \
-H "x-api-key: secret-key-change-me"
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для API генерацииОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Зачем свое API, если есть WebUI?
WebUI заточен под человека. Свое API дает чистый контракт запрос-ответ, авторизацию по ключу и предсказуемый формат — это то, что нужно для встраивания в сайт или продукт.
Как ограничить нагрузку от чужих запросов?
Авторизация по ключу в заголовке плюс семафор на число одновременных генераций и rate-limit в nginx. Так один клиент не положит сервер.
Хватит ли VPS без GPU для API?
Для личного проекта или бота с невысоким трафиком — да. Модель держится в RAM, генерация идет на CPU, а быстрый NVMe убирает задержки на загрузке весов.
Нужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.