یک ریلی سبک و رایگان برای پروتکل XHTTP روی Railway
A lightweight free relay for the XHTTP protocol on Railway
🌐 زبان / Language
[ معرفی • معماری • دیپلوی • متغیرها • باگگیری • مدیریت • لایسنس ]
یک پروکسی معکوس سبکوزن بر پایه Node.js خالص (بدون هیچ dependency) که روی پلتفرم Railway (پلن رایگان) اجرا میشه و ترافیک XHTTP رو از یه آدرس عمومی به سرور پشتی شما منتقل میکنه.
| ویژگی | توضیح |
|---|---|
| 🪶 سبکوزن | بدون هیچ dependency خارجی، فقط Node.js استاندارد |
| 🔐 احراز هویت | پشتیبانی از کلید امنیتی x-relay-key |
| 🚦 کنترل ترافیک | محدودیت درخواستهای همزمان با MAX_INFLIGHT |
| ⏱️ مدیریت تایماوت | قطع خودکار اتصالات کند با UPSTREAM_TIMEOUT_MS |
| 🔍 دیباگ یکپارچه | اندپوینت /__debug برای بررسی وضعیت لحظهای |
| 🌍 چند منطقه | انتخاب لوکیشن سرور از ۴ منطقه جغرافیایی |
| 💸 رایگان | ~۵۰۰ ساعت فعالیت با $5 اعتبار ماهانه Railway |
┌─────────────────────────────────────────────────────────────┐
│ کلاینت شما │
│ (v2rayN / Hiddify / ...) │
└──────────────────────────┬──────────────────────────────────┘
│ HTTPS
│ HOST: xxx.up.railway.app
│ Path: /PUBLIC_RELAY_PATH
▼
┌─────────────────────────────────────────────────────────────┐
│ 🚂 Railway (Edge) │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Avaco Railway Relay (Node.js) │ │
│ │ │ │
│ │ ✓ بررسی مسیر (PUBLIC_RELAY_PATH) │ │
│ │ ✓ احراز هویت (x-relay-key) │ │
│ │ ✓ کنترل ترافیک (MAX_INFLIGHT) │ │
│ │ ✓ فوروارد هدرها (بدون لیک IP/Host) │ │
│ │ ✓ استریم دوطرفه (pipeline) │ │
│ └──────────────────────────┬──────────────────────────┘ │
└──────────────────────────────┼──────────────────────────────┘
│ HTTP
│ Path: /RELAY_PATH
▼
┌─────────────────────────────────────────────────────────────┐
│ 🖥️ سرور شخصی شما (Xray-core) │
│ TARGET_DOMAIN:PORT │
│ پروتکل: VLESS + XHTTP │
└─────────────────────────────────────────────────────────────┘
کلاینت ──► Railway (PUBLIC_RELAY_PATH) ──► سرور (RELAY_PATH) ──► پاسخ
◄── ◄── ◄──
# با npm
npm install -g @railway/cli
# یا با Homebrew (Mac)
brew install railway۱. برو به railway.com/account/tokens ۲. روی New Token کلیک کن ۳. نوع: Account Token انتخاب کن ۴. توکن رو کپی کن — یه بار نشون داده میشه!
⚠️ توکن رو جایی امن نگه دار. هر بار که لازم داری میتونی توکن جدید بسازی.
git clone https://github.com/avacocloud/avaco-railway.git
cd avaco-railway# ساخت پروژه جدید
RAILWAY_API_TOKEN=your_token railway init --name avaco-railway
# آپلود و دیپلوی
RAILWAY_API_TOKEN=your_token railway up --detach💡
--detachیعنی منتظر نمیمونی — Railway در بکگراند build و deploy میکنه.
RAILWAY_API_TOKEN=your_token railway variables \
--set "TARGET_DOMAIN=https://YOUR-SERVER-IP-OR-DOMAIN:PORT" \
--set "PUBLIC_RELAY_PATH=/api" \
--set "RELAY_PATH=/api" \
--set "RELAY_KEY=your-secret-key-min-16-chars" \
--set "UPSTREAM_TIMEOUT_MS=0" \
--set "MAX_INFLIGHT=512"⚡ بعد از ست کردن متغیرها، Railway خودکار ریدیپلوی میکنه.
RAILWAY_API_TOKEN=your_token railway domainخروجی:
✔ Created domain: YOUR-APP.up.railway.app
این آدرس همونیه که توی کانفیگ کلاینتت میزاری.
curl https://YOUR-APP.up.railway.app/__debugخروجی موفق:
{
"TARGET_BASE": "https://your-server:port",
"PUBLIC_RELAY_PATH": "/api",
"RELAY_PATH": "/api",
"RELAY_KEY_SET": true,
"UPSTREAM_TIMEOUT_MS": 0,
"MAX_INFLIGHT": 512,
"inFlight": 0
}📋 مراحل دیپلوی در PowerShell (کلیک کن)
PowerShell رو باز کن:
npm install -g @railway/cli
railway --versionخروجی موفق:
railway 4.x.x
railway login💡 روی ویندوز لاگین مرورگری بهتر از توکن کار میکنه — مرورگر باز میشه، تأیید کن.
تأیید لاگین:
railway whoamigit clone https://github.com/avacocloud/avaco-railway.git
cd avaco-railwayrailway init --name avaco-railwayخروجی موفق:
Created project avaco-railway
railway up --detach
⚠️ روی ویندوز هر متغیر رو جداگانه ست کن (بدون\):
railway variables --set "TARGET_DOMAIN=https://YOUR-SERVER:PORT"
railway variables --set "PUBLIC_RELAY_PATH=/api"
railway variables --set "RELAY_PATH=/api"
railway variables --set "RELAY_KEY=your-secret-key"railway domainخروجی:
https://YOUR-APP.up.railway.app
railway up --detach
⚠️ بعد از هر تغییر متغیر حتماً ریدیپلوی کن و منتظر اتمام build بمون.
curl https://YOUR-APP.up.railway.app/__debugخروجی موفق:
{
"TARGET_BASE": "https://your-server:port",
"PUBLIC_RELAY_PATH": "/api",
"RELAY_PATH": "/api",
"RELAY_KEY_SET": true,
"UPSTREAM_TIMEOUT_MS": 0,
"MAX_INFLIGHT": 512,
"inFlight": 0
}railway variables # مشاهده متغیرها
railway logs # مشاهده لاگها
railway status # وضعیت پروژه
railway domain # مشاهده دامنه
railway up --detach # ریدیپلوی
railway whoami # تأیید لاگین| متغیر | اجباری | پیشفرض | توضیح |
|---|---|---|---|
TARGET_DOMAIN |
✅ | — | آدرس کامل سرور شما. مثال: https://1.2.3.4:443 |
PUBLIC_RELAY_PATH |
✅ | /api |
مسیری که کلاینت میزنه. مثال: /xhttp |
RELAY_PATH |
✅ | /api |
مسیری که روی سرور Xray تنظیم کردی |
RELAY_KEY |
❌ | — | کلید امنیتی (حداقل ۱۶ کاراکتر) — توصیه میشه |
UPSTREAM_TIMEOUT_MS |
❌ | 0 |
تایماوت اتصال به سرور (میلیثانیه). 0 = بدون تایماوت |
MAX_INFLIGHT |
❌ | 512 |
حداکثر درخواست همزمان |
TARGET_DOMAINنباید/داشته باشه — مثال:https://1.2.3.4:443✅ نهhttps://1.2.3.4:443/❌PUBLIC_RELAY_PATHوRELAY_PATHنمیتونن/باشن- اگه
RELAY_KEYبزاری، کلاینت باید هدرx-relay-keyرو بفرسته PUBLIC_RELAY_PATHوRELAY_PATHمیتونن متفاوت باشن (برای پنهانسازی مسیر واقعی)RELAY_PATHهر مقداری میتونه باشه ولی حتماً باید با مسیری که توی کانفیگ Xray روی سرورت تنظیم کردی یکی باشه
| منطقه | مکان | کد |
|---|---|---|
| 🇺🇸 US West | کالیفرنیا | us-west2 |
| 🇺🇸 US East | ویرجینیا | us-east4 |
| 🇳🇱 EU West | آمستردام | europe-west4 |
| 🇸🇬 Southeast Asia | سنگاپور | asia-southeast1 |
برای تغییر لوکیشن، در railway.json اضافه کن:
{
"deploy": {
"region": "europe-west4"
}
}بعد دوباره دیپلوی کن:
RAILWAY_API_TOKEN=your_token railway up --detachcurl https://YOUR-APP.up.railway.app/__debugاین اندپوینت وضعیت کامل ریلی رو نشون میده — اولین جایی که باید چک کنی.
RAILWAY_API_TOKEN=your_token railway logs❌ خطای 500 — Misconfigured: TARGET_DOMAIN is not set
علت: متغیر TARGET_DOMAIN ست نشده.
RAILWAY_API_TOKEN=your_token railway variables --set "TARGET_DOMAIN=https://YOUR-SERVER:PORT"❌ خطای 500 — Misconfigured: RELAY_PATH cannot be '/'
علت: مسیر رو / گذاشتی که مجاز نیست.
RAILWAY_API_TOKEN=your_token railway variables --set "RELAY_PATH=/api"❌ خطای 500 — Misconfigured: RELAY_KEY is too short
علت: کلید امنیتی کمتر از ۱۶ کاراکتر داره.
# یه کلید تصادفی بساز:
openssl rand -hex 16
# بعد ست کن:
RAILWAY_API_TOKEN=your_token railway variables --set "RELAY_KEY=your-generated-key"❌ خطای 403 — Forbidden
علت: هدر x-relay-key در درخواست وجود نداره یا اشتباهه.
در کانفیگ کلاینتت (مثلاً v2rayN)، باید هدر زیر رو اضافه کنی:
x-relay-key: your-secret-key
❌ خطای 404 — Not Found
علت: مسیر درخواست با PUBLIC_RELAY_PATH مطابقت نداره.
# ببین الان چی ست شده:
RAILWAY_API_TOKEN=your_token railway variables
# مثال: اگه PUBLIC_RELAY_PATH=/xhttp باشه، کلاینت باید /xhttp بزنه❌ خطای 503 — Server Busy: Too Many Inflight Requests
علت: تعداد درخواستهای همزمان از MAX_INFLIGHT بیشتره.
RAILWAY_API_TOKEN=your_token railway variables --set "MAX_INFLIGHT=1024"❌ خطای 502 — Bad Gateway
علت: ریلی نمیتونه به TARGET_DOMAIN وصل بشه.
چکلیست:
- آیا
TARGET_DOMAINدرسته؟ (IP و پورت) - آیا فایروال سرور پورت رو باز کرده؟
- آیا Xray روی سرور در حال اجراست؟
- تست دسترسی مستقیم:
curl http://YOUR-SERVER:PORT
❌ خطای 504 — Gateway Timeout
علت: سرور در زمان تنظیمشده پاسخ نداد.
RAILWAY_API_TOKEN=your_token railway variables --set "UPSTREAM_TIMEOUT_MS=0"❌ دیپلوی ساخته میشه ولی اپ استارت نمیشه
# بررسی لاگهای build و runtime:
RAILWAY_API_TOKEN=your_token railway logs
# چک کن که نسخه Node.js درست باشه (باید ≥20 باشه)❌ متغیرها ست شدن ولی تغییری نمیکنه
Railway بعد از تغییر متغیر باید ریدیپلوی بشه. اگه خودکار نشد:
RAILWAY_API_TOKEN=your_token railway up --detach# تست کامل:
curl -v https://YOUR-APP.up.railway.app/__debug
# تست با RELAY_KEY:
curl -H "x-relay-key: your-secret-key" https://YOUR-APP.up.railway.app/api
# تست پینگ ساده:
curl -o /dev/null -s -w "%{http_code}\n" https://YOUR-APP.up.railway.app/__debug
# باید 200 برگردونه# مشاهده همه متغیرها
RAILWAY_API_TOKEN=your_token railway variables
# آپدیت متغیر
RAILWAY_API_TOKEN=your_token railway variables --set "TARGET_DOMAIN=https://NEW-SERVER:PORT"
# دیپلوی مجدد (بعد از تغییر کد)
RAILWAY_API_TOKEN=your_token railway up --detach
# مشاهده وضعیت سرویس
RAILWAY_API_TOKEN=your_token railway status
# مشاهده لاگهای زنده
RAILWAY_API_TOKEN=your_token railway logs --tail
# دامنه فعلی
RAILWAY_API_TOKEN=your_token railway domain| متریک | مقدار |
|---|---|
| 💵 اعتبار ماهانه | $5 |
| ⏱️ تخمین آپتایم | ~۵۰۰ ساعت/ماه |
| 📡 درخواست | نامحدود |
| 😴 Sleep | ندارد (برعکس Render) |
| 🧠 RAM | 512 MB |
| ⚡ CPU | Shared |
| 🌐 پهنای باند | 100 GB/ماه |
💡 اگه نیاز به آپتایم بیشتر داری، یه پروژه دوم با حساب دیگه بساز.
railway/
├── src/
│ └── index.js ← کد اصلی ریلی (Node.js خالص)
├── package.json ← تعریف پروژه + engine: node ≥20
├── railway.json ← تنظیمات Railway (builder, restart policy, region)
└── README.md ← این فایل
اگه این پروژه بهت کمک کرد و دوست داری حمایت کنی، میتونی با ارز دیجیتال دونیت کنی:
این پروژه تحت لایسنس GNU GPL-3.0 منتشر شده.
هر گونه استفاده مجدد، فورک، یا تغییر در کد مشروط به حفظ موارد زیر است:
- ✅ کپیرایت اصلی:
Copyright (C) 2025 avaco_cloud - ✅ لینک مخزن اصلی: github.com/avacocloud/avaco-railway
- ✅ اشاره به سازنده: @avaco_cloud
- ✅ فایل LICENSE بدون تغییر
⚠️ حذف یا جایگزین کردن اطلاعات سازنده نقض این لایسنس است و منجر به DMCA Takedown میشود.
ساخته شده با ❤️ توسط @avaco_cloud