diff --git a/.env.example b/.env.example
index 44ade0d..6ca9ddf 100644
--- a/.env.example
+++ b/.env.example
@@ -12,6 +12,7 @@ DEFAULT_CURRENCY_SYMBOL="RUB" # e.g., RUB, USD, EUR
# External Links
SUPPORT_LINK=https://t.me/your_support_link
SERVER_STATUS_URL=https://status.yourdomain.tld/status/your_service
+TERMS_OF_SERVICE_URL=https://example.com/tos
# YooKassa Payment Gateway Configuration
YOOKASSA_SHOP_ID=your_shop_id
diff --git a/bot/keyboards/inline/user_keyboards.py b/bot/keyboards/inline/user_keyboards.py
index 6451ca2..8d8e244 100644
--- a/bot/keyboards/inline/user_keyboards.py
+++ b/bot/keyboards/inline/user_keyboards.py
@@ -21,7 +21,6 @@ def get_main_menu_inline_keyboard(
builder.row(
InlineKeyboardButton(text=_(key="menu_subscribe_inline"),
callback_data="main_action:subscribe"))
-
builder.row(
InlineKeyboardButton(text=_(key="menu_my_subscription_inline"),
callback_data="main_action:my_subscription"))
@@ -53,6 +52,11 @@ def get_main_menu_inline_keyboard(
InlineKeyboardButton(text=_(key="menu_support_button"),
url=settings.SUPPORT_LINK))
+ if settings.TERMS_OF_SERVICE_URL:
+ builder.row(
+ InlineKeyboardButton(text=_(key="menu_terms_button"),
+ url=settings.TERMS_OF_SERVICE_URL))
+
return builder.as_markup()
diff --git a/config/settings.py b/config/settings.py
index fd27ded..04699a3 100644
--- a/config/settings.py
+++ b/config/settings.py
@@ -22,6 +22,8 @@ class Settings(BaseSettings):
SERVER_STATUS_URL: Optional[str] = Field(
default=None,
description="Link to server status page (e.g., Uptime Kuma)")
+ TERMS_OF_SERVICE_URL: Optional[str] = Field(
+ default=None, description="Link to Terms of Use page")
YOOKASSA_SHOP_ID: Optional[str] = None
YOOKASSA_SECRET_KEY: Optional[str] = None
@@ -32,10 +34,7 @@ class Settings(BaseSettings):
default=None,
description="Default email for YooKassa receipts (REQUIRED for 54-FZ)")
YOOKASSA_VAT_CODE: int = Field(
- default=6,
- description=
- "YooKassa VAT code (e.g., 1=20%, 2=10%, 4=0%, 6=No VAT - check YooKassa docs!)"
- )
+ default=1, description="YooKassa VAT code (check YooKassa docs!)")
YOOKASSA_PAYMENT_MODE: str = Field(
default="full_prepayment",
description=
diff --git a/docker-compose.yml b/docker-compose.yml
index 749dd1a..d79a2f7 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,8 +1,8 @@
services:
vpn-shop:
build: .
- container_name: vpn-shop
- hostname: vpn-shop
+ container_name: vpn-shop-stable
+ hostname: vpn-shop-stable
env_file:
- .env
networks:
diff --git a/locales/en.json b/locales/en.json
index 6e72dbd..8bb8d87 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -10,13 +10,14 @@
"error_try_again": "An error occurred. Please try again.",
"menu_subscribe_inline": "🚀 Buy",
- "menu_my_subscription_inline": "📄 My Sub/Config",
+ "menu_my_subscription_inline": "📆 My Sub/Config",
"menu_referral_inline": "🎁 Referrals",
"menu_apply_promo_button": "🎁 Promo Code",
"menu_activate_trial_button": "🆓 Activate Trial",
"menu_language_settings_inline": "🌐 Language",
"menu_server_status_button": "📊 Status",
"menu_support_button": "💬 Support",
+ "menu_terms_button": "📄 Terms Of Service",
"back_to_main_menu_button": "⬅️ Main Menu",
"no_subscription_options_available": "Subscription options are currently unavailable.",
diff --git a/locales/ru.json b/locales/ru.json
index 84a84c0..2b32121 100644
--- a/locales/ru.json
+++ b/locales/ru.json
@@ -10,13 +10,14 @@
"error_try_again": "Произошла ошибка. Попробуйте снова.",
"menu_subscribe_inline": "🚀 Купить",
- "menu_my_subscription_inline": "📄 Моя подписка",
+ "menu_my_subscription_inline": "📆 Моя подписка",
"menu_referral_inline": "🎁 Рефералы",
"menu_apply_promo_button": "🎁 Промокод",
"menu_activate_trial_button": "🆓 Пробный период",
"menu_language_settings_inline": "🌐 Язык",
"menu_server_status_button": "📊 Статус",
"menu_support_button": "💬 Поддержка",
+ "menu_terms_button": "📄 Условия сервиса",
"back_to_main_menu_button": "⬅️ Назад",
"no_subscription_options_available": "Варианты подписки сейчас недоступны.",
@@ -33,7 +34,7 @@
"payment_successful": "✅ Оплата успешна! Ваша подписка на {months} мес. активна до {end_date}.",
"payment_failed": "❌ Оплата не удалась/отменена. Если деньги списаны, напишите в поддержку.",
"payment_description_subscription": "Подписка на {months} мес.",
- "my_subscription_details": "ℹ️ Ваша подписка\n\n🗓️ До: {end_date} (Осталось: {days_left} дн.)\n\n🔗 Ссылка: {config_link}\n\n📊 Трафик: {traffic_used} / {traffic_limit}\n💡 Статус: {status}",
+ "my_subscription_details": "ℹ️ Ваша подписка\n\n🗓️ До: {end_date} (Дней осталось: {days_left})\n\n🔗 Ссылка: {config_link}\n\n📊 Трафик: {traffic_used} / {traffic_limit}\n💡 Статус: {status}",
"subscription_not_active": "Активной подписки нет. Оформите сейчас!",
"config_link_not_available": "Н/Д (Попробуйте /sync или поддержка)",
"traffic_unlimited": "Безлимит",
@@ -43,7 +44,7 @@
"status_disabled": "Отключена",
"status_limited": "Ограничена",
"status_unknown": "Неизвестен",
- "subscription_ending_soon_notification": "{user_name},\nВаша подписка истекает {end_date} (через {days_left} дней).\nНе забудьте продлить!",
+ "subscription_ending_soon_notification": "{user_name},\nВаша подписка истекает {end_date} (дней осталось: {days_left}).\nНе забудьте продлить!",
"payment_successful_with_referral_bonus": "✅ Оплата на {months} мес. успешна! Базовая дата: {base_end_date}.\n\n🎉 Вас пригласил(а) {inviter_name}, вы получили дополнительно {bonus_days} бонусных дней!\nИтоговая дата окончания: {final_end_date}.",
"payment_successful_error_details": "Оплата прошла успешно, но возникла ошибка отображения деталей подписки. Пожалуйста, проверьте раздел 'Моя подписка' или свяжитесь с поддержкой.",
"error_processing_your_payment": "Ошибка обработки платежа. Обратитесь в поддержку, если проблема не решится.",