Releases: Mrvibecodic/chill-remna-bot
Release list
1.4.1
Мелкий релиз вдогонку к 1.4.0.
📱 Экран «Документы» удобнее на телефоне
Кнопки админ-экрана Интерфейс → Контакты → 📜 Документы теперь идут в один столбец — по одной в строке. Раньше они стояли парами, и длинные подписи («Согласие перед покупкой: ✅» и т.п.) на телефоне обрезались многоточием.
Обновление: /update в боте или docker compose pull && docker compose up -d. Образы: ghcr.io/mrvibecodic/chill-remna-bot:v1.4.1 (а также :v1.4, :v1, :latest).
1.4.0
📜 Документы сервиса: соглашение и политика конфиденциальности
Вместо единственного «пользовательского соглашения» теперь два документа — соглашение и политика конфиденциальности. У каждого может быть текст прямо в боте и/или ссылка на страницу.
Где они показываются, решают четыре независимых тумблера (Интерфейс → Контакты → 📜 Документы):
- 🏠 кнопка «Документы» в меню — доступны в любой момент, а не только при покупке (этого требуют платёжные провайдеры, например Platega);
- 💳 согласие перед покупкой — прежнее поведение соглашения;
- 🚪 согласие при первом входе — без «Принимаю» меню не открывается;
- 🧾 ссылки на экране оплаты — приписка «Оплачивая, вы принимаете …».
Согласие одно на все документы, дата фиксируется у пользователя; кнопка «Сбросить согласия» (с подтверждением) заставляет принять их заново, когда документы изменились. Мини-апп и веб-кабинет держат те же тумблеры — принять можно прямо там (аккаунту по e-mail бот недоступен). Команды /terms, /privacy, /docs открывают документы в любой момент; длинный документ уходит несколькими сообщениями целиком.
Обновление ничего не ломает: прежний текст соглашения становится документом «Пользовательское соглашение» с включёнными «согласием перед покупкой» и кнопкой в меню.
🖼 Баннер главной больше не может уронить бота
Исправлен сценарий, из-за которого бот у оператора «переставал стартовать»: при настройке баннера вместо картинки было отправлено текстовое сообщение, Telegram отвечал wrong remote file identifier, и вместе с баннером не уходило главное меню.
- текст или пустое сообщение больше не сохраняется как картинка (подсказка, «-» возвращает встроенную);
- если Telegram отверг саму картинку — экран уходит на встроенном баннере, негодная настройка снимается, админу приходит предупреждение;
- при сетевом сбое или блокировке бота настройка не трогается, разовая недоступность сайта с картинкой её не стирает;
- если не принялась и встроенная (например, слишком длинная подпись) — экран уходит текстом с теми же кнопками;
- картинка, присланная файлом «без сжатия», больше не молчит: бот просит переслать её фотографией.
📚 Новая документация — remna.shop
Сайт документации переписан: боковое меню, поиск по-русски, оглавление страницы, тёмная и светлая темы, мобильный вид. Разделы: установка и мастер, админка (продажи, маркетинг, интерфейс, пользователи, система), вебхуки и reverse-proxy, команды, переменные окружения, обновление и бэкап, каналы релизов, FAQ и галерея скриншотов. Старые ссылки (/screens.html, якоря вида #install) продолжают работать.
🛠 Мелочи
- CI переведён на экшены с Node 24 (GitHub деprecated Node 20).
- README сокращён: быстрый старт и ссылки на разделы сайта.
Обновление: /update в боте или docker compose pull && docker compose up -d. Образы: ghcr.io/mrvibecodic/chill-remna-bot:v1.4.0 (а также :v1.4, :v1, :latest).
1.3.0
Экран «Подключить»
- Исправлен разбор конфига приложений актуальной страницы подписки (7.x): раньше бот не видел в нём приложения и список оставался пустым, теперь поддерживаются оба формата — старый и новый.
- На панели 3.x список приложений берётся напрямую из панели по API, включая персональный конфиг, назначенный конкретной подписке. Страница подписки осталась запасным источником для старых панелей.
- Платформы Android TV / Apple TV встали на своё место в списке; при неудачном разборе в логи пишется причина.
Пользователи
- Появился поиск: по Telegram ID, нику, имени и e-mail веб-аккаунта, достаточно части строки. Из результатов открывается карточка, «Назад» возвращает в выдачу.
Доступ в бота
- Закрытие публичного бота больше не выдаёт доступ всей базе молча — бот спрашивает: сохранить доступ уже зарегистрированным или закрыть всем. Это чинит ситуацию после импорта из RemnaShop, когда все импортированные оказывались в белом списке.
- Экран «Список вайтлиста» теперь показывает всех, у кого доступ реально есть (с пагинацией), отдельно — заранее добавленные ID. Добавлена кнопка «Снять доступ у всех» с подтверждением.
- Отчёт импорта предупреждает, что в закрытом боте импортированным нужно выдать доступ.
- Предзаполненный вайтлист и приглашения теперь переезжают вместе с резервной копией базы.
Кошелёк
- Пополнение баланса можно отключить (Продажи → 👛 Кошелёк): новые деньги не принимаются, а лежащие на балансах люди дожигают на подписку. Оплата с баланса, реферальные начисления и промокоды продолжают работать; уже выставленные счета на пополнение дозачисляются.
- На экране настройки видно, сколько денег сейчас лежит на балансах и у скольких человек.
- В кошельке и на экране пополнения явно указано: баланс тратится только на подписку, вывод средств невозможен.
Прочее
- Go обновлён до 1.25.13 (закрывает уязвимости стандартной библиотеки).
- Документация и README обновлены под перечисленное.
1.2.1
Что нового
Образ теперь собирается под ARM64 (aarch64), а не только под x86-64.
Мультиарх-манифест публикуется на все теги (:latest, :v1, :v1.2, :v1.2.1, :dev) — docker pull сам выбирает вариант под процессор сервера. Установка на ARM-серверах (Oracle Ampere, Hetzner CAX, Raspberry Pi, Apple Silicon) больше не падает с no matching manifest for linux/arm64/v8.
Закрывает #5.
Обновление
Ничего менять не нужно: на x86-64 всё работает как раньше, образ тот же.
docker compose pull && docker compose up -d1.2.0
Что нового
🧾 Тарифы
Вместо одной сетки цен — полноценные тарифы, сколько угодно (Продажи → 🧾 Тарифы):
- У каждого тарифа свои имя, значок, описание, порядок в витрине, вкл/выкл, дублирование и удаление.
- 💲 Цены и лимиты: свои сроки и цены (в том числе по способам оплаты), валюта, трафик и лимит устройств (HWID), сквады — на тариф и с переопределением на отдельный срок (например, на годовой дать больше устройств).
- 🔐 Доступность: всем / только новым / только действующим / по списку (Telegram ID или почта веб-кабинета) / по ссылке.
- 🔗 Продажа по прямой ссылке
t.me/<бот>?start=plan_КОД: тариф скрыт из витрины и открывается только по ссылке. Код неперебираем, попытки подбора троттлятся. - 📤 Экспорт / 📥 Импорт тарифа JSON-файлом (условия + список допущенных) — перенос между установками в две кнопки.
- ➕ Доп-подписка на уровне тарифа: вкл / выкл / как в общих настройках, своё название и описание опции.
Обновление ничего не требует: текущая сетка цен автоматически становится тарифом «Базовый», быстрая и тонкая настройка продолжают работать и правят его же.
🛒 Витрина и карточка тарифа
- Несколько тарифов — список с ценами «от …», единственный открывается сразу карточкой.
- В карточке: описание, доступные страны и условия тарифа — трафик (с учётом стратегии сброса) и лимит устройств; если условия различаются по срокам — с разбивкой по срокам.
- Значок тарифа из админки показывается в заголовке карточки; стандартная коробка 📦 — только у тарифов без своего значка.
💱 Смена тарифа и продление
- Смена тарифа не сжигает остаток: неиспользованные дни зачитываются к новому тарифу по соотношению цен, точный сдвиг срока виден до оплаты.
- Продление идёт по своему тарифу. Если его условия изменились с прошлой оплаты — предупреждение перед оплатой; если тариф стал недоступен — предложение выбрать новый без вреда действующей подписке.
📜 Снимок условий сделки
Условия покупки (цена, лимиты, сквады) фиксируются в момент выставления счёта и применяются при оплате ровно такими, какими были проданы — последующие правки тарифа админом, рестарт бота или задержавшийся вебхук выдачу не меняют. Выбор срока и условия счетов хранятся в базе и переживают перезапуск.
📱 Мини-апп и веб-кабинет
Витрина по тарифам: карточки со сроками, странами, лимитами и подсветкой самого выгодного срока; зачёт остатка при смене тарифа виден до оплаты. Кошелёк, прогноз «на сколько хватит», триал и суммы пополнения учитывают цены тарифов.
🔧 Исправления
Фиксы автосписания (ретраи, валюта, перепроверка сверки), сверки и продления, бонусных дней, статистики и бэкапа.
v1.1.1
1.1.0
Что нового
🚫 Торрент-блокер — полная интеграция с плагином панели
Если на нодах включён плагин torrent-blocker (Панель и Node ≥ 2.7.0), бот обрабатывает отчёты панели о блокировках IP за торрент-трафик:
- Отчёт админу по каждому срабатыванию: пользователь, номер нарушения за 30 дней, нода, IP, срок, протокол и адреса соединения. Кнопки прямо в отчёте: карточка пользователя, блокировка, снятие блокировки IP досрочно (Executor плагинов на всех нодах), исключение пользователя из-под блокера (
ignoreLists.userIdво всех конфигах плагинов). - Предупреждение нарушителю (с паузой от спама) и отдельное сообщение «блокировка снята» по истечении срока — текст настраивается с телеграм-форматированием, перед отправкой бот сверяет с панелью, что подписка не отключена.
- Журнал отчётов на 180 дней с пагинацией и счётчиком повторов; в карточке пользователя — счётчик нарушений и личный журнал.
- Автоотключение подписки по порогу нарушений за 30 дней (по умолчанию выключено; защита от повторного срабатывания по хвосту отчётов).
- Новый раздел Пользователи → 🚫 Торренты; отчёты обрабатываются только при заданном секрете вебхука панели (защита от подделки). Для кнопок действий токену панели 3.x нужны скоупы
node-plugins:list, get, update, executor.
⏰ Напоминания об истечении на новых панелях
Панели 2.8.0+ и 3.x заменили события user.expires_in_* на user.expiration — бот теперь понимает оба поколения. Напоминания «подписка скоро истечёт» снова работают на актуальных панелях (включите EXPIRATION_NOTIFICATIONS_ENABLED на панели); интервалы, кратные суткам, показываются в днях.
🔄 Обновление бота
/updateскачивает только образ бота — лимит Docker Hub на посторонние образы (postgres) больше не срывает обновление.- Ошибка pull теперь приходит админу текстом (раньше обновление молча «не происходило»).
🛠 Исправления
- Починен счётчик повторных нарушений на Postgres для Telegram ID больше 2³¹.
- Сообщение «блокировка снята» больше не теряется при кратковременном сбое БД.
- Экран «Торренты» предупреждает, если секрет вебхука панели не задан.
Обновление
/update в боте, либо docker compose pull && docker compose up -d. Миграции БД применяются автоматически (новые таблицы журнала и отметок).
Docker-образы: :v1 / :v1.1 / :v1.1.0 / :latest
1.0.2
Исправления по итогам сверки всех платёжек с официальными API:
- Чеки «Мой налог» теперь формируются только по платежам ЮKassa.
- Heleket: исправлено зависание бота при вводе валюты конвертации в админке; в журнале — фактически оплаченная сумма; валидация Return URL.
- Tribute: полугодовой тариф выдаёт 6 месяцев (было 12); валютные платежи (EUR/USD) больше не считаются рублями в рефералке и статистике.
- Platega: актуальный код карточного эквайринга (11), проверка подлинности колбэка, обработка chargeback с уведомлением админа.
- CryptoBot: валюта счёта из прайса, понятные тексты ошибок API, потерянное пополнение зовёт админа вместо тихой потери.
- ЮKassa: обработка отменённых платежей с причиной, защита от двойного автосписания, строгая валидация цены.
- Stars: обработка возвратов звёзд, повторная доставка оплаты больше не пугает пользователя, оплата не блокирует другие платежи.
- МойНалог: чек по московскому времени, повторы при сбоях, подробные ошибки ФНС в журнале.
1.0.1
Дефолт docker-compose.yml для новых установок — мажорный тег :v1: приходят все релизы 1.x.y, автоматического перехода на будущий 2.0.0 не будет. CI теперь публикует на каждый релиз также образы :vX и :vX.Y.
Существующие установки не затронуты: :latest и :dev обновляются как раньше, самообновление из бота работает без изменений.
1.0.0
Первый нумерованный релиз. Включает всё, что накопилось в dev с последнего обновления main.
💳 Платежи
- Новая платёжка Heleket (криптовалюта): счёт в ₽, монету и сеть клиент выбирает на странице оплаты; покупка и пополнение кошелька из чата, мини-аппа и веб-кабинета; подпись вебхука и перепроверка каждого платежа по API шлюза; официальный Go SDK.
- Автопродление ЮKassa: подключается по согласию после успешной оплаты, отключается одной кнопкой везде; списание за N дней до конца (настраивает админ), защита от двойного списания, очередь и повторы при сбоях; 429 от ЮKassa считается временным лимитом, а не отказом карты.
- P2P «всем без одобрения» (опция) — реквизиты без ручного допуска каждого; e-mail-аккаунты кабинета по-прежнему только вручную.
🚪 Доступ
- Режимы публичности: публично / по приглашениям / белый список. Приглашения — ссылки
t.me/бот?start=inv_КОДсо сроком жизни и лимитом активаций, отзыв и удаление. Режим действует и на мини-апп с веб-кабинетом.
🧩 Панель и переезд
- Поддержка Remnawave 3.x рядом с 2.7.4+: бот сам определяет диалект API (uuid ↔ числовой id через
/api/users/stream) и переживает апгрейд панели на лету. - Мастер переезда с remnashop (v0.8.0–0.8.2): пользователи, сроки, триалы, рефералы, промокоды, история платежей — по дампу его базы.
- Совместимость доп-подписки с прослойкой подписок + кнопка «Синхронизировать всех».
- Поддержка панелей за «Caddy with security» (
CADDY_AUTH_API_TOKEN) и экран «Доступ к панели».
🧾 Журнал платежей
- Ошибки всех способов оплаты пишутся в журнал: создание счёта, вебхуки, подписи, выдача подписки, автопродление, реконсиляция — с источником (чат / мини-апп / кабинет).
- Экран «Только ошибки»: сводка «способ · этап · сколько» + выгрузка файлом за сутки / 7 дней / всё время; усечения всегда объявляются; фильтрация на стороне БД с индексами.
🛡 Надёжность и безопасность (по итогам аудита всего кода)
- Починена идемпотентность выдачи: сбой записи платежа больше не приводит к повторным продлениям подписки реконсилятором.
- Устранена гонка, способная уронить процесс во время мастера настройки; закрыт обход рейт-лимитера кабинета через подделку заголовков прокси.
- Экранирован пользовательский ввод в админ-уведомлениях (e-mail кабинета, данные мини-аппа, метки из дампа remnashop).
- Мусорные вебхуки больше не заливают журнал и не дёргают API шлюзов; строгий разбор цен (fail-closed) у Heleket и Platega.
- Обновление с dev-канала на SQLite больше не падает на миграции 0038.
🐳 Образы
ghcr.io/mrvibecodic/chill-remna-bot:latest— этот релиз (канал stable, веткаmain).ghcr.io/mrvibecodic/chill-remna-bot:v1.0.0— закреплённая версия.ghcr.io/mrvibecodic/chill-remna-bot:dev— превью-канал, как раньше.