docs: update 0.7.4 release notes, env vars and requirements

This commit is contained in:
Ilay
2026-04-07 23:41:14 +05:00
parent bc41fca783
commit a2c4d8bf4d
8 changed files with 295 additions and 131 deletions

View File

@@ -1,27 +1,66 @@
---
title: "Assets"
description: "Configuring banners and translations for Remnashop"
description: "Configuring banners, translations and QR code logo for Remnashop"
---
## Banners
The bot supports custom banners for each page category and locale: `menu`, `dashboard`, `subscription`, `promocode`, `referral`.
The bot supports custom banners for each page and locale. Supported page names: `menu`, `dashboard`, `subscription`, `promocode`, `referral`, `default`.
To set a custom banner, name the file according to the target page and make sure it uses one of the supported formats: `jpg`, `jpeg`, `png`, `gif`, `webp`.
Supported formats: `jpg`, `jpeg`, `png`, `gif`, `webp`.
Banners should be placed at: `/opt/remnashop/assets/banners/(locale)/`
Banners should be placed at: `/opt/remnashop/assets/banners/`
Example: `/opt/remnashop/assets/banners/en/menu.gif`
### Fallback chain
When loading a banner, the system searches in the following order:
1. `banners/{user_locale}/{page}` — page-specific banner for the user's locale
2. `banners/{user_locale}/default` — default banner for the user's locale
3. `banners/{default_locale}/{page}` — page-specific banner for the default locale
4. `banners/{default_locale}/default` — default banner for the default locale
5. `banners/default` — global fallback
### Usage examples
- **One image for everything** — place a single `banners/default.jpg`
- **One image per locale** — place `banners/{locale}/default.jpg` for each locale
- **Per-page images** — place `banners/{locale}/{page}.jpg` for each page and locale
### File structure example
```
banners/
├── default.jpg ← global fallback for all pages and locales
├── ru/
│ ├── default.jpg ← default for all pages in ru locale
│ ├── menu.jpg
│ └── subscription.jpg
└── en/
├── default.jpg
└── menu.jpg
```
<Warning>
Do not delete the `default.jpg` file — it is required for the bot to work properly.
The `banners/default.jpg` file is the global fallback and is required for the bot to work properly. Do not delete it.
</Warning>
---
## Translations
You can edit any translation file located at: `/opt/remnashop/assets/translations/(locale)/`
Translation files are located at: `/opt/remnashop/assets/translations/{locale}/`
| File | Description |
| ------------------- | ---------------------------------------------------- |
| `buttons.ftl` | Button labels |
| `messages.ftl` | Messages and dialog texts |
| `notifications.ftl` | Notification texts |
| `events.ftl` | Event-triggered messages |
| `utils.ftl` | Utility strings (statuses, labels, etc.) |
| `custom.ftl` | Custom translations for plan names, menu buttons, etc. |
The `custom.ftl` file is intended for user-defined keys — for example, translated plan names or extra menu button labels. Add your keys here instead of editing the main files.
After making changes, restart the container for them to take effect.
@@ -33,4 +72,15 @@ After making changes, restart the container for them to take effect.
<Warning>
Translation persistence across bot updates is not currently supported. When updating, your previous assets will be archived at: `/opt/remnashop/assets/*.bak`
</Warning>
</Warning>
---
## QR Code Logo
You can add a custom logo to the center of generated invite QR codes.
- **Path:** `assets/logo.png`
- **Format:** PNG, preferably with a transparent background
If the file exists, it will automatically be overlaid in the center of every generated QR code.

View File

