docs: vendor the documentation site into the monorepo

Fold the standalone 3x-ui-docs project (Next.js 16 + Fumadocs, deployed to
docs.sanaei.dev) into docs/ so the panel and its documentation share a single
source of truth, the way sing-box keeps its docs in-tree. The old repo becomes
redundant and can be retired.

- Import the full site under docs/ (app, components, content, lib, public,
  scripts, config). The self-contained pnpm project sits alongside the existing
  engineering notes with no filename collisions.
- Re-point "Edit on GitHub" links from MHSanaei/3x-ui-docs to this repo's
  docs/content/docs path (docs/lib/shared.ts, docs/app/.../page.tsx).
- Add docs-ci.yml and docs-deploy.yml under .github/workflows/, scoped to
  docs/** and run with working-directory: docs, since GitHub only runs
  workflows from the repo-root .github/. deploy-static.yml's GitHub Pages
  publish (CNAME docs.sanaei.dev) carries over unchanged.

Follow-up (outside this commit): attach the docs.sanaei.dev custom domain to
this repository's Pages (or set the Vercel project's root directory to docs),
confirm the site is live from the monorepo, then delete MHSanaei/3x-ui-docs.
This commit is contained in:
MHSanaei
2026-07-07 23:07:14 +02:00
parent 2c49dbf54e
commit 9b91f0f42e
283 changed files with 44179 additions and 0 deletions
@@ -0,0 +1,156 @@
---
title: خروجی‌ها و مسیریابی
description: مدیریت ترافیک خروجی در 3x-ui — خروجی‌های WARP و NordVPN، اشتراک‌های خروجی (مجموعه سرورها)، قواعد مسیریابی و متعادل‌کننده‌های بار.
icon: Route
---
ورودی‌ها کلاینت‌ها را می‌پذیرند؛ **خروجی‌ها** تعیین می‌کنند ترافیک آن‌ها در ادامه به کجا برود.
3x-ui می‌تواند ترافیک را از طریق Cloudflare WARP، NordVPN یا مجموعه‌های خروجی دلخواه
وارد‌شده از یک اشتراک مسیریابی کند و با قواعد مسیریابی و متعادل‌کننده‌ها میان آن‌ها
انتخاب نماید.
## ویرایش خروجی‌ها و مسیریابی
خروجی‌ها، قواعد مسیریابی، متعادل‌کننده‌ها، DNS و ثبت رویداد همگی در **پیکربندی Xray**
قرار دارند (همان قالب پیکربندی که زیر Xray Settings ویرایش می‌کنید). رابط کاربری جداگانه‌ای
برای هر قاعده وجود ندارد — شما JSON را ویرایش می‌کنید و پنل Xray را بارگذاری مجدد می‌کند. پنل
همچنین یک **آزمون اتصال‌پذیری خروجی** و یک **آزمون مسیر** ارائه می‌دهد (از هسته در حال اجرا
بپرسید که برای یک مقصد مشخص از کدام خروجی استفاده خواهد شد).
## ساخت یک خروجی
هر خروجی یک شیء JSON است با حداکثر چهار بخش: یک **`tag`** (که قواعد مسیریابی و
متعادل‌کننده‌ها به آن ارجاع می‌دهند)، یک **`protocol`**، **`settings`** مخصوص پروتکل،
و — برای پروتکل‌های proxy — **`streamSettings`** که باید با انتقال و امنیت ورودی راه دور
مطابقت داشته باشد. دو خروجی تقریباً همیشه حضور دارند:
- **`freedom`** ترافیک را مستقیماً به مقصدش می‌فرستد — خروجی پیش‌فرض.
به‌صورت اختیاری می‌توانید یک `domainStrategy` (مثلاً `UseIP`) تنظیم کنید تا نحوه تفکیک نام‌های میزبان را کنترل کنید.
- **`blackhole`** ترافیک را دور می‌اندازد. مقصدهای ناخواسته (تبلیغات، تورنت‌ها) را به اینجا هدایت کنید.
```json title="freedom + blackhole"
{
"outbounds": [
{ "tag": "direct", "protocol": "freedom", "settings": {} },
{ "tag": "block", "protocol": "blackhole", "settings": {} }
]
}
```
یک خروجی **proxy** (VLESS، VMess، Trojan، Shadowsocks) به سرور دیگری ارسال می‌کند —
که برای زنجیره‌کردن یا فرستادن ترافیک منتخب به خارج مفید است. به شکل‌های سیمی که 3x-ui
استفاده می‌کند توجه کنید: **VLESS شکل تخت است** (`address`/`port`/`id`/`flow`/
`encryption`)، **VMess از `settings.vnext[]` استفاده می‌کند**، و **Trojan/Shadowsocks از
`settings.servers[]` استفاده می‌کنند**. مقدار `streamSettings` باید با
[انتقال و امنیت](/docs/config/transports) مقصد همخوانی داشته باشد.
هر خروجی را در زیر سرهم کنید و JSON را در **Xray Settings → Outbounds** بچسبانید:
<OutboundGenerator />
## Cloudflare WARP
WARP به سرور شما امکان می‌دهد ترافیک خود را از طریق شبکه Cloudflare خارج کند. 3x-ui می‌تواند
یک حساب WARP برای شما ثبت کند و آن را به یک خروجی WireGuard با برچسب **`warp`** متصل نماید:
<Steps>
<Step>
### افزودن یک خروجی با برچسب `warp`
یک خروجی WireGuard با برچسب `warp` در پیکربندی Xray خود بسازید.
</Step>
<Step>
### ثبت WARP
از کنترل‌های WARP در پنل، یک حساب ثبت کنید. 3x-ui کلیدها، نشانی‌ها، بایت‌های رزروشده و نقطه
انتهایی peer مربوط به خروجی را به‌صورت خودکار پر می‌کند.
</Step>
<Step>
### (اختیاری) چرخش خودکار IP
یک بازه به‌روزرسانی WARP (بر حسب **روز**) تنظیم کنید تا IP مربوط به WARP به‌صورت دوره‌ای چرخش
یابد. یک لایسنس رایگان نیز می‌تواند اعمال شود.
</Step>
</Steps>
ترافیک موردنظر خود (برای مثال دامنه‌های خاص) را با یک قاعده مسیریابی به خروجی `warp` هدایت
کنید.
## NordVPN
3x-ui می‌تواند اعتبارنامه‌های NordVPN (NordLynx/WireGuard) را از یک توکن دسترسی دریافت کند (یا
یک کلید خصوصی را مستقیماً بپذیرد) و کشورها/سرورها را فهرست کند تا بتوانید یک خروجی NordVPN
بسازید.
## اشتراک‌های خروجی (مجموعه سرورها)
یک **اشتراک خروجی** یک اشتراک share-link از راه دور را وارد می‌کند و سرورهای آن را به‌عنوان
**خروجی** به پیکربندی در حال اجرای Xray تزریق می‌کند — بدون دست‌زدن به قالب ذخیره‌شده شما. این
روش توصیه‌شده برای اشتراک در یک *مجموعه* از سرورهاست.
| فیلد | پیش‌فرض | معنا |
| ---------------- | ------- | -------------------------------------------------------------- |
| `url` | — | نشانی اشتراک از راه دور (محافظت‌شده در برابر SSRF). |
| `tagPrefix` | auto | پیشوند برچسب‌های خروجی تولیدشده (مثلاً `hk-`)؛ خالی = `subN-`. |
| `updateInterval` | `600` | بازه تازه‌سازی بر حسب **ثانیه**. |
| `prepend` | `false` | این خروجی‌ها را پیش از خروجی‌های دستی شما قرار می‌دهد. |
| `priority` | `0` | ترتیب ادغام (مقدار کمتر، زودتر). |
خروجی‌های وارد‌شده **برچسب‌های پایدار** می‌گیرند: همان سرور در طول تازه‌سازی‌ها همان برچسب را
حفظ می‌کند، بنابراین انتخاب‌گرهای مسیریابی/متعادل‌کننده مبتنی بر برچسب دقیق پایدار می‌مانند —
در حالی که انتخاب‌گرهای پیشوندی/wildcard (مثلاً `hk-*`) با تغییر مجموعه، به‌صورت خودکار سرورهای
جدید را در بر می‌گیرند. طرح‌های پیوند پشتیبانی‌شده: `vmess`، `vless`، `trojan`، `ss`،
`hysteria2` (`hy2`) و `wireguard` (`wg`). پنل اشتراک‌های فعال را روی یک زمان‌سنج تازه می‌کند و
هنگام تغییر چیزی، Xray را بارگذاری مجدد می‌کند.
## قواعد مسیریابی
**قواعد مسیریابی** تعیین می‌کنند هر اتصال از کدام خروجی (یا متعادل‌کننده) استفاده کند. هر
قاعده یک تطبیق‌دهنده از نوع `field` است: هر یک از `domain`، `ip`، `port`، `network`،
`protocol`، `inboundTag`، `sourceIP`، … را تنظیم کنید و آن را به یک **`outboundTag`** یا یک
**`balancerTag`** اشاره دهید. قواعد **از بالا به پایین — نخستین تطبیق برنده است** ارزیابی می‌شوند، بنابراین
قواعد خاص را بالای قواعد عمومی قرار دهید.
```json title="route ads to blackhole, private IPs direct"
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{ "type": "field", "domain": ["geosite:category-ads-all"], "outboundTag": "block" },
{ "type": "field", "ip": ["geoip:private"], "outboundTag": "direct" }
]
}
}
```
## متعادل‌کننده‌ها
یک **متعادل‌کننده** خروجی‌ها را با یک **انتخاب‌گر** (پیشوندهای برچسب، از جمله مجموعه‌های
wildcard حاصل از اشتراک‌های خروجی) گروه‌بندی می‌کند و ترافیک را با یک **استراتژی** میان آن‌ها
توزیع یا در صورت خرابی منتقل می‌کند:
| استراتژی | انتخاب می‌کند… | به مانیتور نیاز دارد |
| ------------- | ----------------------------------------------- | ------------------------ |
| `random` | یک عضو تصادفی برای هر اتصال | خیر |
| `roundRobin` | اعضا به‌صورت چرخشی | خیر |
| `leastPing` | عضو با کمترین تأخیر | **`observatory`** |
| `leastLoad` | پایدارترین عضو بر اساس بار نمونه‌برداری‌شده | **`burstObservatory`** |
از یک قاعده با `balancerTag` به یک متعادل‌کننده ارجاع دهید. `leastPing` و `leastLoad`
به یک مانیتور سلامت نیاز دارند که Xray آن را در **سطح بالای** پیکربندی قرار می‌دهد
(`observatory` / `burstObservatory`، **نه** درون `routing`). پنل می‌تواند وضعیت
متعادل‌کننده را گزارش کند و برای آزمایش یک متعادل‌کننده را به یک خروجی مشخص **بازنویسی** کند.
بلوک مسیریابی — قواعد، متعادل‌کننده‌ها و observatory متناظر — را در اینجا بسازید:
<RoutingBuilder />
<Callout type="warn">
خروجی‌هایی که به سرویس‌های خارجی دسترسی می‌یابند با محافظت SSRF واکشی می‌شوند — به‌صورت
پیش‌فرض نشانی‌های خصوصی/داخلی مسدود هستند مگر آنکه به‌طور صریح آن‌ها را به‌ازای هر منبع مجاز
کنید.
</Callout>