Скопируйте строку, вставьте в SSH-консоль сервера, нажмите Enter:
curl -fsSL https://raw.githubusercontent.com/CraftStick/node-installer-cdn/main/node-installer-cdn.py -o node-installer-cdn.py && sudo python3 node-installer-cdn.pyДальше мастер задаёт вопросы: режим, панель, CDN, домен. Всё остальное скрипт делает сам.
Без вопросов, сразу с параметрами
curl -fsSL https://raw.githubusercontent.com/CraftStick/node-installer-cdn/main/node-installer-cdn.py -o node-installer-cdn.py && sudo python3 node-installer-cdn.py --mode 1 --panel 1 --cdn 1 --domain example.comПовторный запуск позже — файл уже лежит рядом:
sudo python3 node-installer-cdn.pyЕсли прошлый запуск оборвался, скрипт предложит продолжить с того же места и
подставит прежние ответы. Начать заново — флаг --fresh.
Important
Ubuntu/Debian, права root. Скрипт меняет сеть и сервисы — обкатывайте на одноразовом VPS со снапшотом.
A origin.example.com → <IP сервера> (DNS only, серое облако)
A example.com → <IP сервера> (DNS only) — панель и её сертификат
Обе записи ведут на сам сервер. Домен панели нельзя направлять на CDN: Let's Encrypt проверяет его прямо здесь, по webroot. Технический домен CDN выдаёт провайдер — в свой DNS его заводить не нужно, установщик спросит его в конце и сам пропишет в панель.
flowchart LR
C["📱 Клиент<br/>VLESS · XHTTP packet-up"]
CDN["☁️ CDN провайдера<br/>VK · Yandex · Beeline · Timeweb"]
N["🔀 nginx на вашем сервере<br/>заглушка на / · туннель на /путь/"]
X["🛡️ Xray<br/>127.0.0.1:4443"]
I(("🌍 Интернет"))
C -->|"TLS на домен CDN"| CDN
CDN -->|"origin.example.com:443"| N
N --> X --> I
Провайдер видит HTTPS к адресам, откуда грузятся видео ВКонтакте и плитки Яндекс.Карт. Никаких экзотических протоколов на виду — соединение едет в общем потоке.
Тот, кто придёт по адресу origin.example.com браузером, увидит обычную
страницу-заглушку. Голый путь туннеля отдаёт 404 — он неотличим от обращения
к несуществующей странице.
CDN перечисленных провайдеров раздают контент половине рунета — банковские сайты, госуслуги, стриминг, мобильные приложения. Отключить их адреса нельзя, не уронив вместе с ними всё остальное.
--cdn |
Провайдер | Пропускная | Ровность канала | Origin | Открытая регистрация | Технический домен |
|---|---|---|---|---|---|---|
1 |
VK Cloud | 100+ Мбит/с | стабильно | HTTP | нет | *.gslb.vkcdn.ru |
2 |
Yandex Cloud | 100+ Мбит/с | стабильно | HTTPS | да | *.topology.gslb.yccdn.ru |
3 |
Beeline (CDNvideo) | 50–80 Мбит/с | стабильно | HTTPS | нет | *.a.trbcdn.net |
4 |
Timeweb | 50–80 Мбит/с | с оговорками | HTTP | да | *.cdn.twcstorage.ru |
Все четыре работают на любом операторе, у всех есть бесплатный тариф, во всех включено padding-маскирование XHTTP.
💡 Начинать проще всего с Yandex Cloud: регистрация открыта и origin ходит по HTTPS. VK — самый быстрый вариант, если аккаунт уже есть.
Создать сам CDN-ресурс придётся руками в панели провайдера — установщик печатает готовую инструкцию под выбранного провайдера, с точными галочками и вашим путём туннеля.
| № | Сценарий | Когда брать |
|---|---|---|
| 1 | Панель + нода + CDN на одной машине | первый запуск, один VPS |
| 2 | Панель здесь, нода на другом сервере по SSH (--node-ip) |
разнести управление и выход |
| 3 | Нода и CDN здесь, регистрация в чужой панели | добавить локацию к работающей панели |
| 4 | Только CDN (--xport / --path) |
накинуть CDN перед готовой нодой |
Режим 3 ставит и ноду, и фронт за один проход, а после регистрации создаёт на панели профиль, хост, сквад и пользователя. Режим 4 нужен, когда нода уже поднята и ей не хватает только CDN.
--panel |
Панель | Чем берёт | Чего просит |
|---|---|---|---|
1 |
Remnawave 3.x | полноценный API: установщик сам заводит профиль, ноду, хост, сквад и пользователя | Docker с compose, от 5 ГБ свободного диска |
2 |
3x-ui | легче и привычнее: systemd-сервис без Docker, конфиги правятся прямо в веб-интерфейсе | практически ничего |
Выбор есть только в режиме 1. Режим 2 работает с Remnawave: у 3x-ui xray встроен в саму панель, отдельной ноды у неё не бывает.
Установщик поднимает панель и заводит в ней первого пользователя. Всё остальное — сквады, привязка к устройству, выдача подписок по User-Agent — умеет сама Remnawave, и настраивается это уже в её интерфейсе.
|
Инфраструктура
|
Обвязка
|
|
Система
|
Живучесть
|
В конце скрипт печатает карточку с итогами: где панель и с каким паролем (там,
где он её ставил), адрес origin, ссылку на подписку и готовую vless://-ссылку.
Основной вход — VLESS XHTTP packet-up, он ставится всегда и ходит через CDN. Установщик спрашивает, добавлять ли к нему второй, прямой — на случай, когда провайдер отвалится:
| Вход | Как идёт | Когда нужен |
|---|---|---|
| XHTTP packet-up | через CDN, 443 |
основной, ставится всегда |
| gRPC Reality | напрямую на сервер | рекомендуется: работает, когда CDN лёг |
Порт открывается ровно под выбор: отказались от gRPC — в ufw он не появится. У
Remnawave это TCP 2053, у 3x-ui — случайный порт; оба печатаются в конце
вместе с PBK, SID и serviceName.
| Файрвол | ufw с политикой deny incoming; открыты только порт sshd (читается из sshd_config), 80, 443 и порты включённых каналов |
| Порт ноды | 2222 доступен только IP панели; правило уходит в ufw, а на серверах без ufw — в iptables с netfilter-persistent save, чтобы пережить перезагрузку |
| Панель и БД | слушают только 127.0.0.1, наружу — через nginx |
| Секреты | .env панели и ноды, .panel_token, ключ сертификата — режим 600, каталог /etc/nginx/ssl — 700 |
| SSH | пароль передаётся через окружение (sshpass -e), в ps не виден; отпечаток хоста запоминается при первом подключении, подмена сервера даёт отказ |
| Сертификат origin | сначала self-signed (чтобы поднялся nginx), затем попытка Let's Encrypt поверх — отключается флагом --no-origin-le |
| Ввод | домен, путь и порт проверяются регулярками до того, как попадут в команды и конфиги |
Показать полный список флагов
--mode 1..4 — сценарий развёртывания (см. таблицу выше)
--panel 1 = Remnawave 3.x, 2 = 3x-ui (режим 1)
--cdn 1 = VK, 2 = Yandex, 3 = Beeline, 4 = Timeweb
--domain домен без http://
# режим 2 — удалённая нода
--node-ip IP удалённой ноды
--node-user SSH-пользователь ноды (по умолчанию root)
--node-pass пароль ноды
--node-key путь к приватному SSH-ключу
# режим 3 — к существующей панели
--panel-url IP/URL панели
--panel-ssh-user SSH-пользователь панели (по умолчанию root)
--panel-ssh-pass SSH-пароль панели
--panel-token API-токен Remnawave. Если не задан — берётся
/opt/remnawave/.panel_token с панели (есть только если
панель ставил этот установщик), иначе логин по
--panel-user / --panel-pass
--panel-user логин админа панели (для получения токена)
--panel-pass пароль админа панели
# режим 4 — только CDN
--xport локальный upstream-порт Xray на 127.0.0.1 (по умолчанию 4443)
--path существующий xhttp-путь (например /abc123)
# повторная установка
--wipe снести прошлую установку без вопросов (контейнеры, тома,
/opt/remnawave, /opt/remnanode) — нужно для автозапуска
--no-wipe не трогать прошлую установку, ставить поверх
--fresh забыть сохранённый прогресс и начать с нуля
# инбаунды
--no-grpc не добавлять gRPC Reality (только CDN)
--no-origin-le не выпускать Let's Encrypt для origin (оставить self-signed)
# прочее
--skip-dns-wait не ждать DNS
--skip-cdn-wait не ждать настройку CDN
| Компонент | Версия |
|---|---|
| Remnawave (backend) | remnawave/backend:3 |
| Xray-core | 26.7.28 |
| 3x-ui | v3.6.0 |
| PostgreSQL | 18.4 |
| Valkey (Redis) | 9-alpine (unix-сокет) |
Стек: Docker + docker compose, nginx, certbot, ufw / iptables. Ядро — Xray (VLESS, XHTTP, gRPC Reality). Работа с удалёнными серверами — по SSH под root.
| Путь | Что внутри |
|---|---|
node-installer-cdn.py |
основной скрипт-установщик (всё в одном файле) |
test_installer.py |
тесты чистого слоя: конфиги, валидация, экранирование, API |
commands.sh |
справочный список shell-команд (не для запуска) |
LICENSE |
MIT |
Тесты гоняются без сервера и без root:
python3 -m unittest discover -vWarning
Дисклеймер. Скрипт работает под root и меняет сеть/сервисы: ставит
Docker, тянет и запускает сторонние скрипты (get.docker.com, 3x-ui,
Xray-install), правит iptables/ufw, выпускает сертификаты. Запускайте
только на своих серверах, на одноразовом VPS со снапшотом до старта.
Ответственность за использование — на запускающем.
MIT — копируйте, меняйте, встраивайте в свои проекты и распространяйте, в том числе на коммерческой основе. Единственное условие: сохраняйте текст лицензии и указание авторства. Гарантий никаких — см. дисклеймер выше.