fix: tune tariffs folder
This commit is contained in:
+1
-1
@@ -146,7 +146,7 @@ STARS_PRICE_12_MONTHS=0
|
|||||||
# Traffic Packages (enables traffic sale mode when set)
|
# Traffic Packages (enables traffic sale mode when set)
|
||||||
TRAFFIC_PACKAGES=10:199,50:799 # Format: "<GB>:<price>", comma-separated
|
TRAFFIC_PACKAGES=10:199,50:799 # Format: "<GB>:<price>", comma-separated
|
||||||
STARS_TRAFFIC_PACKAGES=10:2500 # Optional: traffic packages priced in Stars
|
STARS_TRAFFIC_PACKAGES=10:2500 # Optional: traffic packages priced in Stars
|
||||||
TARIFFS_CONFIG_PATH=config/tariffs.json # Optional Tariffs 2.0 JSON config. If missing, legacy .env pricing is used.
|
TARIFFS_CONFIG_PATH=data/tariffs.json # Optional Tariffs 2.0 JSON config. If missing, legacy .env pricing is used.
|
||||||
TARIFF_TRAFFIC_WARNING_LEVELS=85,90,95 # Tariffs 2.0 traffic warning levels, percent used
|
TARIFF_TRAFFIC_WARNING_LEVELS=85,90,95 # Tariffs 2.0 traffic warning levels, percent used
|
||||||
|
|
||||||
# Subscription Notifications
|
# Subscription Notifications
|
||||||
|
|||||||
+1
-1
@@ -30,5 +30,5 @@ __pycache__/
|
|||||||
locales/ru_backup.json
|
locales/ru_backup.json
|
||||||
locales/en_backup.json
|
locales/en_backup.json
|
||||||
db/models_old.py
|
db/models_old.py
|
||||||
config/tariffs.json
|
data/tariffs.json
|
||||||
docker-compose-dev.yml
|
docker-compose-dev.yml
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ docker compose logs -f remnawave-minishop
|
|||||||
- настройки платежного провайдера;
|
- настройки платежного провайдера;
|
||||||
- `SUBSCRIPTION_MINI_APP_URL`, если используется Web App.
|
- `SUBSCRIPTION_MINI_APP_URL`, если используется Web App.
|
||||||
|
|
||||||
Для каталога тарифов используется `TARIFFS_CONFIG_PATH` со значением по умолчанию `config/tariffs.json`. Пример формата лежит в [config/tariffs.example.json](config/tariffs.example.json), подробности - в [docs/tariffs.md](docs/tariffs.md).
|
Для каталога тарифов используется `TARIFFS_CONFIG_PATH` со значением по умолчанию `data/tariffs.json`. Пример формата лежит в [data/tariffs.example.json](data/tariffs.example.json), подробности - в [docs/tariffs.md](docs/tariffs.md).
|
||||||
|
|
||||||
## Полезные команды
|
## Полезные команды
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
<header class="admin-card-head">
|
<header class="admin-card-head">
|
||||||
<div>
|
<div>
|
||||||
<h3>{at("tariffs_title", {}, "Каталог тарифов")}</h3>
|
<h3>{at("tariffs_title", {}, "Каталог тарифов")}</h3>
|
||||||
<small>{tariffsPath || "config/tariffs.json"}</small>
|
<small>{tariffsPath || "data/tariffs.json"}</small>
|
||||||
</div>
|
</div>
|
||||||
<div class="admin-editor-section-actions">
|
<div class="admin-editor-section-actions">
|
||||||
<button type="button" class="admin-btn admin-btn-sm" on:click={tariffsStore.loadTariffs} disabled={tariffsLoading || tariffsSaving}>
|
<button type="button" class="admin-btn admin-btn-sm" on:click={tariffsStore.loadTariffs} disabled={tariffsLoading || tariffsSaving}>
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ export async function mockApi(path, options = {}, context = {}) {
|
|||||||
if (path === "/admin/tariffs") {
|
if (path === "/admin/tariffs") {
|
||||||
return {
|
return {
|
||||||
ok: true,
|
ok: true,
|
||||||
path: "config/tariffs.json",
|
path: "data/tariffs.json",
|
||||||
catalog: {
|
catalog: {
|
||||||
default_tariff: "standard",
|
default_tariff: "standard",
|
||||||
topup_packages_default: { rub: [{ gb: 10, price: 99 }], stars: [] },
|
topup_packages_default: { rub: [{ gb: 10, price: 99 }], stars: [] },
|
||||||
|
|||||||
+1
-1
@@ -261,7 +261,7 @@ class Settings(BaseSettings):
|
|||||||
default=None,
|
default=None,
|
||||||
description="Comma-separated list of traffic packages priced in Stars, e.g. '5:500,20:1500'",
|
description="Comma-separated list of traffic packages priced in Stars, e.g. '5:500,20:1500'",
|
||||||
)
|
)
|
||||||
TARIFFS_CONFIG_PATH: str = Field(default="config/tariffs.json")
|
TARIFFS_CONFIG_PATH: str = Field(default="data/tariffs.json")
|
||||||
TARIFF_TRAFFIC_WARNING_LEVELS: str = Field(
|
TARIFF_TRAFFIC_WARNING_LEVELS: str = Field(
|
||||||
default="85,90,95",
|
default="85,90,95",
|
||||||
description="Comma-separated traffic usage warning levels for tariff traffic limits, e.g. '85,90,95'",
|
description="Comma-separated traffic usage warning levels for tariff traffic limits, e.g. '85,90,95'",
|
||||||
|
|||||||
@@ -9,10 +9,9 @@ services:
|
|||||||
- TZ=UTC
|
- TZ=UTC
|
||||||
volumes:
|
volumes:
|
||||||
- ./locales:/app/locales
|
- ./locales:/app/locales
|
||||||
# Optional Tariffs 2.0 config. Put tariffs.json near this compose file,
|
# Tariffs 2.0 configuration. Mount the data directory to persist
|
||||||
# then uncomment the mount below. If no JSON is mounted, legacy .env
|
# changes made via the admin panel.
|
||||||
# pricing is used.
|
# - ./data:/app/data
|
||||||
# - ./tariffs.json:/app/config/tariffs.json:ro
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
depends_on:
|
depends_on:
|
||||||
remnawave-minishop-db:
|
remnawave-minishop-db:
|
||||||
|
|||||||
@@ -14,10 +14,9 @@ services:
|
|||||||
- TZ=UTC
|
- TZ=UTC
|
||||||
volumes:
|
volumes:
|
||||||
- ./locales:/app/locales
|
- ./locales:/app/locales
|
||||||
# Optional Tariffs 2.0 config. Put tariffs.json near this compose file,
|
# Tariffs 2.0 configuration. Mount the data directory to persist
|
||||||
# then uncomment the mount below. If no JSON is mounted, legacy .env
|
# changes made via the admin panel.
|
||||||
# pricing is used.
|
# - ./data:/app/data
|
||||||
# - ./tariffs.json:/app/config/tariffs.json:ro
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
depends_on:
|
depends_on:
|
||||||
- remnawave-minishop-db
|
- remnawave-minishop-db
|
||||||
|
|||||||
+3
-4
@@ -14,11 +14,10 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- 127.0.0.1:8080:8080
|
- 127.0.0.1:8080:8080
|
||||||
- 127.0.0.1:${WEBAPP_SERVER_PORT:-8081}:${WEBAPP_SERVER_PORT:-8081}
|
- 127.0.0.1:${WEBAPP_SERVER_PORT:-8081}:${WEBAPP_SERVER_PORT:-8081}
|
||||||
# Optional Tariffs 2.0 config. Put tariffs.json near this compose file,
|
# Tariffs 2.0 configuration. Mount the data directory to persist
|
||||||
# then uncomment the mount below. If no JSON is mounted, legacy .env
|
# changes made via the admin panel.
|
||||||
# pricing is used.
|
|
||||||
# volumes:
|
# volumes:
|
||||||
# - ./tariffs.json:/app/config/tariffs.json:ro
|
# - ./data:/app/data
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8080/healthz >/dev/null || exit 1"]
|
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8080/healthz >/dev/null || exit 1"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
|
|||||||
+2
-2
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
## Тарифы
|
## Тарифы
|
||||||
|
|
||||||
Раздел **Система -> Тарифы** работает с файлом `TARIFFS_CONFIG_PATH` (по умолчанию `config/tariffs.json`). При сохранении backend валидирует payload через `TariffsConfig`, пишет JSON в UTF-8 и сбрасывает кеш публичных данных Web App.
|
Раздел **Система -> Тарифы** работает с файлом `TARIFFS_CONFIG_PATH` (по умолчанию `data/tariffs.json`). При сохранении backend валидирует payload через `TariffsConfig`, пишет JSON в UTF-8 и сбрасывает кеш публичных данных Web App.
|
||||||
|
|
||||||
Если файла еще нет, админка открывает пустой каталог. Перед сохранением должен быть хотя бы один включенный тариф, а `default_tariff` должен ссылаться на включенный тариф.
|
Если файла еще нет, админка открывает пустой каталог. Перед сохранением должен быть хотя бы один включенный тариф, а `default_tariff` должен ссылаться на включенный тариф.
|
||||||
|
|
||||||
@@ -50,4 +50,4 @@
|
|||||||
|
|
||||||
Отключенный тариф исчезает с витрины, но активные подписки с его `tariff_key` продолжают существовать. Удаление тарифа безопасно только если не осталось активных подписок, которым нужна докупка, продление или смена с этого тарифа.
|
Отключенный тариф исчезает с витрины, но активные подписки с его `tariff_key` продолжают существовать. Удаление тарифа безопасно только если не осталось активных подписок, которым нужна докупка, продление или смена с этого тарифа.
|
||||||
|
|
||||||
Для Docker важно, чтобы путь `TARIFFS_CONFIG_PATH` был доступен на запись контейнеру. В dev-compose каталог `./config` монтируется в `/app/config`, поэтому админка может сохранять `config/tariffs.json`.
|
Для Docker важно, чтобы путь `TARIFFS_CONFIG_PATH` был доступен на запись контейнеру. В dev-compose каталог `./data` монтируется в `/app/data`, поэтому админка может сохранять `data/tariffs.json`.
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ nano .env
|
|||||||
|
|
||||||
| Переменная | Назначение |
|
| Переменная | Назначение |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `TARIFFS_CONFIG_PATH` | Путь к JSON-каталогу тарифов. По умолчанию `config/tariffs.json`. |
|
| `TARIFFS_CONFIG_PATH` | Путь к JSON-каталогу тарифов. По умолчанию `data/tariffs.json`. |
|
||||||
| `TARIFF_TRAFFIC_WARNING_LEVELS` | Проценты предупреждений по трафику, например `85,90,95`. |
|
| `TARIFF_TRAFFIC_WARNING_LEVELS` | Проценты предупреждений по трафику, например `85,90,95`. |
|
||||||
| `RUB_PRICE_1_MONTH`, `RUB_PRICE_3_MONTHS`, `RUB_PRICE_6_MONTHS`, `RUB_PRICE_12_MONTHS` | Цены подписок в рублях для режима без JSON-каталога. |
|
| `RUB_PRICE_1_MONTH`, `RUB_PRICE_3_MONTHS`, `RUB_PRICE_6_MONTHS`, `RUB_PRICE_12_MONTHS` | Цены подписок в рублях для режима без JSON-каталога. |
|
||||||
| `STARS_PRICE_1_MONTH`, `STARS_PRICE_3_MONTHS`, `STARS_PRICE_6_MONTHS`, `STARS_PRICE_12_MONTHS` | Цены подписок в Telegram Stars для режима без JSON-каталога. |
|
| `STARS_PRICE_1_MONTH`, `STARS_PRICE_3_MONTHS`, `STARS_PRICE_6_MONTHS`, `STARS_PRICE_12_MONTHS` | Цены подписок в Telegram Stars для режима без JSON-каталога. |
|
||||||
@@ -79,7 +79,7 @@ nano .env
|
|||||||
|
|
||||||
Если файл из `TARIFFS_CONFIG_PATH` существует, бот использует каталог тарифов. Если файла нет, применяется конфигурация из переменных `.env`.
|
Если файл из `TARIFFS_CONFIG_PATH` существует, бот использует каталог тарифов. Если файла нет, применяется конфигурация из переменных `.env`.
|
||||||
|
|
||||||
В `docker-compose-dev.yml` каталог `./config` монтируется в контейнер как `/app/config`, чтобы Web App админка могла сохранять `config/tariffs.json`. После изменения compose-файла пересоздайте контейнер:
|
В `docker-compose-dev.yml` каталог `./data` монтируется в контейнер как `/app/data`, чтобы Web App админка могла сохранять `data/tariffs.json`. После изменения compose-файла пересоздайте контейнер:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose -f docker-compose-dev.yml up -d --build --force-recreate
|
docker compose -f docker-compose-dev.yml up -d --build --force-recreate
|
||||||
|
|||||||
+2
-2
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
Бот поддерживает два способа описания продаж:
|
Бот поддерживает два способа описания продаж:
|
||||||
|
|
||||||
- JSON-каталог тарифов из `TARIFFS_CONFIG_PATH` (по умолчанию `config/tariffs.json`);
|
- JSON-каталог тарифов из `TARIFFS_CONFIG_PATH` (по умолчанию `data/tariffs.json`);
|
||||||
- конфигурация через переменные `.env`, если JSON-файл отсутствует.
|
- конфигурация через переменные `.env`, если JSON-файл отсутствует.
|
||||||
|
|
||||||
JSON-каталог может содержать несколько тарифов разных моделей: подписки на срок, пакеты трафика без срока действия, разные наборы Internal Squads, лимиты устройств и пакеты докупки. Пример формата: [config/tariffs.example.json](../config/tariffs.example.json).
|
JSON-каталог может содержать несколько тарифов разных моделей: подписки на срок, пакеты трафика без срока действия, разные наборы Internal Squads, лимиты устройств и пакеты докупки. Пример формата: [data/tariffs.example.json](../data/tariffs.example.json).
|
||||||
|
|
||||||
Коротко по моделям:
|
Коротко по моделям:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user