feat: документация из Nextcloud, график у сотрудника, автоочистка фото, мониторинг, итог мастера, фильтр по местам; доп. сервисы в docker-compose
- docker-compose.yml: профили docs (Nextcloud), office (ONLYOFFICE Document Server), ai (Ollama + скачивание модели) - автонастройка: адреса Nextcloud, ONLYOFFICE, портала и модели подставляются из .env или по именам сервисов во внутренней сети Docker; значения из интерфейса важнее - локальная модель в своей сети (имя сервиса, частный IP) подключается без ключа API - .env.example, docs/DEPLOY.md (раздел 7а), README
This commit is contained in:
+23
-2
@@ -9,13 +9,13 @@ from fastapi.responses import FileResponse
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from sqlalchemy import select
|
||||
|
||||
from . import backup, config, demo, logic, mode, push
|
||||
from . import backup, config, demo, docs_index, logic, mode, photo_cleanup, push
|
||||
from .db import SessionLocal, real_engine
|
||||
from .migrate import ensure_schema
|
||||
from .models import User
|
||||
from .routers import catalog, orders, extras, reports, service as service_router, demo as demo_router
|
||||
from .routers import inventory, incidents, tasks, portal, external, history, backups, assistant as assistant_router
|
||||
from .routers import reliability as reliability_router, feedback as feedback_router
|
||||
from .routers import reliability as reliability_router, feedback as feedback_router, docs as docs_router
|
||||
from .security import hash_password
|
||||
|
||||
log = logging.getLogger("scheduler")
|
||||
@@ -49,6 +49,14 @@ def bootstrap():
|
||||
db.commit()
|
||||
log.warning("Создан администратор '%s' — смените пароль!", config.ADMIN_USERNAME)
|
||||
push.ensure_vapid(db)
|
||||
moved = logic.schedules_to_users(db)
|
||||
if moved:
|
||||
log.warning("Графики работы перенесены с должностей на сотрудников: %s", moved)
|
||||
|
||||
|
||||
def _reindex_docs():
|
||||
with SessionLocal() as db:
|
||||
docs_index.rebuild(db)
|
||||
|
||||
|
||||
async def scheduler_loop():
|
||||
@@ -67,6 +75,18 @@ async def scheduler_loop():
|
||||
backup.auto_backup(db)
|
||||
except Exception:
|
||||
log.exception("Ошибка автоматического резервного копирования")
|
||||
try:
|
||||
with SessionLocal() as db:
|
||||
if photo_cleanup.due(db): # старые фото — раз в сутки
|
||||
photo_cleanup.run(db)
|
||||
except Exception:
|
||||
log.exception("Ошибка очистки старых фото")
|
||||
try:
|
||||
with SessionLocal() as db:
|
||||
if docs_index.due(db): # индекс документации для AI — раз в сутки, в фоне
|
||||
asyncio.get_running_loop().run_in_executor(None, _reindex_docs)
|
||||
except Exception:
|
||||
log.exception("Ошибка индекса документации")
|
||||
await asyncio.sleep(config.SCHEDULER_INTERVAL)
|
||||
|
||||
|
||||
@@ -123,6 +143,7 @@ api.include_router(backups.router)
|
||||
api.include_router(assistant_router.router)
|
||||
api.include_router(reliability_router.router)
|
||||
api.include_router(feedback_router.router)
|
||||
api.include_router(docs_router.router)
|
||||
|
||||
|
||||
@api.get("/health", tags=["service"])
|
||||
|
||||
Reference in New Issue
Block a user