From 93c9d88897546db4acc53077d24840fe653f76d7 Mon Sep 17 00:00:00 2001 From: Kavalar Date: Mon, 14 Sep 2026 16:53:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=BE=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BD=D0=B4=20gigadoc-dnr-sdk.sbermed.ai:=20?= =?UTF-8?q?=D1=85=D0=BE=D1=81=D1=82=D1=8B=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=20env=20(FPG=5FREST=5FHOST/FPG=5FWS=5FHOST/FPG=5FWS=5FORIGIN),?= =?UTF-8?q?=20client=5Fid=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE=D0=BB=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8E=20client=5Ffpg=5Ffront=5Fdnr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++++++++---- app.py | 12 +++++++----- fpg_connect.py | 13 +++++++------ fpg_stream.py | 11 ++++++----- gigadoc_ws.py | 6 +++--- 5 files changed, 31 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 6b1f7f1..35a9a08 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ pip install -r requirements.txt sudo apt install -y fonts-dejavu # 4. Секреты SDK ФПГ (обязательно!) -export FPG_CLIENT_ID=client_fpg_front +export FPG_CLIENT_ID=client_fpg_front_dnr export FPG_CLIENT_SECRET=ВАШ_СЕКРЕТ # 5. Запуск (dev-режим, порт 5000) @@ -50,9 +50,13 @@ python3 -c "from waitress import serve; from app import app; serve(app, host='12 | Переменная | Описание | |---|---| -| `FPG_CLIENT_ID` | client_id для OAuth SDK ФПГ (по умолчанию `client_fpg_front`) | +| `FPG_CLIENT_ID` | client_id для OAuth SDK ФПГ (по умолчанию `client_fpg_front_dnr` — персональный стенд) | | `FPG_CLIENT_SECRET` | client_secret для OAuth SDK ФПГ (**обязательна**, без неё авторизация не работает) | | `CORS_ORIGINS` | (необязательно) список разрешённых Origin для CORS через запятую, например `https://site1.ru,https://site2.ru`. По умолчанию `*` | +| `FPG_OAUTH_URL` | (необязательно) URL OAuth-токена (по умолчанию `https://oauth.sbermed.ai/token`) | +| `FPG_REST_HOST` | (необязательно) REST-хост SDK (по умолчанию `gigadoc-dnr-sdk.sbermed.ai` — персональный стенд) | +| `FPG_WS_HOST` | (необязательно) WebSocket-хост SDK (по умолчанию `gigadoc-dnr-sdk.sbermed.ai`) | +| `FPG_WS_ORIGIN` | (необязательно) Origin для WebSocket (по умолчанию `https://gigadoc-dnr-sdk.sbermed.ai`) | ## Развёртывание на сервере @@ -79,7 +83,7 @@ Type=simple User=apuc WorkingDirectory=/opt/med Environment=PYTHONUNBUFFERED=1 -Environment=FPG_CLIENT_ID=client_fpg_front +Environment=FPG_CLIENT_ID=client_fpg_front_dnr Environment=FPG_CLIENT_SECRET=ВАШ_СЕКРЕТ ExecStart=/usr/bin/python3 -c "from waitress import serve; from app import app; serve(app, host='127.0.0.1', port=18018, threads=8)" Restart=always @@ -149,7 +153,7 @@ sudo systemctl restart med.service 1. Видео сохраняется в `videos/` (копия записи — доступна для скачивания) 2. `ffmpeg` извлекает 300 кадров 1280×720 (bt709 + yuv420p — важно для iPhone MOV с P3/HDR) -3. OAuth-токен → создание сессии → кадры по WebSocket (`wss://gigadoc-sdk.sbermed.ai:8443`, subprotocol `bearer.`, Origin `https://gigadoc.sbermed.ai`) +3. OAuth-токен → создание сессии → кадры по WebSocket (`wss://gigadoc-dnr-sdk.sbermed.ai:8443`, subprotocol `bearer.`, Origin `https://gigadoc-dnr-sdk.sbermed.ai`) 4. Интерпретация JSON SDK → summary/metrics/warnings/advice → сохранение в SQLite ## Важные нюансы diff --git a/app.py b/app.py index dcb5134..4feebdc 100644 --- a/app.py +++ b/app.py @@ -33,16 +33,18 @@ import export # ─── Конфигурация ───────────────────────────────────────────── # Секреты читаются из переменных окружения (не хранятся в репозитории). # На сервере задаются в /etc/systemd/system/med.service (Environment=). -OAUTH_URL = "https://oauth.sbermed.ai/token" -CLIENT_ID = os.environ.get("FPG_CLIENT_ID", "client_fpg_front") +# Хосты стенда можно переопределить через env (FPG_REST_HOST и т.д.). +OAUTH_URL = os.environ.get("FPG_OAUTH_URL", "https://oauth.sbermed.ai/token") +CLIENT_ID = os.environ.get("FPG_CLIENT_ID", "client_fpg_front_dnr") CLIENT_SECRET = os.environ.get("FPG_CLIENT_SECRET", "") -REST_HOST = "gigadoc-sdk.sbermed.ai" +REST_HOST = os.environ.get("FPG_REST_HOST", "gigadoc-dnr-sdk.sbermed.ai") REST_BASE = f"https://{REST_HOST}" -WS_HOST = "gigadoc-sdk.sbermed.ai" +WS_HOST = os.environ.get("FPG_WS_HOST", "gigadoc-dnr-sdk.sbermed.ai") WS_PORT = 8443 WS_PATH_TEMPLATE = "/api/v2/ws/predict/{uid}/image" +WS_ORIGIN = os.environ.get("FPG_WS_ORIGIN", "https://gigadoc-dnr-sdk.sbermed.ai") DEVICE_ID = "web_prod" FORM_FACTOR = "web_prod" @@ -159,7 +161,7 @@ async def ws_stream(token: str, uid: str, frame_files: list, fps: float = FPS): uri, open_timeout=10, subprotocols=[f"bearer.{token}"], - origin="https://gigadoc.sbermed.ai", + origin=WS_ORIGIN, extra_headers={ "Cache-Control": "no-cache", "Pragma": "no-cache", diff --git a/fpg_connect.py b/fpg_connect.py index f911493..5477f3a 100644 --- a/fpg_connect.py +++ b/fpg_connect.py @@ -27,17 +27,18 @@ from pathlib import Path import requests # ─── Конфигурация ───────────────────────────────────────────── -OAUTH_URL = "https://oauth.sbermed.ai/token" -CLIENT_ID = "client_fpg_front" +OAUTH_URL = os.environ.get("FPG_OAUTH_URL", "https://oauth.sbermed.ai/token") +CLIENT_ID = os.environ.get("FPG_CLIENT_ID", "client_fpg_front_dnr") CLIENT_SECRET = os.environ.get("FPG_CLIENT_SECRET", "") -REST_HOST = "gigadoc-sdk.sbermed.ai" +REST_HOST = os.environ.get("FPG_REST_HOST", "gigadoc-dnr-sdk.sbermed.ai") REST_BASE = f"https://{REST_HOST}" -# WebSocket (рабочий хост подтверждён: gigadoc-sdk.sbermed.ai:8443) -WS_HOST = "gigadoc-sdk.sbermed.ai" +# WebSocket (рабочий хост подтверждён: gigadoc-dnr-sdk.sbermed.ai:8443) +WS_HOST = os.environ.get("FPG_WS_HOST", "gigadoc-dnr-sdk.sbermed.ai") WS_PORT = 8443 WS_PATH_TEMPLATE = "/api/v2/ws/predict/{uid}/image" +WS_ORIGIN = os.environ.get("FPG_WS_ORIGIN", "https://gigadoc-dnr-sdk.sbermed.ai") DEVICE_ID = "web_prod" FORM_FACTOR = "web_prod" @@ -263,7 +264,7 @@ async def ws_scan(token: str, uid: str, ws_host: str, ws_port: int, image_dir: s uri, open_timeout=10, subprotocols=[f"bearer.{token}"], - origin="https://gigadoc.sbermed.ai", + origin=WS_ORIGIN, extra_headers={ "Cache-Control": "no-cache", "Pragma": "no-cache", diff --git a/fpg_stream.py b/fpg_stream.py index 94b8a67..19f87bc 100644 --- a/fpg_stream.py +++ b/fpg_stream.py @@ -19,16 +19,17 @@ import requests import websockets # ─── Конфигурация ───────────────────────────────────────────── -OAUTH_URL = "https://oauth.sbermed.ai/token" -CLIENT_ID = "client_fpg_front" +OAUTH_URL = os.environ.get("FPG_OAUTH_URL", "https://oauth.sbermed.ai/token") +CLIENT_ID = os.environ.get("FPG_CLIENT_ID", "client_fpg_front_dnr") CLIENT_SECRET = os.environ.get("FPG_CLIENT_SECRET", "") -REST_HOST = "gigadoc-sdk.sbermed.ai" +REST_HOST = os.environ.get("FPG_REST_HOST", "gigadoc-dnr-sdk.sbermed.ai") REST_BASE = f"https://{REST_HOST}" -WS_HOST = "gigadoc-sdk.sbermed.ai" +WS_HOST = os.environ.get("FPG_WS_HOST", "gigadoc-dnr-sdk.sbermed.ai") WS_PORT = 8443 WS_PATH_TEMPLATE = "/api/v2/ws/predict/{uid}/image" +WS_ORIGIN = os.environ.get("FPG_WS_ORIGIN", "https://gigadoc-dnr-sdk.sbermed.ai") DEVICE_ID = "web_prod" FORM_FACTOR = "web_prod" @@ -155,7 +156,7 @@ async def ws_stream(token: str, uid: str, image_path: str, frames: int, fps: flo uri, open_timeout=10, subprotocols=[f"bearer.{token}"], - origin="https://gigadoc.sbermed.ai", + origin=WS_ORIGIN, extra_headers={ "Cache-Control": "no-cache", "Pragma": "no-cache", diff --git a/gigadoc_ws.py b/gigadoc_ws.py index 6bdcbd4..94fa17c 100644 --- a/gigadoc_ws.py +++ b/gigadoc_ws.py @@ -66,7 +66,7 @@ def parse_args(): parser.add_argument( "--sdk-host", required=True, - help="SDK hostname, например gigadoc-sdk.sbermed.ai", + help="SDK hostname, например gigadoc-dnr-sdk.sbermed.ai", ) parser.add_argument( @@ -94,10 +94,10 @@ def parse_args(): parser.add_argument( "--origin", - default="https://gigadoc.sbermed.ai", + default="https://gigadoc-dnr-sdk.sbermed.ai", help=( "Origin для WebSocket " - "(default: https://gigadoc.sbermed.ai)" + "(default: https://gigadoc-dnr-sdk.sbermed.ai)" ), )