چگونه یک OpenAI-Compatible API شخصی و امن روی سرور بسازیم؟

چگونه یک OpenAI-Compatible API شخصی و امن روی سرور بسازیم؟

جدول محتوا 👇

بیشتر ابزارها و کتابخانه‌های هوش مصنوعی برای 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 ندارند و نباید مستقیم روی اینترنت باز شوند. معماری امن این است:

  1. موتور اجرای مدل (Ollama یا vLLM) فقط روی 127.0.0.1 گوش می‌دهد.
  2. Nginx به‌عنوان Reverse Proxy جلوی آن قرار می‌گیرد، HTTPS را مدیریت می‌کند، کلید API را بررسی می‌کند و نرخ درخواست را محدود می‌کند.
  3. کاربران و برنامه‌ها فقط با 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 بسازید؛ با حریم خصوصی کامل و بدون هزینه به‌ازای توکن.

Ollama چیست و چگونه مدل هوش مصنوعی را روی سرور شخصی اجرا کنیم؟

مشاوره تراست‌هاست​

با متخصصان و کارشناسان به صورت رایگان!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *