MAATRIX / Блог / Свое API генерации картинок на VPS

Свое API генерации картинок на VPS

Блог MAATRIX · 2026-07-07

Готовый WebUI хорош для ручной работы, но для сайта или бота нужен чистый HTTP-эндпоинт: отправил промпт — получил картинку. Соберем свое API на FastAPI поверх Stable Diffusion и задеплоим на VPS.

Архитектура решения

['Задача — спрятать тяжелую модель за легким 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\npython3 -m venv ~/api-venv\nsource ~/api-venv/bin/activate\npip install fastapi uvicorn diffusers transformers accelerate torch --index-url https://download.pytorch.org/whl/cpu\npip install fastapi uvicorn
', 'Библиотека diffusers от Hugging Face дает прямой доступ к модели из Python — не нужен посредник в виде WebUI.']

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Код API на FastAPI

['Минимальный сервер app.py, который грузит модель один раз и генерирует по запросу:', '
from fastapi import FastAPI, Header, HTTPException\nfrom diffusers import StableDiffusionPipeline\nimport torch, base64, io\n\napp = FastAPI()\npipe = StableDiffusionPipeline.from_pretrained(\n    "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float32)\npipe = pipe.to("cpu")\nAPI_KEY = "secret-key-change-me"\n\n@app.post("/generate")\ndef generate(prompt: str, steps: int = 25, x_api_key: str = Header(None)):\n    if x_api_key != API_KEY:\n        raise HTTPException(401, "bad key")\n    img = pipe(prompt, num_inference_steps=steps).images[0]\n    buf = io.BytesIO()\n    img.save(buf, format="PNG")\n    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]\nDescription=Image Gen API\nAfter=network.target\n\n[Service]\nUser=root\nWorkingDirectory=/root/imgapi\nExecStart=/root/api-venv/bin/uvicorn app:app --host 127.0.0.1 --port 8000\nRestart=always\n\n[Install]\nWantedBy=multi-user.target
', '
systemctl daemon-reload && systemctl enable --now img-api
']

TLS и защита через nginx

['Выставляем API в интернет только через nginx с HTTPS. Получаем сертификат и проксируем:', '
apt install -y nginx certbot python3-certbot-nginx\ncertbot --nginx -d api.example.com
', '
location /generate {\n    proxy_pass http://127.0.0.1:8000;\n    proxy_read_timeout 300;\n    client_max_body_size 20M;\n}
', 'Таймаут поднят до 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" \\\n  -H "x-api-key: secret-key-change-me"
']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для API генерации

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Зачем свое API, если есть WebUI?

WebUI заточен под человека. Свое API дает чистый контракт запрос-ответ, авторизацию по ключу и предсказуемый формат — это то, что нужно для встраивания в сайт или продукт.

Как ограничить нагрузку от чужих запросов?

Авторизация по ключу в заголовке плюс семафор на число одновременных генераций и rate-limit в nginx. Так один клиент не положит сервер.

Хватит ли VPS без GPU для API?

Для личного проекта или бота с невысоким трафиком — да. Модель держится в RAM, генерация идет на CPU, а быстрый NVMe убирает задержки на загрузке весов.