mirror of
https://github.com/snoups/remnashop.git
synced 2026-04-21 10:22:00 +00:00
chore: replace README with docs link, pin remnapy to commit, minor fixes
- replaced README content with link to external docs (en + ru) - cleaned up .env.example by removing optional commented variables - pinned remnapy source to specific commit rev instead of tag - added panel version display via get_metadata in system getter with fallback - skipped update check for dev builds in update task
This commit is contained in:
50
.env.example
50
.env.example
@@ -1,5 +1,3 @@
|
||||
# TODO: See remnashop docs env
|
||||
|
||||
# Domain through which your bot is publicly accessible.
|
||||
# Used for receiving webhooks from services (e.g., Telegram, payment systems).
|
||||
# !!! WARNING: Specify domain WITHOUT HTTP/HTTPS and WITHOUT trailing slash.
|
||||
@@ -45,50 +43,4 @@ REMNAWAVE_TOKEN=change_me
|
||||
REMNAWAVE_WEBHOOK_SECRET=change_me
|
||||
|
||||
# Password for the database.
|
||||
DATABASE_PASSWORD=change_me
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Optional settings with default values (uncomment and modify as needed):
|
||||
# APP_HOST = "0.0.0.0"
|
||||
# APP_PORT = 5000
|
||||
# APP_LOCALES = "en, ru"
|
||||
# APP_DEFAULT_LOCALE = "en"
|
||||
# APP_ASSETS_DIR = "/app/assets"
|
||||
# APP_ORIGINS = "a, b"
|
||||
|
||||
# BOT_RESET_WEBHOOK = false
|
||||
# BOT_DROP_PENDING_UPDATES = false
|
||||
# BOT_SETUP_COMMANDS= true
|
||||
# BOT_USE_BANNERS = true
|
||||
|
||||
# DATABASE_HOST = "remnashop-db"
|
||||
# DATABASE_PORT = 5432
|
||||
# DATABASE_NAME = "remnashop"
|
||||
# DATABASE_USER = "remnashop"
|
||||
# DATABASE_ECHO = false
|
||||
# DATABASE_ECHO_POOL = false
|
||||
# DATABASE_POOL_SIZE = 30
|
||||
# DATABASE_MAX_OVERFLOW = 30
|
||||
# DATABASE_POOL_TIMEOUT = 10
|
||||
# DATABASE_POOL_RECYCLE = 3600
|
||||
|
||||
# LOG_TO_FILE = true
|
||||
# LOG_LEVEL = "DEBUG"
|
||||
# LOG_ROTATION = "100MB"
|
||||
# LOG_COMPRESSION = "zip"
|
||||
# LOG_RETENTION = "3 days"
|
||||
|
||||
# REDIS_HOST: str = "remnashop-redis"
|
||||
# REDIS_PORT: int = 6379
|
||||
# REDIS_NAME: str = "0"
|
||||
# REDIS_PASSWORD = # Optional
|
||||
|
||||
# REMNAWAVE_CADDY_TOKEN = ""
|
||||
# REMNAWAVE_COOKIE = ":"
|
||||
|
||||
# REMNAWAVE_CF_CLIENT_ID = ""
|
||||
# REMNAWAVE_CF_CLIENT_SECRET = ""
|
||||
DATABASE_PASSWORD=change_me
|
||||
330
README.md
330
README.md
@@ -12,322 +12,16 @@
|
||||
[](https://t.me/remna_shop)
|
||||
[](https://t.me/+xQs17zMzwCY1NzYy)
|
||||

|
||||
</div>
|
||||
|
||||
# ✨ Features
|
||||
|
||||
- **📦 Plans**
|
||||
> Unique architecture that allows flexible plan creation and precise availability control.
|
||||
|
||||
> Supports any limits — by traffic, devices, both, or unlimited.
|
||||
|
||||
> Control plan availability for specific user types or individual users.
|
||||
|
||||
> Link internal and external squads to specific plans.
|
||||
|
||||
> Support for any subscription duration.
|
||||
|
||||
> Ability to make any duration free of charge.
|
||||
|
||||
> Multi-currency pricing for each duration.
|
||||
|
||||
> Customizable plan display order.
|
||||
|
||||
> Built-in plan configurator directly in the bot interface.
|
||||
|
||||
- **🎟️ Promocodes**
|
||||
> Multiple reward types: extra days, traffic, subscription activation for a chosen plan, personal discount, or discount for the next purchase.
|
||||
|
||||
> Configurable lifetime: by time or number of activations.
|
||||
|
||||
> Convenient promocode configurator.
|
||||
|
||||
- **📢 Broadcasts**
|
||||
> View all previously sent messages with content preview.
|
||||
|
||||
> Send by user category: all users, by plan, with subscription, without subscription, expired, or trial.
|
||||
|
||||
> Supports photos, videos, GIFs, and stickers.
|
||||
|
||||
> Supports HTML tags for message formatting.
|
||||
|
||||
> Preview messages before sending.
|
||||
|
||||
> Option to stop an active broadcast.
|
||||
|
||||
> Option to delete sent messages.
|
||||
|
||||
- **🔔 Notifications**
|
||||
> Configurable notification system directly in the bot interface.
|
||||
|
||||
> User notifications: subscription expiring, expired, traffic exhausted.
|
||||
|
||||
> System notifications: bot lifecycle, bot update, new user registration, subscription activation, promocode activation, get trial, node status, first user connection, device add/remove events.
|
||||
|
||||
- **🧪 Trial**
|
||||
> Configurable trial setup through the plan configurator.
|
||||
|
||||
> Supports any limits.
|
||||
|
||||
> Supports multiple trial plans.
|
||||
|
||||
> Separate internal and external squad assignments.
|
||||
|
||||
> Availability settings for users who joined via referral or ad links.
|
||||
|
||||
- **👥 Referral System**
|
||||
> Detailed referral statistics.
|
||||
|
||||
> Referral system configurator.
|
||||
|
||||
> Reward customization: points or extra days.
|
||||
|
||||
> Two-level referral support.
|
||||
|
||||
- **💳 Flexible Payment System**
|
||||
> Supports multiple payment gateways: Telegram Stars, YooKassa, YooMoney, Cryptomus, Heleket, CryptoPay, RoboKassa.
|
||||
|
||||
> Payment gateway configurator.
|
||||
|
||||
> Default currency setup.
|
||||
|
||||
> Ability to run test payments for selected gateways.
|
||||
|
||||
> Customizable display order for payment methods.
|
||||
|
||||
- **📱 Device Management**
|
||||
> Allows users to manage their connected devices (only with active subscriptions and within device limits).
|
||||
|
||||
> Configurable cooldown for device reset actions.
|
||||
|
||||
- **🏷️ Discount System**
|
||||
> Two discount types: personal and next purchase.
|
||||
|
||||
> Discounts do not stack — the largest discount is applied.
|
||||
|
||||
> Discount display on purchase buttons.
|
||||
|
||||
- **🔐 Access Mode**
|
||||
> Five access modes: full restriction, open for all, invite-only, purchase restricted, and register restricted.
|
||||
|
||||
> Automatic notifications for users who attempted to purchase during restricted mode.
|
||||
|
||||
> Conditional access support: rule acceptance and channel subscription.
|
||||
|
||||
- **📈 Ad Links**
|
||||
> Create links to track traffic sources and user acquisition.
|
||||
|
||||
> Built-in link configurator.
|
||||
|
||||
> View detailed analytics for each link.
|
||||
|
||||
- **📊 Statistics**
|
||||
> Detailed analytics by category: users, transactions, subscriptions, plans, promocodes, referrals.
|
||||
|
||||
- **👤 User Editor**
|
||||
> Complete user information: profile data, stats, subscription, transactions.
|
||||
|
||||
> Edit personal discounts.
|
||||
|
||||
> Manage roles: developer, admin, user.
|
||||
|
||||
> Block users.
|
||||
|
||||
> Grant plan access for purchase.
|
||||
|
||||
> Full subscription editor: modify limits, reset traffic, manage devices, squads, expiration date, toggle subscription status, delete, or get connection link.
|
||||
|
||||
> View all banned users.
|
||||
|
||||
> Search by name, username and id.
|
||||
|
||||
> View recent registrations and active users.
|
||||
|
||||
> Quick access via forwarded messages, system notifications, or main menu search.
|
||||
|
||||
- **🔄 User Synchronization**
|
||||
> Automatic synchronization with the panel.
|
||||
|
||||
> Edit user data both from the bot and the panel.
|
||||
|
||||
- **🔍 User Audit**
|
||||
> View full user activity history.
|
||||
|
||||
- **🌐 Internationalization**
|
||||
> Ability to set unique banners for each locale.
|
||||
|
||||
> Support for interface translations into multiple languages.
|
||||
|
||||
> Automatic language detection on the user's first launch and after subsequent changes.
|
||||
|
||||
- **🧭 Migration**
|
||||
> Seamless migration from other bots.
|
||||
|
||||
- **🪄 MiniApp Subscription Page Support**
|
||||
|
||||
|
||||
# ⚙️ Installation and configuration
|
||||
|
||||
## Requirements
|
||||
- Hardware:
|
||||
- OS: Recommended Ubuntu or Debian
|
||||
- RAM: Minimum 2 GB, recommended 4 GB
|
||||
- CPU: Minimum 2 cores, recommended 4 cores
|
||||
- Storage: 20 GB, minimum and recommended
|
||||
|
||||
- Software:
|
||||
- [Docker](https://docs.docker.com/get-started/get-docker/)
|
||||
|
||||
Install Docker using official script
|
||||
```
|
||||
sudo curl -fsSL https://get.docker.com | sh
|
||||
```
|
||||
|
||||
> [!WARNING]
|
||||
> **The latest version of the bot is compatible only with RemnaWave panel version 2.3–2.4.x**
|
||||
> Before installation, make sure your panel matches this version.
|
||||
|
||||
|
||||
## Step 1 – Download required files
|
||||
|
||||
Create the project directory
|
||||
```
|
||||
mkdir /opt/remnashop && cd /opt/remnashop
|
||||
```
|
||||
|
||||
Download `docker-compose.yml` compose-file and `.env` by running these commands:
|
||||
|
||||
- Get `docker-compose.yml` file:
|
||||
|
||||
- For external panel **(the bot is hosted on a separate server from the panel)**:
|
||||
```
|
||||
curl -o docker-compose.yml https://raw.githubusercontent.com/snoups/remnashop/refs/heads/main/docker-compose.prod.external.yml
|
||||
```
|
||||
- For internal panel **(the bot and panel are hosted on the same server)**:
|
||||
```
|
||||
curl -o docker-compose.yml https://raw.githubusercontent.com/snoups/remnashop/refs/heads/main/docker-compose.prod.internal.yml
|
||||
```
|
||||
|
||||
- Get `.env` file
|
||||
```
|
||||
curl -o .env https://raw.githubusercontent.com/snoups/remnashop/refs/heads/main/.env.example
|
||||
```
|
||||
|
||||
|
||||
## Step 2 – Configure the .env file
|
||||
|
||||
Generate secret keys by running the following commands:
|
||||
|
||||
- Generate secure keys
|
||||
```
|
||||
sed -i "s|^APP_CRYPT_KEY=.*|APP_CRYPT_KEY=$(openssl rand -base64 32 | tr -d '\n')|" .env && sed -i "s|^BOT_SECRET_TOKEN=.*|BOT_SECRET_TOKEN=$(openssl rand -hex 64 | tr -d '\n')|" .env
|
||||
```
|
||||
|
||||
- Generate passwords
|
||||
```
|
||||
sed -i "s|^DATABASE_PASSWORD=.*|DATABASE_PASSWORD=$(openssl rand -hex 24 | tr -d '\n')|" .env && sed -i "s|^REDIS_PASSWORD=.*|REDIS_PASSWORD=$(openssl rand -hex 24 | tr -d '\n')|" .env
|
||||
```
|
||||
|
||||
Now, open the .env file and update the variables:
|
||||
|
||||
- **`APP_DOMAIN`** : The domain used by Telegram and Remnawave to reach your bot.
|
||||
- **`BOT_TOKEN`** : Your bot token from BotFather.
|
||||
- **`BOT_DEV_ID`** : Telegram ID of the main developer.
|
||||
- **`BOT_SUPPORT_USERNAME`** : Support username without the `@` symbol.
|
||||
- **`REMNAWAVE_HOST`** : The domain or Docker container name.
|
||||
- **`REMNAWAVE_TOKEN`** : Remnawave API token, created in the panel.
|
||||
- **`REMNAWAVE_WEBHOOK_SECRET`** : Must match the value of `WEBHOOK_SECRET_HEADER` from `.env` the panel.
|
||||
|
||||
> [!WARNING]
|
||||
> Depending on your configuration, also pay attention to the following variables: **`BOT_MINI_APP`**, **`REMNAWAVE_CADDY_TOKEN`**, **`REMNAWAVE_COOKIE`**.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> The bot requires a properly configured webhook to function.
|
||||
> In the Remnawave Panel `.env` file, set:
|
||||
>
|
||||
> ```
|
||||
> WEBHOOK_ENABLED=true
|
||||
> WEBHOOK_URL=https://bot.domain.com/api/v1/remnawave
|
||||
> ```
|
||||
> Replace `bot.domain.com` with your actual domain.
|
||||
> This step is critically important for the bot to receive events correctly.
|
||||
|
||||
|
||||
## Step 3 – Start the containers
|
||||
|
||||
Start the containers by running the following command:
|
||||
|
||||
```
|
||||
docker compose up -d && docker compose logs -f -t
|
||||
```
|
||||
|
||||
After a few seconds, you should see the bot successfully start.
|
||||
|
||||
|
||||
## Step 4 - Reverse proxies
|
||||
|
||||
A reverse proxy is required to run Remnashop properly.
|
||||
It is needed to receive webhooks from Telegram, the Remnawave panel, and payment systems.
|
||||
|
||||
**This guide does not cover how to install or configure a reverse proxy.**
|
||||
You can use any proxy solution, similar to how it is done for [**Remnawave**](https://docs.rw/docs/install/reverse-proxies/).
|
||||
|
||||
> If you are installing the bot on the same server as the panel, you probably already have a proxy configured.
|
||||
> In this case, you only need to add a forwarding rule to route traffic to the bot container.
|
||||
|
||||
**Configure the following path to forward requests to the bot container:**
|
||||
|
||||
`https://your-domain/api/v1` -> `http://remnashop:5000`
|
||||
|
||||
|
||||
## Step 5 – How to upgrade
|
||||
|
||||
To update and restart the bot, run the following command:
|
||||
```
|
||||
cd /opt/remnashop && docker compose pull && docker compose down && RESET_ASSETS=true docker compose up -d && docker compose logs -f
|
||||
```
|
||||
|
||||
When using `RESET_ASSETS=true`, the following actions are performed:
|
||||
- All current assets are backed up with a timestamp (`/opt/remnashop/assets/*.bak`).
|
||||
- New assets from the image are downloaded and unpacked.
|
||||
- After the update, the bot will use the latest files.
|
||||
|
||||
> [!CAUTION]
|
||||
> If you do not use `RESET_ASSETS=true`, the old assets will remain unchanged.
|
||||
> This may cause the bot to work incorrectly after the update.
|
||||
|
||||
|
||||
# 🖼️ Banners
|
||||
|
||||
The bot supports custom banners for each page category and locale: `menu`, `dashboard`, `subscription`, `promocode`, `referral`.
|
||||
|
||||
To set a custom banner, name it according to the target page and ensure it uses one of the supported formats: `jpg`, `jpeg`, `png`, `gif`, `webp`.
|
||||
|
||||
Banners should be placed in: `/opt/remnashop/assets/banners/(locale)/`
|
||||
Example: `/opt/remnashop/assets/banners/en/menu.gif`
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Do not delete the `default.jpg` file — it is required for proper operation.
|
||||
|
||||
|
||||
# 🌐 Translations
|
||||
You can edit any translation file located in:
|
||||
`/opt/remnashop/assets/translations/(locale)/`
|
||||
|
||||
After making changes, you need to restart the container for the updates to take effect.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Currently, translation persistence during bot updates is not supported.
|
||||
> When updating, your previous assets will be archived in: `/opt/remnashop/assets/*.bak`
|
||||
|
||||
|
||||
# 💸 Project Support
|
||||
|
||||
Any support helps me dedicate more time to development and accelerate project progress!
|
||||
|
||||
> Russian and international cards - [**Tribute**](https://t.me/tribute/app?startapp=drsi)
|
||||
|
||||
> SBP, ЮMoney, SberPay, T-Pay - [**ЮKassa**](https://yookassa.ru/my/i/Z8AkHJ_F9sO_/l)
|
||||
|
||||
> USDT TRC-20 - **`TPnpmwD4P9znKs3Hp4Hrh9rhJ7u1m6UA1B`**
|
||||
|
||||
<p align="center">
|
||||
<br />
|
||||
<p align="center">
|
||||
<a href="https://remnashop.mintlify.app/docs/en/overview/releases">
|
||||
<img src="https://img.shields.io/badge/Get%20Started-%E2%86%92-0969da?style=for-the-badge&labelColor=0969da&color=0969da" alt="Get Started" width="200" height="auto">
|
||||
</a>
|
||||
</p>
|
||||
<a href="https://github.com/snoups/remnashop/releases">
|
||||
<img src="https://img.shields.io/github/v/release/snoups/remnashop?label=Latest%20release&style=social" alt="Latest release">
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
327
README.ru_RU.md
327
README.ru_RU.md
@@ -12,319 +12,16 @@
|
||||
[](https://t.me/remna_shop)
|
||||
[](https://t.me/+xQs17zMzwCY1NzYy)
|
||||

|
||||
</div>
|
||||
|
||||
# ✨ Возможности
|
||||
|
||||
- **📦 Планы**
|
||||
> Уникальная архитектура, позволяющая гибко создавать тарифы и управлять их доступностью.
|
||||
|
||||
> Поддержка любых лимитов — по трафику, устройствам, вместе или без ограничений.
|
||||
|
||||
> Управление доступностью для конкретных пользователей или типов пользователей.
|
||||
|
||||
> Привязка внутренних и внешних сквадов к конкретным планам.
|
||||
|
||||
> Поддержка любых длительностей подписки.
|
||||
|
||||
> Возможность сделать бесплатный вариант длительности.
|
||||
|
||||
> Мультивалютные цены для каждой длительности.
|
||||
|
||||
> Настраиваемый порядок отображения планов.
|
||||
|
||||
> Конфигуратор планов прямо в интерфейсе бота.
|
||||
|
||||
- **🎟️ Промокоды**
|
||||
> Различные типы наград: дополнительные дни, трафик, выдача подписки по плану, персональная скидка или скидка на следующую покупку.
|
||||
|
||||
> Настройка времени жизни: по времени или количеству активаций.
|
||||
|
||||
> Удобный конфигуратор промокодов.
|
||||
|
||||
- **📢 Рассылки**
|
||||
> Просмотр всех отправленных сообщений с контентом.
|
||||
|
||||
> Отправка по категориям пользователей: всем, по плану, с подпиской, без подписки, с истекшей подпиской или с пробником.
|
||||
|
||||
> Поддержка фото, видео, GIF и стикеров.
|
||||
|
||||
> Поддержка HTML-тегов для форматирования текста.
|
||||
|
||||
> Предпросмотр перед отправкой.
|
||||
|
||||
> Возможность остановить активную рассылку.
|
||||
|
||||
> Возможность удалить отправленные сообщения.
|
||||
|
||||
- **🔔 Уведомления**
|
||||
> Настраиваемая система уведомлений прямо в интерфейсе бота.
|
||||
|
||||
> Пользовательские уведомления: истечение подписки, подписка истекла, исчерпан трафик.
|
||||
|
||||
> Системные уведомления: жизненный цикл бота, обновление бота, регистрация, оформление подписки, активация промокода, статус узла, первое подключение пользователя, добавление/удаление устройства пользователя.
|
||||
|
||||
- **🧪 Пробный период**
|
||||
> Настройка пробников через конфигуратор планов.
|
||||
|
||||
> Поддержка любых лимитов.
|
||||
|
||||
> Поддержка нескольких пробных планов.
|
||||
|
||||
> Привязка разных внутренних и внешних сквадов.
|
||||
|
||||
> Настройка доступности для пользователей с рекламных или реферальных ссылок.
|
||||
|
||||
- **👥 Реферальная система**
|
||||
> Подробная статистика рефералов.
|
||||
|
||||
> Конфигуратор реферальной системы.
|
||||
|
||||
> Настройка наград: баллы или дни.
|
||||
|
||||
> Поддержка двухуровневых рефералов.
|
||||
|
||||
- **💳 Гибкая платежная система**
|
||||
> Поддержка множества агрегаторов: Telegram Stars, YooKassa, YooMoney, Cryptomus, Heleket, CryptoPay, RoboKassa.
|
||||
|
||||
> Конфигуратор платежных шлюзов.
|
||||
|
||||
> Настройка валюты по умолчанию.
|
||||
|
||||
> Возможность проведения тестовых платежей.
|
||||
|
||||
> Настройка порядка отображения способов оплаты.
|
||||
|
||||
- **📱 Управление устройствами**
|
||||
> Возможность пользователям управлять своими устройствами (при активной подписке и лимите).
|
||||
|
||||
> Настройка интервала между сбросами устройств.
|
||||
|
||||
- **🏷️ Система скидок**
|
||||
> Два типа скидок: персональная и на следующую покупку.
|
||||
|
||||
> Скидки не суммируются — применяется наибольшая.
|
||||
|
||||
> Отображение скидки на кнопках покупки.
|
||||
|
||||
- **🔐 Режим доступа**
|
||||
> Пять режимов: полное ограничение, открытый доступ, по приглашениям, запрет покупок и запрет регистрации.
|
||||
|
||||
> Автоуведомления пользователям, пытавшимся купить при активном ограничении.
|
||||
|
||||
> Условия доступа: принятие правил и подписка на канал.
|
||||
|
||||
- **📈 Рекламные ссылки**
|
||||
> Создание ссылок для отслеживания источников трафика и пользователей.
|
||||
|
||||
> Встроенный конфигуратор ссылок.
|
||||
|
||||
> Просмотр детальной аналитики.
|
||||
|
||||
- **📊 Статистика**
|
||||
> Подробная статистика по категориям: пользователи, транзакции, подписки, планы, промокоды, рефералы.
|
||||
|
||||
- **👤 Редактор пользователей**
|
||||
> Полная информация: данные, статистика, подписка, транзакции.
|
||||
|
||||
> Редактирование персональных скидок.
|
||||
|
||||
> Управление ролями: разработчик, администратор, пользователь.
|
||||
|
||||
> Блокировка пользователя.
|
||||
|
||||
> Выдача доступа к покупке плана.
|
||||
|
||||
> Редактор подписки: лимиты, сброс трафика, устройства, сквады, дата окончания, включение/отключение, удаление, получение ссылки на подключение.
|
||||
|
||||
> Просмотр заблокированных пользователей.
|
||||
|
||||
> Поиск по имени, username и идентификатору.
|
||||
|
||||
> Списки последних зарегистрированных и активных.
|
||||
|
||||
> Быстрый доступ к пользователям через пересланные сообщения и уведомления.
|
||||
|
||||
- **🔄 Синхронизация пользователей**
|
||||
> Автоматическая синхронизация с панелью.
|
||||
|
||||
> Возможность изменять данные пользователей как в боте так и через панель.
|
||||
|
||||
- **🔍 Аудит пользователей**
|
||||
> Просмотр всей активности пользователей.
|
||||
|
||||
- **🌐 Интернационализация**
|
||||
> Возможность задавать уникальные баннеры для каждой локали.
|
||||
|
||||
> Поддержка переводов интерфейса на разные языки.
|
||||
|
||||
> Автоматическое определение языка при первой регистрации и последующих изменениях.
|
||||
|
||||
- **🧭 Миграция**
|
||||
> Простая миграция с других ботов.
|
||||
|
||||
- **🪄 Поддержка страницы подписки MiniApp**
|
||||
|
||||
|
||||
# ⚙️ Установка и настройка
|
||||
|
||||
## Требования
|
||||
- Аппаратные:
|
||||
- ОС: рекомендуется Ubuntu или Debian
|
||||
- ОЗУ: минимум 2 ГБ, рекомендуется 4 ГБ
|
||||
- ЦПУ: минимум 2 ядра, рекомендуется 4 ядра
|
||||
- Хранилище: минимум 20 ГБ
|
||||
|
||||
- Программные:
|
||||
- [Docker](https://docs.docker.com/get-started/get-docker/)
|
||||
|
||||
Установить Docker с помощью официального скрипта
|
||||
```
|
||||
sudo curl -fsSL https://get.docker.com | sh
|
||||
```
|
||||
|
||||
> [!WARNING]
|
||||
> **Последняя версия бота совместима только с панелью RemnaWave версии 2.3–2.4.x**
|
||||
> Перед установкой убедитесь, что ваша панель соответствует этой версии.
|
||||
|
||||
|
||||
## Шаг 1 – Скачивание необходимых файлов
|
||||
|
||||
Создайте директорию проекта:
|
||||
```
|
||||
mkdir /opt/remnashop && cd /opt/remnashop
|
||||
```
|
||||
|
||||
Скачайте файлы `docker-compose.yml` и `.env`, выполнив команды ниже:
|
||||
|
||||
- Скачать `docker-compose.yml`:
|
||||
|
||||
- Для внешней панели **(бот и панель находятся на разных серверах)**:
|
||||
```
|
||||
curl -o docker-compose.yml https://raw.githubusercontent.com/snoups/remnashop/refs/heads/main/docker-compose.prod.external.yml
|
||||
```
|
||||
- Для внутренней панели **(бот и панель находятся на одном сервере)**:
|
||||
```
|
||||
curl -o docker-compose.yml https://raw.githubusercontent.com/snoups/remnashop/refs/heads/main/docker-compose.prod.internal.yml
|
||||
```
|
||||
|
||||
- Скачать `.env`:
|
||||
```
|
||||
curl -o .env https://raw.githubusercontent.com/snoups/remnashop/refs/heads/main/.env.example
|
||||
```
|
||||
|
||||
|
||||
## Шаг 2 – Настройка файла .env
|
||||
|
||||
Сгенерируйте секретные ключи, выполнив команды:
|
||||
|
||||
- Генерация ключей безопасности:
|
||||
```
|
||||
sed -i "s|^APP_CRYPT_KEY=.*|APP_CRYPT_KEY=$(openssl rand -base64 32 | tr -d '\n')|" .env && sed -i "s|^BOT_SECRET_TOKEN=.*|BOT_SECRET_TOKEN=$(openssl rand -hex 64 | tr -d '\n')|" .env
|
||||
```
|
||||
|
||||
- Генерация паролей:
|
||||
```
|
||||
sed -i "s|^DATABASE_PASSWORD=.*|DATABASE_PASSWORD=$(openssl rand -hex 24 | tr -d '\n')|" .env && sed -i "s|^REDIS_PASSWORD=.*|REDIS_PASSWORD=$(openssl rand -hex 24 | tr -d '\n')|" .env
|
||||
```
|
||||
|
||||
Теперь откройте файл `.env` и обновите значения переменных:
|
||||
|
||||
- **`APP_DOMAIN`** : Домен, используемый Telegram и Remnawave для доступа к вашему боту.
|
||||
- **`BOT_TOKEN`** : Токен бота, полученный от BotFather.
|
||||
- **`BOT_DEV_ID`** : Telegram ID главного разработчика.
|
||||
- **`BOT_SUPPORT_USERNAME`** : Имя пользователя поддержки без символа `@`.
|
||||
- **`REMNAWAVE_HOST`** : Домен или имя контейнера Docker.
|
||||
- **`REMNAWAVE_TOKEN`** : API-токен Remnawave, созданный в панели.
|
||||
- **`REMNAWAVE_WEBHOOK_SECRET`** : Должен совпадать со значением `WEBHOOK_SECRET_HEADER` из `.env` панели.
|
||||
|
||||
> [!WARNING]
|
||||
> Также в зависимости от вашей конфигурации обратите внимание на данные переменные: **`BOT_MINI_APP`**, **`REMNAWAVE_CADDY_TOKEN`**, **`REMNAWAVE_COOKIE`**.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Для корректной работы бота необходимо правильно настроить вебхук.
|
||||
> В файле `.env` панели Remnawave укажите:
|
||||
> ```
|
||||
> WEBHOOK_ENABLED=true
|
||||
> WEBHOOK_URL=https://bot.domain.com/api/v1/remnawave
|
||||
> ```
|
||||
> Замените `bot.domain.com` на ваш реальный домен.
|
||||
> Этот шаг критически важен для корректного получения событий ботом.
|
||||
|
||||
|
||||
## Шаг 3 – Запуск контейнеров
|
||||
|
||||
Запустите контейнеры командой:
|
||||
|
||||
```
|
||||
docker compose up -d && docker compose logs -f -t
|
||||
```
|
||||
|
||||
Через несколько секунд вы должны увидеть сообщение об успешном запуске бота.
|
||||
|
||||
## Шаг 4 – Настройка обратного прокси
|
||||
|
||||
Для корректной работы Remnashop требуется настроенный обратный прокси.
|
||||
Он необходим для получения вебхуков от Telegram, панели Remnawave и платежных систем.
|
||||
|
||||
**В этом руководстве не описывается установка или настройка прокси.**
|
||||
Вы можете использовать любой прокси-сервер по аналогии с [**Remnawave**](https://docs.rw/docs/install/reverse-proxies/).
|
||||
|
||||
> Если бот установлен на том же сервере, что и панель, прокси, вероятно, уже настроен.
|
||||
> В этом случае нужно лишь добавить правило для перенаправления трафика в контейнер бота.
|
||||
|
||||
**Добавьте правило для маршрута:**
|
||||
|
||||
`https://your-domain/api/v1` -> `http://remnashop:5000`
|
||||
|
||||
|
||||
## Шаг 5 – Как обновить
|
||||
|
||||
Для обновления и перезапуска бота выполните следующую команду:
|
||||
```
|
||||
cd /opt/remnashop && docker compose pull && docker compose down && RESET_ASSETS=true docker compose up -d && docker compose logs -f
|
||||
```
|
||||
|
||||
При использовании `RESET_ASSETS=true` выполняются следующие действия:
|
||||
- Все текущие ассеты сохраняются в резервные копии с отметкой времени (`/opt/remnashop/assets/*.bak`).
|
||||
- Загружаются и распаковываются новые ассеты из образа.
|
||||
- После обновления бот гарантированно использует актуальные файлы.
|
||||
|
||||
> [!CAUTION]
|
||||
> Если не использовать `RESET_ASSETS=true`, старые ассеты останутся без изменений.
|
||||
> Это может привести к некорректной работе бота после обновления.
|
||||
|
||||
# 🖼️ Баннеры
|
||||
|
||||
Бот поддерживает установку собственных баннеров для каждой категории страницы и локали: `menu`, `dashboard`, `subscription`, `promocode`, `referral`.
|
||||
|
||||
Чтобы задать баннер, назовите его в соответствии со страницей и используйте один из поддерживаемых форматов: `jpg`, `jpeg`, `png`, `gif`, `webp`.
|
||||
|
||||
Разместите баннеры по пути: `/opt/remnashop/assets/banners/(locale)/`
|
||||
Пример: `/opt/remnashop/assets/banners/en/menu.gif`
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Не удаляйте файл `default.jpg` — он необходим для корректной работы.
|
||||
|
||||
|
||||
# 🌐 Переводы
|
||||
Вы можете изменить любой файл перевода, расположенный по пути:
|
||||
`/opt/remnashop/assets/translations/(locale)/`
|
||||
|
||||
После внесения изменений перезапустите контейнер, чтобы обновления вступили в силу.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> На данный момент обновления переводов при апдейте бота не сохраняются.
|
||||
> При обновлении ваши предыдущие ассеты будут архивированы в: `/opt/remnashop/assets/*.bak`
|
||||
|
||||
|
||||
# 💸 Поддержка проекта
|
||||
|
||||
Любая поддержка поможет мне уделять больше времени разработке и ускорить развитие проекта!
|
||||
|
||||
> Российские и международные карты - [**Tribute**](https://t.me/tribute/app?startapp=drsi)
|
||||
|
||||
> СБП, ЮMoney, SberPay, T-Pay - [**ЮKassa**](https://yookassa.ru/my/i/Z8AkHJ_F9sO_/l)
|
||||
|
||||
> USDT TRC-20 - **`TPnpmwD4P9znKs3Hp4Hrh9rhJ7u1m6UA1B`**
|
||||
|
||||
<p align="center">
|
||||
<br />
|
||||
<p align="center">
|
||||
<a href="https://remnashop.mintlify.app/docs/ru/overview/releases">
|
||||
<img src="https://img.shields.io/badge/Начать-%E2%86%92-0969da?style=for-the-badge&labelColor=0969da&color=0969da" alt="Начать" width="200" height="auto">
|
||||
</a>
|
||||
</p>
|
||||
<a href="https://github.com/snoups/remnashop/releases">
|
||||
<img src="https://img.shields.io/github/v/release/snoups/remnashop?label=Latest%20release&style=social" alt="Latest release">
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
@@ -33,7 +33,7 @@ dependencies = [
|
||||
]
|
||||
|
||||
[tool.uv.sources]
|
||||
remnapy = { git = "https://github.com/snoups/remnapy", tag = "v2.6.3" }
|
||||
remnapy = { git = "https://github.com/snoups/remnapy", rev = "bec1c72" }
|
||||
|
||||
[project.urls]
|
||||
homepage = "https://t.me/@remna_shop"
|
||||
|
||||
@@ -25,6 +25,10 @@ async def check_bot_update(
|
||||
redis: FromDishka[Redis],
|
||||
event_publisher: FromDishka[EventPublisher],
|
||||
) -> None:
|
||||
if not config.build.tag or config.build.tag == "dev":
|
||||
logger.debug("Local version is a development build, skipping update check")
|
||||
return
|
||||
|
||||
local_version = config.build.tag.replace("v", "") if config.build.tag else None
|
||||
|
||||
if not local_version:
|
||||
|
||||
@@ -4,6 +4,7 @@ from aiogram_dialog import DialogManager
|
||||
from aiogram_dialog.widgets.common import ManagedScroll
|
||||
from dishka import FromDishka
|
||||
from dishka.integrations.aiogram_dialog import inject
|
||||
from loguru import logger
|
||||
from remnapy import RemnawaveSDK
|
||||
|
||||
from src.application.common import TranslatorRunner
|
||||
@@ -18,9 +19,16 @@ async def system_getter(
|
||||
**kwargs: Any,
|
||||
) -> dict[str, Any]:
|
||||
result = await remnawave_sdk.system.get_stats()
|
||||
metadata = None
|
||||
|
||||
# for compatibility with older versions of Remnawave, where the metadata endpoint might not be available
|
||||
try:
|
||||
metadata = await remnawave_sdk.system.get_metadata()
|
||||
except Exception as e:
|
||||
logger.error(f"Error occurred while fetching metadata: {e}")
|
||||
|
||||
return {
|
||||
"version": "", # TODO: Add panel version
|
||||
"version": metadata.version if metadata else "",
|
||||
"cpu_cores": result.cpu.physical_cores,
|
||||
"cpu_threads": result.cpu.cores,
|
||||
"ram_used": i18n_format_bytes_to_unit(result.memory.active),
|
||||
|
||||
4
uv.lock
generated
4
uv.lock
generated
@@ -1039,7 +1039,7 @@ wheels = [
|
||||
[[package]]
|
||||
name = "remnapy"
|
||||
version = "2.1.2.dev106+gbec1c72b3"
|
||||
source = { git = "https://github.com/snoups/remnapy?tag=v2.6.3#bec1c72b321886a069e1ba33aa346f447f7a8455" }
|
||||
source = { git = "https://github.com/snoups/remnapy?rev=bec1c72#bec1c72b321886a069e1ba33aa346f447f7a8455" }
|
||||
dependencies = [
|
||||
{ name = "cryptography" },
|
||||
{ name = "httpx" },
|
||||
@@ -1105,7 +1105,7 @@ requires-dist = [
|
||||
{ name = "pydantic-settings", specifier = "~=2.11.0" },
|
||||
{ name = "qrcode", extras = ["pil"], specifier = ">=8.2" },
|
||||
{ name = "redis", specifier = "~=7.0.0" },
|
||||
{ name = "remnapy", git = "https://github.com/snoups/remnapy?tag=v2.6.3" },
|
||||
{ name = "remnapy", git = "https://github.com/snoups/remnapy?rev=bec1c72" },
|
||||
{ name = "sqlalchemy", extras = ["mypy"], specifier = ">=2.0.0" },
|
||||
{ name = "taskiq", extras = ["orjson"], specifier = "~=0.12.1" },
|
||||
{ name = "taskiq-redis", specifier = "~=1.2.1" },
|
||||
|
||||
Reference in New Issue
Block a user