From d7c2ca7c45d807308dd1d6fd024db0a763d2982e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sat, 29 Aug 2026 13:37:26 +0300 Subject: [PATCH] Use receipt as primary API endpoint --- HISTORY/2026-08-28-obdai-receipt.md | 13 +++++++++++++ recipe_service/README.md | 6 ++++-- recipe_service/app.py | 3 +++ recipe_service/nginx-recipe.conf | 26 ++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/HISTORY/2026-08-28-obdai-receipt.md b/HISTORY/2026-08-28-obdai-receipt.md index b2675d9..4ac2051 100644 --- a/HISTORY/2026-08-28-obdai-receipt.md +++ b/HISTORY/2026-08-28-obdai-receipt.md @@ -588,6 +588,19 @@ User-Agent, method/path, MIME и размер изображения, длина Файл переведён во владение `recipe:recipe` с правами `0660`, в unit добавлены `StateDirectory=recipe` и `StateDirectoryMode=0770`. +## Основной endpoint `/receipt` + +По уточнению пользователя основным публичным endpoint сделан +`https://obdai.ru/receipt`. Добавлены Flask-маршруты `/receipt` и `/receipt/`, +nginx-маршруты без redirect и health `/receipt/health`. Старые `/recipe` и +`/recipe/` сохранены для совместимости. + +Проверен автоматический сценарий через ВМ 213: временный тестовый image был +передан на ВМ, отправлен с ВМ через `POST /receipt`, после ответа временные +файлы удалены. Health вернул HTTP 200, OCR вернул HTTP 200 с непустыми `text` +и `usage`. Рабочий код принимает изображение в память; изображения не +сохраняются в постоянное хранилище. + После исправления `recipe.service` active. Таблица `requests` создана автоматически. Проверка записала 401 и успешный OCR: последняя строка содержит IP `127.0.0.1`, MIME `image/png`, размер 531101 байт, длину prompt 88 и diff --git a/recipe_service/README.md b/recipe_service/README.md index e9c9cb4..9785a13 100644 --- a/recipe_service/README.md +++ b/recipe_service/README.md @@ -1,11 +1,13 @@ -# obdai.ru/recipe +# obdai.ru/receipt Минимальный Flask-сервис на ВМ `5.172.178.213`. -Вход: `POST /recipe` в формате `multipart/form-data` с полями `image` и +Вход: `POST /receipt` в формате `multipart/form-data` с полями `image` и `prompt`. Требуется заголовок `Authorization: Bearer `. Изображение: JPEG/PNG/WEBP, не более 10 MB. +`POST /receipt/` и старые пути `/recipe` и `/recipe/` также поддерживаются. + URL немецкого Gemini proxy и JSON-строка `GEMINI_GENERATION_CONFIG` находятся только в серверном EnvironmentFile. Сервис передаёт изображение, prompt и настройки в proxy и возвращает `text` и `usage`; разбор рецепта выполняется diff --git a/recipe_service/app.py b/recipe_service/app.py index 924802b..d8f9bb3 100644 --- a/recipe_service/app.py +++ b/recipe_service/app.py @@ -35,10 +35,13 @@ def authorized() -> bool: @app.get("/health") +@app.get("/receipt/health") def health(): return jsonify(status="ok") +@app.post("/receipt") +@app.post("/receipt/") @app.post("/recipe") @app.post("/recipe/") def recipe(): diff --git a/recipe_service/nginx-recipe.conf b/recipe_service/nginx-recipe.conf index 16aca62..02fa70b 100644 --- a/recipe_service/nginx-recipe.conf +++ b/recipe_service/nginx-recipe.conf @@ -23,3 +23,29 @@ location /recipe/ { proxy_send_timeout 200s; proxy_read_timeout 200s; } + +location = /receipt { + proxy_pass http://127.0.0.1:8770/receipt; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + client_max_body_size 10m; + proxy_connect_timeout 10s; + proxy_send_timeout 200s; + proxy_read_timeout 200s; +} + +location /receipt/ { + proxy_pass http://127.0.0.1:8770/receipt/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + client_max_body_size 10m; + proxy_connect_timeout 10s; + proxy_send_timeout 200s; + proxy_read_timeout 200s; +}