📢 کانال تلگرام Avaco Cloud — برای آموزشهای بیشتر، آپدیتها، روشهای دور زدن سانسور و کانفیگهای جدید عضو شو:
A minimal relay running on Vercel Edge Functions that forwards XHTTP traffic from your Xray/V2Ray client to your backend Xray server. The goal: use Vercel's global edge network and the *.vercel.app domain as a front to hide the real IP of your origin server.
- این پروژه برای کیه؟
- نحوهی کار (معماری)
- محدودیتها و هشدارها
- پیشنیازها
- مرحله ۱ — خرید VPS
- مرحله ۲ — تنظیم دامنه و DNS
- مرحله ۳ — اتصال SSH به VPS
- مرحله ۴ — نصب Xray
- مرحله ۵ — گرفتن TLS Certificate
- مرحله ۶ — کانفیگ Xray با XHTTP
- مرحله ۷ — Deploy روی Vercel
- مرحله ۸ — کانفیگ کلاینت
- محدودیتهای Vercel
- عیبیابی
- سوالات متداول
این پروژه فقط زمانی به دردت میخوره که خودت یک سرور Xray با XHTTP داری و میخوای IP اون رو با Vercel استتار کنی.
❌ به دردت نمیخوره اگر:
- فقط یه کانفیگ آماده (vless/vmess) از فروشنده گرفتی
- کانفیگت WebSocket / gRPC / Reality / Trojan / TCP هست
- میخوای بدون VPS فقط با Vercel پروکسی بسازی
- ترافیک سنگین داری (استریم 4K، دانلود حجیم، torrent، چندکاربره) — چون Fast Origin Transfer در Hobby خیلی زود تموم میشه و حساب Pause میشه
✅ به دردت میخوره اگر:
- VPS داری یا میخوای بگیری
- میخوای transport رو XHTTP بذاری
- میخوای IP سرورت پنهان بمونه
- استفادهی شخصی و سبک میکنی (چت، مرور وب، ویدیو تا 1080p، موزیک)
- یا حاضری برای ترافیک سنگین پلن Pro بگیری
┌──────────┐ TLS, SNI=vercel.com ┌──────────────┐ HTTP/2 ┌──────────────┐
│ کلاینت │ ─────────────────────► │ Vercel Edge │ ────────► │ سرور Xray │
│ (v2rayN/ │ XHTTP request │ (relay) │ forward │ XHTTP inbound│
│ Hiddify) │ │ │ │ │
└──────────┘ └──────────────┘ └──────────────┘
- کلاینت با SNI=
vercel.comبه دامنهی Vercel وصل میشه. برای سانسورچی شبیه ترافیک عادی Vercel بهنظر میرسه. - Vercel Edge Function بدنهی request رو بدون buffer به سرور Xray فوروارد میکنه.
- پاسخ هم به همون صورت stream میشه برمیگرده.
🔴 هشدار مهم — Fast Origin Transfer: در پلن Hobby هر بایت ترافیک دو بار شمرده میشه (یکبار کلاینت↔Vercel و یکبار Vercel↔سرور). اگه سهمیه تموم بشه، Vercel اکانتت رو Pause میکنه، کاربرا دیگه نمیتونن وصل بشن و ۳۰ روز باید صبر کنی یا Pro بخری. جزئیات در بخش محدودیتهای Vercel.
برای جلوگیری از قطع شدن اتصال در وسط ماه:
- 📊 Dashboard → Usage رو هفتگی چک کن (Vercel هنگام ۸۰٪ و ۱۰۰٪ ایمیل میفرسته)
- 🔄 چند پروژه Hobby با چند اکانت Gmail بساز و در کلاینت بهصورت Load Balance / Failover تنظیم کن
- ⏸ ویدیوهای 4K و دانلودهای حجیم رو از پروکسی خارج کن (مستقیم یا از پروکسی دیگه)
- 💳 اگه ترافیک زیاد داری، Pro ($20/ماه) بگیر و با Spend Management سقف هزینه بذار
| مورد | توضیح |
|---|---|
| VPS | یک سرور لینوکس خارج از ایران با IP عمومی (ترجیحاً Ubuntu 22.04 یا 24.04) |
| دامنه | یک دامنه (پولی یا رایگان مثل DuckDNS) که A record اون به IP سرور اشاره کنه |
| اکانت Vercel | رایگان از vercel.com |
| Node.js + npm | روی سیستم محلی برای Vercel CLI (میتونی از داشبورد هم deploy کنی) |
| اکانت GitHub | اختیاری، اگه از روش Dashboard استفاده میکنی |
این راهنما هم برای ویندوز و هم مک/لینوکس نوشته شده. در هر مرحله بسته به OS خودت دستورات معادل رو میبینی.
همهی ابزارهای زیر رایگان هستن:
| ابزار | لینک نصب | کاربرد |
|---|---|---|
| PowerShell | از قبل نصبه (در منوی Start جستجو کن) | اجرای دستورات |
| OpenSSH Client | از قبل در Win10/11 نصبه (راهنما) | اتصال SSH |
| Git for Windows | git-scm.com/download/win | git + Git Bash |
| Node.js LTS | nodejs.org — installer رو دانلود و Next-Next-Finish | برای Vercel CLI |
| PuTTY (اختیاری) | putty.org | جایگزین SSH با GUI |
💡 توصیه: بعد از نصب Git for Windows از Git Bash استفاده کن، چون دستورات یونیکسی (مثل
curl,ssh,cat) داخلش طبیعی کار میکنن. این راهنما رو راحتتر میکنه.
| ابزار | روش نصب |
|---|---|
| Terminal | از قبل نصبه |
| ssh, curl, dig | از قبل نصبن |
| Homebrew (Mac) | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
| Node.js | brew install node (Mac) یا apt install nodejs npm (Linux) |
| Git | brew install git (Mac) یا apt install git (Linux) |
| ارائهدهنده | قیمت ماهانه | لوکیشن پیشنهادی |
|---|---|---|
| Hetzner | ~€4.5 | Frankfurt / Helsinki |
| Contabo | ~$4.5 | EU / US |
| Vultr | $5-6 | EU / US |
| DigitalOcean | $6 | متعدد |
- RAM: ۱ GB
- CPU: ۱ vCPU
- Disk: ۲۰ GB SSD
- Bandwidth: حداقل ۱ TB/ماه
- OS: Ubuntu 22.04 یا 24.04
پس از خرید، IP عمومی و رمز SSH رو از داشبورد بگیر.
- پولی: Namecheap, Porkbun, Cloudflare Registrar
- رایگان: DuckDNS
- وارد dash.cloudflare.com شو
- روی دامنهت کلیک کن → منوی DNS → Records
- Add record:
| فیلد | مقدار |
|---|---|
| Type | A |
| Name | xray (یا هر چیز دلخواه — میشه xray.yourdomain.com) |
| IPv4 address | IP عمومی VPS تو (مثلاً 203.0.113.45) |
| Proxy status | ⚫ DNS only (خاکستری، نه نارنجی) |
| TTL | Auto |
🔴 Proxy status حتماً DNS only باشه. اگه Proxied بذاری، Cloudflare وسط ترافیک قرار میگیره و کار نمیکنه.
🍎 Mac / 🐧 Linux:
dig @8.8.8.8 xray.yourdomain.com +short🪟 Windows (PowerShell):
Resolve-DnsName xray.yourdomain.com -Server 8.8.8.8 -Type Aیا با nslookup:
nslookup xray.yourdomain.com 8.8.8.8🪟 Windows (Git Bash):
nslookup xray.yourdomain.com 8.8.8.8باید IP سرور تو رو برگردونه. ممکنه ۱-۵ دقیقه طول بکشه.
ssh root@YOUR_VPS_IPاولین بار yes بزن. رمز رو وارد کن (هنگام تایپ نشون داده نمیشه — این طبیعیه).
- PuTTY رو باز کن
- Host Name (or IP address):
YOUR_VPS_IP - Port:
22 - Connection type:
SSH - Open بزن
- اولین بار Accept بزن
- login:
root+ Enter، رمز رو وارد کن
💡 پس از این مرحله، تمام دستوراتی که با
#(یاroot@vps:~#) شروع میشن، داخل سرور SSH اجرا میشن — مهم نیست از Mac وصل شدی یا Windows.
cat /etc/os-releaseباید Ubuntu 22.04 یا 24.04 رو ببینی.
apt update && apt upgrade -y
apt install -y curl socat cron ufwbash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ installپس از چند ثانیه:
info: Xray vXX.X.X is installed.
xray version
⚠️ نسخه باید حداقل v1.8.16 باشه (برای XHTTP). نسخههای جدیدتر (مثل ۲۶.x) بهترن.
xray uuidخروجی مثل:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
این UUID رو ذخیره کن — بعداً تو کانفیگ سرور و کلاینت لازمه.
systemctl enable xrayufw allow 22/tcp # SSH
ufw allow 80/tcp # برای صدور cert
ufw allow 443/tcp # برای آینده
ufw allow 2096/tcp # پورت Xray ما
ufw --force enable
ufw status
⚠️ قبل ازufw --force enableمطمئن شو پورت ۲۲ allow شده، وگرنه ارتباط SSH قطع میشه.
از acme.sh + Let's Encrypt استفاده میکنیم (رایگان، خودکار).
curl https://get.acme.sh | sh -s email=your@email.com
source ~/.bashrc~/.acme.sh/acme.sh --set-default-ca --server letsencryptss -tlnp | grep :80اگه چیزی listen میکنه (مثل apache یا nginx)، خاموشش کن:
systemctl stop apache2 2>/dev/null
systemctl disable apache2 2>/dev/null
systemctl stop nginx 2>/dev/null~/.acme.sh/acme.sh --issue -d xray.yourdomain.com --standalone -k ec-256جای
xray.yourdomain.comدامنهی واقعی خودت رو بذار.
خروجی موفق:
Cert success.
Your cert is in: /root/.acme.sh/xray.yourdomain.com_ecc/...
mkdir -p /etc/xray
~/.acme.sh/acme.sh --install-cert -d xray.yourdomain.com --ecc \
--fullchain-file /etc/xray/cert.pem \
--key-file /etc/xray/key.pem \
--reloadcmd "systemctl restart xray"
chown -R nobody:nogroup /etc/xray
chmod 644 /etc/xray/cert.pem
chmod 640 /etc/xray/key.pem
ls -la /etc/xray/باید cert.pem و key.pem رو ببینی.
mkdir -p /var/log/xray
touch /var/log/xray/access.log /var/log/xray/error.log
chown -R nobody:nogroup /var/log/xray
cp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.bak 2>/dev/null || true📝 قبل از پیست، این مقادیر رو در ذهن داشته باش:
YOUR-UUID-HERE→ UUID که ازxray uuidگرفتیxray.yourdomain.com→ دامنهی واقعی خودت/yourpath→ یه path دلخواه (مثلاً/myapppath)
cat > /usr/local/etc/xray/config.json << 'EOF'
{
"log": {
"loglevel": "warning",
"access": "/var/log/xray/access.log",
"error": "/var/log/xray/error.log"
},
"inbounds": [
{
"tag": "xhttp-in",
"listen": "0.0.0.0",
"port": 2096,
"protocol": "vless",
"settings": {
"clients": [
{ "id": "YOUR-UUID-HERE", "flow": "" }
],
"decryption": "none"
},
"streamSettings": {
"network": "xhttp",
"security": "tls",
"tlsSettings": {
"alpn": ["h2", "http/1.1"],
"certificates": [
{
"certificateFile": "/etc/xray/cert.pem",
"keyFile": "/etc/xray/key.pem"
}
]
},
"xhttpSettings": {
"path": "/yourpath",
"host": "xray.yourdomain.com",
"mode": "auto"
}
}
}
],
"outbounds": [
{ "protocol": "freedom", "tag": "direct" },
{ "protocol": "blackhole", "tag": "blocked" }
]
}
EOF
⚠️ بعد از پیست، فایل رو باnano /usr/local/etc/xray/config.jsonباز کن و سه مقدارYOUR-UUID-HERE,/yourpath,xray.yourdomain.comرو با مقادیر واقعی جایگزین کن.
xray -test -config /usr/local/etc/xray/config.jsonباید ببینی: Configuration OK.
systemctl restart xray
systemctl status xray --no-pager
ss -tlnp | grep 2096curl -vk https://127.0.0.1:2096/yourpathاگه HTTP/2 404 گرفتی → عالیه! (404 طبیعیه چون UUID نفرستادی، یعنی Xray داره کار میکنه.)
دو روش: CLI (سریعتر) یا Dashboard (با GitHub).
🍎 Mac:
# اگه Homebrew نداری
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install node
sudo npm i -g vercel
vercel --version🐧 Linux (Ubuntu/Debian):
sudo apt update
sudo apt install -y nodejs npm
sudo npm i -g vercel
vercel --version🪟 Windows:
-
نصب Node.js:
- برو nodejs.org
- نسخهی LTS رو دانلود کن (فایل
.msi) - دابلکلیک کن، Next تا Finish
- حتماً تیک Add to PATH فعال باشه
-
نصب Vercel CLI (در PowerShell یا Git Bash):
npm i -g vercel vercel --version
اگه permission error داد، PowerShell رو As Administrator باز کن و دوباره بزن.
در هر سیستمعاملی:
vercel loginبا فلش Continue with Email رو انتخاب کن، ایمیلت رو بزن، روی لینک تأیید کلیک کن.
🍎 Mac / 🐧 Linux / 🪟 Git Bash:
git clone https://github.com/YOUR-USERNAME/vercel-xhttp-relay.git
cd vercel-xhttp-relay
vercel🪟 Windows PowerShell:
git clone https://github.com/YOUR-USERNAME/vercel-xhttp-relay.git
cd vercel-xhttp-relay
vercelسؤالات:
Set up and deploy?→YLink to existing project?→NProject name?→ اسم دلخواهOverride settings?→N
vercel env add TARGET_DOMAIN- مقدار:
https://xray.yourdomain.com:2096 - Environments: فقط
ProductionوPreviewرو با Space تیک بزن (Development رو نزن) - Git branch: خالی Enter
- Make sensitive:
n
vercel --prodURL مثل https://your-project.vercel.app میگیری.
- ریپوی این پروژه رو fork یا clone کن و به GitHub خودت push کن.
- در vercel.com/new ریپو رو Import کن.
- در صفحهی تنظیمات، بخش Environment Variables:
TARGET_DOMAIN=https://xray.yourdomain.com:2096
- Deploy بزن.
اگه موقع setup گزینهی Vercel Authentication رو روشن گذاشتی، باید خاموشش کنی وگرنه relay کار نمیکنه:
- داشبورد Vercel → پروژه → Settings → Deployment Protection
- Vercel Authentication رو روی Disabled بذار
- Save
🍎 Mac / 🐧 Linux / 🪟 Git Bash / 🪟 PowerShell (Win 10+):
curl -I https://your-project.vercel.app/yourpath🪟 Windows PowerShell (نسخهی native):
Invoke-WebRequest -Uri "https://your-project.vercel.app/yourpath" -Method Head💡 در ویندوز ۱۰+ خود
curl.exeنصبه و کار میکنه.
| خروجی | معنی |
|---|---|
HTTP/2 404 |
✅ همه چیز درسته |
HTTP/2 401 + HTML login |
Deployment Protection روشنه |
HTTP/2 500 |
env var ست نشده |
HTTP/2 502 |
TARGET_DOMAIN غلطه |
UUID: UUID خودت
Address: vercel.com
Port: 443
SNI: vercel.com
Type: xhttp
Path: /yourpath
Host: your-project.vercel.app
Mode: auto
TLS: on
ALPN: h2
Fingerprint: chrome
vless://YOUR-UUID@vercel.com:443?encryption=none&security=tls&sni=vercel.com&alpn=h2&fp=chrome&type=xhttp&path=%2Fyourpath&host=your-project.vercel.app&mode=auto#Vercel-Relay
توجه:
/در path رو با%2Fencode کن.
| پلتفرم | کلاینت |
|---|---|
| Windows | v2rayN (v6.45+) |
| Android | v2rayNG, Hiddify |
| iOS | V2Box, Streisand |
| macOS | V2Box, Hiddify |
| Linux | Hiddify, xray-core |
- Core: حتماً
Xray-core(نه V2Ray-core، چون XHTTP رو V2Ray ساپورت نمیکنه) - Mux: خاموش (
OFF) - Routing: Bypass LAN/Iran رو روشن کن
- Allow Insecure:
OFF
تو مرورگر برو:
https://ifconfig.me
باید IP سرور VPS تو رو نشون بده، نه IP ایران.
⚠️ این اعداد از مستندات رسمی Vercel در زمان نوشتن این README هستن. ممکنه تغییر کرده باشن — برای آخرین آپدیت vercel.com/pricing و vercel.com/docs/limits رو چک کن.
| محدودیت | Hobby (رایگان) | Pro |
|---|---|---|
| Fast Data Transfer (کلاینت ↔ Vercel) | ۱۰۰ GB / ماه | ۱ TB / ماه |
| Fast Origin Transfer (Vercel ↔ سرور پشتی) | محدود (مهم برای relay!) | ~۱۰× Hobby |
| Edge Requests | ۱M / ماه | ۱۰M / ماه |
| Active CPU Time | ۴ ساعت / ماه | ۴۰ ساعت / ماه |
| شروع Response (Edge) | ۲۵ ثانیه | ۲۵ ثانیه |
| حداکثر مدت Streaming | ۳۰۰ ثانیه (۵ دقیقه) | ۳۰۰ ثانیه |
برای استفادهی پروکسی/relay این مورد بحرانیتر از Fast Data Transfer هست!
هر بایت ترافیک شما دو بار شمرده میشه:
┌─────────┐ Fast Data ┌────────┐ Fast Origin ┌───────────┐
│ کلاینت │ ─────────────► │ Vercel │ ─────────────► │ Xray سرور │
│ │ Transfer │ Edge │ Transfer │ │
└─────────┘ └────────┘ └───────────┘
(سهمیه ۱ — کلاینت) (سهمیه ۲ — origin)
- ۱ GB دانلود از سمت تو = ۱ GB Fast Data + ۱ GB Fast Origin مصرف میشه
- اگه Fast Origin Transfer به حدش برسه، حساب Hobby ت pause میشه و باید ۳۰ روز صبر کنی یا upgrade کنی
با در نظر گرفتن هر دو Fast Data و Fast Origin:
| استفاده | تقریبی |
|---|---|
| چت / تلگرام / WhatsApp | عملاً نامحدود |
| استریم موزیک (Spotify) | عملاً نامحدود |
| مرور وب عادی | عملاً نامحدود |
| یوتیوب 720p | ~۵۰ ساعت / ماه |
| یوتیوب 1080p | ~۲۰-۳۰ ساعت / ماه |
| یوتیوب 4K / دانلود حجیم | ~۷ ساعت / ماه |
💡 برای استفادهی روزمره (چت، مرور، موزیک، ویدیو 720p) Hobby کاملاً کافیه. برای استریم 4K یا دانلود سنگین، یا Pro بگیر یا چند پروژهی Hobby بساز و بینشون load balance کن.
Vercel به سرور پشتی نمیرسه. چک کن:
TARGET_DOMAINدقیقاً درسته (https://...:port)- Xray در سرور بالاست:
systemctl status xray - پورت در فایروال بازه:
ufw status
Env var ست نشده یا redeploy نشده. بزن:
vercel env ls
vercel --prodVercel Authentication روشنه. در داشبورد → Settings → Deployment Protection → Disabled.
- Mux رو خاموش کن
- Core رو روی
Xray-coreبذار - Routing → Bypass Iran رو فعال کن
- SNI رو از
vercel.comبهyour-project.vercel.appعوض کن - ALPN رو فقط
h2بذار
ISP موبایل ممکنه *.vercel.app رو bottleneck کنه. یه Custom Domain به Vercel وصل کن (Settings → Domains).
لاگ خطا رو ببین:
tail -50 /var/log/xray/error.logمعمولاً مشکل دسترسی فایل cert/key. با این درست کن:
chown -R nobody:nogroup /etc/xray /var/log/xrayبله، ولی با کد متفاوت (Cloudflare Workers). برای WebSocket، Cloudflare Workers بهتره. برای XHTTP، Vercel بهخاطر streaming WebStreams پایدارتره.
یه دامنهی شخصی به Vercel وصل کن (Settings → Domains → Add). بعد در کلاینت host و address رو همون بذار.
محدودیت سختی نیست، ولی برای هر کاربر یه UUID جدا بساز:
"clients": [
{ "id": "uuid-1", "email": "user1@example.com" },
{ "id": "uuid-2", "email": "user2@example.com" }
]بله. پورت دلخواه رو در config.json بذار، در ufw allow کن، و در TARGET_DOMAIN در Vercel همون پورت رو بذار.
vercel logs --followیا در داشبورد → پروژه → Logs.
xray -test -config /usr/local/etc/xray/config.json
systemctl restart xrayبله. acme.sh یه cron job میسازه و هر ۶۰ روز خودکار renew میکنه. میتونی manual تست کنی:
~/.acme.sh/acme.sh --renew -d xray.yourdomain.com --force --eccMIT — مثل پروژهی اصلی.
این پروژه برای آموزش و تست شخصیه. مسئولیت استفاده با خودته. قوانین کشور و TOS Vercel رو رعایت کن.
اگه این راهنما برات مفید بود، یا سوال/پیشنهاد داری، از طریق کانال تلگرام در ارتباط باش:
⭐ اگه پروژه به دردت خورد، یه Star بذار تا بیشتر دیده بشه.