Прокси на внутренний IP: анализ и скачивания через REST-эндпоинты WordPress (режим proxy/direct, настройки)

This commit is contained in:
apuc committed 2026-09-14 16:41:44 +03:00
1 parent b3ac9491f6
commit 867fe7bc66
3 files changed
+191 -15

No files matched your search

+27 -5
View File
@@ -37,23 +37,44 @@ zip -r med-diagnostics.zip . -x README.md
## Настройки
**Настройки → Med Diagnostics** — поле «URL API-бэкенда» (по умолчанию `https://med.my-dpr.ru`).
**Настройки → Med Diagnostics**:
| Поле | Описание |
|---|---|
| **Режим подключения** | `Через сервер (внутренний IP)` — браузер шлёт видео на этот WordPress, PHP проксирует запрос на внутренний IP бэкенда (по умолчанию, рекомендуется когда WordPress и API на одном сервере). `Напрямую из браузера (CORS)` — браузер обращается к публичному URL API. |
| **Внутренний URL бэкенда** | Адрес API, доступный с этого сервера (по умолчанию `http://127.0.0.1:18018`). Используется в режиме «Через сервер». |
| **Публичный URL API-бэкенда** | Публичный адрес Flask-приложения (по умолчанию `https://med.my-dpr.ru`). Используется в режиме «Напрямую» и для ссылки «Поделиться». |
Можно также переопределить кодом:
```php
add_filter('med_diag_api_url', fn() => 'https://другой-домен.ru');
add_filter('med_diag_internal_url', fn() => 'http://10.0.0.5:18018');
add_filter('med_diag_mode', fn() => 'direct');
```
## Как это работает
- Плагин выводит ту же вёрстку, что и главная страница сервиса (стили с префиксом `med-`, чтобы не конфликтовать с темой).
- JS отправляет видео на API-бэкенд (`POST /analyze`) с абсолютным URL — поэтому нужен CORS на стороне Flask.
- **Режим «Через сервер» (по умолчанию)**: JS отправляет видео на REST-эндпоинт этого же WordPress (`/wp-json/med-diag/v1/analyze`), PHP пересылает его на внутренний IP бэкенда (`http://127.0.0.1:18018/analyze`). Скачивания PDF/DOCX/видео идут через `/wp-json/med-diag/v1/download/<id>/<type>`. CORS не нужен — все запросы same-origin.
- **Режим «Напрямую»**: JS отправляет видео на публичный URL API (`POST /analyze`) — тогда нужен CORS на стороне Flask.
- Результат (сводка, показатели, рекомендации, кнопки PDF/DOCX/видео/поделиться) рендерится на странице WordPress.
- Сканирование с камеры работает на мобильных (canvas 720×720 + MediaRecorder).
## Требования к серверу WordPress (режим «Через сервер»)
Видео сначала загружается в PHP, поэтому в `php.ini` должны быть подняты лимиты:
```ini
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 300
```
Проверить текущие значения: `php -i | grep -E "upload_max_filesize|post_max_size|max_execution_time"`.
## Требования к бэкенду (Flask)
В `app.py` серверного репозитория уже добавлена поддержка CORS:
В `app.py` серверного репозитория уже добавлена поддержка CORS (нужна только в режиме «Напрямую»):
- `Access-Control-Allow-Origin` — по умолчанию `*`, можно ограничить через env `CORS_ORIGINS` (список через запятую, например `https://site1.ru,https://site2.ru`).
- Preflight `OPTIONS /analyze` возвращает `204`.
@@ -69,7 +90,8 @@ add_filter('med_diag_api_url', fn() => 'https://другой-домен.ru');
- Шорткод используйте **один раз на странице** (id элементов фиксированы).
- Для работы сканирования с камеры нужен HTTPS на сайте WordPress (getUserMedia требует secure context).
- Загрузка видео идёт напрямую в API-бэкенд — убедитесь, что `client_max_body_size` в nginx бэкенда ≥ 100 МБ.
- В режиме «Через сервер» видео загружается в PHP — следите за лимитами `upload_max_filesize`/`post_max_size`/`max_execution_time` (см. выше).
- Ссылка «Поделиться» всегда ведёт на публичный URL API (`/r/<share_id>`).
## Структура