From e9ff0369346525eaef4e92c439a4ac8925260419 Mon Sep 17 00:00:00 2001 From: Capybara-z Date: Fri, 24 Oct 2025 02:39:32 +0300 Subject: [PATCH] preserve UUID in Remnawave sync --- handlers/admin/clusters/clusters_handler.py | 73 +++++++++++++++---- handlers/keys/key_mode/key_country_mode.py | 1 + handlers/keys/operations/creation.py | 1 + .../keys/operations/subgroup_migration.py | 1 + handlers/keys/operations/update.py | 1 + 5 files changed, 61 insertions(+), 16 deletions(-) diff --git a/handlers/admin/clusters/clusters_handler.py b/handlers/admin/clusters/clusters_handler.py index 7556637f..9cc13df0 100644 --- a/handlers/admin/clusters/clusters_handler.py +++ b/handlers/admin/clusters/clusters_handler.py @@ -534,25 +534,66 @@ async def handle_sync_server( for key in keys_to_sync: try: if key["panel_type"] == "remnawave": - continue + expire_iso = ( + datetime.utcfromtimestamp(key["expiry_time"] / 1000).replace(tzinfo=timezone.utc).isoformat() + ) + + remna = RemnawaveAPI(key["api_url"]) + if not await remna.login(REMNAWAVE_LOGIN, REMNAWAVE_PASSWORD): + logger.error(f"Не удалось авторизоваться в Remnawave для сервера {server_name}") + continue - await create_client_on_server( - { - "api_url": key["api_url"], - "inbound_id": key["inbound_id"], - "server_name": key["server_name"], - }, - key["tg_id"], - key["client_id"], - key["email"], - key["expiry_time"], - semaphore, - plan=key["tariff_id"], - session=session, - ) + traffic_limit_bytes = 0 + hwid_limit = 0 + if key["tariff_id"]: + tariff = await session.get(Tariff, key["tariff_id"]) + if tariff: + if tariff.traffic_limit is not None: + traffic_limit_bytes = int(tariff.traffic_limit * 1024**3) + hwid_limit = tariff.device_limit + + success = await remna.update_user( + uuid=key["client_id"], + expire_at=expire_iso, + telegram_id=key["tg_id"], + email=f"{key['email']}@fake.local", + active_user_inbounds=[key["inbound_id"]], + traffic_limit_bytes=traffic_limit_bytes, + hwid_device_limit=hwid_limit, + ) + + if not success: + logger.warning("[Sync] ошибка обновления, пробуем пересоздать") + + await delete_key_from_cluster(server_name, key["email"], key["client_id"], session) + + await create_key_on_cluster( + cluster_id=server_name, + tg_id=key["tg_id"], + client_id=key["client_id"], + email=key["email"], + expiry_timestamp=key["expiry_time"], + plan=key["tariff_id"], + session=session, + ) + else: + await create_client_on_server( + { + "api_url": key["api_url"], + "inbound_id": key["inbound_id"], + "server_name": key["server_name"], + }, + key["tg_id"], + key["client_id"], + key["email"], + key["expiry_time"], + semaphore, + plan=key["tariff_id"], + session=session, + ) await asyncio.sleep(0.6) except Exception as e: - logger.error(f"Ошибка при добавлении ключа {key['client_id']} в сервер {server_name}: {e}") + logger.error(f"Ошибка при синхронизации ключа {key['client_id']} в сервер {server_name}: {e}") await callback_query.message.edit_text( text=f"✅ Ключи успешно синхронизированы для сервера {server_name}", diff --git a/handlers/keys/key_mode/key_country_mode.py b/handlers/keys/key_mode/key_country_mode.py index 28368480..52b61327 100644 --- a/handlers/keys/key_mode/key_country_mode.py +++ b/handlers/keys/key_mode/key_country_mode.py @@ -442,6 +442,7 @@ async def finalize_key_creation( "expireAt": expire_at, "telegramId": tg_id, "activeInternalSquads": [server_info.inbound_id], + "uuid": client_id, } if traffic_limit_bytes: user_data["trafficLimitBytes"] = traffic_limit_bytes diff --git a/handlers/keys/operations/creation.py b/handlers/keys/operations/creation.py index 26c1b200..22c2f15e 100644 --- a/handlers/keys/operations/creation.py +++ b/handlers/keys/operations/creation.py @@ -132,6 +132,7 @@ async def create_key_on_cluster( "expireAt": expire_at, "telegramId": tg_id, "activeInternalSquads": inbound_ids, + "uuid": client_id, } if traffic_limit_bytes and traffic_limit_bytes > 0: user_data["trafficLimitBytes"] = traffic_limit_bytes * 1024 * 1024 * 1024 diff --git a/handlers/keys/operations/subgroup_migration.py b/handlers/keys/operations/subgroup_migration.py index d99e17db..d72b9c02 100644 --- a/handlers/keys/operations/subgroup_migration.py +++ b/handlers/keys/operations/subgroup_migration.py @@ -71,6 +71,7 @@ async def ensure_on_remnawave( "expireAt": expire_iso, "telegramId": tg_id, "activeInternalSquads": inbounds, + "uuid": client_id, } if traffic_bytes > 0: payload["trafficLimitBytes"] = traffic_bytes diff --git a/handlers/keys/operations/update.py b/handlers/keys/operations/update.py index 80684a1e..9448bab8 100644 --- a/handlers/keys/operations/update.py +++ b/handlers/keys/operations/update.py @@ -86,6 +86,7 @@ async def update_key_on_cluster( "expireAt": expire_iso, "telegramId": tg_id, "activeInternalSquads": inbound_ids, + "uuid": client_id, } if traffic_limit is not None: user_data["trafficLimitBytes"] = traffic_limit * 1024**3