Реализованы сервисы ВМ2 - проверка сообщений и синхронизация с Б24 (деплой еще без перевода в боевой режим)

This commit is contained in:
mi
2026-08-13 18:52:42 +03:00
parent 5100ba9fc3
commit 99605b1c77
144 changed files with 15295 additions and 1120 deletions
@@ -0,0 +1,71 @@
from __future__ import annotations
import asyncio
import uvicorn
from app.adapters import TrustedDnsResolver
from app.api import create_app
from app.config import ActiveConfig, validate_config
from app.db import engine_and_sessions
from app.file_pipeline import ClamAvInstream, DependencyFailure
from app.repository import Repository
from app.service import SafetyService
from app.settings import BootstrapSettings, EmergencyMode
async def build_runtime() -> tuple[object, object]:
settings = BootstrapSettings()
assert settings.database_url and settings.service_token
engine, sessions = engine_and_sessions(settings.database_url.get_secret_value())
repository = Repository(sessions)
row = await repository.active_config()
rules, detector, digest = validate_config(row.config, settings.artifacts_dir)
if digest != row.config_sha256:
raise RuntimeError("active config hash mismatch")
config = ActiveConfig(row.version, row.config, rules, detector)
mode = EmergencyMode.from_file(settings.mode_file)
resolver = TrustedDnsResolver(
[item.strip() for item in settings.dns_resolvers.split(",") if item.strip()]
)
clamav = ClamAvInstream(settings.clamav_host, settings.clamav_port)
if mode.mock:
signatures_version = "unavailable"
files_ready = False
else:
try:
signatures_version = await clamav.signatures_version()
files_ready = True
except DependencyFailure:
signatures_version = "unavailable"
files_ready = False
service = SafetyService(
repository,
config,
mode,
resolver,
files_ready=files_ready,
signatures_version=signatures_version,
)
app = create_app(service, settings.service_token.get_secret_value())
return app, engine
async def serve() -> None:
settings = BootstrapSettings()
app, engine = await build_runtime()
try:
server = uvicorn.Server(
uvicorn.Config(app, host=settings.host, port=settings.port, proxy_headers=False)
)
await server.serve()
finally:
await engine.dispose()
def run() -> None:
asyncio.run(serve())
if __name__ == "__main__":
run()