Publish dev images to both GHCR and Docker Hub from the dev workflow and drop the GitLab CI pipeline, so all images are built by GitHub Actions only.
Remnawave Minishop
Remnawave Minishop - Telegram-бот и Web App (Mini App) для продажи и управления подписками панели Remnawave. Бот обрабатывает регистрацию, оплату, продление, пробный период, промокоды, рефералов и поддержку в чате. Web App показывает ссылку подключения, срок действия, трафик, оплату, устройства и вход по Telegram Mini Apps initData, Telegram OAuth / OpenID Connect и одноразовому email-коду.
Проект является переработанным форком kavore/remnawave-tg-shop. Для переноса данных из прежнего стека и других ботов используйте раздел миграций.
Возможности
Для пользователей:
- регистрация с выбором русского или английского языка;
- просмотр статуса подписки, даты окончания, ссылки подключения и трафика;
- покупка подписок, пакетов трафика, обычная и premium-докупка трафика, докупка устройств по настроенному каталогу тарифов;
- Web App / Mini App с входом через Telegram или email;
- встроенные инструкции установки в Mini App: личный экран
/installи публичная ссылка/s/<token>для передачи инструкции; - пробный период, промокоды и реферальная программа;
- оплата через YooKassa, FreeKassa, Platega, SeverPay, Wata, CryptoPay, Heleket, PayKilla и Telegram Stars;
- тикеты поддержки в Web App и внешняя ссылка на поддержку;
- раздел "Мои устройства" при включенном
MY_DEVICES_SECTION_ENABLED.
Для администраторов:
- админ-панель для пользователей из
ADMIN_IDS(только при входе через Telegram, не для аккаунтов только с email); - статистика пользователей, подписок, платежей и синхронизации с Remnawave;
- список пользователей с поиском, фильтрами и колонкой premium-трафика;
- блокировка пользователей, поддержка через тикеты, рассылки, промокоды, логи действий и настройка разрешенных параметров приложения поверх
.env; - редактор JSON-каталога тарифов с моделями на срок/по трафику, Internal Squads, premium-сквадами и HWID-пакетами;
- настройки инструкций подключения: чтение конфига Subscription Page из Remnawave Panel, опциональное JSON-переопределение и переключатель поведения кнопок бота;
- ручная синхронизация пользователей и подписок с панелью.
Документация
- Входная страница документации - маршрут по установке, настройке, платежам, админке и диагностике.
- Развертывание - Docker Compose, Caddy, Nginx, Pangolin/Newt и запуск без обратного прокси.
- Настройка окружения - bootstrap
.envи рекомендуемая настройка через Web App админку. - Переменные
.env- полный справочник всех env-ключей по разделам. - Бэкапы и восстановление - автоматические архивы, Telegram-отправка и restore через админку.
- Тарифы - каталог тарифов, модели на срок и по трафику, обычные и premium-докупки, premium-сквады, смена тарифа, HWID-лимиты и обработка трафика.
- Админ-панель - права доступа, настройки, редактор тарифов, premium-сквады и сохранение JSON-каталога.
- Веб-приложение / Mini App - отдельный порт, домен, инструкции установки и реферальные ссылки.
- Telegram-авторизация и вход по email - настройка BotFather/OAuth и SMTP-логина.
- Поддержка пользователей / тикеты - тикеты в Mini App, входящий список админки, уведомления, лимиты и внешняя ссылка поддержки.
- Темы Web App - кастомные темы, настройка внешнего вида, логотипы, CSS/ассеты и пайплайн создания новой темы.
- Миграции - готовые сценарии переноса с
remnawave-tg-shopи Remnashop. - Миграция с remnawave-tg-shop и Remnashop - сценарии через общий install wizard.
Совместимость
Интеграция с API панели Remnawave (вебхуки, пользователи, подписки, статистика в админке и т.д.) протестирована на панели Remnawave версии > 2.7.0. Более старые версии могут работать частично или не работать из‑за изменений в API.
Стек
Сборка и runtime задаются deploy/docker/Dockerfile и docker-compose.yml; точные версии пакетов — в backend/requirements.txt и frontend/package.json.
| Слой | Технологии |
|---|---|
| Backend | Python 3.12, aiogram 3.x (Telegram), aiohttp (HTTP и Web App), SQLAlchemy 2 async, asyncpg, Pydantic / pydantic-settings, httpx, платёжные SDK (в т.ч. YooKassa, aiocryptopay), PyJWT |
| Данные | PostgreSQL 17 (сервис postgres в Compose) и Redis 7 (сервис redis) |
| Сборка Web App | Node.js 22, Svelte 5, Vite, Tailwind CSS 4; артефакты попадают в шаблоны backend/bot/app/web/templates/ |
Локальная разработка без Docker возможна при установленных Python 3.12, PostgreSQL и (для пересборки фронта) Node 22; типичный сценарий — всё через Compose.
Быстрый старт
Требования:
- Docker и Docker Compose;
- рабочая панель Remnawave версии
> 2.7.0(см. раздел «Совместимость»); - токен Telegram-бота;
- публичные домены для webhook и Mini App.
git clone https://github.com/3252a8/remnawave-minishop
cd remnawave-minishop
cp .env.example .env
nano .env
docker compose up -d --build
docker compose logs -f backend worker frontend
Минимально заполните в .env:
BOT_TOKEN- токен Telegram-бота;ADMIN_IDS- Telegram ID администраторов через запятую;WEBHOOK_BASE_URL- публичный URL вебхуков;POSTGRES_USER,POSTGRES_PASSWORD,POSTGRES_DB- доступы PostgreSQL;WEBAPP_ENABLED=True- включает Web App и админку для первого входа;WEBAPP_SESSION_SECRET,WEBHOOK_SECRET_TOKEN- стабильные секреты;SUBSCRIPTION_MINI_APP_URL- публичный HTTPS URL Mini App/frontend, напримерhttps://app.domain.com/;PANEL_API_URL,PANEL_API_KEY,PANEL_WEBHOOK_SECRET- доступ к Remnawave;TRUSTED_PROXIES- оставьте дефолт для Docker/Caddy/Nginx/Newt или укажите IP/CIDR своего reverse proxy, чтобы IP allowlist платежных webhook видел реального провайдера;- остальные настройки удобнее задать в Web App админке.
В Remnawave Panel укажите WEBHOOK_URL как публичный адрес Minishop с путем /webhook/panel, например https://app.example.com/webhook/panel. Секрет вебхука задается в самой Remnawave Panel; это же значение вставьте в PANEL_WEBHOOK_SECRET в .env или в Система -> Настройки -> Remnawave Panel в админке.
После первого входа в админку настройте тарифы, платежные провайдеры, внешний вид, поддержку, уведомления и инструкции подключения через UI. Инструкции установки включены по умолчанию, читают Subscription Page config из Remnawave Panel и при проблемах с конфигом откатываются к обычной ссылке подключения. Полный справочник env-переменных: docs/configuration/env-vars.md.
Для каталога тарифов используется TARIFFS_CONFIG_PATH со значением по умолчанию data/tariffs.json. Пример формата лежит в data/tariffs.example.json, подробности - в docs/features/tariffs.md.
В Docker этот файл должен быть доступен не только backend и worker, но и одноразовому сервису migrate: мигратор читает каталог тарифов при привязке существующих подписок к тарифу по умолчанию. В текущих compose-файлах весь /app/data уже смонтирован в migrate, backend и worker; если переносите compose вручную, сохраните одинаковый mount для всех трех сервисов.
В compose-примерах /app/data монтируется из папки ./data рядом с docker-compose.yml. Заранее создайте каталог и отдайте его пользователю контейнера. Это нужно для сохранения data/tariffs.json, каталога тем data/themes и кеша логотипа Web App:
mkdir -p data/themes data/webapp-logo data/tariffs
touch data/locales-overrides.json
chown -R 10001:10001 data
chmod -R u+rwX data
Полезные команды
# Локальная сборка и запуск
docker compose up -d --build
# Логи приложения
docker compose logs -f backend worker frontend
# Рекомендуемый продакшен-вариант с Caddy
cd deploy/examples/caddy # или nginx, newt, no-proxy
cp .env.example .env
nano .env
docker compose up -d
# Запуск из готового образа с конкретным тегом
IMAGE_TAG=3.1.0 docker compose up -d
Для продакшен-запуска удобнее брать готовые папки из deploy/examples, а читать каноничные инструкции в docs/getting-started/deployment.md. Предпочтительный вариант для обычного публичного сервера - Caddy: он сам выпускает и продлевает HTTPS-сертификаты. В папках рядом с compose лежат только конфиги и короткие ссылки на документацию.
Имена образов для релизов:
ghcr.io/3252a8/remnawave-minishop-backendghcr.io/3252a8/remnawave-minishop-workerghcr.io/3252a8/remnawave-minishop-frontenddocker.io/3252a8/remnawave-minishop-backenddocker.io/3252a8/remnawave-minishop-workerdocker.io/3252a8/remnawave-minishop-frontend
Сборка и публикация сразу в GHCR и Docker Hub:
docker login ghcr.io
docker login docker.io
IMAGE_TAG=v3.4.3 bash scripts/docker-build-push-images.sh
Поддержать проект
- Crypto:
USDT/Other ERC-20 0xeD506D44aae634fEc0E01C8835744fBedb7B2a44 (Ethereum/Polygon/Gnosis)
