From 6dc882fa199a28c471c17fa71652737a9196ceda Mon Sep 17 00:00:00 2001 From: Admin Date: Fri, 26 Jun 2026 21:19:19 +0400 Subject: [PATCH] =?UTF-8?q?MIGRATION:=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=20speedtests=20=D0=BD=D0=B0=20PostgreSQL=20=D0=B8?= =?UTF-8?q?=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20SQLite=20=D0=B2=20web/app.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 14 +++++++++---- database/models.py | 17 ++++++++++++++++ docker-compose.yml | 51 +++++++++++++++++----------------------------- web/app.py | 23 +++++++++------------ 4 files changed, 56 insertions(+), 49 deletions(-) diff --git a/Dockerfile b/Dockerfile index ae0f239..6f39d48 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,18 @@ -# Использование легкого образа Python FROM python:3.12-slim # Установка рабочей директории WORKDIR /app -# Установка системных зависимостей (если понадобятся для каких-то либ) -RUN apt-get update && apt-get install -y \ ffmpeg - sqlite3 \ +# Установка системных зависимостей для ffmpeg, weasyprint (pango/cairo) и LibreOffice +RUN apt-get update && apt-get install -y \ + ffmpeg \ + libreoffice \ + libpango-1.0-0 \ + libpangocairo-1.0-0 \ + libgdk-pixbuf-2.0-0 \ + libffi-dev \ + shared-mime-info \ + fonts-dejavu \ && rm -rf /var/lib/apt/lists/* # Копирование requirements и установка зависимостей diff --git a/database/models.py b/database/models.py index 7ec1929..c6870da 100644 --- a/database/models.py +++ b/database/models.py @@ -812,3 +812,20 @@ class Artifact(Base): def __repr__(self): return f"" + + +class Speedtest(Base): + """Результаты замеров скорости интернета""" + __tablename__ = 'speedtests' + + id = Column(Integer, primary_key=True, autoincrement=True) + timestamp = Column(DateTime, default=datetime.utcnow) + download = Column(Float, nullable=True) + upload = Column(Float, nullable=True) + ping = Column(Float, nullable=True) + server_name = Column(String(255), nullable=True) + result_url = Column(String(255), nullable=True) + + def __repr__(self): + return f"" + diff --git a/docker-compose.yml b/docker-compose.yml index 9f8718b..0cc2294 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,50 +3,37 @@ version: '3.8' services: domovoy-bot: build: . - container_name: lkm37-core - restart: unless-stopped - env_file: - - .env + container_name: domovoy-bot + network_mode: "host" + restart: always + environment: + - PYTHONPATH=/app:/app/services volumes: - # Монтируем базу данных и важные данные для сохранения - - ./database:/app/database - ./logs:/app/logs - - ./data:/app/data - ./exports:/app/exports - - ./backups:/app/backups - - ./web:/app/web - - ./services/email_auditor/exported_emails:/app/services/email_auditor/exported_emails - network_mode: host - environment: - - TZ=Europe/Moscow - - PYTHONUNBUFFERED=1 + - ./data:/app/data + - /home/matrixhasyou/domovoy_google_creds.json:/home/matrixhasyou/domovoy_google_creds.json:ro logging: driver: "json-file" options: max-size: "10m" max-file: "3" - email_auditor: - build: - context: ./services/email_auditor - dockerfile: Dockerfile - container_name: email-auditor - restart: unless-stopped - env_file: - - .env + domovoy-web: + build: . + container_name: domovoy-web + command: python -m uvicorn web.app:app --host 0.0.0.0 --port 8000 + network_mode: "host" + restart: always + environment: + - PYTHONPATH=/app:/app/services volumes: - - ./database:/app/database - - ./services/email_auditor/exported_emails:/app/exported_emails - network_mode: host - environment: - - TZ=Europe/Moscow - - PYTHONUNBUFFERED=1 + - ./logs:/app/logs + - ./exports:/app/exports + - ./data:/app/data + - /home/matrixhasyou/domovoy_google_creds.json:/home/matrixhasyou/domovoy_google_creds.json:ro logging: driver: "json-file" options: max-size: "10m" max-file: "3" - -networks: - default: - name: lkm37-net diff --git a/web/app.py b/web/app.py index 11ade85..86842f2 100644 --- a/web/app.py +++ b/web/app.py @@ -41,7 +41,7 @@ from database.models import ( User, Message as DBMessage, Poll, Ad, PaymentReminder, Schedule, VerificationRequest, Service, Announcement, Event, ScheduledPost, Broadcast, BroadcastRead, Digest, InitiativeGroup, EmailAudit, EmailExportLog, - ProfileHistory, Achievement, Thank, SpyLog, Artifact + ProfileHistory, Achievement, Thank, SpyLog, Artifact, Speedtest ) # ===== ЧАСОВОЙ ПОЯС УЛЬЯНОВСК (UTC+4) ===== @@ -730,21 +730,18 @@ async def api_emails_sync_ai(username: str = Depends(get_current_admin)): @app.get("/infra", response_class=HTMLResponse) async def get_infra_page(request: Request, username: str = Depends(get_current_admin)): - import sqlite3 - conn = sqlite3.connect("/home/matrixhasyou/domovoy_bot/database/domovoy.db") - cursor = conn.cursor() - cursor.execute("SELECT timestamp, download, upload, ping, server_name FROM speedtests ORDER BY timestamp DESC LIMIT 10") - rows = cursor.fetchall() - conn.close() - + async with AsyncSessionLocal() as session: + stmt = select(Speedtest).order_by(Speedtest.timestamp.desc()).limit(10) + rows = (await session.execute(stmt)).scalars().all() + speedtests = [] for r in rows: speedtests.append({ - "timestamp": r[0], - "download": r[1], - "upload": r[2], - "ping": r[3], - "server_name": r[4] + "timestamp": fmt_local(r.timestamp), + "download": r.download, + "upload": r.upload, + "ping": r.ping, + "server_name": r.server_name }) return templates.TemplateResponse("infra.html", {"request": request, "username": username, "speedtests": speedtests})