Личный 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 на Debian или Ubuntu. Если нужен быстрый старт без долгого выбора провайдера, вот два проверенных варианта:
VDSina — удобный вариант для личного VPN: быстрое создание VPS, root-доступ по SSH, понятная панель управления и тарифы, которых достаточно для домашнего использования 3x-ui. К тому же, при регистрации по этой ссылке вы получите скидку 10% на оплату.
Aeza — европейские и международные локации, быстрые NVMe-серверы, простой интерфейс. Хороший вариант если нужен сервер вне России с низкой задержкой. При регистрации по этой ссылке вы получите бонус 15% на первое пополнение — бонус действует 24 часа.
NetGrid Host — NVMe VPS в 11 локациях от Амстердама до Майами, тарифы от €1.99/мес. Сервер поднимается за 60 секунд, включён выделенный IPv4, порт 1 Gbps и root-доступ.
Домен нужен для ACME-сертификата (ZeroSSL) и SNI маскировки Reality. Можно взять бесплатно:
ClouDNS — бесплатный DNS-хостинг с быстрыми anycast-серверами имён, корректными DNSSEC и CAA. Это важно: именно из-за медленных/сбойных NS у некоторых бесплатных сервисов ACME-валидация (LE/ZeroSSL) падает с SERVFAIL/таймаутами по CAA. С ClouDNS таких проблем нет. Можно завести бесплатный поддомен или подключить свой домен:
- Зарегистрироваться на ClouDNS
- Создать бесплатный бесплатный поддомен
- Добавить A-запись на IP сервера
DuckDNS — бесплатный динамический DNS, идеален для личной инфраструктуры. Регистрация за минуту, настройка A-записи элементарна, работает со статическим IP:
- Перейти на duckdns.org
- Авторизоваться (через Google, GitHub или другие)
- Создать домен, например
myvpn.duckdns.org - Указать IP сервера в управлении доменом
- A-запись будет активна за несколько секунд
isroot.in — ещё один вариант бесплатного динамического DNS с простой настройкой. Поддерживает статические IP:
- Перейти на isroot.in
- Создать аккаунт
- Добавить домен и указать ваш IP
- DNS активируется за несколько секунд
Этот вариант удобен, если вы уже зашли на 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.shinstall.sh запускает steps/setup.sh на текущем сервере, создаёт первого клиента, показывает прогресс и после завершения выводит содержимое /root/3xui-credentials.txt.
Минимальный запуск, домен будет запрошен интерактивно:
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.
- Port hopping включён по умолчанию. На сервере весь диапазон
- 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──▶ 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, поэтому если xray не запустился (например, из-за ошибки в конфиге), публичный URL панели временно недоступен. При этом процесс панели x-ui продолжает работать — xray является его дочерним процессом, и его падение панель не убивает. Восстановить доступ всегда можно по SSH:
- Перезапустить сервис (поднимет и панель, и xray):
ssh root@<IP> 'systemctl restart x-ui' # или: ssh root@<IP> 'x-ui restart'
- Зайти в панель напрямую через SSH-туннель (панель всегда жива на localhost), чтобы найти и исправить ошибку конфига:
ssh -L 8443:127.0.0.1:60000 root@<IP> # затем в браузере: https://localhost:8443/<PANEL_PATH>/ # x-ui отдаёт HTTPS с сертификатом домена — для localhost браузер предупредит, примите.
- Посмотреть, почему упал xray, — в логах панели:
ssh root@<IP> 'journalctl -u x-ui -n 100 --no-pager'
x-ui запускается с Restart=on-failure, поэтому большинство сбоев self-healing — systemd поднимет панель, а она перезапустит xray.
Создать бекап:
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 # Восстановление из бекапа на сервере