Skip to content

Latest commit

 

History

37 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

3x-ui Fast install Setup

Личный VPN-сервер под ключ за один запуск. Скрипты разворачивают 3x-ui, VLESS Reality, Hysteria2, Trojan-WS, selfsteal Caddy, Cloudflare WARP, Opera Proxy, Tor, BBR, UFW и fail2ban, а затем сразу выдают готовые доступы к панели.

Что вы получаете

  • Готовый 3x-ui, установленный нативно (бинарь + systemd-сервис x-ui) с автозапуском после перезагрузки сервера.
  • Три протокола из коробки: VLESS Reality, Hysteria2 и Trojan-WS (спрятан за 443 через Caddy).
  • Первый клиент создаётся автоматически сразу во всех inbound'ах.
  • Персональная ссылка подписки сохраняется в файле доступов.
  • Сертификаты ACME через Caddy selfsteal: основной CA — ZeroSSL, фолбэк — Let's Encrypt.
  • Раздельную маршрутизацию: RU-трафик через WARP, выбранные зарубежные сервисы через Opera Proxy, .onion через Tor, остальное напрямую.
  • Настроенный фаервол, BBR и базовую защиту fail2ban.
  • Backup/restore-скрипты для переноса и восстановления сервера.
  • Автоматический бэкап существующей установки перед повторным деплоем.
  • Интерактивная обработка смены SSH-ключа: предлагает удалить старый ключ и продолжить.

Для кого

Для тех, кто хочет быстро поднять личную VPN-инфраструктуру на VPS без ручной настройки 3x-ui, inbound'ов, сертификатов, firewall-правил и Xray routing. Подходит для личного сервера, тестового стенда или аккуратной самостоятельной установки с понятными логами.

Быстрый старт

Нужны VPS с Debian/Ubuntu, root-доступ по SSH и домен с A-записью на IP сервера.

git clone https://github.com/AppsGanin/3xui-fast-install.git
cd 3xui-fast-install

bash deploy.sh 1.2.3.4

После установки скрипт покажет URL панели, логин, пароль и персональную ссылку подписки первого клиента. Эти же данные сохраняются на сервере в /root/3xui-credentials.txt.

Также можно установить с помощью ИИ-агента. Он проведёт вас через все шаги, от выбора VPS и домена до финальной настройки. ИИ-агент автоматически обработает смену SSH-ключа, если сервер уже был установить. Подробная инструкция для агента: AI_INSTALL.md.

Компоненты

