Настраиваемый BASE_URL для share-ссылок и поддержка HTTPS (CERT_FILE/KEY_FILE)
This commit is contained in:
1 parent
f11ec6298d
commit
0cb2c5e41a
3 files changed
+28
-8
No files matched your search
@@ -3,6 +3,11 @@
|
|||||||
*.db
|
*.db
|
||||||
videos/
|
videos/
|
||||||
|
|
||||||
|
# Локальные артефакты запуска
|
||||||
|
venv/
|
||||||
|
bin/
|
||||||
|
certs/
|
||||||
|
|
||||||
# Логи (могут содержать токены SDK)
|
# Логи (могут содержать токены SDK)
|
||||||
*.log
|
*.log
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user