Skip to content

Releases: Mrvibecodic/chill-remna-bot

1.4.1

Choose a tag to compare

@Mrvibecodic Mrvibecodic released this 18 Aug 22:13

Мелкий релиз вдогонку к 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

Choose a tag to compare

@Mrvibecodic Mrvibecodic released this 18 Aug 21:54

📜 Документы сервиса: соглашение и политика конфиденциальности

Вместо единственного «пользовательского соглашения» теперь два документа — соглашение и политика конфиденциальности. У каждого может быть текст прямо в боте и/или ссылка на страницу.

Где они показываются, решают четыре независимых тумблера (Интерфейс → Контакты → 📜 Документы):

  • 🏠 кнопка «Документы» в меню — доступны в любой момент, а не только при покупке (этого требуют платёжные провайдеры, например 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

Choose a tag to compare

@Mrvibecodic Mrvibecodic released this 14 Aug 11:08

Экран «Подключить»

  • Исправлен разбор конфига приложений актуальной страницы подписки (7.x): раньше бот не видел в нём приложения и список оставался пустым, теперь поддерживаются оба формата — старый и новый.
  • На панели 3.x список приложений берётся напрямую из панели по API, включая персональный конфиг, назначенный конкретной подписке. Страница подписки осталась запасным источником для старых панелей.
  • Платформы Android TV / Apple TV встали на своё место в списке; при неудачном разборе в логи пишется причина.

Пользователи

  • Появился поиск: по Telegram ID, нику, имени и e-mail веб-аккаунта, достаточно части строки. Из результатов открывается карточка, «Назад» возвращает в выдачу.

Доступ в бота

  • Закрытие публичного бота больше не выдаёт доступ всей базе молча — бот спрашивает: сохранить доступ уже зарегистрированным или закрыть всем. Это чинит ситуацию после импорта из RemnaShop, когда все импортированные оказывались в белом списке.
  • Экран «Список вайтлиста» теперь показывает всех, у кого доступ реально есть (с пагинацией), отдельно — заранее добавленные ID. Добавлена кнопка «Снять доступ у всех» с подтверждением.
  • Отчёт импорта предупреждает, что в закрытом боте импортированным нужно выдать доступ.
  • Предзаполненный вайтлист и приглашения теперь переезжают вместе с резервной копией базы.

Кошелёк

  • Пополнение баланса можно отключить (Продажи → 👛 Кошелёк): новые деньги не принимаются, а лежащие на балансах люди дожигают на подписку. Оплата с баланса, реферальные начисления и промокоды продолжают работать; уже выставленные счета на пополнение дозачисляются.
  • На экране настройки видно, сколько денег сейчас лежит на балансах и у скольких человек.
  • В кошельке и на экране пополнения явно указано: баланс тратится только на подписку, вывод средств невозможен.

Прочее

  • Go обновлён до 1.25.13 (закрывает уязвимости стандартной библиотеки).
  • Документация и README обновлены под перечисленное.

1.2.1

Choose a tag to compare

@Mrvibecodic Mrvibecodic released this 13 Aug 13:04

Что нового

Образ теперь собирается под 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 -d

1.2.0

Choose a tag to compare

@Mrvibecodic Mrvibecodic released this 12 Aug 09:16

Что нового

🧾 Тарифы

Вместо одной сетки цен — полноценные тарифы, сколько угодно (Продажи → 🧾 Тарифы):

  • У каждого тарифа свои имя, значок, описание, порядок в витрине, вкл/выкл, дублирование и удаление.
  • 💲 Цены и лимиты: свои сроки и цены (в том числе по способам оплаты), валюта, трафик и лимит устройств (HWID), сквады — на тариф и с переопределением на отдельный срок (например, на годовой дать больше устройств).
  • 🔐 Доступность: всем / только новым / только действующим / по списку (Telegram ID или почта веб-кабинета) / по ссылке.
  • 🔗 Продажа по прямой ссылке t.me/<бот>?start=plan_КОД: тариф скрыт из витрины и открывается только по ссылке. Код неперебираем, попытки подбора троттлятся.
  • 📤 Экспорт / 📥 Импорт тарифа JSON-файлом (условия + список допущенных) — перенос между установками в две кнопки.
  • ➕ Доп-подписка на уровне тарифа: вкл / выкл / как в общих настройках, своё название и описание опции.

Обновление ничего не требует: текущая сетка цен автоматически становится тарифом «Базовый», быстрая и тонкая настройка продолжают работать и правят его же.

🛒 Витрина и карточка тарифа

  • Несколько тарифов — список с ценами «от …», единственный открывается сразу карточкой.
  • В карточке: описание, доступные страны и условия тарифа — трафик (с учётом стратегии сброса) и лимит устройств; если условия различаются по срокам — с разбивкой по срокам.
  • Значок тарифа из админки показывается в заголовке карточки; стандартная коробка 📦 — только у тарифов без своего значка.

💱 Смена тарифа и продление

  • Смена тарифа не сжигает остаток: неиспользованные дни зачитываются к новому тарифу по соотношению цен, точный сдвиг срока виден до оплаты.
  • Продление идёт по своему тарифу. Если его условия изменились с прошлой оплаты — предупреждение перед оплатой; если тариф стал недоступен — предложение выбрать новый без вреда действующей подписке.

📜 Снимок условий сделки

Условия покупки (цена, лимиты, сквады) фиксируются в момент выставления счёта и применяются при оплате ровно такими, какими были проданы — последующие правки тарифа админом, рестарт бота или задержавшийся вебхук выдачу не меняют. Выбор срока и условия счетов хранятся в базе и переживают перезапуск.

📱 Мини-апп и веб-кабинет

Витрина по тарифам: карточки со сроками, странами, лимитами и подсветкой самого выгодного срока; зачёт остатка при смене тарифа виден до оплаты. Кошелёк, прогноз «на сколько хватит», триал и суммы пополнения учитывают цены тарифов.

🔧 Исправления

Фиксы автосписания (ретраи, валюта, перепроверка сверки), сверки и продления, бонусных дней, статистики и бэкапа.

v1.1.1

Choose a tag to compare

@Mrvibecodic Mrvibecodic released this 07 Aug 21:07

Чистка кода.

1.1.0

Choose a tag to compare

@Mrvibecodic Mrvibecodic released this 07 Aug 10:08

Что нового

🚫 Торрент-блокер — полная интеграция с плагином панели

Если на нодах включён плагин 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

Choose a tag to compare

@Mrvibecodic Mrvibecodic released this 05 Aug 13:10

Исправления по итогам сверки всех платёжек с официальными API:

  • Чеки «Мой налог» теперь формируются только по платежам ЮKassa.
  • Heleket: исправлено зависание бота при вводе валюты конвертации в админке; в журнале — фактически оплаченная сумма; валидация Return URL.
  • Tribute: полугодовой тариф выдаёт 6 месяцев (было 12); валютные платежи (EUR/USD) больше не считаются рублями в рефералке и статистике.
  • Platega: актуальный код карточного эквайринга (11), проверка подлинности колбэка, обработка chargeback с уведомлением админа.
  • CryptoBot: валюта счёта из прайса, понятные тексты ошибок API, потерянное пополнение зовёт админа вместо тихой потери.
  • ЮKassa: обработка отменённых платежей с причиной, защита от двойного автосписания, строгая валидация цены.
  • Stars: обработка возвратов звёзд, повторная доставка оплаты больше не пугает пользователя, оплата не блокирует другие платежи.
  • МойНалог: чек по московскому времени, повторы при сбоях, подробные ошибки ФНС в журнале.

1.0.1

Choose a tag to compare

@Mrvibecodic Mrvibecodic released this 04 Aug 22:08

Дефолт docker-compose.yml для новых установок — мажорный тег :v1: приходят все релизы 1.x.y, автоматического перехода на будущий 2.0.0 не будет. CI теперь публикует на каждый релиз также образы :vX и :vX.Y.

Существующие установки не затронуты: :latest и :dev обновляются как раньше, самообновление из бота работает без изменений.

1.0.0

Choose a tag to compare

@Mrvibecodic Mrvibecodic released this 04 Aug 21:50

Первый нумерованный релиз. Включает всё, что накопилось в 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 — превью-канал, как раньше.