فورک کردن این پروژه (بهخصوص اگر تعداد زیادی کاربر دقیقاً همین کار را انجام دهند) ممکن است ریسک محدودسازی/بن شدن اکانتها را بالا ببرد. اگر میخواهید ریسک کمتر باشد، پیشنهاد میشود از گزینه B (Netlify CLI بدون فورک) استفاده کنید.
یک پروکسی سبک و جریانمحور (streaming) برای ترافیک VLESS + XHTTP با استفاده از Netlify Edge Functions.
فورک کنید، به گیتهاب متصل شوید، یک متغیر محیطی تنظیم کنید و در ۶۰ ثانیه راهاندازی شوید – محدودیتهای پلن رایگان Netlify بهصورت Credit-based است و ممکن است تغییر کند (جزئیات: https://www.netlify.com/pricing/).
این پروژه با الهام از Vercel‑XHTTP ساخته شده و جایگزینی تقریباً بدون تغییر برای نسخهی Vercel ارائه میدهد. تمام درخواستهای ورودی – از جمله WebSocket و دادههای جریانی – را به سرور شخصی Xray شما ارسال میکند، دقیقاً مانند نسخهی اصلی، اما روی شبکهی جهانی Netlify.
| ویژگی | Vercel‑XHTTP (اصلی) | Netlify‑XHTTP (این پروژه) |
|---|---|---|
| پهنای باند | ۱۰ گیگابایت در ماه | Credit-based (طبق صفحه قیمتگذاری Netlify) |
| جریان (Streaming) | داخلی (Node.js streams) | بومی (Edge Function ReadableStream) |
| زمان انقضا | ۱۰ ثانیه (طرح Hobby) | ۳۰ ثانیه (همهی طرحها) |
| استقرار | داشبورد Vercel | داشبورد Netlify + فورک گیتهاب |
| WebSocket | پشتیبانی از طریق جریان | پشتیبانی از طریق جریان |
| دامنه شخصی | بله | بله (SSL رایگان) |
۱. شما این پروژه را به عنوان Edge Function روی Netlify مستقر میکنید.
۲. تابع روی تمام مسیرهای دامنهی Netlify شما (/*) گوش میدهد.
۳. هر درخواست HTTP/HTTPS ورودی بدون تغییر به سرور بکاند Xray شما (که VLESS + XHTTP را اجرا میکند) ارسال میشود.
۴. پاسخ به صورت زنده و جریانی به کلاینت بازگردانده میشود – بدون بافر، بدون قطع ارتباط زنده.
کلاینت (برنامهی شما) → Netlify Edge → بکاند شما (Xray + VLESS + XHTTP)
- یک سرور Xray فعال با ورودی VLESS + XHTTP
(مثلاً در حال گوشدادن رویhttps://your-backend-server.com:443) - یک حساب Netlify
- یک حساب گیتهاب
برای اینکه کانفیگها شبیه هم نشوند و ریسک شناسایی/مسدود شدن کمتر شود، حتماً مقادیر پیشفرض و اطلاعات حساس را تغییر دهید. حداقل این موارد را برای هر نفر/هر سرور یکتا کنید:
- UUID/ID کاربر در VLESS
- Path مربوط به XHTTP (مثلاً به جای مسیرهای ساده، یک مسیر غیرقابل حدس بگذارید)
- Domain/Host (ترجیحاً دامنهی شخصی)
- در صورت استفاده از تنظیمات اضافی مثل SNI/ALPN، آنها را با توجه به سرور خودتان تنظیم کنید
اگر از کانفیگهای آماده/کپیشده استفاده کنید و همه دقیقاً یکسان باشند، احتمال مشکل (از جمله محدودسازی/بن شدن) بیشتر میشود.
روی دکمهی Fork در بالای همین صفحه کلیک کنید تا یک کپی در حساب گیتهاب خودتان ایجاد شود.
- وارد Netlify شوید و روی “Add new site” → “Import an existing project” کلیک کنید.
- GitHub را انتخاب کنید، در صورت نیاز مجوز دهید و مخزن فورکشدهی خود را برگزینید.
- Netlify بهطور خودکار تنظیمات را از فایل
netlify.tomlتشخیص میدهد – نیازی به تغییر دستور build یا پوشهی publish نیست.
- در داشبورد Netlify، به Site settings → Environment variables بروید.
- یک متغیر جدید اضافه کنید:
- Key:
BACKEND_URL - Value: آدرس کامل بکاند Xray، مثلاً
https://my-vps.com(اسلش/در انتها قرار ندهید)
- Key:
- متغیر را ذخیره کنید.
- به تب Deploys برگردید و روی “Trigger deploy” کلیک کنید (اگر قبلاً مستقر نشده است).
- پس از چند ثانیه، وبسایت شما روی دامنهای تصادفی به فرم
something.netlify.appدر دسترس خواهد بود.
کلاینت XHTTP خود (مانند v2rayN، Nekoray یا برنامههای سفارشی) را باز کرده و تنظیم کنید:
- آدرس (host): دامنهی Netlify شما (
https://your-site.netlify.app) - پورت: 443
- مسیر: هر چیزی که بکاند شما انتظار دارد (مثلاً
/your-xhttp-path)
تمام! اکنون ترافیک شما از لبهی شبکهی جهانی Netlify به بکاند شما جریان مییابد، درست مانند نسخهی Vercel.
💡 دامنهی شخصی؟
در Netlify، به Domain settings بروید و دامنهی شخصی خود را اضافه کنید. سپس کلاینت را با آن دامنه بهروز کنید.
اگر نمیخواهید فورک کنید یا گیتهاب را به Netlify وصل کنید، میتوانید مستقیم از روی سیستم خودتان دیپلوی کنید.
npm i -g netlify-clinetlify logingit clone https://github.com/avacocloud/netlify-XHHTP.git
mv netlify-XHHTP xxx-xxx-xxxxx
cd xxx-xxx-xxxxxنکته:
- منظور از
xxxاین است که بهجای آن هر اسمی دوست دارید بگذارید. - بهتر است بعد از کلون، اسم پوشه/پروژه را عوض کنید تا پروژههای همه یک نام یکسان نداشته باشند.
netlify initپیشنهاد:
- گزینهی Create & configure a new site را انتخاب کنید.
- وقتی دربارهی build settings سوال پرسید، تنظیمات داخل
netlify.tomlرا دستنزنید (build command لازم نیست).
netlify env:set BACKEND_URL "https://my-vps.com:port"نکتهها:
- مقدار باید یک URL کامل باشد.
- در انتهای آدرس، اسلش
/نگذارید.
netlify deploy --prodبعد از دیپلوی، آدرسی که CLI نمایش میدهد (یا دامنهی شخصیتان) را به عنوان Host داخل کلاینت وارد کنید.
۱. یک پروفایل VLESS بسازید یا ویرایش کنید. ۲. این فیلدها را تنظیم کنید:
- Address / Server: دامنهی Netlify شما (مثل
your-site.netlify.app) یا دامنهی شخصی - Port:
443 - Transport / Network:
xhttp - Path: مسیر XHTTP روی بکاند (باید با ورودی Xray یکی باشد)، مثلاً
/your-xhttp-path۳. TLS را فعال کنید. ۴. ذخیره کنید و اتصال را تست کنید.
۱. یک پروفایل VLESS بسازید/ایمپورت کنید. ۲. در تنظیمات انتقال (Transport) گزینهی XHTTP را انتخاب کنید. ۳. این فیلدها را تنظیم کنید:
- Server / Host: دامنهی Netlify یا دامنهی شخصی
- Port:
443 - Path: مثلاً
/your-xhttp-path۴. TLS را فعال کنید و اتصال را برقرار کنید.
تنها فایلی که ممکن است بخواهید مشاهده کنید proxy.js است – یک کنترلکنندهی ساده ۵۰ خطی که همه چیز را ارسال میکند.
کافیست متغیر BACKEND_URL را در داشبورد Netlify ویرایش کنید. درخواست بعدی مقدار جدید را فوراً دریافت میکند (نیازی به بیلد مجدد نیست).
اگر بکاند شما مسیر ثابتی انتظار دارد (مثلاً /my‑secret)، میتوانید آن را مستقیماً در proxy.js مقداردهی کنید:
// در proxy.js، ساخت URL را اینگونه تغییر دهید:
const upstreamUrl = new URL('/my-secret' + url.search, BACKEND_URL).toString();سپس کلاینت میتواند از هر مسیری استفاده کند – تابع همیشه به /my-secret روی بکاند ارسال میکند.
این معمولاً به این معنی است که Edge Function شناسایی نشده است.
۱. تب Functions در Netlify را بررسی کنید – باید proxy در بخش Edge Functions فهرست شده باشد.
۲. اگر موجود نیست، لاگهای استقرار را ببینید. هر خطای نحوی در proxy.js مانع بارگذاری تابع میشود.
۳. مطمئن شوید netlify.toml دقیقاً مانند همین مخزن است (براکت دوتایی برای [[edge_functions]]، نام صحیح تابع).
۴. یک استقرار کاملاً تازه را امتحان کنید: یک سایت جدید در Netlify ایجاد کرده و مخزن را دوباره متصل کنید.
- مطمئن شوید بکاند شما از اینترنت قابل دسترسی است (فایروال، پورت صحیح).
- از
BACKEND_URLبا گواهی خود-امضا استفاده نکنید –fetchدر Netlify به گواهی HTTPS معتبر نیاز دارد (روی بکاند خود Let’s Encrypt نصب کنید). - Edge Functions محدودیت زمانی ۳۰ ثانیه دارند. جریانهای طولانی (مانند ویدیو) کار خواهند کرد، اما اتصال باید در این بازه کامل شود. برای اتصالات دائمی WebSocket، کلاینت باید قابلیت اتصال مجدد داشته باشد.
طرح رایگان Netlify الان بر اساس Credit است و محدودیتها ممکن است با گذشت زمان تغییر کنند. برای دیدن محدودیتهای دقیق پلن رایگان و هزینه/مصرف پهنای باند، صفحهی رسمی قیمتگذاری Netlify را بررسی کنید:
اگر پهنای باند بیشتری نیاز دارید، پلن را ارتقا دهید یا مصرف ترافیک را بهینه کنید. برای پهنای باند نامحدود، Cloudflare Workers را در نظر بگیرید – اما نیازمند بازنویسی پروکسی برای محیط Workers خواهد بود.
- محیط اجرا: Edge Functions از API وب مبتنی بر Deno استفاده میکنند، نه Node.js. جریاندهی کاملاً بومی است.
- پیکربندی: فایل
vercel.jsonباnetlify.tomlجایگزین شده. نیازی بهrewritesنیست؛ بلوک[[edge_functions]]مسیریابی را انجام میدهد. - متغیر محیطی: از
BACKEND_URLاستفاده کنید (ممکن است در نسخهی اصلی نام متغیر متفاوتی به کار رفته باشد). - شروع سرد (Cold starts): Edge Functions شروع فوقالعاده سریعی دارند (< 50ms)، قابل مقایسه با Vercel.
این پروژه با الهام از Vercel‑XHTTP ساختهشده توسط avaco-cloud ایجاد شده است.
کد این مخزن تحت مجوز MIT ارائه میشود – میتوانید آزادانه تغییر دهید و توزیع کنید.
تلگرام: https://t.me/avaco_cloud
پراکسی خوبی داشته باشید! اگر با مشکلی مواجه شدید، issue باز کنید یا تماس بگیرید.