Компонент Что делает
3x-ui Панель управления Xray (systemd-сервис x-ui), inbound'ы VLESS Reality, Hysteria2 и Trojan-WS
VLESS + Reality Основной TCP-вход, по умолчанию на 443, с fallback-маскировкой через Caddy
Hysteria2 UDP-вход поверх TLS, по умолчанию на 63000/udp, хорошо переживает мобильные сети и потери
Trojan-WS TCP-вход поверх WebSocket+TLS на 443. Слушает только 127.0.0.1, наружу не торчит: трафик приходит через Reality-steal → Caddy по секретному пути. Неотличим от обычного HTTPS
Caddy selfsteal Получает ACME-сертификат (основной CA — ZeroSSL, фолбэк — Let's Encrypt) и держит fallback-маскировку
Cloudflare WARP Локальный SOCKS5 outbound для RU-ресурсов
Opera Proxy Локальный SOCKS5 outbound для выбранных зарубежных сервисов
Tor Локальный SOCKS5 outbound для .onion и отдельных Tor-сценариев
BBR TCP congestion control для более стабильной скорости
UFW Открывает только нужные порты: SSH, 80, Reality (443), Hysteria2. Панель, подписки и Trojan-WS наружу не торчат — идут через Caddy на 443
fail2ban Базовая защита от перебора

Маршрутизация

Трафик Куда отправляется
Реклама и вредоносные домены blocked
RU-домены .ru, .su, .рф и RU GeoIP warp, чтобы не светить IP сервера перед RU-ресурсами
.onion, check.torproject.org tor
Disney+, Reddit opera
Всё остальное direct

GeoIP/GeoSite для клиентов Happ подписки берутся из roscomvpn-routing.

Требования

  • Debian 12+ или Ubuntu 22.04+.
  • Root-доступ по SSH.
  • Домен, A-запись которого указывает на IP сервера.
  • Доступные порты: 80/tcp, порт VLESS Reality (443/tcp по умолчанию), порт Hysteria2 (63000/udp по умолчанию) и при включённом port hopping диапазон 63000:63999/udp. Панель и подписки доступны на 443 через Caddy, отдельных портов наружу не требуют.

Где взять VPS

Для установки подойдёт любой чистый VPS на Debian или Ubuntu. Если нужен быстрый старт без долгого выбора провайдера, вот два проверенных варианта:

VDSina — удобный вариант для личного VPN: быстрое создание VPS, root-доступ по SSH, понятная панель управления и тарифы, которых достаточно для домашнего использования 3x-ui. К тому же, при регистрации по этой ссылке вы получите скидку 10% на оплату.

Создать VPS в VDSina

Aeza — европейские и международные локации, быстрые NVMe-серверы, простой интерфейс. Хороший вариант если нужен сервер вне России с низкой задержкой. При регистрации по этой ссылке вы получите бонус 15% на первое пополнение — бонус действует 24 часа.

Создать VPS в Aeza

NetGrid Host — NVMe VPS в 11 локациях от Амстердама до Майами, тарифы от €1.99/мес. Сервер поднимается за 60 секунд, включён выделенный IPv4, порт 1 Gbps и root-доступ.

Создать VPS в NetGrid Host

Где взять домен

Домен нужен для ACME-сертификата (ZeroSSL) и SNI маскировки Reality. Можно взять бесплатно:

ClouDNS (рекомендуется)

ClouDNS — бесплатный DNS-хостинг с быстрыми anycast-серверами имён, корректными DNSSEC и CAA. Это важно: именно из-за медленных/сбойных NS у некоторых бесплатных сервисов ACME-валидация (LE/ZeroSSL) падает с SERVFAIL/таймаутами по CAA. С ClouDNS таких проблем нет. Можно завести бесплатный поддомен или подключить свой домен:

  1. Зарегистрироваться на ClouDNS
  2. Создать бесплатный бесплатный поддомен
  3. Добавить A-запись на IP сервера

Создать домен в ClouDNS

DuckDNS

DuckDNS — бесплатный динамический DNS, идеален для личной инфраструктуры. Регистрация за минуту, настройка A-записи элементарна, работает со статическим IP:

  1. Перейти на duckdns.org
  2. Авторизоваться (через Google, GitHub или другие)
  3. Создать домен, например myvpn.duckdns.org
  4. Указать IP сервера в управлении доменом
  5. A-запись будет активна за несколько секунд

Создать домен в DuckDNS

isroot.in

isroot.in — ещё один вариант бесплатного динамического DNS с простой настройкой. Поддерживает статические IP:

  1. Перейти на isroot.in
  2. Создать аккаунт
  3. Добавить домен и указать ваш IP
  4. DNS активируется за несколько секунд

Создать домен в isroot.in

Способы установки

Прямо на сервере

Этот вариант удобен, если вы уже зашли на VPS по SSH и хотите установить всё без локального деплоя.

ssh root@<IP>
apt-get update && apt-get install -y git
git clone https://github.com/AppsGanin/3xui-fast-install.git
cd 3xui-fast-install

Минимальный запуск, домен будет запрошен интерактивно:

bash install.sh

Запуск без интерактива:

DOMAIN=vpn.example.com bash install.sh

С кастомными портами VPN:

DOMAIN=vpn.example.com \
VLESS_PORT=8443 \
HY2_PORT=63001 \
bash install.sh

install.sh запускает steps/setup.sh на текущем сервере, создаёт первого клиента, показывает прогресс и после завершения выводит содержимое /root/3xui-credentials.txt.

С локальной машины через SSH (Linux/Mac/WSL)

Минимальный запуск, домен будет запрошен интерактивно:

bash deploy.sh <IP>

Запуск без интерактива:

DOMAIN=vpn.example.com bash deploy.sh <IP>

С SSH-ключом:

DOMAIN=vpn.example.com bash deploy.sh <IP> -i ~/.ssh/id_rsa

С нестандартным SSH-портом:

SSH_PORT=2222 DOMAIN=vpn.example.com bash deploy.sh <IP>

С кастомными портами VPN:

DOMAIN=vpn.example.com \
VLESS_PORT=8443 \
HY2_PORT=63001 \
bash deploy.sh <IP>

deploy.sh копирует steps/ на сервер, запускает setup.sh, создаёт первого клиента, показывает прогресс и после завершения выводит содержимое /root/3xui-credentials.txt.

После установки

  • Панель: https://<DOMAIN>/<PANEL_PATH>/ (на 443 через Caddy)
  • Подписка первого клиента: https://<DOMAIN><SUB_PATH><CLIENT_SUB_ID> (на 443)
  • VLESS Reality: <VLESS_PORT>/tcp, по умолчанию 443/tcp
  • Hysteria2: <HY2_PORT>/udp, по умолчанию 63000/udp
    • Port hopping включён по умолчанию. На сервере весь диапазон HY2_HOP_RANGE (63000:63999) редиректится (NAT) на HY2_PORT, а в конфиг инбаунда добавляется finalmask.quicParams.udpHop — поэтому диапазон портов и интервал переключения (5-10 сек) попадают в клиентскую ссылку автоматически, вручную в клиенте ничего вписывать не нужно. Отключить: HY2_HOP=false.
  • Trojan-WS: на 443 через Caddy (отдельный порт наружу не открывается). Инбаунд слушает 127.0.0.1:<TROJAN_PORT> (по умолчанию 8443) без TLS; клиент подключается на wss://<DOMAIN>:443<TROJAN_WS_PATH>, реальный TLS терминирует Caddy. В клиентскую ссылку через externalProxy автоматически попадают публичный адрес 443, SNI, отпечаток и ALPN — вписывать вручную ничего не нужно.
  • Лог установки: /root/3xui-install.log
  • Полный лог установки: /root/3xui-install-full.log
  • Доступы: /root/3xui-credentials.txt
  • Управление 3x-ui: меню x-ui или systemctl {status|start|stop|restart} x-ui, логи — journalctl -u x-ui -f
  • БД 3x-ui: /etc/x-ui/x-ui.db, бинари: /usr/local/x-ui/

Как устроен доступ на 443

Панель, подписка и сайт-маскировка отдаются на одном порту 443:

клиент ──443──▶ xray (VLESS Reality)
                   └─ не-Reality трафик ──fallback (PROXY proto)──▶ Caddy :9443
                                                                       ├─ /<PANEL_PATH>/   → x-ui панель (127.0.0.1:60000)
                                                                       ├─ /<SUB_PATH>      → x-ui подписки (127.0.0.1:60001)
                                                                       ├─ /<TROJAN_WS_PATH> → x-ui Trojan-WS (127.0.0.1:8443)
                                                                       └─ всё остальное    → сайт-заглушка

Так на одном 443 живут панель, подписки, Trojan-WS и сайт-маскировка. Панель и подписки x-ui слушает только на 127.0.0.1 и отдаёт по ним HTTPS (сертификат Caddy зашит в настройки x-ui, чтобы внутри панели работала кнопка «взять сертификат») — Caddy проксирует на них как на локальный HTTPS-бэкенд. Trojan-WS слушает 127.0.0.1 без TLS — публичный TLS даёт Caddy. Наружу открыты лишь 80, 443 и порт Hysteria2.

Если панель на 443 не открывается (xray лёг)

Порт 443 держит xray, поэтому если xray не запустился (например, из-за ошибки в конфиге), публичный URL панели временно недоступен. При этом процесс панели x-ui продолжает работать — xray является его дочерним процессом, и его падение панель не убивает. Восстановить доступ всегда можно по SSH:

  1. Перезапустить сервис (поднимет и панель, и xray):
    ssh root@<IP> 'systemctl restart x-ui'   # или: ssh root@<IP> 'x-ui restart'
  2. Зайти в панель напрямую через SSH-туннель (панель всегда жива на localhost), чтобы найти и исправить ошибку конфига:
    ssh -L 8443:127.0.0.1:60000 root@<IP>
    # затем в браузере: https://localhost:8443/<PANEL_PATH>/
    # x-ui отдаёт HTTPS с сертификатом домена — для localhost браузер предупредит, примите.
  3. Посмотреть, почему упал xray, — в логах панели:
    ssh root@<IP> 'journalctl -u x-ui -n 100 --no-pager'

x-ui запускается с Restart=on-failure, поэтому большинство сбоев self-healing — systemd поднимет панель, а она перезапустит xray.

Backup и restore

Создать бекап:

bash backup.sh <IP>

С ключом, нестандартным SSH-портом или своей локальной папкой:

bash backup.sh <IP> -i ~/.ssh/id_rsa
SSH_PORT=2222 bash backup.sh <IP>
BACKUP_DIR=~/my-backups bash backup.sh <IP>

Восстановить сервер из архива:

bash restore.sh <IP> backups/backup_1.2.3.4_20260508_120000.tar.gz
bash restore.sh <IP> backups/backup_*.tar.gz -i ~/.ssh/id_rsa

Важно: restore.sh рассчитан на сервер с уже установленным окружением (Caddy, Tor, WARP, Opera Proxy и пр.). На чистом (новом) сервере сначала выполните deploy.sh, а затем запустите restore.sh — он заменит данные 3x-ui содержимым бекапа.

Архив содержит базу 3x-ui (/etc/x-ui), сертификаты, Caddy-конфиг (/etc/caddy/Caddyfile), сайт-заглушку (/var/www/html), ACME-данные Caddy (/var/lib/caddy) и файл доступов.

Прямо на сервере (без локальной машины)

Скрипты steps/backup.sh и steps/restore.sh деплоятся на сервер вместе с остальными шагами и работают автономно.

Создать бекап:

bash /root/3xui-setup/backup.sh

Архивы сохраняются в /root/backups/, автоматически ротируются (хранятся последние 7). Количество изменяется через KEEP:

KEEP=14 bash /root/3xui-setup/backup.sh

Восстановить — последний бекап:

bash /root/3xui-setup/restore.sh latest

Восстановить — выбор из списка интерактивно:

bash /root/3xui-setup/restore.sh

Восстановить — конкретный файл:

bash /root/3xui-setup/restore.sh 3xui_20260601_120000.tar.gz

Или через SSH с локальной машины без копирования файлов:

ssh root@<IP> 'bash /root/3xui-setup/backup.sh'
ssh root@<IP> 'bash /root/3xui-setup/restore.sh latest'

Переменные окружения

Все ключевые параметры можно переопределить перед запуском install.sh или deploy.sh. Если переменная не задана, steps/_lib.sh подставит дефолт.

Переменная По умолчанию Описание
DOMAIN Домен для Reality SNI и сертификата
PANEL_PORT 60000 Локальный порт панели 3x-ui (за Caddy, на 127.0.0.1)
PANEL_USER admin Логин панели
PANEL_PASS случайный Пароль панели
PANEL_PATH случайный URL-путь панели
SUB_PORT 60001 Локальный порт подписок (за Caddy, на 127.0.0.1)
SUB_PATH /subs/ URL-путь подписок
SUB_TITLE домен Название подписки
CLIENT_EMAIL случайный Имя автоматически созданного клиента
CLIENT_UUID случайный UUID VLESS-клиента
CLIENT_SUB_ID случайный ID персональной подписки
CLIENT_HY2_AUTH случайный Auth-пароль Hysteria2-клиента
CLIENT_TROJAN_PASS случайный Пароль Trojan-WS-клиента
VLESS_PORT 443 Порт VLESS Reality
TROJAN_PORT 8443 Локальный порт Trojan-WS (на 127.0.0.1, за Caddy)
TROJAN_WS_PATH случайный Секретный WS-путь Trojan (по нему Caddy проксирует на инбаунд)
HY2_PORT 63000 Порт Hysteria2 UDP
HY2_HOP true Port hopping для Hysteria2 (NAT-редирект диапазона UDP-портов на HY2_PORT)
HY2_HOP_RANGE 63000:63999 Диапазон портов для hopping (формат start:end)
OPERA_REGION EU Регион для Opera Proxy (AM, EU, AS, и т.д.)
TRAFFIC_RESET monthly Сброс трафика инбаундов (never, daily, monthly)
LOW_POWER_MODE 0 Облегчённый режим для слабых VPS: меньше фоновой нагрузки, ниже лимит CPU сервиса x-ui (CPUQuota)
SSH_PORT 22 SSH-порт сервера
SSH_USER root SSH-пользователь

Если сервер совсем слабый, запустите установку так:

LOW_POWER_MODE=1 DOMAIN=vpn.example.com bash install.sh

В этом режиме 3x-ui не поднимает лишние шумные сервисы, а сам сервис x-ui получает мягкий лимит CPU (systemd CPUQuota), чтобы сервер оставался отзывчивым.

Пример с кастомными параметрами:

DOMAIN=vpn.example.com \
PANEL_PORT=60010 \
PANEL_PASS=MySecretPass \
VLESS_PORT=8443 \
HY2_PORT=63001 \
OPERA_REGION=US \
bash install.sh

Пример с фиксированным именем клиента и ID подписки:

DOMAIN=vpn.example.com \
CLIENT_EMAIL=phone \
CLIENT_SUB_ID=phone2026 \
bash install.sh

Структура проекта

├── install.sh          # Установка прямо на сервере
├── deploy.sh           # Деплой с локальной машины
├── backup.sh           # Резервное копирование
├── restore.sh          # Восстановление из бекапа
├── backups/            # Локальные бекапы, в .gitignore
├── scripts/
│   └── local_lib.sh    # Общие функции deploy/backup/restore
└── steps/
    ├── setup.sh        # Оркестратор установки
    ├── _lib.sh         # Общие функции и дефолты env
    ├── prereqs.sh      # Системные зависимости
    ├── bbr.sh          # BBR
    ├── ufw.sh          # UFW firewall
    ├── warp.sh         # Cloudflare WARP
    ├── opera-proxy.sh  # Opera Proxy
    ├── tor.sh          # Tor
    ├── fail2ban.sh     # fail2ban
    ├── selfsteal.sh    # Caddy selfsteal и ACME-сертификат
    ├── xui.sh          # 3x-ui (нативно из релиза + systemd), Reality-ключи, Xray config, БД
    ├── backup.sh       # Серверный бекап в /root/backups/
    └── restore.sh      # Восстановление из бекапа на сервере

About

Личный VPN-сервер под ключ: 3x-ui, VLESS Reality, Hysteria2, Trojan, WARP, Opera proxy, Tor, Caddy Selfsteal и бекапы одной командой.

Topics

Resources

Stars

34 stars

Watchers

1 watching

Forks

Contributors

Languages