@@ -5,83 +5,84 @@ description: "Description of all environment variables for configuring Remnashop
## General
| Variable | Default | Description |
| -------------------- | :-------- | ---------------------------------------------------------------------------------------------- |
| `APP_DOMAIN` | — | Bot domain without HTTP/HTTPS and without trailing slash. Used for webhooks. |
| `APP_CRYPT_KEY` | — | Encryption key for sensitive data in the database. Must be a valid 44-character Base64 string. |
| `APP_HOST` | `0.0.0.0` | Address on which the application runs. |
| `APP_PORT` | `5000` | Application port. |
| `APP_LOCALES` | `ru` | Comma-separated list of supported locales. Example: `en, ru` |
| `APP_DEFAULT_LOCALE` | `ru` | Default locale. |
| `APP_ORIGINS` | — | Comma-separated list of allowed CORS origins. |
| Variable | Required | Default | Description |
| -------------------- | :------: | --------- | ---------------------------------------------------------------------------------------------- |
| `APP_DOMAIN` | ✅ | — | Bot domain without HTTP/HTTPS and without trailing slash. Used for webhooks. |
| `APP_CRYPT_KEY` | ✅ | — | Encryption key for sensitive data in the database. Must be a valid 44-character Base64 string. |
| `APP_HOST` | ❌ | `0.0.0.0` | Address on which the application runs. |
| `APP_PORT` | ❌ | `5000` | Application port. |
| `APP_LOCALES` | ❌ | `ru` | Comma-separated list of supported locales. Example: `en, ru` |
| `APP_DEFAULT_LOCALE` | ❌ | `ru` | Default locale. |
| `APP_ORIGINS` | ❌ | — | Comma-separated list of allowed CORS origins. |
---
## Bot
| Variable | Default | Description |
| -------------------------- | ------- | --------------------------------------------------------------------------------------------------- |
| `BOT_TOKEN` | — | Telegram Bot API token. Obtain it from [@BotFather](https://t.me/BotFather). |
| `BOT_SECRET_TOKEN` | — | Secret token for verifying webhooks from Telegram. |
| `BOT_OWNER_ID` | — | Telegram ID of the bot owner. Grants elevated permissions. |
| `BOT_SUPPORT_USERNAME` | — | Telegram username of the support account for deep-linking (without @). |
| `BOT_MINI_APP` | `false` | Behavior of the "connect" button: `false` — browser, `true` — WebApp, URL — open specified address. |
| `BOT_RESET_WEBHOOK` | `false` | Whether to reset the webhook on startup. |
| `BOT_DROP_PENDING_UPDATES` | `false` | Whether to ignore pending updates on startup. |
| `BOT_SETUP_COMMANDS` | `true` | Whether to set up bot commands on startup. |
| `BOT_USE_BANNERS` | `true` | Whether to use banners in bot messages. |
| Variable | Required | Default | Description |
| -------------------------- | :------: | ------- | --------------------------------------------------------------------------------------------------- |
| `BOT_TOKEN` | ✅ | — | Telegram Bot API token. Obtain it from [@BotFather](https://t.me/BotFather). |
| `BOT_SECRET_TOKEN` | ✅ | — | Secret token for verifying webhooks from Telegram. |
| `BOT_OWNER_ID` | ✅ | — | Telegram ID of the bot owner. Grants elevated permissions. |
| `BOT_SUPPORT_USERNAME` | ✅ | — | Telegram username of the support account for deep-linking (without @). |
| `BOT_MINI_APP` | ❌ | `false` | Behavior of the "connect" button: `false` — browser, `true` — WebApp, URL — open specified address. |
| `BOT_RESET_WEBHOOK` | ❌ | `false` | Whether to reset the webhook on startup. |
| `BOT_DROP_PENDING_UPDATES` | ❌ | `false` | Whether to ignore pending updates on startup. |
| `BOT_SETUP_COMMANDS` | ❌ | `true` | Whether to set up bot commands on startup. |
| `BOT_USE_BANNERS` | ❌ | `true` | Whether to use banners in bot messages. |
| `BOT_PROXY_URL` | ❌ | — | SOCKS5 proxy URL for Telegram API access. Useful if the server is behind TSPU/DPI. Supports `socks5://` (local DNS) and `socks5h://` (remote DNS). Example: `socks5://user:password@1.2.3.4:1080` |
---
## Remnawave
| Variable | Default | Description |
| ---------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------- |
| `REMNAWAVE_HOST` | `remnawave` | Hostname or Docker service name for connecting to the Remnawave API. Without HTTP/HTTPS and without trailing slash. |
| `REMNAWAVE_TOKEN` | — | Remnawave API token. Created in the panel: Settings → API Tokens. |
| `REMNAWAVE_WEBHOOK_SECRET` | — | Secret token for verifying webhooks from Remnawave. Must match `WEBHOOK_SECRET_HEADER` in the panel's `.env`. |
| `REMNAWAVE_CADDY_TOKEN` | — | Token for authentication via Caddy (optional). |
| `REMNAWAVE_COOKIE` | — | Cookie for requests in `key=value` format (optional). |
| `REMNAWAVE_CF_CLIENT_ID` | — | Cloudflare Access Client ID (optional). |
| `REMNAWAVE_CF_CLIENT_SECRET` | — | Cloudflare Access Client Secret (optional). |
| Variable | Required | Default | Description |
| ---------------------------- | :------: | ----------- | ------------------------------------------------------------------------------------------------------------------- |
| `REMNAWAVE_TOKEN` | ✅ | — | Remnawave API token. Created in the panel: Settings → API Tokens. |
| `REMNAWAVE_WEBHOOK_SECRET` | ✅ | — | Secret token for verifying webhooks from Remnawave. Must match `WEBHOOK_SECRET_HEADER` in the panel's `.env`. |
| `REMNAWAVE_HOST` | ❌ | `remnawave` | Hostname or Docker service name for connecting to the Remnawave API. Without HTTP/HTTPS and without trailing slash. |
| `REMNAWAVE_CADDY_TOKEN` | ❌ | — | Token for authentication via Caddy. |
| `REMNAWAVE_COOKIE` | ❌ | — | Cookie for requests in `key=value` format. |
| `REMNAWAVE_CF_CLIENT_ID` | ❌ | — | Cloudflare Access Client ID. |
| `REMNAWAVE_CF_CLIENT_SECRET` | ❌ | — | Cloudflare Access Client Secret. |
---
## Database
| Variable | Default | Description |
| ----------------------- | -------------- | --------------------------------------------------------- |
| `DATABASE_PASSWORD` | — | Password for connecting to PostgreSQL. |
| `DATABASE_HOST` | `remnashop-db` | Database host. |
| `DATABASE_PORT` | `5432` | Database port. |
| `DATABASE_NAME` | `remnashop` | Database name. |
| `DATABASE_USER` | `remnashop` | Database user. |
| `DATABASE_POOL_SIZE` | `30` | Connection pool size. |
| `DATABASE_MAX_OVERFLOW` | `30` | Maximum additional connections beyond the pool. |
| `DATABASE_POOL_TIMEOUT` | `10` | Timeout for waiting for a connection from the pool (sec). |
| `DATABASE_POOL_RECYCLE` | `3600` | Connection lifetime in the pool (sec). |
| `DATABASE_ECHO` | `false` | Log SQL queries. |
| `DATABASE_ECHO_POOL` | `false` | Log connection pool events. |
| Variable | Required | Default | Description |
| ----------------------- | :------: | -------------- | --------------------------------------------------------- |
| `DATABASE_PASSWORD` | ✅ | — | Password for connecting to PostgreSQL. |
| `DATABASE_HOST` | ❌ | `remnashop-db` | Database host. |
| `DATABASE_PORT` | ❌ | `5432` | Database port. |
| `DATABASE_NAME` | ❌ | `remnashop` | Database name. |
| `DATABASE_USER` | ❌ | `remnashop` | Database user. |
| `DATABASE_POOL_SIZE` | ❌ | `30` | Connection pool size. |
| `DATABASE_MAX_OVERFLOW` | ❌ | `30` | Maximum additional connections beyond the pool. |
| `DATABASE_POOL_TIMEOUT` | ❌ | `10` | Timeout for waiting for a connection from the pool (sec). |
| `DATABASE_POOL_RECYCLE` | ❌ | `1800` | Connection lifetime in the pool (sec). |
| `DATABASE_ECHO` | ❌ | `false` | Log SQL queries. |
| `DATABASE_ECHO_POOL` | ❌ | `false` | Log connection pool events. |
---
## Redis
| Variable | Default | Description |
| ---------------- | ----------------- | -------------------------- |
| `REDIS_HOST` | `remnashop-redis` | Redis host. |
| `REDIS_PORT` | `6379` | Redis port. |
| `REDIS_NAME` | `0` | Redis database number. |
| `REDIS_PASSWORD` | — | Redis password (optional). |
| Variable | Required | Default | Description |
| ---------------- | :------: | ----------------- | ---------------------- |
| `REDIS_HOST` | ❌ | `remnashop-redis` | Redis host. |
| `REDIS_PORT` | ❌ | `6379` | Redis port. |
| `REDIS_NAME` | ❌ | `0` | Redis database number. |
| `REDIS_PASSWORD` | ❌ | — | Redis password. |
---
## Logging
| Variable | Default | Description |
| ----------------- | -------- | ----------------------------------------------------------- |
| `LOG_TO_FILE` | `true` | Write logs to file. |
| `LOG_LEVEL` | `DEBUG` | Log level: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`. |
| `LOG_ROTATION` | `100MB` | Log file rotation condition. Example: `100MB` or `00:00`. |
| `LOG_COMPRESSION` | `zip` | Compression format for archived logs. |
| `LOG_RETENTION` | `3 days` | Retention period for archived logs. |
| Variable | Required | Default | Description |
| ----------------- | :------: | -------- | ----------------------------------------------------------- |
| `LOG_TO_FILE` | ❌ | `true` | Write logs to file. |
| `LOG_LEVEL` | ❌ | `DEBUG` | Log level: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`. |
| `LOG_ROTATION` | ❌ | `100MB` | Log file rotation condition. Example: `100MB` or `00:00`. |
| `LOG_COMPRESSION` | ❌ | `zip` | Compression format for archived logs. |
| `LOG_RETENTION` | ❌ | `3 days` | Retention period for archived logs. |

View File

@@ -8,7 +8,8 @@ description: "This page lists the hardware and software requirements for running
#### Compatible Remnawave Panel versions
| Remnashop Version | Remnawave Panel Version |
|-------------------|------------------------ |
| `0.7.0` | `>= 2.6.0` `<= 2.6.4` |
| `0.7.4` | `>= 2.7.0` `< 2.8.0` |
| `0.7.0` — `0.7.3` | `>= 2.6.0` `< 2.7.0` |
| `0.6.6` | `>= 2.3.2` `<= 2.5.7` |
---

View File

@@ -5,6 +5,36 @@ description: "History of changes"
---
#### 0.7.4 (April 7, 2026)
New:
- Added support for **Remnawave 2.7.x**
- Added **MONTH_ROLLING** traffic reset strategy: traffic resets based on the subscription creation date rather than a fixed calendar day
- Added optional **SOCKS5 proxy** support for Telegram API access (configurable via `BOT_PROXY_URL` in env)
- Added **Remnawave version compatibility check**: the bot warns if the connected panel version is outdated or unsupported
- Added **one-time purchase discount** management: separate personal and one-time discounts per user, with the higher value applied automatically
- Added **trial availability toggle** in the user editor
- Added **discount type indicator** on subscription screens showing whether the active discount is personal or one-time
- Increased maximum length for menu button labels and plan names from **16 to 32 characters**
- Improved YooKassa payment creation: added retry logic on connection errors
- Added permission checks when changing user roles: preventing self-demotion, protecting the Owner role, and enforcing role hierarchy
Fixes:
- Fixed role hierarchy comparison in admin list: edit access is now correctly calculated based on actor vs. target role
- Fixed role deletion button visibility in the Administrators dialog
- Fixed subscription statistics: counts now correctly reflect only active (current) subscriptions per user
- Fixed trial statistics: now counts distinct users instead of total trial subscriptions
- Fixed discount calculation: the effective discount is now the maximum of personal and one-time discounts
- Fixed purchase discount reset after a successful payment
- Fixed amount formatting in payments
- Fixed `/delete_commands` not being called when `setup_commands` is disabled
- Fixed update check notification incorrectly triggering in some cases
- Fixed Redis connection configuration
- Fixed translator leaving blank lines after removing optional placeholders
- Transactions in user history are now sorted by creation date (newest first)
---
#### 0.7.3 (March 29, 2026)
Fixes:

View File

@@ -1,27 +1,66 @@
---
title: "Ассеты"
description: "Настройка баннеров и переводов Remnashop"
description: "Настройка баннеров, переводов и логотипа QR-кода Remnashop"
---
## Баннеры
Бот поддерживает кастомные баннеры для каждой категории страниц и локали: `menu`, `dashboard`, `subscription`, `promocode`, `referral`.
Бот поддерживает кастомные баннеры для каждой страницы и локали. Поддерживаемые названия страниц: `menu`, `dashboard`, `subscription`, `promocode`, `referral`, `default`.
Чтобы установить кастомный баннер, назовите файл в соответствии с целевой страницей и убедитесь, что он использует один из поддерживаемых форматов: `jpg`, `jpeg`, `png`, `gif`, `webp`.
Поддерживаемые форматы: `jpg`, `jpeg`, `png`, `gif`, `webp`.
Баннеры должны быть размещены по пути: `/opt/remnashop/assets/banners/(locale)/`
Баннеры должны быть размещены по пути: `/opt/remnashop/assets/banners/`
Пример: `/opt/remnashop/assets/banners/en/menu.gif`
### Порядок поиска баннера
При загрузке баннера система ищет файл в следующем порядке:
1. `banners/{locale_пользователя}/{страница}` — страничный баннер для локали пользователя
2. `banners/{locale_пользователя}/default` — дефолтный баннер для локали пользователя
3. `banners/{locale_по_умолчанию}/{страница}` — страничный баннер для локали по умолчанию
4. `banners/{locale_по_умолчанию}/default` — дефолтный баннер для локали по умолчанию
5. `banners/default` — глобальный запасной баннер
### Примеры использования
- **Одно изображение для всего** — разместите единственный файл `banners/default.jpg`
- **Своё изображение для каждой локали** — разместите `banners/{locale}/default.jpg` для каждой локали
- **Изображения для каждой страницы** — разместите `banners/{locale}/{страница}.jpg` для каждой страницы и локали
### Пример структуры файлов
```
banners/
├── default.jpg ← глобальный запасной баннер для всех страниц и локалей
├── ru/
│ ├── default.jpg ← дефолтный баннер для всех страниц в локали ru
│ ├── menu.jpg
│ └── subscription.jpg
└── en/
├── default.jpg
└── menu.jpg
```
<Warning>
Не удаляйте файл `default.jpg` — он необходим для корректной работы бота.
Файл `banners/default.jpg` является глобальным запасным баннером и необходим для корректной работы бота. Не удаляйте его.
</Warning>
---
## Переводы
Вы можете редактировать любой файл перевода, расположенный по пути: `/opt/remnashop/assets/translations/(locale)/`
Файлы переводов находятся по пути: `/opt/remnashop/assets/translations/{locale}/`
| Файл | Описание |
| ------------------- | --------------------------------------------------------- |
| `buttons.ftl` | Подписи кнопок |
| `messages.ftl` | Сообщения и тексты диалогов |
| `notifications.ftl` | Тексты уведомлений |
| `events.ftl` | Сообщения, отправляемые по событиям |
| `utils.ftl` | Вспомогательные строки (статусы, подписи и т.п.) |
| `custom.ftl` | Пользовательские переводы для названий планов, кнопок меню и т.п. |
Файл `custom.ftl` предназначен для пользовательских ключей — например, переводов названий планов или дополнительных кнопок меню. Добавляйте свои ключи сюда, не изменяя основные файлы.
После внесения изменений необходимо перезапустить контейнер, чтобы они вступили в силу.
@@ -33,4 +72,15 @@ description: "Настройка баннеров и переводов Remnasho
<Warning>
В настоящее время сохранение переводов при обновлении бота не поддерживается. При обновлении ваши предыдущие ассеты будут заархивированы по пути: `/opt/remnashop/assets/*.bak`
</Warning>
</Warning>
---
## Логотип QR-кода
Вы можете добавить кастомный логотип в центр генерируемых QR-кодов приглашений.
- **Путь:** `assets/logo.png`
- **Формат:** PNG, желательно с прозрачным фоном
Если файл существует, он автоматически будет наложен в центр каждого сгенерированного QR-кода.

View File

@@ -5,83 +5,84 @@ description: "Описание всех переменных окружения
## Основные
| Переменная | По умолчанию | Описание |
| ------------------- | ------------ | --------------------------------------------------------------------------------------- |
| `APP_DOMAIN` | — | Домен бота без HTTP/HTTPS и без завершающего слеша. Используется для вебхуков. |
| `APP_CRYPT_KEY` | — | Ключ шифрования конфиденциальных данных в БД. Валидная Base64-строка длиной 44 символа. |
| `APP_HOST` | `0.0.0.0` | Адрес, на котором запускается приложение. |
| `APP_PORT` | `5000` | Порт приложения. |
| `APP_LOCALES` | `ru` | Список поддерживаемых локалей через запятую. Пример: `en, ru` |
| `APP_DEFAULT_LOCALE`| `ru` | Локаль по умолчанию. |
| `APP_ORIGINS` | — | Список разрешённых CORS-источников через запятую. |
| Переменная | Обязательная | По умолчанию | Описание |
| -------------------- | :----------: | ------------ | --------------------------------------------------------------------------------------- |
| `APP_DOMAIN` | ✅ | — | Домен бота без HTTP/HTTPS и без завершающего слеша. Используется для вебхуков. |
| `APP_CRYPT_KEY` | ✅ | — | Ключ шифрования конфиденциальных данных в БД. Валидная Base64-строка длиной 44 символа. |
| `APP_HOST` | ❌ | `0.0.0.0` | Адрес, на котором запускается приложение. |
| `APP_PORT` | ❌ | `5000` | Порт приложения. |
| `APP_LOCALES` | ❌ | `ru` | Список поддерживаемых локалей через запятую. Пример: `en, ru` |
| `APP_DEFAULT_LOCALE` | ❌ | `ru` | Локаль по умолчанию. |
| `APP_ORIGINS` | ❌ | — | Список разрешённых CORS-источников через запятую. |
---
## Бот
| Переменная | По умолчанию | Описание |
| ------------------------- | ------------ | ------------------------------------------------------------------------------------------------- |
| `BOT_TOKEN` | — | Токен Telegram Bot API. Получите у [@BotFather](https://t.me/BotFather). |
| `BOT_SECRET_TOKEN` | — | Секретный токен для верификации вебхуков от Telegram. |
| `BOT_OWNER_ID` | — | Telegram ID владельца бота. Предоставляет расширенные права. |
| `BOT_SUPPORT_USERNAME` | — | Telegram username аккаунта поддержки для deep-link (без @). |
| `BOT_MINI_APP` | `false` | Поведение кнопки «подключить»: `false` — браузер, `true` — WebApp, URL — открыть указанный адрес. |
| `BOT_RESET_WEBHOOK` | `false` | Сбрасывать ли вебхук при запуске. |
| `BOT_DROP_PENDING_UPDATES`| `false` | Игнорировать ли накопившиеся обновления при запуске. |
| `BOT_SETUP_COMMANDS` | `true` | Устанавливать ли команды бота при запуске. |
| `BOT_USE_BANNERS` | `true` | Использовать ли баннеры в сообщениях бота. |
| Переменная | Обязательная | По умолчанию | Описание |
| -------------------------- | :----------: | ------------ | ------------------------------------------------------------------------------------------------- |
| `BOT_TOKEN` | ✅ | — | Токен Telegram Bot API. Получите у [@BotFather](https://t.me/BotFather). |
| `BOT_SECRET_TOKEN` | ✅ | — | Секретный токен для верификации вебхуков от Telegram. |
| `BOT_OWNER_ID` | ✅ | — | Telegram ID владельца бота. Предоставляет расширенные права. |
| `BOT_SUPPORT_USERNAME` | ✅ | — | Telegram username аккаунта поддержки для deep-link (без @). |
| `BOT_MINI_APP` | ❌ | `false` | Поведение кнопки «подключить»: `false` — браузер, `true` — WebApp, URL — открыть указанный адрес. |
| `BOT_RESET_WEBHOOK` | ❌ | `false` | Сбрасывать ли вебхук при запуске. |
| `BOT_DROP_PENDING_UPDATES` | ❌ | `false` | Игнорировать ли накопившиеся обновления при запуске. |
| `BOT_SETUP_COMMANDS` | ❌ | `true` | Устанавливать ли команды бота при запуске. |
| `BOT_USE_BANNERS` | ❌ | `true` | Использовать ли баннеры в сообщениях бота. |
| `BOT_PROXY_URL` | ❌ | — | URL SOCKS5-прокси для подключения к Telegram API. Актуально при блокировке через ТСПУ/DPI. Поддерживает `socks5://` (локальный DNS) и `socks5h://` (удалённый DNS). Пример: `socks5://user:password@1.2.3.4:1080` |
---
## Remnawave
| Переменная | По умолчанию | Описание |
| --------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------ |
| `REMNAWAVE_HOST` | `remnawave` | Хост или имя Docker-сервиса для подключения к API Remnawave. Без HTTP/HTTPS и без слеша. |
| `REMNAWAVE_TOKEN` | — | API-токен Remnawave. Создаётся в панели: Настройки → API Токены. |
| `REMNAWAVE_WEBHOOK_SECRET` | | Секретный токен для верификации вебхуков от Remnawave. Должен совпадать с `WEBHOOK_SECRET_HEADER` в `.env` панели. |
| `REMNAWAVE_CADDY_TOKEN` | — | Токен для аутентификации через Caddy (опционально). |
| `REMNAWAVE_COOKIE` | — | Cookie для запросов в формате `key=value` (опционально). |
| `REMNAWAVE_CF_CLIENT_ID` | — | Cloudflare Access Client ID (опционально). |
| `REMNAWAVE_CF_CLIENT_SECRET`| — | Cloudflare Access Client Secret (опционально). |
| Переменная | Обязательная | По умолчанию | Описание |
| ---------------------------- | :----------: | ------------ | ------------------------------------------------------------------------------------------------------------------ |
| `REMNAWAVE_TOKEN` | ✅ | — | API-токен Remnawave. Создаётся в панели: Настройки → API Токены. |
| `REMNAWAVE_WEBHOOK_SECRET` | ✅ | — | Секретный токен для верификации вебхуков от Remnawave. Должен совпадать с `WEBHOOK_SECRET_HEADER` в `.env` панели. |
| `REMNAWAVE_HOST` | | `remnawave` | Хост или имя Docker-сервиса для подключения к API Remnawave. Без HTTP/HTTPS и без слеша. |
| `REMNAWAVE_CADDY_TOKEN` | ❌ | — | Токен для аутентификации через Caddy. |
| `REMNAWAVE_COOKIE` | ❌ | — | Cookie для запросов в формате `key=value`. |
| `REMNAWAVE_CF_CLIENT_ID` | ❌ | — | Cloudflare Access Client ID. |
| `REMNAWAVE_CF_CLIENT_SECRET` | ❌ | — | Cloudflare Access Client Secret. |
---
## База данных
| Переменная | По умолчанию | Описание |
| ----------------------- | -------------- | ---------------------------------------------- |
| `DATABASE_PASSWORD` | — | Пароль для подключения к PostgreSQL. |
| `DATABASE_HOST` | `remnashop-db` | Хост базы данных. |
| `DATABASE_PORT` | `5432` | Порт базы данных. |
| `DATABASE_NAME` | `remnashop` | Название базы данных. |
| `DATABASE_USER` | `remnashop` | Пользователь базы данных. |
| `DATABASE_POOL_SIZE` | `30` | Размер пула соединений. |
| `DATABASE_MAX_OVERFLOW` | `30` | Максимум дополнительных соединений сверх пула. |
| `DATABASE_POOL_TIMEOUT` | `10` | Таймаут ожидания соединения из пула (сек). |
| `DATABASE_POOL_RECYCLE` | `3600` | Время жизни соединения в пуле (сек). |
| `DATABASE_ECHO` | `false` | Логировать SQL-запросы. |
| `DATABASE_ECHO_POOL` | `false` | Логировать события пула соединений. |
| Переменная | Обязательная | По умолчанию | Описание |
| ----------------------- | :----------: | -------------- | ---------------------------------------------- |
| `DATABASE_PASSWORD` | ✅ | — | Пароль для подключения к PostgreSQL. |
| `DATABASE_HOST` | ❌ | `remnashop-db` | Хост базы данных. |
| `DATABASE_PORT` | ❌ | `5432` | Порт базы данных. |
| `DATABASE_NAME` | ❌ | `remnashop` | Название базы данных. |
| `DATABASE_USER` | ❌ | `remnashop` | Пользователь базы данных. |
| `DATABASE_POOL_SIZE` | ❌ | `30` | Размер пула соединений. |
| `DATABASE_MAX_OVERFLOW` | ❌ | `30` | Максимум дополнительных соединений сверх пула. |
| `DATABASE_POOL_TIMEOUT` | ❌ | `10` | Таймаут ожидания соединения из пула (сек). |
| `DATABASE_POOL_RECYCLE` | ❌ | `1800` | Время жизни соединения в пуле (сек). |
| `DATABASE_ECHO` | ❌ | `false` | Логировать SQL-запросы. |
| `DATABASE_ECHO_POOL` | ❌ | `false` | Логировать события пула соединений. |
---
## Redis
| Переменная | По умолчанию | Описание |
| --------------- | ----------------- | ----------------------------- |
| `REDIS_HOST` | `remnashop-redis` | Хост Redis. |
| `REDIS_PORT` | `6379` | Порт Redis. |
| `REDIS_NAME` | `0` | Номер базы данных Redis. |
| `REDIS_PASSWORD`| — | Пароль Redis (опционально). |
| Переменная | Обязательная | По умолчанию | Описание |
| ---------------- | :----------: | ----------------- | --------------------------- |
| `REDIS_HOST` | ❌ | `remnashop-redis` | Хост Redis. |
| `REDIS_PORT` | ❌ | `6379` | Порт Redis. |
| `REDIS_NAME` | ❌ | `0` | Номер базы данных Redis. |
| `REDIS_PASSWORD` | ❌ | — | Пароль Redis. |
---
## Логирование
| Переменная | По умолчанию | Описание |
| --------------- | ------------ | --------------------------------------------------------------------- |
| `LOG_TO_FILE` | `true` | Записывать логи в файл. |
| `LOG_LEVEL` | `DEBUG` | Уровень логирования: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`. |
| `LOG_ROTATION` | `100MB` | Условие ротации лог-файла. Пример: `100MB` или `00:00`. |
| `LOG_COMPRESSION`| `zip` | Формат сжатия архивных логов. |
| `LOG_RETENTION` | `3 days` | Срок хранения архивных логов. |
| Переменная | Обязательная | По умолчанию | Описание |
| ----------------- | :----------: | ------------ | --------------------------------------------------------------------- |
| `LOG_TO_FILE` | ❌ | `true` | Записывать логи в файл. |
| `LOG_LEVEL` | ❌ | `DEBUG` | Уровень логирования: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`. |
| `LOG_ROTATION` | ❌ | `100MB` | Условие ротации лог-файла. Пример: `100MB` или `00:00`. |
| `LOG_COMPRESSION` | ❌ | `zip` | Формат сжатия архивных логов. |
| `LOG_RETENTION` | ❌ | `3 days` | Срок хранения архивных логов. |

View File

@@ -6,10 +6,11 @@ description: "На этой странице перечислены аппара
---
#### Совместимость версий панели Remnawave
| Версия Remnashop | Версия панели Remnawave |
|------------------|------------------------- |
| `0.7.0` | `>= 2.6.0` `<= 2.6.4` |
| `0.6.6` | `>= 2.3.2` `<= 2.5.7` |
| Версия Remnashop | Версия панели Remnawave |
|-------------------|------------------------- |
| `0.7.4` | `>= 2.7.0` `< 2.8.0` |
| `0.7.0` — `0.7.3` | `>= 2.6.0` `< 2.7.0` |
| `0.6.6` | `>= 2.3.2` `<= 2.5.7` |
---

View File

@@ -5,6 +5,36 @@ description: "История изменений"
---
#### 0.7.4 (7 апреля 2026)
Новое:
- Добавлена поддержка **Remnawave 2.7.x**
- Добавлена стратегия сброса трафика **MONTH_ROLLING**: трафик сбрасывается по дате создания подписки, а не по фиксированному дню месяца
- Добавлена опциональная поддержка **SOCKS5 прокси** для доступа к Telegram API (настраивается через `BOT_PROXY_URL` в env)
- Добавлена **проверка совместимости версии Remnawave**: бот предупреждает, если версия подключённой панели устарела или не поддерживается
- Добавлено управление **скидкой на покупку**: отдельные личная и одноразовая скидка на пользователя, применяется наибольшая
- Добавлена кнопка переключения **доступности пробного периода** в редакторе пользователя
- Добавлен **индикатор типа скидки** на экранах подписки: показывает, личная скидка или одноразовая
- Увеличена максимальная длина названий кнопок меню и названий планов с **16 до 32 символов**
- Улучшено создание платежа в YooKassa: добавлена логика повторных попыток при ошибке соединения
- Добавлены проверки прав при изменении роли пользователя: запрет на понижение собственной роли, защита роли Владельца и соблюдение иерархии ролей
Исправления:
- Исправлено сравнение ролей в списке администраторов: доступность редактирования теперь корректно рассчитывается относительно роли актора
- Исправлено условие отображения кнопки удаления роли в диалоге Администраторы
- Исправлена статистика подписок: учитываются только активные (текущие) подписки пользователей
- Исправлена статистика пробных периодов: теперь считаются уникальные пользователи, а не общее число пробных подписок
- Исправлен расчёт скидки: применяется максимальная из личной и одноразовой скидок
- Исправлен сброс покупочной скидки после успешной оплаты
- Исправлено форматирование сумм в платежах
- Исправлен вызов `/delete_commands` при отключённом `setup_commands`
- Исправлено некорректное срабатывание уведомления о доступном обновлении
- Исправлена конфигурация подключения к Redis
- Исправлен переводчик: пустые строки после удаления опциональных плейсхолдеров больше не остаются
- История транзакций пользователя теперь отсортирована по дате создания (сначала новые)
---
#### 0.7.3 (29 марта 2026)
Исправления: