fix: tune tariffs folder

This commit is contained in:
3252a8
2026-05-11 22:12:19 +03:00
parent ed6b214b29
commit 116b0a5c08
13 changed files with 21 additions and 24 deletions
+1 -1
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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'",
+3 -4
View File
@@ -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:
+3 -4
View File
@@ -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
View File
@@ -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
View File
@@ -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`.
+2 -2
View File
@@ -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
View File
@@ -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).
Коротко по моделям: Коротко по моделям: