From 991e5cd756f4fc31965913f7a6c034fb408d8295 Mon Sep 17 00:00:00 2001 From: Max Ronzhin Date: Sun, 26 Jul 2026 02:57:56 +0300 Subject: [PATCH] =?UTF-8?q?nginx:=20/openapi.json=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D1=85=D0=B2=D0=B0=D1=82=D1=8B=D0=B2=D0=B0=D0=BB=D1=81?= =?UTF-8?q?=D1=8F=20SPA-=D1=84=D0=BE=D0=BB=D0=B1=D1=8D=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=D1=81=D1=85=D0=B5?= =?UTF-8?q?=D0=BC=D1=8B=20backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FastAPI отдаёт /openapi.json на корневом пути (маршруты backend объявлены с явным префиксом /api/... в декораторах, а не через APIRouter(prefix=)), поэтому запрос попадал в catch-all location / (раздача index.html фронта) раньше, чем мог бы дойти до backend — снаружи схема API была недоступна, что мешало отладке. Добавлен точный location = /openapi.json, проксирующий на backend:8000 (матчится раньше catch-all за счёт приоритета exact-match в nginx). --- deploy/nginx/nginx.conf.template | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/deploy/nginx/nginx.conf.template b/deploy/nginx/nginx.conf.template index 21c2f54..81c3395 100644 --- a/deploy/nginx/nginx.conf.template +++ b/deploy/nginx/nginx.conf.template @@ -156,6 +156,20 @@ server { return 403; } + # --- Схема OpenAPI: FastAPI отдаёт её на КОРНЕВОМ пути /openapi.json (не + # под /api/ — маршруты backend объявлены с явным префиксом /api/... в + # декораторах, а не через APIRouter(prefix=...), см. backend/main.py), + # поэтому без этого location запрос попадал бы в SPA-фолбэк ниже + # (`location /` отдаёт index.html фронта вместо схемы — мешало отладке). + location = /openapi.json { + set $backend_upstream http://backend:8000; + proxy_pass $backend_upstream; + 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; + } + # --- Медиа (аватары): раздача напрямую из volume, в обход backend. --- location /media/ { alias /media/;