✅ Регистрация и верификация жильцов ✅ Рейтинг активности (уровни) ✅ Детект шпионов (Score 0-100) ✅ Анти-мат система (3 предупреждения → бан) ✅ Админ-панель с рассылкой ✅ Учёт квартир (несколько жильцов) ✅ Телефоны экстренных служб и мастеров ✅ Еженедельный экспорт JSON ✅ Прокси (socks5) для обхода РКН Бекап: backups/versions/v1.0_mvp_2026-02-26/ Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
59 lines
2 KiB
Python
59 lines
2 KiB
Python
"""
|
||
Web Server Service - сервис для запуска веб-сервера
|
||
"""
|
||
import logging
|
||
import threading
|
||
from typing import Optional
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class WebServerService:
|
||
"""Сервис для управления веб-сервером"""
|
||
|
||
def __init__(self, host: str = "0.0.0.0", port: int = 8000):
|
||
self.host = host
|
||
self.port = 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
|
||
|
||
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" Логин: admin")
|
||
logger.info(f" Пароль: {self.port} (ID админа)")
|
||
|
||
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}"
|