MIGRATION: Перевод speedtests на PostgreSQL и исправление SQLite в web/app.py

This commit is contained in:
Admin 2026-06-26 21:19:19 +04:00
parent 2be7aea46e
commit 6dc882fa19
4 changed files with 56 additions and 49 deletions

View file

@ -1,12 +1,18 @@
# Использование легкого образа Python
FROM python:3.12-slim FROM python:3.12-slim
# Установка рабочей директории # Установка рабочей директории
WORKDIR /app WORKDIR /app
# Установка системных зависимостей (если понадобятся для каких-то либ) # Установка системных зависимостей для ffmpeg, weasyprint (pango/cairo) и LibreOffice
RUN apt-get update && apt-get install -y \ ffmpeg RUN apt-get update && apt-get install -y \
sqlite3 \ 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/* && rm -rf /var/lib/apt/lists/*
# Копирование requirements и установка зависимостей # Копирование requirements и установка зависимостей

View file

@ -812,3 +812,20 @@ class Artifact(Base):
def __repr__(self): def __repr__(self):
return f"<Artifact {self.filename} ({self.file_type})>" return f"<Artifact {self.filename} ({self.file_type})>"
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"<Speedtest #{self.id} DL={self.download} UP={self.upload} Server={self.server_name}>"

View file

@ -3,50 +3,37 @@ version: '3.8'
services: services:
domovoy-bot: domovoy-bot:
build: . build: .
container_name: lkm37-core container_name: domovoy-bot
restart: unless-stopped network_mode: "host"
env_file: restart: always
- .env environment:
- PYTHONPATH=/app:/app/services
volumes: volumes:
# Монтируем базу данных и важные данные для сохранения
- ./database:/app/database
- ./logs:/app/logs - ./logs:/app/logs
- ./data:/app/data
- ./exports:/app/exports - ./exports:/app/exports
- ./backups:/app/backups - ./data:/app/data
- ./web:/app/web - /home/matrixhasyou/domovoy_google_creds.json:/home/matrixhasyou/domovoy_google_creds.json:ro
- ./services/email_auditor/exported_emails:/app/services/email_auditor/exported_emails
network_mode: host
environment:
- TZ=Europe/Moscow
- PYTHONUNBUFFERED=1
logging: logging:
driver: "json-file" driver: "json-file"
options: options:
max-size: "10m" max-size: "10m"
max-file: "3" max-file: "3"
email_auditor: domovoy-web:
build: build: .
context: ./services/email_auditor container_name: domovoy-web
dockerfile: Dockerfile command: python -m uvicorn web.app:app --host 0.0.0.0 --port 8000
container_name: email-auditor network_mode: "host"
restart: unless-stopped restart: always
env_file: environment:
- .env - PYTHONPATH=/app:/app/services
volumes: volumes:
- ./database:/app/database - ./logs:/app/logs
- ./services/email_auditor/exported_emails:/app/exported_emails - ./exports:/app/exports
network_mode: host - ./data:/app/data
environment: - /home/matrixhasyou/domovoy_google_creds.json:/home/matrixhasyou/domovoy_google_creds.json:ro
- TZ=Europe/Moscow
- PYTHONUNBUFFERED=1
logging: logging:
driver: "json-file" driver: "json-file"
options: options:
max-size: "10m" max-size: "10m"
max-file: "3" max-file: "3"
networks:
default:
name: lkm37-net

View file

@ -41,7 +41,7 @@ from database.models import (
User, Message as DBMessage, Poll, Ad, PaymentReminder, Schedule, User, Message as DBMessage, Poll, Ad, PaymentReminder, Schedule,
VerificationRequest, Service, Announcement, Event, ScheduledPost, VerificationRequest, Service, Announcement, Event, ScheduledPost,
Broadcast, BroadcastRead, Digest, InitiativeGroup, EmailAudit, EmailExportLog, Broadcast, BroadcastRead, Digest, InitiativeGroup, EmailAudit, EmailExportLog,
ProfileHistory, Achievement, Thank, SpyLog, Artifact ProfileHistory, Achievement, Thank, SpyLog, Artifact, Speedtest
) )
# ===== ЧАСОВОЙ ПОЯС УЛЬЯНОВСК (UTC+4) ===== # ===== ЧАСОВОЙ ПОЯС УЛЬЯНОВСК (UTC+4) =====
@ -730,21 +730,18 @@ async def api_emails_sync_ai(username: str = Depends(get_current_admin)):
@app.get("/infra", response_class=HTMLResponse) @app.get("/infra", response_class=HTMLResponse)
async def get_infra_page(request: Request, username: str = Depends(get_current_admin)): async def get_infra_page(request: Request, username: str = Depends(get_current_admin)):
import sqlite3 async with AsyncSessionLocal() as session:
conn = sqlite3.connect("/home/matrixhasyou/domovoy_bot/database/domovoy.db") stmt = select(Speedtest).order_by(Speedtest.timestamp.desc()).limit(10)
cursor = conn.cursor() rows = (await session.execute(stmt)).scalars().all()
cursor.execute("SELECT timestamp, download, upload, ping, server_name FROM speedtests ORDER BY timestamp DESC LIMIT 10")
rows = cursor.fetchall()
conn.close()
speedtests = [] speedtests = []
for r in rows: for r in rows:
speedtests.append({ speedtests.append({
"timestamp": r[0], "timestamp": fmt_local(r.timestamp),
"download": r[1], "download": r.download,
"upload": r[2], "upload": r.upload,
"ping": r[3], "ping": r.ping,
"server_name": r[4] "server_name": r.server_name
}) })
return templates.TemplateResponse("infra.html", {"request": request, "username": username, "speedtests": speedtests}) return templates.TemplateResponse("infra.html", {"request": request, "username": username, "speedtests": speedtests})