Свое API генерации картинок на VPS
Готовый WebUI хорош для ручной работы, но для сайта или бота нужен чистый HTTP-эндпоинт: отправил промпт — получил картинку. Соберем свое API на FastAPI поверх Stable Diffusion и задеплоим на VPS.
Содержание
Архитектура решения
['Задача — спрятать тяжелую модель за легким HTTP-слоем. Схема простая: FastAPI принимает запрос, кладет задачу в очередь, воркер генерирует картинку, клиент забирает результат по ссылке или в base64.', '- FastAPI — тонкий веб-слой с авторизацией по ключу
- Модель — diffusers или готовый WebUI в режиме --api
- Очередь — чтобы параллельные запросы не убивали RAM
- nginx — TLS, лимиты, проксирование
Нужен сервер под эту задачу?
Разверните 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 убирает задержки на загрузке весов.