diff --git a/.env.example b/.env.example
index b92cb0a6..c9a3b5e4 100644
--- a/.env.example
+++ b/.env.example
@@ -395,6 +395,7 @@ SERVER_STATUS_ITEMS_PER_PAGE=10
MAINTENANCE_MODE=false
MAINTENANCE_CHECK_INTERVAL=30
MAINTENANCE_AUTO_ENABLE=true
+MAINTENANCE_MONITORING_ENABLED=true
MAINTENANCE_MESSAGE=Ведутся технические работы. Сервис временно недоступен. Попробуйте позже.
# ===== ЛОКАЛИЗАЦИЯ =====
diff --git a/README.md b/README.md
index d08f3dcd..3e159fdb 100644
--- a/README.md
+++ b/README.md
@@ -471,6 +471,7 @@ REMNAWAVE_AUTO_SYNC_TIMES=03:00,15:00
# Автоматический режим тех. работ
MAINTENANCE_MODE=false
MAINTENANCE_AUTO_ENABLE=true
+MAINTENANCE_MONITORING_ENABLED=true
MAINTENANCE_CHECK_INTERVAL=30
# Интервал проверки состояния панели (секунды)
@@ -663,6 +664,7 @@ SERVER_STATUS_ITEMS_PER_PAGE=10
MAINTENANCE_MODE=false
MAINTENANCE_CHECK_INTERVAL=30
MAINTENANCE_AUTO_ENABLE=true
+MAINTENANCE_MONITORING_ENABLED=true
# ===== ЛОКАЛИЗАЦИЯ =====
DEFAULT_LANGUAGE=ru
diff --git a/app/bot.py b/app/bot.py
index 19097554..4d4c9d87 100644
--- a/app/bot.py
+++ b/app/bot.py
@@ -182,11 +182,14 @@ async def setup_bot() -> tuple[Bot, Dispatcher]:
logger.info("⚡ Зарегистрированы обработчики простой покупки")
logger.info("⚡ Зарегистрированы обработчики простой подписки")
- try:
- await maintenance_service.start_monitoring()
- logger.info("Мониторинг техработ запущен")
- except Exception as e:
- logger.error(f"Ошибка запуска мониторинга техработ: {e}")
+ if settings.is_maintenance_monitoring_enabled():
+ try:
+ await maintenance_service.start_monitoring()
+ logger.info("Мониторинг техработ запущен")
+ except Exception as e:
+ logger.error(f"Ошибка запуска мониторинга техработ: {e}")
+ else:
+ logger.info("Мониторинг техработ отключен настройками")
logger.info("🛡️ GlobalErrorMiddleware активирован - бот защищен от устаревших callback queries")
logger.info("Бот успешно настроен")
diff --git a/app/config.py b/app/config.py
index 12d9f9ea..3ecdb6b5 100644
--- a/app/config.py
+++ b/app/config.py
@@ -156,8 +156,9 @@ class Settings(BaseSettings):
INACTIVE_USER_DELETE_MONTHS: int = 3
MAINTENANCE_MODE: bool = False
- MAINTENANCE_CHECK_INTERVAL: int = 30
- MAINTENANCE_AUTO_ENABLE: bool = True
+ MAINTENANCE_CHECK_INTERVAL: int = 30
+ MAINTENANCE_AUTO_ENABLE: bool = True
+ MAINTENANCE_MONITORING_ENABLED: bool = True
MAINTENANCE_MESSAGE: str = "🔧 Ведутся технические работы. Сервис временно недоступен. Попробуйте позже."
TELEGRAM_STARS_ENABLED: bool = True
@@ -1052,6 +1053,9 @@ class Settings(BaseSettings):
def is_maintenance_auto_enable(self) -> bool:
return self.MAINTENANCE_AUTO_ENABLE
+ def is_maintenance_monitoring_enabled(self) -> bool:
+ return self.MAINTENANCE_MONITORING_ENABLED
+
def get_available_subscription_periods(self) -> List[int]:
try:
periods_str = self.AVAILABLE_SUBSCRIPTION_PERIODS
diff --git a/app/handlers/admin/maintenance.py b/app/handlers/admin/maintenance.py
index 33959296..09bfe6d4 100644
--- a/app/handlers/admin/maintenance.py
+++ b/app/handlers/admin/maintenance.py
@@ -74,6 +74,7 @@ async def show_maintenance_panel(
{status_emoji} Режим техработ: {status_text}
{api_emoji} API Remnawave: {api_text}
{monitoring_emoji} Мониторинг: {monitoring_text}
+🛠️ Автозапуск мониторинга: {'Включен' if status_info['monitoring_configured'] else 'Отключен'}
⏱️ Интервал проверки: {status_info['check_interval']}с
🤖 Автовключение: {'Включено' if status_info['auto_enable_configured'] else 'Отключено'}
{panel_info}
diff --git a/app/services/maintenance_service.py b/app/services/maintenance_service.py
index ae8f4fb9..11509f6a 100644
--- a/app/services/maintenance_service.py
+++ b/app/services/maintenance_service.py
@@ -398,6 +398,7 @@ API снова отвечает на запросы.""", "success")
"api_status": self._status.api_status,
"consecutive_failures": self._status.consecutive_failures,
"monitoring_active": self._check_task is not None and not self._check_task.done(),
+ "monitoring_configured": settings.is_maintenance_monitoring_enabled(),
"auto_enable_configured": settings.is_maintenance_auto_enable(),
"check_interval": settings.get_maintenance_check_interval(),
"bot_connected": self._bot is not None
diff --git a/app/services/system_settings_service.py b/app/services/system_settings_service.py
index 9666ba6a..e6615804 100644
--- a/app/services/system_settings_service.py
+++ b/app/services/system_settings_service.py
@@ -516,6 +516,17 @@ class BotConfigurationService:
"warning": "Не забудьте отключить после завершения работ, иначе бот останется недоступен.",
"dependencies": "MAINTENANCE_MESSAGE, MAINTENANCE_CHECK_INTERVAL",
},
+ "MAINTENANCE_MONITORING_ENABLED": {
+ "description": (
+ "Управляет автоматическим запуском мониторинга панели Remnawave при старте бота."
+ ),
+ "format": "Булево значение.",
+ "example": "false",
+ "warning": (
+ "При отключении мониторинг можно запустить вручную из панели администратора."
+ ),
+ "dependencies": "MAINTENANCE_CHECK_INTERVAL",
+ },
"DISPLAY_NAME_BANNED_KEYWORDS": {
"description": (
"Список слов и фрагментов, при наличии которых в отображаемом имени "
diff --git a/main.py b/main.py
index f8a68603..2ae6780b 100644
--- a/main.py
+++ b/main.py
@@ -403,7 +403,10 @@ async def main():
"🛡️",
success_message="Служба техработ запущена",
) as stage:
- if not maintenance_service._check_task or maintenance_service._check_task.done():
+ if not settings.is_maintenance_monitoring_enabled():
+ maintenance_task = None
+ stage.skip("Мониторинг техработ отключен настройками")
+ elif not maintenance_service._check_task or maintenance_service._check_task.done():
maintenance_task = asyncio.create_task(maintenance_service.start_monitoring())
stage.log(f"Интервал проверки: {settings.MAINTENANCE_CHECK_INTERVAL}с")
else: