Merge pull request #41 from cwash797-cmd/genspark_ai_developer
Panel Naive + Hysteria2 by RIXXX
Веб-панель для быстрой установки и управления NaiveProxy и Hysteria2 на одном VPS — в 2 клика
🚀 Быстрая установка
bash <(curl -fsSL https://raw.githubusercontent.com/cwash797-cmd/Panel---Naive-Hy2---by---RIXXX/main/install.sh)
После установки панель будет доступна:
http://YOUR_SERVER_IP:3000
Логин по умолчанию: admin / admin — смените сразу!
🔄 Обновление существующей установки
Для применения новых патчей (улучшения, новые опции) без полной переустановки используйте update.sh:
bash <(curl -fsSL https://raw.githubusercontent.com/cwash797-cmd/Panel---Naive-Hy2---by---RIXXX/main/update.sh)
Что делает скрипт:
- ✅ Применяет только новые изменения с момента последнего запуска (версионирование через
/etc/rixxx-panel/version) - ✅ НЕ трогает существующих пользователей, пароли, домены, сертификаты, sysctl-настройки
- ✅ В конце выводит сводку: что обновлено, что пропущено, версия до/после
- ✅ Безопасно запускать повторно (idempotent — уже применённые миграции пропускаются)
Полезные флаги:
bash update.sh --dry-run # показать что будет сделано, ничего не менять
bash update.sh --force # перепрогнать миграции даже если version совпадает
bash update.sh --expose <panel.domain> # вернуть публичный доступ к панели после SSH-only
bash update.sh --masquerade # сменить режим маскировки (local | mirror)
bash update.sh --repair # регенерация Caddyfile + Hy2 config из config.json
# (с автобэкапом и rollback при ошибке)
bash update.sh --status # диагностика: версия, сервисы, TLS, порты
# (read-only, работает даже без root)
bash update.sh --help # справка
Если установка ещё не сделана, скрипт мягко завершится с подсказкой запустить install.sh.
🔒 SSH-only режим (панель только через SSH-туннель)
Это максимально защищённый режим: панель свяжется на 127.0.0.1:3000 и не будет видна из Интернета. Получить доступ можно только через SSH-туннель, что делает её невозможным сбрутить или просканировать.
Включение при установке:
При запуске install.sh после выбора способа доступа к панели вы увидите вопрос:
Сделать панель доступной только через SSH-туннель? [y/N]:
Если ответить y:
- Панель свяжется только на
127.0.0.1(внутри сервера). - Порты
3000/tcpи8080/tcpбудут закрыты на UFW (deny). - Если выбран режим 3 (поддомен) — site-блок поддомена не добавляется в Caddyfile (поддомен будет недоступен публично).
Доступ с локальной машины:
# 1) Открыть SSH-туннель (терминал держим открытым)
ssh -L 8080:127.0.0.1:3000 root@YOUR_SERVER_IP
# 2) В браузере на локальной машине
http://localhost:8080
Что делать, если нужно вернуть публичный доступ:
bash update.sh --expose panel.yourdomain.com
Команда:
- Добавит site-блок
panel.yourdomain.comв Caddyfile (TLS + reverse_proxy на127.0.0.1:3000). - Снимет UFW-deny с портов
3000/tcpи8080/tcp. - Обновит
config.json:panelDomain,sshOnly=0. - Перезагрузит Caddy и панель.
LE-сертификат выпишется автоматически при первом обращении к домену.
🎭 Маскировка домена (masquerade)
Маскировка — это что увидит случайный посетитель домена в браузере (HTTPS) или сторонний клиент, отправивший запрос на UDP/443 без правильной аутентификации. Цель: сделать сервер похожим на обычный сайт, а не на VPN-эндпоинт.
При установке (install.sh) после ввода параметров прокси вы увидите вопрос:
🎭 Маскировка (камуфляж домена):
1) Локальная страница «Loading» (надёжно, без внешних зависимостей)
→ Простая статичная HTML-страница, всегда работает.
2) Зеркалирование внешнего сайта (reverse_proxy)
→ Caddy и Hy2 будут отдавать содержимое указанного URL.
⚠ Если сайт станет недоступен — посетители получат 502.
→ Рекомендуемые: https://www.apple.com, https://github.com, https://www.amd.com
Ваш выбор [1/2, по умолчанию 1]:
Вариант 1 — локальная страница «Loading» (по умолчанию):
- Caddy:
file_server { root /var/www/html }(статичная HTML-страница). - Hy2:
masquerade.type: file(та же папка). - Плюсы: нет внешних зависимостей, всегда работает, минимальные ресурсы.
- Минусы: при попытке скана видно что-то «нестандартное» (хотя выглядит как сайт-заглушка).
Вариант 2 — зеркалирование внешнего сайта (reverse_proxy):
- Caddy:
reverse_proxy <url> { header_up Host {upstream_hostport} }. - Hy2:
masquerade.type: proxy, proxy.url: <url>, rewriteHost: true. - Плюсы: для случайного посетителя домен выглядит точно как apple.com / github.com / любой другой сайт.
- Минусы: если upstream станет недоступен — все посетители получат 502 ошибку (но клиенты прокси продолжат работать, так как они идут через
forward_proxy/QUIC). - Рекомендуемые сайты: стабильные крупные ресурсы (apple.com, github.com, amd.com).
Сменить маскировку на существующей установке:
bash update.sh --masquerade
Команда:
- Спросит интерактивно режим (1=local, 2=mirror + URL).
- Перепишет
Caddyfileи/etc/hysteria/config.yamlпод новый режим. - Обновит
config.json:masqueradeMode,masqueradeUrl. - Reload Caddy + restart Hysteria2 + restart панели.
- НЕ трогает: пользователей, домен, email, сертификаты.
💡 Идея проекта
На одном сервере поднимаются оба протокола одновременно:
| Протокол | Транспорт | Порт | Назначение |
|---|---|---|---|
| NaiveProxy | TCP | 443 | Маскировка под HTTPS, HTTP/2 forward-proxy (Caddy) |
| Hysteria2 | UDP | 443 | Высокоскоростной QUIC-прокси с собственным congestion |
Оба работают на одном порту 443 (TCP + UDP — разные сокеты, конфликта нет). Hysteria2 использует сертификат Caddy — один домен, один сертификат, два протокола. Для внешнего наблюдателя сервер выглядит как обычный сайт на HTTPS с поддержкой HTTP/3.
📋 Требования к серверу
Поддерживаемые ОС
| ОС | Версия | Статус |
|---|---|---|
| Ubuntu | 24.04 LTS | ✅ Рекомендуется (основная для тестов) |
| Ubuntu | 22.04 LTS | ✅ Полностью поддерживается |
| Ubuntu | 20.04 LTS | ⚠️ Работает, но ядро старое (BBR может быть медленнее) |
| Debian | 12 (bookworm) | ✅ Полностью поддерживается |
| Debian | 11 (bullseye) | ✅ Полностью поддерживается |
Другие apt-based (Mint, Pop!_OS, …) |
— | ⚠️ Должны работать, но не тестировались |
| CentOS / RHEL / Fedora / Alpine / Arch | — | ❌ Не поддерживаются (скрипт требует apt) |
Архитектуры
| Arch | uname -m |
Статус |
|---|---|---|
| x86_64 | x86_64 |
✅ Основной случай (99% VPS) |
| ARM 64-bit | aarch64 |
✅ Oracle Cloud Free ARM, AWS Graviton — работает |
| ARM 32-bit | armv7l |
✅ Raspberry Pi 3/4 (32-бит режим) |
Скрипт автоматически определяет архитектуру и скачивает соответствующие бинарники Hysteria2 / Go / Caddy. Ранее были проблемы с ARM — в текущей версии пофиксены (работает на Oracle ARM).
Прочее
- Домен: A-запись с IP сервера (например
vpn.yourdomain.com) — иначе Let's Encrypt не выдаст сертификат - Порты: 22/tcp (SSH), 80/tcp (ACME), 443/tcp (Naive), 443/udp (Hy2), 3000/tcp или 8080/tcp (панель)
- RAM: минимум 1 ГБ (для сборки Caddy из исходников). Для 512 МБ используйте swap.
- Root-доступ: обязателен
- Ядро: 4.9+ (для BBR). В Ubuntu 20.04+ — всегда новее.
🎛️ Возможности панели
| Функция | Описание |
|---|---|
| 🟢 Установка в 2 клика | Выбери стек (Naive / Hy2 / Оба) → домен + email → готово |
| 👥 Раздельные пользователи | Отдельные списки для NaiveProxy и Hysteria2 |
| ⏱️ Срок действия ключей | 1/3/7/14/30/90/180/365 дней или бессрочно. Автоматическое отключение по истечении (проверка каждые 5 мин). Продление одной кнопкой. |
| 🇷🇺 Bypass (split-tunneling) | Загрузка списка российских IP (1000+ сетей) — трафик к ним идёт напрямую, мимо VPN. Поддерживается Hysteria2 через нативный ACL. |
| 📊 Умный дашборд | Статус обоих сервисов, счётчик пользователей, IP, домен |
| 🔗 Ссылки подключения | Готовые naive+https://... и hysteria2://... ссылки |
| 🔄 Управление сервисами | Старт / стоп / рестарт Caddy и Hysteria по отдельности |
| ⚡ Сетевой тюнинг | Применение BBR + UDP-буферов одной кнопкой |
| 🔍 Диагностика | Проверка портов TCP/UDP 443, логи сервисов, статус сертификатов, содержимое Hy2-конфига |
| 🔒 Смена пароля панели | Хешированное хранение bcrypt |
🔌 Клиенты для подключения
NaiveProxy
| Платформа | Приложение |
|---|---|
| iOS | Karing |
| Android | NekoBox / Karing |
| Windows | Karing / NekoRay / v2rayN |
Hysteria2
| Платформа | Приложение |
|---|---|
| iOS | Karing / Shadowrocket |
| Android | NekoBox / Karing |
| Windows | Nekoray / v2rayN / Hiddify |
| macOS | Karing / Hiddify |
| Linux | hysteria CLI |
Формат ссылок:
naive+https://LOGIN:PASSWORD@your.domain.com:443
hysteria2://PASSWORD@your.domain.com:443?sni=your.domain.com
⚙️ Управление
# Панель
pm2 status
pm2 logs panel-naive-hy2
pm2 restart panel-naive-hy2
# NaiveProxy (Caddy)
systemctl status caddy
systemctl restart caddy
journalctl -u caddy -f
# Hysteria2
systemctl status hysteria-server
systemctl restart hysteria-server
journalctl -u hysteria-server -f
⏱️ Срок действия ключей
При добавлении пользователя можно выбрать срок: 1 день / 3 / 7 / 14 / 30 / 90 / 180 / 365 дней или бессрочно. Панель раз в 5 минут проверяет истёкших и автоматически:
- Для NaiveProxy — удаляет
basic_authстроку изCaddyfileи перезагружает Caddy. Пользователь получает407 Proxy Authentication Required. - Для Hysteria2 — удаляет запись из
auth.userpassв/etc/hysteria/config.yamlи перезапускаетhysteria-server. Клиент получает auth reject и перестаёт подключаться.
В таблице пользователей отображается цветной бейдж:
- 🟢 Бессрочно — серый
- 🟢 X дней — зелёный (>24 часа)
- 🟡 X часов — жёлтый (<24 часа до истечения)
- 🔴 Истёк — красный + строка перечёркнута
Кнопка «⏰ Продлить» в строке пользователя — открывает модалку для выбора нового срока от текущего момента. Бессрочный ключ можно сделать срочным и наоборот.
🇷🇺 Bypass — трафик к российским сервисам напрямую
Некоторые сайты (банки, госуслуги, маркетплейсы, банки) блокируют иностранные IP. Если весь трафик идёт через зарубежный VPN — они не откроются. Решение — пускать трафик к ним мимо VPN (split tunneling).
В панели: раздел Bypass (прямой трафик)
- Скачать актуальный список в JSON: например с antifilter.download или github.com/zapret-info
- Вставить в текстовое поле и нажать «Загрузить и включить»
- Форматы:
{"service.ru": ["1.2.3.0/24", ...], ...}— по сервисам["1.2.3.0/24", ...]— просто массив CIDR
- Файл ACL создаётся по пути
/etc/hysteria/bypass-ru.acl, подключается в конфиг Hy2 какacl.file: ..., Hy2 перезапускается автоматически.
Ограничения
| Протокол | Серверный bypass | Примечание |
|---|---|---|
| Hysteria2 | ✅ Работает через ACL | Настраивается один раз на сервере, для всех клиентов |
| NaiveProxy | ❌ Не поддерживается Caddy forward_proxy | Настраивается на клиенте (Karing / Happ / v2rayN поддерживают) |
Для NaiveProxy клиенту нужно прописать bypass-список локально — в Karing это делается в разделе «Outbound rules», в Happ — через import конфига с rules.
🔐 Безопасность
- Пароли пользователей панели хранятся как bcrypt-хеш
- Пароли прокси-пользователей шифруются при сохранении на диск (AES-256-GCM)
- CORS ограничен
localhost:3000 - Session secret генерируется при первом запуске
- UFW включается автоматически, лишние порты закрыты
🔧 Диагностика проблем
В панели есть страница «Диагностика» (в боковом меню) — там можно:
- Посмотреть логи Caddy и Hysteria2 без SSH
- Проверить кто слушает порт 443/TCP и 443/UDP
- Прочитать частые причины почему Hy2 не запускается
Если что-то не так — заходите туда первым делом.
Из командной строки: update.sh --status
Одна команда показывает всё состояние установки — версия патчей, статус сервисов (caddy/hysteria/panel), TLS-сертификаты и их сроки, открытые порты, режим маскировки и режим доступа к панели:
sudo bash update.sh --status
# или вообще без root (read-only):
bash update.sh --status
Пример вывода:
Версия патчей: 1.3.0 (target: 1.3.0)
NaiveProxy: да
Hysteria2: да
Доступ к панели:
режим 3 — отдельный поддомен (Caddy + LE)
SSH-only: выкл
Маскировка:
режим: mirror → https://www.apple.com
Сервисы:
● caddy: active
● hysteria-server: active
● panel-naive-hy2: active
TLS-сертификаты Caddy:
• example.com: до Jul 27 12:34:56 2026 GMT
• panel.example.com: до Jul 27 12:34:56 2026 GMT
Восстановление: update.sh --repair
Если что-то сломалось (например, Caddyfile повреждён ручными правками, или панель перестала отвечать), эта команда регенерирует Caddyfile и /etc/hysteria/config.yaml из config.json, не трогая пользователей, домены и сертификаты:
sudo bash update.sh --repair
Что происходит:
- Автобэкап в
/etc/rixxx-panel/backups/YYYY-MM-DD-HHMMSS-repair/— сохраняются Caddyfile, hysteria config, panel config, systemd-юнит. Хранятся последние 10 бэкапов, старые удаляются. - Регенерация Caddyfile и Hy2 config из шаблонов на основе текущего
config.json. - Валидация —
caddy validateдля Caddyfile, YAML-парсинг для Hy2. Если новый конфиг невалиден → автоматический rollback из бэкапа. - Atomic rename временных файлов в рабочие пути (на ext4/xfs это атомарная операция).
- Reload сервисов: caddy, hysteria-server, панель.
- Smoke-test —
systemctl is-activeдля всех сервисов.
Smoke-test после установки
install.sh теперь в самом конце автоматически проверяет, что всё работает:
caddy validate --config /etc/caddy/Caddyfilesystemctl is-active caddy / hysteria-server / panel-naive-hy2curl http://127.0.0.1:3000/(панель отвечает локально)curl https://<proxy.domain>/иhttps://<panel.domain>/(TLS работает)
При обнаружении проблем выводится конкретная ошибка и подсказка: bash update.sh --repair или bash update.sh --status.
📜 История изменений
v1.4.1 — Флаг --ssh-only (PR #9)
- 🆕
bash update.sh --ssh-only— переключение уже работающей установки в SSH-only режим одной командой, без переустановки. Симметрично существующему--expose <domain>. - 🛡️ Сохраняется при переключении: юзеры NaiveProxy/Hysteria2 (со всеми паролями и ссылками), домен прокси и его TLS-сертификат, режим маскировки (mirror/local), Hysteria2 config,
panelDomainв config.json. - 🚪 Что делает: интерактивно показывает текущее состояние и подтверждение →
auto_backup "ssh-only"(точка отката) → удаляет panel-блок из Caddyfile (если был) с валидацией и rollback-ом → UFW deny 8080/tcp + 3000/tcp → останавливает nginx → прописываетsshOnly=1, listenHost=127.0.0.1в config.json → systemd Environment + PM2 delete+start с явным env (урок из PR #8) → reload Caddy → curl-проверка что панель отвечает на127.0.0.1:3000. - 🔄 Симметричный откат:
bash update.sh --expose <тот же panelDomain>возвращает публичный доступ. - 🤖 Не-интерактивный режим:
bash update.sh --ssh-only --yes(для автоматизации). - 🔮 Защита от регрессии при выпуске ключей: backend
writeCaddyfile()уже уважаетcfg.sshOnly === 1(с PR #4) — при добавлении новых Naive-юзеров panel-блок НЕ восстанавливается, так что панель надёжно остаётся скрытой.
v1.4.0 — Hotfix: SSH-only режим (PR #7)
- 🔒 Закрыта дыра в SSH-only режиме: при
ACCESS_MODE=1 + SSH_ONLY=1финальный UFW-блок вinstall.shперетирал раннийdenyкомандойufw allow 8080/tcp, а Nginx биндился на0.0.0.0:8080— панель оставалась доступной из Интернета, несмотря наLISTEN_HOST=127.0.0.1у бэкенда. ТеперьSSH_ONLY=1принудительно переводит установку в режим прямого bind на127.0.0.1:${INTERNAL_PORT}(без Nginx), а финальный UFW-блок проверяетSSH_ONLYпервым приоритетом и наглухо закрывает 8080/tcp + 3000/tcp. - 🔧 Migration 1.4.0 (
migrate_ssh_only_close_ports) — для уже установленных серверов сsshOnly=1: автоматически закрывает 8080/tcp и 3000/tcp в UFW (и удаляет старыеallow-правила), останавливает и отключаетnginx, гарантируетLISTEN_HOST=127.0.0.1в systemd-юните и PM2-env, перезапускает панель и финально проверяет, что внешний IP не отвечает на этих портах. Применяется одной командой:bash <(curl -fsSL https://raw.githubusercontent.com/cwash797-cmd/Panel---Naive-Hy2---by---RIXXX/main/update.sh). - ✅ Контракт миграции: если
sshOnly=0— миграция no-op (легитимный публичный режимACCESS_MODE=1через Nginx-прокси не ломается).
v1.3.2 — Hotfix: masquerade (PR #6)
- 🐞
update.sh --masqueradeпадал сCannot find module 'js-yaml': Node-скрипт запускался из/root/, где нетnode_modules. Теперь все три Node-вызова вupdate.sh(do_masquerade(),do_repair(), YAML-валидация в atomic write) обёрнуты в(cd "$PANEL_DIR/panel" && node -e "...")— модули резолвятся корректно. - 🐞 Mirror на крупных сайтах (GitHub, Apple, Cloudflare и т.д.) не работал: они блокируют
reverse_proxy-запросы от чужих серверов, клиенты NaiveProxy получали502 / EOF. В рекомендацияхinstall.shиupdate.sh --masqueradeзаменены примеры на статичные сайты:iana.org,ietf.org,demo.nginx.com. Дефолт при пустом вводе теперьhttps://www.iana.org. - ⚠️ Предупреждение в установщике: при выборе режима mirror теперь показывается явное сообщение про крупные сайты и риск 502/EOF — пользователи больше не будут случайно ставить github.com.
v1.3.1 — UI-хотфикс (PR #5)
- 🆕 Динамическая версия в панели: новый эндпоинт
GET /api/system/versionчитает/etc/rixxx-panel/version, на странице «Настройки → Информация о панели» теперь отображается актуальная версия (раньше было захардкожено1.0.0). - 🆕 Подсказки в «Диагностике»: добавлен блок CLI-инструментов со ссылками на
bash update.sh --statusиsudo bash update.sh --repair(с примером--dry-run). - ⚠️ Пометка в разделе Bypass: явное предупреждение, что функция в активном тестировании — обязательно проверять на своём клиенте перед использованием в продакшне.
v1.3 — Стабильность и диагностика (PR #4)
- 🆕
update.sh --repair— регенерация Caddyfile + Hy2 config изconfig.jsonс автобэкапом, валидацией и rollback при ошибке - 🆕
update.sh --status— одна команда показывает всё состояние (версия, сервисы, TLS, порты, режимы); работает без root - 🆕 Автобэкап в
/etc/rixxx-panel/backups/— все ключевые файлы сохраняются перед изменениями, хранятся последние 10 - 🆕 Smoke-test в
install.sh— после установки автоматически проверяется работоспособность (caddy validate, systemctl is-active, curl на домены) - 🐞 Атомарная защита
writeCaddyfile(): запись через temp-файл →caddy validate→atomic rename. На любой ошибке — автоматический rollback из.last-бэкапа. Это окончательно закрывает баг с потерей panel-блока при добавлении Naive-юзеров. - 🐞 Атомарная защита
writeHysteriaConfig(): temp-файл + self-validate (yaml.load) + atomic rename + rollback из.last. - 🐞
writeCaddyfile()уважаетsshOnly=1— panel-блок не добавляется в SSH-only режиме даже при перегенерации (раньше мог восстанавливаться при добавлении юзеров).
v1.2 — Исправление параллельной работы Naive + Hy2
- 🐞 Hy2 не запускался когда был Naive: Caddy по умолчанию занимал UDP/443 для HTTP/3 (QUIC), не давая Hy2 биндиться. Теперь при установке обоих протоколов в
Caddyfileдобавляетсяservers { protocols h1 h2 }— HTTP/3 в Caddy отключён, UDP/443 свободен для Hy2. - 🆕 Страница «Диагностика» в панели — логи + проверка портов
- 🆕 Скрипт
install_hysteria.shтеперь сам патчит уже установленный Caddyfile при доустановке Hy2 поверх Naive - 🆕 Финальные проверки в
install.sh: панель отвечает на:3000, nginx слушает:8080 - 🆕 Systemd-fallback если PM2 не запустил панель
- 🐞
writeCaddyfileв backend теперь сохраняет директиву отключения HTTP/3 при добавлении/удалении Naive-юзеров
v1.1 — Параллельный запуск Naive + Hy2 (4 фикса)
- Hysteria2 теперь стартует после Caddy (
After=caddy.service) - Чтение существующего
/etc/hysteria/config.yamlпри изменении пользователей (раньше затирал TLS-секцию) - Поиск Caddy-сертификата в обоих возможных путях
- Валидный JSON
config.json(heredoc + переменные)
v1.0 — Первый релиз
- Multi-arch Go (amd64 / arm64 / armv6l)
- 2-кликовая установка обоих протоколов
- Единая панель для Naive + Hy2
- BBR + UDP-тюнинг
by RIXXX — мультипротокольная прокси-панель с удобным интерфейсом