mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-07-26 09:52:14 +03:00
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.
180 lines
10 KiB
Plaintext
180 lines
10 KiB
Plaintext
---
|
||
title: گواهیهای SSL
|
||
description: دریافت و تمدید گواهیهای TLS برای پنل و ورودیهای 3x-ui — با منوی ACME در x-ui (دامنه یا IP خام)، گواهی wildcard از طریق Cloudflare DNS-01، یا Certbot دستی.
|
||
icon: ShieldCheck
|
||
---
|
||
|
||
یک گواهی TLS به شما امکان میدهد **پنل** را روی HTTPS سرویسدهی کنید (تا ترافیک ورود و
|
||
API شما رمزگذاری شود) و TLS را روی **ورودیها** خاتمه دهید (VLESS-TLS، Trojan،
|
||
Shadowsocks-TLS و موارد مشابه). سه راه برای بهدستآوردن گواهی وجود دارد:
|
||
|
||
- **منوی `x-ui`** — کلاینت داخلی [ACME](https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment).
|
||
آسانترین گزینه برای یک دامنهی واحد یا یک IP خام.
|
||
- **Cloudflare DNS-01** — این هم از همان منو؛ برای گواهیهای **wildcard** یا
|
||
زمانی که پورت 80 مسدود است / سرور پشت پراکسی Cloudflare قرار دارد لازم است.
|
||
- **Certbot دستی** — اگر ترجیح میدهید `acme.sh`/Certbot را خودتان مدیریت کنید.
|
||
|
||
<Callout type="info">
|
||
اگر پنل را پشت Nginx یا Caddy قرار میدهید، بگذارید پراکسی بهجای شما گواهی را
|
||
مدیریت کند — به [پراکسی معکوس](/docs/operations/reverse-proxy) مراجعه کنید.
|
||
ورودیهای [REALITY](/docs/config/reality) **هیچ** گواهیای نیاز ندارند؛ آنها
|
||
TLS یک سایت واقعی را قرض میگیرند. این صفحه برای پنل و برای ورودیهای کلاسیک TLS است.
|
||
</Callout>
|
||
|
||
## منوی SSL در `x-ui` (Let's Encrypt)
|
||
|
||
`x-ui` را اجرا کنید و **`20` — SSL Certificate Management** را انتخاب کنید. این گزینه
|
||
[acme.sh](https://github.com/acmesh-official/acme.sh) را به کار میگیرد و موارد زیر را ارائه میدهد:
|
||
|
||
| گزینه | کاری که انجام میدهد |
|
||
| ------------------------------ | ------------------------------------------------------------------- |
|
||
| Get SSL (Domain) | صدور گواهی برای یک دامنه از طریق اعتبارسنجی HTTP. |
|
||
| Get SSL for IP Address | صدور یک گواهی کوتاهمدت (۶ روزه، با تمدید خودکار) برای یک **IP خام**. |
|
||
| Revoke | باطلکردن یک گواهی موجود. |
|
||
| Force Renew | تمدید همین حالا، پیش از انقضا. |
|
||
| Show Existing Domains | فهرستکردن گواهیهایی که از پیش روی سرور هستند. |
|
||
| Set Cert paths for the panel | اشارهدادن TLS پنل به یک گواهی صادرشده (فیلدها را برای شما تنظیم میکند). |
|
||
|
||
### صدور گواهی برای یک دامنه
|
||
|
||
<Steps>
|
||
|
||
<Step>
|
||
### دامنه را به سرور اشاره دهید
|
||
|
||
یک رکورد `A` (و/یا `AAAA`) برای دامنهی خود بسازید که به IP عمومی این سرور
|
||
اشاره کند. تا زمانی که DNS منتشر (propagate) نشده باشد، اعتبارسنجی ناموفق خواهد بود.
|
||
</Step>
|
||
|
||
<Step>
|
||
### پورت 80 را آزاد کنید
|
||
|
||
اعتبارسنجی HTTP نیاز دارد که **پورت 80** از اینترنت در دسترس باشد و از پیش در حال
|
||
استفاده نباشد. هر چیزی را که به آن متصل است برای این مدت متوقف کنید و آن را از
|
||
[فایروال](/docs/reference/ports-firewall) عبور دهید.
|
||
</Step>
|
||
|
||
<Step>
|
||
### صادرکننده را اجرا کنید
|
||
|
||
`x-ui` ← `20` ← **Get SSL (Domain)**، سپس دامنه را وارد کنید. acme.sh گواهی را
|
||
درخواست میکند و آن را زیر `/root/cert/<domain>/` بهصورت `fullchain.pem`
|
||
(زنجیرهی گواهی) و `privkey.pem` (کلید خصوصی) ذخیره میکند.
|
||
</Step>
|
||
|
||
<Step>
|
||
### آن را به پنل متصل کنید
|
||
|
||
گزینهی **Set Cert paths for the panel** را انتخاب کنید تا `webCertFile` و
|
||
`webKeyFile` پر شوند و پنل راهاندازی مجدد شود، یا آنها را خودتان در
|
||
[تنظیمات پنل](/docs/config/panel#tls) تنظیم کنید. بهمحض تنظیمشدن هر دو، پنل HTTPS را
|
||
سرویسدهی میکند.
|
||
</Step>
|
||
|
||
</Steps>
|
||
|
||
### صدور گواهی برای یک IP خام
|
||
|
||
دامنهای ندارید؟ گزینهی **Get SSL for IP Address** را انتخاب کنید تا یک گواهی
|
||
کوتاهمدت (با اعتبار حدود ۶ روز، که بهصورت خودکار تمدید میشود) متصل به IP سرور
|
||
بهدست آورید. برای دسترسی به پنل روی HTTPS پیش از آنکه دامنهای راهاندازی کنید مفید است.
|
||
|
||
## Cloudflare (گواهی wildcard با DNS-01)
|
||
|
||
اعتبارسنجی DNS بهجای پاسخدادن روی پورت 80، با ساختن یک رکورد TXT ثابت میکند که شما
|
||
دامنه را در اختیار دارید — بنابراین **پشت پراکسی Cloudflare**، روی سرورهایی که
|
||
پورت 80 در آنها مسدود است، و برای گواهیهای **wildcard** (`*.example.com`) کار میکند.
|
||
|
||
DNS دامنهی شما باید توسط Cloudflare مدیریت شود و به یکی از این موارد نیاز دارید:
|
||
|
||
- یک **توکن API محدودشده** با مجوز `Zone:DNS:Edit` (توصیهشده)، یا
|
||
- **ایمیل حساب + Global API Key**.
|
||
|
||
<Steps>
|
||
|
||
<Step>
|
||
### یک توکن API محدودشده بسازید
|
||
|
||
در داشبورد Cloudflare به **My Profile → API Tokens →
|
||
[Create Token](https://dash.cloudflare.com/profile/api-tokens)** بروید، قالب
|
||
**Edit zone DNS** را انتخاب کنید، آن را به zoneای که برایش گواهی صادر میکنید محدود
|
||
کنید و آن را بسازید. توکن را کپی کنید — فقط یکبار نمایش داده میشود.
|
||
</Step>
|
||
|
||
<Step>
|
||
### صادرکنندهی Cloudflare را اجرا کنید
|
||
|
||
`x-ui` ← **`21` — Cloudflare SSL Certificate**. هنگام پرسش، **`t`** را برای یک
|
||
توکن API (پیشفرض) یا **`g`** را برای Global API Key انتخاب کنید، سپس دامنهی خود را
|
||
وارد کنید (و برای Global API Key، ایمیل حساب و کلید خود را). acme.sh رکورد TXT را
|
||
میسازد، اعتبارسنجی میکند و آن را پاکسازی میکند.
|
||
</Step>
|
||
|
||
<Step>
|
||
### پنل را به آن اشاره دهید
|
||
|
||
مانند جریان دامنه، از **Set Cert paths for the panel** (منوی `20`) استفاده کنید یا
|
||
`webCertFile` / `webKeyFile` را در [تنظیمات پنل](/docs/config/panel#tls) تنظیم کنید.
|
||
</Step>
|
||
|
||
</Steps>
|
||
|
||
<Callout type="info">
|
||
یک توکن محدودشده را به Global API Key ترجیح دهید — آن فقط اجازهی ویرایش DNS را روی
|
||
zoneای که انتخاب میکنید میدهد، بنابراین نشت آن نمیتواند به بقیهی حساب Cloudflare شما دست بزند.
|
||
</Callout>
|
||
|
||
## دستی (Certbot)
|
||
|
||
اگر ترجیح میدهید از منو استفاده نکنید، یک گواهی را با افزونهی standalone مربوط به
|
||
Certbot صادر کنید (این هم نیاز دارد که پورت 80 آزاد باشد و دامنه به سرور اشاره کند):
|
||
|
||
```bash
|
||
apt-get install certbot -y
|
||
certbot certonly --standalone --agree-tos --register-unsafely-without-email -d yourdomain.com
|
||
certbot renew --dry-run
|
||
```
|
||
|
||
Certbot گواهی را در `/etc/letsencrypt/live/yourdomain.com/` مینویسد
|
||
(`fullchain.pem` و `privkey.pem`). پنل را در [تنظیمات پنل](/docs/config/panel#tls) به آن
|
||
دو فایل اشاره دهید و تمدید را راهاندازی کنید — `certbot renew` بهصورت پیشفرض روی یک
|
||
تایمر systemd اجرا میشود.
|
||
|
||
## استفاده از گواهی
|
||
|
||
- **پنل** — `webCertFile` (زنجیرهی کامل) و `webKeyFile` (کلید خصوصی) را در
|
||
[تنظیمات پنل](/docs/config/panel#tls) تنظیم کنید. برای آنکه پنل به HTTPS سوئیچ کند،
|
||
هر دو باید تنظیم شوند. گزینهی منوی **`11` — View Current Settings** مسیرهای
|
||
درحالاستفادهی فعلی را چاپ میکند.
|
||
- **ورودیها** — وقتی TLS را روی یک ورودی فعال میکنید، در تنظیمات TLS همان ورودی به
|
||
همان فایلهای گواهی و کلید ارجاع دهید (یا محتوای آنها را جایگذاری کنید). به
|
||
[ورودیها](/docs/config/inbounds) و [ترابریها](/docs/config/transports) مراجعه کنید.
|
||
|
||
<Callout type="warn">
|
||
گواهیها منقضی میشوند (Let's Encrypt: ۹۰ روز؛ گواهیهای IP: حدود ۶ روز). هم منو و هم
|
||
Certbot بهصورت خودکار تمدید میکنند، اما پنل همچنان **فایلها** را در مسیرهای ثابتشان
|
||
میخواند — بنابراین **در همان محل** تمدید کنید نه با جابهجاکردن فایلها، و پنل در
|
||
راهاندازی مجدد بعدیاش گواهی جدید را برمیدارد. **Force Renew** (منوی `20`) یک تمدید
|
||
را بهصورت درخواستی فعال میکند.
|
||
</Callout>
|
||
|
||
## گامهای بعدی
|
||
|
||
<Cards>
|
||
<Card
|
||
title="تنظیمات پنل"
|
||
href="/docs/config/panel#tls"
|
||
description="webCertFile / webKeyFile و بقیهی تنظیمات وبسرور."
|
||
/>
|
||
<Card
|
||
title="پراکسی معکوس"
|
||
href="/docs/operations/reverse-proxy"
|
||
description="بهجای آن، بگذارید Nginx یا Caddy کار خاتمهدادن TLS را برایتان انجام دهد."
|
||
/>
|
||
<Card
|
||
title="REALITY"
|
||
href="/docs/config/reality"
|
||
description="TLS مخفیانه برای ورودیها — بدون نیاز به گواهی."
|
||
/>
|
||
</Cards>
|