diff --git a/.env.example b/.env.example index 49d40597..28c25f2f 100644 --- a/.env.example +++ b/.env.example @@ -59,6 +59,11 @@ REMNAWAVE_SECRET_KEY= # {telegram_id} — ID Telegram REMNAWAVE_USER_DESCRIPTION_TEMPLATE="Bot user: {full_name} {username}" +# Режим удаления пользователей из панели RemnaWave +# delete - полностью удалить пользователя из панели +# disable - только деактивировать пользователя +REMNAWAVE_USER_DELETE_MODE=delete + # ========= ПОДПИСКИ ========= # ===== ТРИАЛ ПОДПИСКА ===== TRIAL_DURATION_DAYS=3 diff --git a/app/config.py b/app/config.py index 3884a425..0c434620 100644 --- a/app/config.py +++ b/app/config.py @@ -43,6 +43,7 @@ class Settings(BaseSettings): REMNAWAVE_PASSWORD: Optional[str] = None REMNAWAVE_AUTH_TYPE: str = "api_key" REMNAWAVE_USER_DESCRIPTION_TEMPLATE: str = "Bot user: {full_name} {username}" + REMNAWAVE_USER_DELETE_MODE: str = "delete" # "delete" или "disable" TRIAL_DURATION_DAYS: int = 3 TRIAL_TRAFFIC_LIMIT_GB: int = 10 @@ -259,6 +260,11 @@ class Settings(BaseSettings): "password": self.REMNAWAVE_PASSWORD, "auth_type": self.REMNAWAVE_AUTH_TYPE } + + def get_remnawave_user_delete_mode(self) -> str: + """Возвращает режим удаления пользователей: 'delete' или 'disable'""" + mode = self.REMNAWAVE_USER_DELETE_MODE.lower().strip() + return mode if mode in ["delete", "disable"] else "delete" def format_remnawave_user_description( self, diff --git a/app/services/user_service.py b/app/services/user_service.py index ef8a1196..0c65fde0 100644 --- a/app/services/user_service.py +++ b/app/services/user_service.py @@ -239,13 +239,39 @@ class UserService: logger.info(f"🗑️ Начинаем полное удаление пользователя {user_id} (Telegram ID: {user.telegram_id})") if user.remnawave_uuid: + from app.config import settings + delete_mode = settings.get_remnawave_user_delete_mode() + try: - from app.services.subscription_service import SubscriptionService - subscription_service = SubscriptionService() - await subscription_service.disable_remnawave_user(user.remnawave_uuid) - logger.info(f"✅ RemnaWave пользователь {user.remnawave_uuid} деактивирован") + from app.services.remnawave_service import RemnaWaveService + remnawave_service = RemnaWaveService() + + if delete_mode == "delete": + # Удаляем пользователя из панели Remnawave + async with remnawave_service.api as api: + delete_success = await api.delete_user(user.remnawave_uuid) + if delete_success: + logger.info(f"✅ RemnaWave пользователь {user.remnawave_uuid} удален из панели") + else: + logger.warning(f"⚠️ Не удалось удалить пользователя {user.remnawave_uuid} из панели Remnawave") + else: + # Деактивируем пользователя в панели Remnawave + from app.services.subscription_service import SubscriptionService + subscription_service = SubscriptionService() + await subscription_service.disable_remnawave_user(user.remnawave_uuid) + logger.info(f"✅ RemnaWave пользователь {user.remnawave_uuid} деактивирован (режим: {delete_mode})") + except Exception as e: - logger.warning(f"⚠️ Ошибка деактивации RemnaWave: {e}") + logger.warning(f"⚠️ Ошибка обработки пользователя в Remnawave (режим: {delete_mode}): {e}") + # Если основное действие не удалось, попытаемся хотя бы деактивировать + if delete_mode == "delete": + try: + from app.services.subscription_service import SubscriptionService + subscription_service = SubscriptionService() + await subscription_service.disable_remnawave_user(user.remnawave_uuid) + logger.info(f"✅ RemnaWave пользователь {user.remnawave_uuid} деактивирован как fallback") + except Exception as fallback_e: + logger.error(f"❌ Ошибка деактивации RemnaWave как fallback: {fallback_e}") try: sent_notifications_result = await db.execute(