- install.sh: интерактивный one-liner — ставит WG, ключи, скрипты, бот, WebUI, cron; сам поднимает RU-сервер если он чистый - uninstall.sh: полная очистка (сервисы, конфиги, cron, /opt/kaskad) с подтверждением; опц. KASKAD_PURGE_KEYS=1 для затирания ключей - webui: кнопка «удалить» для зарубежных серверов теперь явно красная (class danger.solid), для локального — «⛔ нельзя» вместо disabled - webui: DELETE /api/ams/<id> переписан — портативный python-based peer-removal, явные ошибки, поддержка ?force=1 - README + docs/install.md: переписаны под обычного пользователя, one-command flow на первом плане, ручной — как fallback Co-authored-by: Cursor <cursoragent@cursor.com>
Kaskad
Свой VPN для россиян за границей. Российские сайты (госуслуги, банки, ВК) открываются через ваш сервер в РФ. Всё остальное — напрямую через зарубежный. Если RU-сервер падает — за минуту переключается на запасной. Управляется из браузера или Telegram.
Зачем это нужно
Живёте за границей и сталкивались с тем, что:
- 🏦 Тинькофф не пускает с заграничного IP
- 🧾 Госуслуги «вы не из России»
- 📺 Кинопоиск, ivi, ВК — недоступны
- 🛍 Озон, Wildberries — корзина не работает
При этом обычный VPN в РФ тормозит всё подряд, включая Netflix, рабочие звонки и игры.
Каскад делит трафик по умному:
┌──────────────────────────────────────────┐
вы ───▶ │ зарубежный сервер (Амстердам, X-ray) │
│ │
│ если адрес РФ → 🇷🇺 RU-сервер → инет │
│ всё остальное → 🌍 напрямую │
└──────────────────────────────────────────┘
Vk.com видит ваш московский IP. Netflix видит амстердамский. Скорость не страдает.
Что умеет
- ⚡ Авто-failover — если основной RU-сервер упал, за минуту переключение на запасной. Когда вернулся — автоматически обратно.
- 🎛 WebUI — добавлять серверы, домены, IP в один клик. Никакого SSH.
- 🤖 Telegram-бот — то же самое из телефона.
- 🌐 N RU-серверов в каскаде с приоритетами.
- 🌍 N зарубежных нод под одним каскадом — все автоматически переключаются вместе.
- 🔔 Уведомления в Telegram при каждом переключении.
- 📋 Маршруты по доменам — ввёл
vk.com, бот сам резолвит IP и держит их в маршрутах.
Установка в одну команду
На зарубежном сервере (Ubuntu 20.04+) с уже работающим X-ray:
curl -fsSL https://raw.githubusercontent.com/andrey271192/kaskad/main/install.sh | sudo bash
Скрипт спросит:
- Telegram bot token (от @BotFather)
- Telegram chat ID (узнать у @userinfobot)
- Хост вашего RU-сервера + пароль root (пароль нужен один раз)
- Логин/пароль для WebUI
Через 2-3 минуты получите:
- 🌐 WebUI на
http://ВАШ_СЕРВЕР:8088 - 🤖 Активного Telegram-бота —
/statusпокажет состояние - 🔁 Авто-failover каждую минуту через cron
Готово. Никаких ручных правок конфигов.
💡 Если RU-сервер ещё чистый — скрипт сам поставит на него WireGuard, ip_forward, iptables и поднимет туннель. Достаточно SSH-пароля.
Удаление в одну команду
curl -fsSL https://raw.githubusercontent.com/andrey271192/kaskad/main/uninstall.sh | sudo bash
или, если уже склонировано:
sudo bash /opt/kaskad/uninstall.sh
Спросит подтверждение (YES), затем уберёт:
- сервисы, скрипты, cron, WG-туннели, конфиги,
/opt/kaskad/
X-ray, ваши SSH-ключи и системные пакеты не трогает. Если хотите снести и WG-ключи — KASKAD_PURGE_KEYS=1 sudo bash uninstall.sh.
WebUI
После установки откройте http://ВАШ_СЕРВЕР:8088.
| Что | Как |
|---|---|
| Переключиться на запасной RU | кнопка backup в верхней таблице |
| Добавить ещё один RU-сервер | секция «RU-серверы» → «+ добавить RU-сервер», ввести IP/домен и пароль root |
| Добавить ещё одну зарубежную ноду | секция «Ам. серверы» → «+ добавить ам. сервер» |
| Удалить зарубежный сервер | красная кнопка удалить в строке — peer уберётся со всех RU и из конфига |
| Добавить русский сайт | секция «Домены» → ввести vk.com ozon.ru |
| Принудительный refresh DNS для доменов | кнопка 🔄 Refresh DNS |
Все действия идут с подтверждением, ошибки видны сразу.
Telegram-бот
| Категория | Команды |
|---|---|
| Туннели | /status, /use <id>, /primary, /backup |
| RU-серверы | /server-list, /server-add, /server-remove, /bot-key |
| Ам. серверы | /ams-list, /ams-add, /ams-remove |
| Маршруты | /ips, /list, /add <IP>, /remove <IP>, /clear |
| Домены | /list-domains, /add-domain <d>, /remove-domain <d>, /show-domain <d>, /refresh-domains |
| Прочее | /help |
Полный синтаксис — docs/bot.md.
Как это работает (короткая версия)
- На каждом зарубежном сервере поднят WireGuard-туннель
ru→ к выбранному RU-серверу. - iptables
mangleпомечает трафик от X-ray меткой100,ip ruleотправляет его в таблицу маршрутизации200, где default → через туннель. - Маршруты на конкретные RU-подсети/IP добавляются в
ru-base.aipsиru-extra.list. - Cron каждую минуту запускает
ru-failover.py: проверяет handshake + TCP-пробу на RU. Если пусто > N секунд — переключает endpoint на следующий по приоритету.
Деталки — docs/architecture.md.
Структура репозитория
kaskad/
├── install.sh ← одна команда — всё ставится
├── uninstall.sh ← одна команда — всё убирается
├── bin/ ← скрипты для ам. серверов
├── bot/ ← Telegram-бот
├── webui/ ← Flask-приложение
├── examples/ ← шаблоны конфигов (если ставите вручную)
└── docs/ ← подробная документация
Безопасность
- Все конфиги (
ru-servers.json,notify.env,webui.env) с правами600, не коммитятся. - Между серверами — только SSH-ключи. Пароли используются один раз, при добавлении нового сервера, и сразу затираются.
- WebUI защищён HTTP basic auth. Рекомендация: поставьте за HTTPS reverse-proxy (Caddy, Nginx, Traefik).
- Telegram-бот принимает команды только от заранее заданного
TG_CHAT_ID.
Требования
- Ubuntu / Debian 20.04+ на ам. сервере (где будет WebUI и бот) — root доступ
- Ubuntu / Debian 20.04+ на RU-сервере — root + SSH-пароль (нужен один раз)
- На ам. сервере: уже настроенный X-ray (3x-ui подойдёт) с интерфейсом
amn0 - На RU-сервере: открыт UDP/1939 наружу (или проброс на роутере)
FAQ
Не работает «удалить» в WebUI? — кнопки удалить рядом с зарубежными серверами теперь явно красные. Если показывает «⛔ нельзя» — это сервер, на котором сам WebUI запущен; такой нельзя убрать (надо сначала перенести WebUI на другой узел).
Сервер удалён, но peer остался на RU? — при удалении WebUI сам делает wg set wg_ru peer ... remove на всех RU. Если RU был недоступен — попросит подтверждение и удалит запись принудительно (force).
Скорость упала? — каскад не должен влиять на не-RU трафик. Если падает — проверьте iptables -t mangle -L PREROUTING -v (помечается ли трафик) и ip rule show.
Бот молчит — journalctl -u ru-tg-bot -f. Чаще всего: неверный TG_BOT_TOKEN или TG_CHAT_ID, или сервер не может выйти к api.telegram.org.
Подробнее: docs/troubleshooting.md.
Связанные проекты
- 🔧 keenetic-unified — мониторинг роутеров Keenetic
- 🌐 keenetic_ssh-web — веб-панель shell-команд на роутере
- 🛣 keenetic-dns-routes — DNS-маршрутизация без HydraRoute Neo
Поддержать проект
- ⭐ Поставьте звезду на andrey271192/kaskad
- 💖 Boosty
- 💳 Ozon Bank СБП
- ✉️ Telegram: @Iot_andrey — вопросы, баги, идеи
Лицензия
MIT