Files
kaskad/docs/bot.md
andrey271192 209caa81a8 Initial release of Kaskad
Каскадная маршрутизация русских сайтов через свой набор RU-серверов
с failover, Telegram-ботом и веб-интерфейсом.

- bin/        — failover-script, route/domain helpers, ams/ru bootstrap
- bot/        — Telegram-бот (Python, long-poll)
- webui/      — Flask single-page dashboard
- docs/       — установка, архитектура, API бота и WebUI
- examples/   — шаблоны конфигов
2026-05-02 09:13:23 +03:00

5.4 KiB
Raw Permalink Blame History

Telegram-бот

Бот живёт на одном из ам. серверов (там, где есть доступ к api.telegram.org). Управляет всеми остальными по SSH через свой ed25519 ключ.

Доступ

Бот реагирует ТОЛЬКО на сообщения из чата с chat_id == TG_CHAT_ID (см. /etc/wireguard/notify.env). Остальные сообщения игнорирует.

Команды

Туннели

Команда Описание
/status Endpoint и handshake age для каждого ам. сервера
/use <id> Принудительно переключить все ам. на RU-сервер с этим id
/primary Алиас /use primary
/backup Алиас /use backup
/failover Алиас /use backup
/failback Алиас /use primary

RU-серверы

Команда Описание
/server-list Список RU-серверов с приоритетами
/server-add <host> <user> <ssh_port> <id> [prio] [password=PW] [label=...] [listen_port=1939] [probe_port=ssh_port] Бот SSHит на новый RU, ставит wireguard, генерит ключ, добавляет 4 ам. как peer'ы, открывает 1939/UDP, кладёт свой ключ для будущего управления
/server-remove <id|host> Удалить RU из ротации (сам сервер не выключается, просто перестаёт использоваться)
/bot-key Показать публичный SSH-ключ бота — для добавления в authorized_keys на новом сервере (если не хочется передавать пароль через TG)

Безопасность: при password=PW бот после обработки автоматически удаляет своё сообщение через TG API. Но в моменте оно всё равно попадает в логи TG, поэтому надёжнее — использовать ключевую авторизацию (см. /bot-key).

Ам. серверы

Команда Описание
/ams-list Список ам. серверов
/ams-add <host> <user> <ssh_port> <id> [tunnel_ip=auto] [xray_iface=amn0] [password=PW] Бот: ставит wireguard, кладёт свой ключ, генерит WG-ключ ам., выдаёт следующий свободный 10.0.0.X, копирует все скрипты и шаблон ru.conf со sga1, поднимает туннель на текущий primary, ставит cron, и добавляет [Peer] на ВСЕХ RU-серверах
/ams-remove <id|host> Снять [Peer] со всех RU; обновить JSON. Сам сервер остаётся работать (X-ray, OS), просто перестаёт быть в туннеле

X-ray на новый ам. сервер бот НЕ ставит — это вне его компетенции.

Маршруты (IP/CIDR)

Команда Описание
/ips Все маршруты сразу (база + доп.)
/list Только дополнительные (добавленные через бот)
/add <IP/CIDR ...> Добавить (через пробел или с новой строки; /32 дописывается сам)
/remove <IP/CIDR ...> Удалить
/clear Удалить ВСЕ доп. маршруты

Базовые подсети (10 крупных сервисов: Яндекс, ВК, Mail.ru, Госуслуги, Ozon) трогать через бот нельзя — они в /etc/wireguard/ru-base.aips. Если нужно изменить — править вручную и /usr/local/bin/ru-routes.sh apply.

Домены

Команда Описание
/list-domains Список доменов с количеством IP
/add-domain <domain ...> Резолвит каждый домен через dig +short A, добавляет полученные IP как /32 в маршруты на всех ам. серверах. Формат: пробел или с новой строки.
/remove-domain <domain ...> Убирает домен и его IP (если их не использует другой домен).
/show-domain <domain> Текущие IP конкретного домена
/refresh-domains Принудительно перерезолвить все домены

Cron 17 */6 * * * /usr/local/bin/ru-domains.py refresh — автоматический refresh каждые 6 часов. Лог: /var/log/ru-domains.log.

Прочее

Команда Описание
/bot-key Публичный SSH-ключ бота
/help Полная справка

Уведомления

При каждом автоматическом переключении (failover/failback успех/failback провал) бот шлёт сообщение в TG_CHAT_ID с тэгом [ru-failover @ <hostname>]. См. journalctl -t ru-failover для истории.

Логи

# логи бота
journalctl -u ru-tg-bot.service -f

# логи failover
journalctl -t ru-failover -f
# или
grep ru-failover /var/log/syslog | tail