✅ WEB_ADMIN_LOGIN/PASSWORD в .env.example ✅ Конфиг web_admin в config.py ✅ API /api/command - выполнение команд ✅ API /api/commands - список команд ✅ Обновлён web_server.py с конфигом 📦 Бекап: backups/versions/v2.1.2_web_auth_2026-02-28/ Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
62 lines
2.1 KiB
Python
62 lines
2.1 KiB
Python
"""
|
||
Web Server Service - сервис для запуска веб-сервера
|
||
"""
|
||
import logging
|
||
import threading
|
||
from typing import Optional
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class WebServerService:
|
||
"""Сервис для управления веб-сервером"""
|
||
|
||
def __init__(self, host: str = None, port: int = None):
|
||
# Импортируем конфиг при инициализации
|
||
import config
|
||
self.host = host or config.WEB_ADMIN_HOST
|
||
self.port = port or config.WEB_ADMIN_PORT
|
||
self.server = None
|
||
self.thread: Optional[threading.Thread] = None
|
||
self.is_running = False
|
||
|
||
def start(self):
|
||
"""Запустить веб-сервер в отдельном потоке"""
|
||
if self.is_running:
|
||
logger.warning("Веб-сервер уже запущен")
|
||
return
|
||
|
||
try:
|
||
import uvicorn
|
||
from web.app import app
|
||
import config
|
||
|
||
def run_server():
|
||
uvicorn.run(app, host=self.host, port=self.port, log_level="info")
|
||
|
||
self.thread = threading.Thread(target=run_server, daemon=True)
|
||
self.thread.start()
|
||
self.is_running = True
|
||
|
||
logger.info(f"✅ Веб-сервер запущен на http://{self.host}:{self.port}")
|
||
logger.info(f" Логин: {config.WEB_ADMIN_LOGIN}")
|
||
logger.info(f" Пароль: {config.WEB_ADMIN_PASSWORD}")
|
||
|
||
except Exception as e:
|
||
logger.error(f"Ошибка запуска веб-сервера: {e}")
|
||
self.is_running = False
|
||
|
||
def stop(self):
|
||
"""Остановить веб-сервер"""
|
||
if not self.is_running:
|
||
return
|
||
|
||
try:
|
||
self.is_running = False
|
||
logger.info("🛑 Веб-сервер остановлен")
|
||
except Exception as e:
|
||
logger.error(f"Ошибка остановки веб-сервера: {e}")
|
||
|
||
def get_url(self) -> str:
|
||
"""Получить URL веб-интерфейса"""
|
||
return f"http://{self.host}:{self.port}"
|