بیشتر ابزارها و کتابخانههای هوش مصنوعی برای API شرکت OpenAI ساخته شدهاند. اگر روی سرور خودتان یک OpenAI-Compatible API بسازید، همه این ابزارها، از n8n و LangChain تا افزونههای وردپرس و رابطهایی مثل Open WebUI، فقط با تغییر یک آدرس به مدلهای متنباز شما وصل میشوند. در این راهنما چنین APIای را با Ollama یا vLLM میسازیم و مهمتر از آن، با کلید API، HTTPS و محدودیت نرخ آن را امن میکنیم.
فهرست مطالب
چرا API سازگار با OpenAI؟
فرمت API شرکت OpenAI، بهخصوص مسیر /v1/chat/completions، به استاندارد غیررسمی صنعت تبدیل شده است. اگر سرور شما همین فرمت را ارائه کند:
- کدهای موجود که با کتابخانه رسمی
openaiنوشته شدهاند، فقط با تغییرbase_urlکار میکنند. - ابزارهایی مثل n8n، LangChain، LlamaIndex، Open WebUI و LibreChat بدون تغییر به مدل شما وصل میشوند.
- میتوانید بین مدل محلی و سرویسهای ابری جابهجا شوید، بدون بازنویسی برنامه.
- دادهها از سرور شما خارج نمیشوند و هزینه بهازای توکن ندارید.
معماری پیشنهادی
موتورهای اجرای مدل معمولاً احراز هویت درست، محدودیت نرخ و HTTPS ندارند و نباید مستقیم روی اینترنت باز شوند. معماری امن این است:
- موتور اجرای مدل (Ollama یا vLLM) فقط روی
127.0.0.1گوش میدهد. - Nginx بهعنوان Reverse Proxy جلوی آن قرار میگیرد، HTTPS را مدیریت میکند، کلید API را بررسی میکند و نرخ درخواست را محدود میکند.
- کاربران و برنامهها فقط با Nginx و از طریق دامنهای مثل
api.example.comارتباط دارند.
قدم اول: موتور اجرای مدل
گزینه الف: Ollama
Ollama مسیر /v1 سازگار با OpenAI را بهصورت پیشفرض روی پورت ۱۱۴۳۴ ارائه میکند. کافی است Ollama نصب و مدل دانلود شده باشد؛ آموزش آن را در نصب Ollama روی سرور GPU آوردهایم. مطمئن شوید OLLAMA_HOST روی 127.0.0.1 است.
گزینه ب: vLLM
برای تعداد کاربر بیشتر، vLLM توان عملیاتی بسیار بالاتری دارد:
vllm serve Qwen/Qwen2.5-7B-Instruct --host 127.0.0.1 --port 8000
با جزئیات vLLM در مقاله vLLM چیست و با معیار انتخاب بین این دو در Ollama یا vLLM آشنا شوید. در ادامه فرض میکنیم موتور روی 127.0.0.1:11434 (Ollama) در حال اجراست.
قدم دوم: Nginx با کلید API و HTTPS
ابتدا برای هر کاربر یا برنامه یک کلید تصادفی بسازید:
openssl rand -hex 24
سپس فایل پیکربندی Nginx را بسازید. بخش map باید در سطح http باشد، که با قرار دادن فایل در /etc/nginx/conf.d/ برقرار است:
map $http_authorization $api_client {
default "";
"Bearer KEY_FOR_N8N_HERE" "n8n";
"Bearer KEY_FOR_WEBSITE_HERE" "website";
}
limit_req_zone $api_client zone=llm_api:10m rate=30r/m;
server {
listen 443 ssl;
http2 on;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
client_max_body_size 10m;
location /v1/ {
if ($api_client = "") { return 401; }
limit_req zone=llm_api burst=10 nodelay;
proxy_pass http://127.0.0.1:11434;
proxy_http_version 1.1;
proxy_set_header Host localhost;
proxy_set_header Authorization "";
proxy_buffering off;
proxy_read_timeout 300s;
}
location / { return 404; }
}
نکات مهم این پیکربندی:
- درخواست بدون کلید معتبر با کد ۴۰۱ رد میشود و هر کلید نام مشخصی دارد که در لاگها قابل ردیابی است.
limit_reqبرای هر کلید حداکثر ۳۰ درخواست در دقیقه را مجاز میکند تا یک برنامه معیوب کل GPU را اشغال نکند.proxy_buffering offبرای پاسخهای Streaming ضروری است؛ بدون آن، کاربر کل پاسخ را یکجا و با تأخیر میبیند.proxy_read_timeoutباید از طولانیترین پاسخ مدل بیشتر باشد.- فقط مسیر
/v1/منتشر شده و APIهای مدیریتی موتور (مثل حذف یا دانلود مدل) از بیرون در دسترس نیستند.
گواهی SSL را با Certbot بگیرید و Nginx را بارگذاری مجدد کنید:
sudo certbot certonly --nginx -d api.example.com
sudo nginx -t && sudo systemctl reload nginx
قدم سوم: تست با curl و پایتون
curl https://api.example.com/v1/chat/completions \
-H "Authorization: Bearer KEY_FOR_N8N_HERE" \
-H "Content-Type: application/json" \
-d '{"model": "qwen2.5:7b", "messages": [{"role": "user", "content": "سلام"}]}'
و با کتابخانه رسمی OpenAI در پایتون، بدون هیچ تغییر دیگری در کد:
from openai import OpenAI
client = OpenAI(base_url="https://api.example.com/v1", api_key="KEY_FOR_N8N_HERE")
stream = client.chat.completions.create(
model="qwen2.5:7b",
messages=[{"role": "user", "content": "SSL چیست؟"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")
یک درخواست بدون کلید هم بفرستید و مطمئن شوید پاسخ ۴۰۱ میگیرید.
گزینه پیشرفته: LiteLLM بهعنوان Gateway
اگر به امکانات بیشتری نیاز دارید، LiteLLM Proxy یک Gateway متنباز است که بین کاربران و موتورها قرار میگیرد و این قابلیتها را اضافه میکند:
- ساخت و ابطال کلید API از طریق پنل، بدون ویرایش فایل Nginx.
- سقف بودجه و سهمیه توکن برای هر کلید یا تیم.
- گزارش مصرف به تفکیک کاربر و مدل.
- تقسیم بار بین چند سرور GPU و استفاده از سرویس ابری بهعنوان پشتیبان در زمان شلوغی.
در این حالت Nginx فقط HTTPS را مدیریت میکند و درخواستها را به LiteLLM میفرستد.
چکلیست امنیتی
- موتور اجرای مدل فقط روی
127.0.0.1یا شبکه خصوصی در دسترس باشد. باss -tlnpبررسی کنید. - فایروال سرور فقط پورتهای ۴۴۳ و SSH را باز بگذارد؛ چکلیست کامل را در تنظیمات امنیتی VPS ببینید.
- برای هر برنامه کلید جداگانه بسازید تا در صورت نشت، فقط همان کلید باطل شود.
- کلیدها را در کد سمت کاربر (JavaScript مرورگر یا اپلیکیشن موبایل) قرار ندهید؛ درخواستها باید از سرور شما ارسال شوند.
- لاگهای Nginx را برای الگوهای مصرف غیرعادی پایش کنید.
سوالات متداول
آیا Streaming پاسخها پشتیبانی میشود؟
بله. Ollama و vLLM هر دو از Server-Sent Events پشتیبانی میکنند. فقط مطمئن شوید proxy_buffering off در Nginx تنظیم شده است.
آیا قابلیت Function Calling هم کار میکند؟
بله، به شرطی که مدل از Tool Calling پشتیبانی کند (مثل Qwen ۲.۵ و Llama ۳.۱). vLLM برای این کار به پارامترهای اضافه هنگام اجرا نیاز دارد.
نام مدل در درخواستها چه باشد؟
در Ollama همان نام مدل مثل qwen2.5:7b و در vLLM نام مخزن Hugging Face یا نامی که با --served-model-name تعیین کردهاید.
آیا میتوانم این API را به کاربران دیگر بفروشم؟
از نظر فنی بله، اما لایسنس هر مدل را بررسی کنید و حتماً از Gateway با سهمیه و گزارش مصرف، مثل LiteLLM، استفاده کنید.
API هوش مصنوعی اختصاصی روی سرور خودتان
با سرورهای GPU تراست هاست یک API سازگار با OpenAI بسازید؛ با حریم خصوصی کامل و بدون هزینه بهازای توکن.