mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-09-18 16:17:16 +00:00
9b91f0f42e
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.
182 lines
11 KiB
Plaintext
182 lines
11 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 | Выпустить короткоживущий (6-дневный, автопродление) сертификат для **голого IP**. |
|
||
| Revoke | Отозвать существующий сертификат. |
|
||
| Force Renew | Продлить сейчас, до истечения срока. |
|
||
| Show Existing Domains | Перечислить сертификаты, уже имеющиеся на сервере. |
|
||
| Set Cert paths for the panel | Указать панели путь к выпущенному сертификату (заполняет поля за вас). |
|
||
|
||
### Выпуск сертификата для домена
|
||
|
||
<Steps>
|
||
|
||
<Step>
|
||
### Направьте домен на сервер
|
||
|
||
Создайте запись `A` (и/или `AAAA`) для вашего домена, которая указывает на
|
||
публичный IP этого сервера. Проверка не пройдёт, пока DNS не распространится.
|
||
</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**, чтобы получить короткоживущий
|
||
сертификат (действует ~6 дней, продлевается автоматически), привязанный к IP сервера.
|
||
Полезно для доступа к панели по HTTPS до того, как вы настроите домен.
|
||
|
||
## Cloudflare (wildcard через DNS-01)
|
||
|
||
DNS-проверка подтверждает, что вы управляете доменом, путём создания TXT-записи вместо
|
||
ответа на порту 80 — поэтому она работает **за прокси Cloudflare**, на серверах,
|
||
где порт 80 заблокирован, и для **wildcard**-сертификатов (`*.example.com`).
|
||
|
||
DNS вашего домена должен управляться Cloudflare, и вам понадобится одно из:
|
||
|
||
- **ограниченный по области API-токен** с правом `Zone:DNS:Edit` (рекомендуется), либо
|
||
- **email вашей учётной записи + Global API Key**.
|
||
|
||
<Steps>
|
||
|
||
<Step>
|
||
### Создайте ограниченный API-токен
|
||
|
||
В панели Cloudflare перейдите в **My Profile → API Tokens →
|
||
[Create Token](https://dash.cloudflare.com/profile/api-tokens)**, выберите шаблон
|
||
**Edit zone DNS**, ограничьте его областью той зоны, для которой выпускаете сертификат, и создайте
|
||
токен. Скопируйте его — он показывается только один раз.
|
||
</Step>
|
||
|
||
<Step>
|
||
### Запустите выпуск через Cloudflare
|
||
|
||
`x-ui` → **`21` — Cloudflare SSL Certificate**. На запрос выберите **`t`** для
|
||
API-токена (по умолчанию) или **`g`** для Global API Key, затем введите свой
|
||
домен (а для Global API Key — ещё email учётной записи и ключ). 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 в выбранной вами зоне, поэтому его утечка не затронет остальную часть вашей учётной записи 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: 90 дней; IP-сертификаты: ~6 дней). И меню, и
|
||
Certbot продлевают их автоматически, но панель продолжает читать **файлы** по их
|
||
фиксированным путям — поэтому продлевайте **на месте**, а не перемещайте файлы, и
|
||
панель подхватит новый сертификат при следующем перезапуске. **Force Renew** (меню `20`)
|
||
запускает продление по требованию.
|
||
</Callout>
|
||
|
||
## Дальнейшие шаги
|
||
|
||
<Cards>
|
||
<Card
|
||
title="Настройки панели"
|
||
href="/docs/config/panel#tls"
|
||
description="webCertFile / webKeyFile и остальные настройки веб-сервера."
|
||
/>
|
||
<Card
|
||
title="Обратный прокси"
|
||
href="/docs/operations/reverse-proxy"
|
||
description="Доверьте терминирование TLS Nginx или Caddy."
|
||
/>
|
||
<Card
|
||
title="REALITY"
|
||
href="/docs/config/reality"
|
||
description="Скрытный TLS для входящих подключений — сертификат не требуется."
|
||
/>
|
||
</Cards>
|