From 2ea30bb30a5f11bc844026f8e177044ff111a1eb Mon Sep 17 00:00:00 2001 From: nns Date: Sun, 31 May 2026 19:38:04 +0500 Subject: [PATCH] =?UTF-8?q?deploy(nginx):=20/hubs/=20=E2=86=92=20API=20?= =?UTF-8?q?=D1=81=20upgrade-=D1=85=D0=B5=D0=B4=D0=B5=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BB=D1=8F=20WebSocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SignalR-клиент на стейдже падал на негоциации — nginx без upgrade-хедеров не пропускал WebSocket-handshake (POST /hubs/notifications/negotiate → 405). Добавлен location /hubs/ с proxy_set_header Upgrade/Connection и proxy_read/send_timeout=24h, иначе nginx рвал бы idle-соединения каждые 60с. Co-Authored-By: Claude Opus 4.7 --- deploy/nginx.conf | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/deploy/nginx.conf b/deploy/nginx.conf index 28e306e..c8b1d0a 100644 --- a/deploy/nginx.conf +++ b/deploy/nginx.conf @@ -36,6 +36,25 @@ server { proxy_set_header Host $host; } + # SignalR хаб для live-уведомлений (см. NotificationsHub). + # WebSocket требует upgrade-хедеры и большой read_timeout (иначе nginx + # будет рвать idle-коннекшен каждые 60 сек). access_token приходит как + # query (?access_token=...), Authorization-хедер middleware на API его + # перекладывает в нужный вид до UseAuthentication. + location /hubs/ { + proxy_pass http://api:8080; + 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; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_read_timeout 86400; # 24h — webSocket долгоживущий + proxy_send_timeout 86400; + proxy_buffering off; + } + location /health { proxy_pass http://api:8080; }