Что нового
Изменения панели STEALTHNET SOFTWARE. Новое сверху.
Готовится — 0.1.0
Первый публичный выпуск ещё не состоялся: код откроется вместе с ним. Ниже — то, что уже работает и проверено на живом стенде.
Телеграм-бот
- Мини-приложение — кабинет клиента прямо в Telegram, разложен по четырём экранам: подписка, тарифы, приглашения и поддержка. Вход без пароля: Telegram подписывает данные о пользователе, панель проверяет подпись ключом бота. Тот, кто ещё ничего не купил, сразу попадает на тарифы.
- Обращения в поддержку и ссылка-приглашение есть и в кабинете, не только в боте: переписка та же самая и ссылка та же, откуда бы клиент ни зашёл.
- Кнопка «Подключиться» открывает страницу подписки внутри Telegram: готовые ссылки и приложения под платформу. Появляется только с активной подпиской.
- Промокоды в боте. Цена на кнопке сразу со скидкой — увидеть одну сумму и заплатить другую нельзя. Отказ объясняется по существу: «код исчерпан», «только для первой покупки», а не общее «не подошёл».
- «Пригласить друга»: клиент получает свою ссылку и процент с оплат приведённого. Начисления идут в тот же раздел «Партнёрка», что и остальные.
- Пробный тариф помечен в витрине и не предлагается второй раз.
- Автопродление переключается самим клиентом в карточке подписки.
- «Как подключить»: выбрал устройство — получил приложение под него и свою ссылку. Список приложений тот же, что на странице подписки, — второго не завели.
- Экран «Документы» вместо «Помощи»: оферта, договор и любые свои ссылки — добавляются списком в панели. Раньше рядом жили две кнопки об одном и том же: «Помощь» и «Связь с поддержкой».
- Телеграм-бот настраивается в панели, в разделе «Телеграм-бот»: приветствие, объявление под меню, документы, ссылка на поддержку. Правки бот подхватывает за полминуты — перезапускать не нужно.
- Своя картинка на каждый экран бота. Задана одна общая — используется везде, где не задана своя.
- Обращения в поддержку прямо в боте: клиент пишет, вы отвечаете в разделе «Обращения», ответ приходит ему в бот. Переписка одна и та же с обеих сторон.
- Проверка подписки на канал. Пока человек не подписан, бот дальше не пускает. Канал не задан — проверки нет вовсе. Если бота убрали из администраторов канала, людей пропускаем: сломанная настройка не должна отрезать всех клиентов.
Ноды и движок
- Журнал действий администраторов. Пишется он давно, но посмотреть его в панели было негде — разбирать «кто это поменял» приходилось запросом к базе.
- Агент обновляется из панели: кнопка «Обновить агентов на всех нодах». Ноду со старым агентом, который команд панели ещё не понимает, обновляют один раз командой
update-node.shна сервере — дальше всё кнопками. - Версия Xray задаётся в панели одной строкой и раскатывается на весь парк: агент сверяет свою при каждом опросе, скачивает релиз, проверяет что бинарь запускается и называет нужную версию, и только потом подменяет рабочий. Отставшие ноды видно на странице нод.
- Кнопка «Перезапустить Xray» в меню ноды. Раньше движок перезапускался только сам — при смене конфига или состава клиентов, — и подхватить обновлённый сертификат можно было лишь руками на сервере.
- Смена профиля перерисовывает карточку ноды: инбаунды принадлежат профилю, и прежний список после смены был неверен. На сервере привязки тоже оставались от старого профиля — нода оказывалась без единого инбаунда.
- Агент перестал писать в журнал про nftables каждые пятнадцать секунд: когда все плагины выключены, он их не применяет вовсе, а повторяющуюся причину отказа сообщает один раз. Установщик ставит nftables сразу.
- Агент качается из релиза на GitHub; панель осталась запасным источником для закрытого контура и своих сборок. Установщик проверяет, что скачал именно бинарь: панель отдаёт свою страницу на любой неизвестный адрес, и её молча ставили вместо агента — systemd отвечал «Exec format error».
- Страна ноды выбирается из списка с поиском по названию и коду. Раньше код набирали руками, и «GE» вместо Германии давал флаг Грузии.
- Имя удалённой ноды освобождается. Удаление мягкое, но ограничение уникальности не различало живые и удалённые записи, поэтому завести ноду с прежним именем было нельзя.
- Ошибка о занятом значении называет поле, а не говорит «запись с таким значением уже существует».
- Окно после создания ноды переписано под чистый сервер: первым идёт путь без Docker, по шагам — вход по SSH, одна команда, ожидание. Команда видна целиком, а не обрезана многоточием.
- Кнопки «Копировать» в окнах установки ноды и сервиса подписок клали в буфер название вкладки вместо самой команды.
- Установка ноды одной командой; агент сам держит связь с панелью, применяет профиль и отдаёт трафик, онлайн и нагрузку.
- Конфигурация проверяется движком до применения. Негодный профиль больше не может уронить уже работающую ноду: она останется на прежней конфигурации.
- Нода горит красным, если движок не поднялся, и показывает причину прямо в карточке — не приходится лезть в логи на сервере.
- Гео-базы обновляются сами, раз в неделю, и движок перезапускается только если файлы действительно изменились.
Протоколы и профили
- Hysteria 2 больше не подключалась в свежих клиентах. В Xray 26.7 она стала отдельным транспортом, а подписка отдавала
network: tcp— приложения отвечали «not hysteria transport» и не запускались вовсе. Теперь транспорт верный с обеих сторон, а панель не даст сохранить профиль с неправильным. - Ключи Reality берутся только из профиля. Раньше они копировались в строку хоста, и после перевыпуска в профиле значения расходились: сервер ждал один short id, клиент присылал другой, локация выглядела нерабочей при полностью исправной ноде. Публичный ключ выводится из приватного, копировать его никуда не нужно.
- Установка ноды снова одна для всех: выпуск сертификата из установщика убран. Reality его не требует, а тому, что работает поверх TLS, сертификат нужен на домен конкретной ноды — это ручной шаг, описанный в разделе про ноды.
- У каждой заготовки профиля появилась кнопка «?» с пошаговой инструкцией: что именно нужно сделать, чтобы она заработала. Такая же кнопка есть в редакторе — там подсказка подбирается по тому, что в конфиге сейчас.
- Протоколы: VLESS, VMess, Trojan, Shadowsocks 2022, Hysteria2.
- Транспорты: TCP, WebSocket, gRPC, XHTTP, HTTPUpgrade, mKCP.
- Шифрование: Reality, TLS, без шифрования за обратным прокси.
- Одиннадцать готовых заготовок профилей: выбрали — создалось — правите под себя. Каждая проверена живым трафиком, а не только по документации.
- Девять готовых кусков маршрутизации, которые вставляются в профиль.
Клиенты и подписки
- Рядом со счётчиком трафика видно, когда он обнулится и по какому расписанию. Раньше сброс по тарифу выглядел поломкой: вчера было два гигабайта, сегодня ноль, и ничто не объясняло почему.
- «Стратегия сброса» в карточке клиента наконец работает: поле было, но значение никуда не отправлялось. Смена расписания пересчитывает и дату следующего сброса — иначе счётчик обнулялся бы по прежнему.
- Небольшой трафик показывался как «0 MiB» и выглядел как обнулённый счётчик: всё, что меньше гигабайта, округлялось до мегабайтов. Теперь мелкие значения показываются в килобайтах и байтах, а ноль так и называется нулём.
- Подписка отдаёт причину в том же формате, что и локации. Раньше при исчерпанном лимите устройств уходила строка «# причина» независимо от запроса, и приложение, ожидающее Xray JSON, показывало ошибку разбора вместо объяснения. Текст про лимит устройств теперь настраивается наравне с остальными.
- Устройства считаются по HWID, число устройств ограничивается тарифом.
- Групповые операции над клиентами: включить, выключить, обнулить трафик, отозвать подписку, удалить — по выбранным или по всему фильтру.
- Состав клиентов доезжает до нод сам, без правки профиля.
- Сервис подписок выносится на отдельный сервер, и адрес берётся при установке — он больше не зашит в код.
Деньги
- Возвраты платежей, полные и частичные, с сохранением истории.
Оформление
- Светлая тема по умолчанию, тёмная — переключателем.
- Английский интерфейс.
История самого сайта — в коммитах репозитория.