Настраиваемый BASE_URL для share-ссылок и поддержка HTTPS (CERT_FILE/KEY_FILE)

This commit is contained in:
apuc committed 2026-09-17 22:31:06 +03:00
1 parent f11ec6298d
commit 0cb2c5e41a
3 files changed
+28 -8

No files matched your search

+5
View File
@@ -3,6 +3,11 @@
*.db *.db
videos/ videos/
# Локальные артефакты запуска
venv/
bin/
certs/
# Логи (могут содержать токены SDK) # Логи (могут содержать токены SDK)
*.log *.log
+19 -4
View File
@@ -99,6 +99,11 @@ VIDEO_MIME = {
app = Flask(__name__) app = Flask(__name__)
app.config["MAX_CONTENT_LENGTH"] = 100 * 1024 * 1024 # 100 МБ app.config["MAX_CONTENT_LENGTH"] = 100 * 1024 * 1024 # 100 МБ
# Базовый URL для share-ссылок и OG-тегов.
# По умолчанию — прод-домен; для локального запуска задайте BASE_URL,
# например https://192.168.31.248:18018
BASE_URL = os.environ.get("BASE_URL", "https://med.my-dpr.ru").rstrip("/")
# CORS для интеграции с WordPress (кросс-доменные запросы с сайта на API). # CORS для интеграции с WordPress (кросс-доменные запросы с сайта на API).
# Список разрешённых origin через запятую, по умолчанию "*" (любой). # Список разрешённых origin через запятую, по умолчанию "*" (любой).
CORS_ORIGINS = [o.strip() for o in os.environ.get("CORS_ORIGINS", "*").split(",") if o.strip()] CORS_ORIGINS = [o.strip() for o in os.environ.get("CORS_ORIGINS", "*").split(",") if o.strip()]
@@ -381,10 +386,10 @@ def shared_result(share_id):
"""Публичная страница результата по ссылке (с OG-тегами для соцсетей).""" """Публичная страница результата по ссылке (с OG-тегами для соцсетей)."""
result = storage.get_result(share_id) result = storage.get_result(share_id)
if result is None: if result is None:
return render_template("result.html", result=None, error="Результат не найден", video_exists=False), 404 return render_template("result.html", result=None, error="Результат не найден", video_exists=False, base_url=BASE_URL), 404
video_exists = bool(glob.glob(os.path.join(VIDEO_DIR, f"{share_id}.*"))) video_exists = bool(glob.glob(os.path.join(VIDEO_DIR, f"{share_id}.*")))
return render_template("result.html", result=result, error=None, video_exists=video_exists) return render_template("result.html", result=result, error=None, video_exists=video_exists, base_url=BASE_URL)
@app.route("/download/<share_id>/pdf") @app.route("/download/<share_id>/pdf")
@@ -509,7 +514,7 @@ def analyze():
# 6. Сохранение результата # 6. Сохранение результата
logger.info(f"[{job_id}] Сохранение результата") logger.info(f"[{job_id}] Сохранение результата")
share_id = storage.save_result(interpretation, result) share_id = storage.save_result(interpretation, result)
share_url = f"https://med.my-dpr.ru/r/{share_id}" share_url = f"{BASE_URL}/r/{share_id}"
logger.info(f"[{job_id}] Результат сохранён: {share_url}") logger.info(f"[{job_id}] Результат сохранён: {share_url}")
# Переименовываем видео под share_id (чтобы ссылка была стабильной) # Переименовываем видео под share_id (чтобы ссылка была стабильной)
@@ -551,4 +556,14 @@ if __name__ == "__main__":
print("🩺 Диагностика по видео — ФПГ") print("🩺 Диагностика по видео — ФПГ")
print(f"Откройте в браузере: http://localhost:5000") print(f"Откройте в браузере: http://localhost:5000")
print("=" * 60) print("=" * 60)
app.run(host="0.0.0.0", port=18018, debug=False)
# HTTPS (для доступа к камере из локальной сети нужен безопасный контекст).
# Задайте CERT_FILE и KEY_FILE (самоподписанный сертификат) — сервер поднимется по HTTPS.
cert_file = os.environ.get("CERT_FILE")
key_file = os.environ.get("KEY_FILE")
ssl_context = None
if cert_file and key_file:
ssl_context = (cert_file, key_file)
print(f"HTTPS включён: {cert_file}")
app.run(host="0.0.0.0", port=18018, debug=False, ssl_context=ssl_context)
+4 -4
View File
@@ -15,8 +15,8 @@
<meta property="og:site_name" content="Диагностика по видео"> <meta property="og:site_name" content="Диагностика по видео">
<meta property="og:title" content="{% if result %}Результат диагностики #{{ result.share_id }} — оценка здоровья по лицу{% else %}Результат не найден{% endif %}"> <meta property="og:title" content="{% if result %}Результат диагностики #{{ result.share_id }} — оценка здоровья по лицу{% else %}Результат не найден{% endif %}">
<meta property="og:description" content="{% if result %}{{ result.summary }}{% else %}Результат анализа не найден.{% endif %}"> <meta property="og:description" content="{% if result %}{{ result.summary }}{% else %}Результат анализа не найден.{% endif %}">
<meta property="og:url" content="https://med.my-dpr.ru/r/{{ result.share_id if result else '' }}"> <meta property="og:url" content="{{ base_url }}/r/{{ result.share_id if result else '' }}">
<meta property="og:image" content="https://med.my-dpr.ru/static/og-image.png"> <meta property="og:image" content="{{ base_url }}/static/og-image.png">
<meta property="og:image:width" content="1200"> <meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630"> <meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Результат диагностики по видео"> <meta property="og:image:alt" content="Результат диагностики по видео">
@@ -26,7 +26,7 @@
<meta name="twitter:card" content="summary_large_image"> <meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{% if result %}Результат диагностики #{{ result.share_id }}{% else %}Результат не найден{% endif %}"> <meta name="twitter:title" content="{% if result %}Результат диагностики #{{ result.share_id }}{% else %}Результат не найден{% endif %}">
<meta name="twitter:description" content="{% if result %}{{ result.summary }}{% else %}Результат анализа не найден.{% endif %}"> <meta name="twitter:description" content="{% if result %}{{ result.summary }}{% else %}Результат анализа не найден.{% endif %}">
<meta name="twitter:image" content="https://med.my-dpr.ru/static/og-image.png"> <meta name="twitter:image" content="{{ base_url }}/static/og-image.png">
<!-- Favicon --> <!-- Favicon -->
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🩺</text></svg>"> <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🩺</text></svg>">
@@ -314,7 +314,7 @@
{% endif %} {% endif %}
<div class="share-box"> <div class="share-box">
<input type="text" id="shareLink" value="https://med.my-dpr.ru/r/{{ result.share_id }}" readonly> <input type="text" id="shareLink" value="{{ base_url }}/r/{{ result.share_id }}" readonly>
<button class="btn-secondary" onclick="copyLink()">📋 Копировать ссылку</button> <button class="btn-secondary" onclick="copyLink()">📋 Копировать ссылку</button>
</div> </div>