Skip to content

fix(nginx): WebSocket upgrade dla Grafana Live + ujednolicenie mapą#3

Merged
mpasternak merged 1 commit into
mainfrom
fix/grafana-websocket-live
Jun 1, 2026
Merged

fix(nginx): WebSocket upgrade dla Grafana Live + ujednolicenie mapą#3
mpasternak merged 1 commit into
mainfrom
fix/grafana-websocket-live

Conversation

@mpasternak
Copy link
Copy Markdown
Member

Problem

W Firefoksie (i każdej przeglądarce) na https://<host>/grafana/:

GET wss://<host>/grafana/api/live/ws
NS_ERROR_WEBSOCKET_CONNECTION_REFUSED

Grafana Live trzyma stałe połączenie WebSocket na /grafana/api/live/ws. Blok location /grafana/ w _bpp-locations.conf był jedynym proxy bez nagłówków upgrade'u — nginx degradował połączenie do HTTP/1.0 i odrzucał handshake. Bloki Dozzle i Netdata miały to od początku, Grafana została pominięta.

Zmiana

  1. Fix: dodane proxy_http_version 1.1 + Upgrade/Connection do bloku Grafany.
  2. Ujednolicenie (na życzenie): wszystkie cztery bloki proxy (@proxy_to_app, grafana, dozzle, netdata) używały zahardkodowanego Connection "upgrade". Zastąpione przez Connection $connection_upgrade z mapą http-context w default.conf.template:
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

Dla zwykłych (nie-WS) requestów wysyłamy teraz Connection: close zamiast mylącego upgrade, zachowując upgrade dla realnego WebSocketu.

Uwagi

  • Mapa żyje w default.conf.template (kontekst http, współdzielony przez wszystkie vhosty). $http_upgrade/$connection_upgrade nie są zmiennymi środowiska, więc 20-envsubst-on-templates.sh ich nie podmienia — przetrwają jako zmienne runtime nginx.
  • Testy nginx -t (tests/test_makefile.sh, Test 14/15) montują default.conf.template, więc mapa renderuje się do http-context i $connection_upgrade rozwiązuje się w blokach proxy — bez tego nginx -t rzuciłby unknown "connection_upgrade" variable.

Wdrożenie po merge

_bpp-locations.conf i default.conf.template są bind-mountowane wprost z repo, ale default.conf.template renderuje entrypoint przy starcie. Żeby mapa trafiła do configu, potrzebny recreate webservera (sam nginx -s reload nie przerenderuje template'u):

git pull
docker compose up -d webserver   # re-render default.conf.template (mapa) + pickup _bpp-locations.conf

🤖 Generated with Claude Code

…ic mapa

Blok `location /grafana/` jako jedyny proxy nie ustawial naglowkow upgrade'u
WebSocketu, wiec Grafana Live (`wss://<host>/grafana/api/live/ws`) leciala w
NS_ERROR_WEBSOCKET_CONNECTION_REFUSED — nginx degradowal polaczenie do HTTP/1.0
i handshake byl odrzucany. Dodano proxy_http_version 1.1 + Upgrade/Connection.

Przy okazji ujednolicono wszystkie cztery bloki proxy (appserver, grafana,
dozzle, netdata): zahardkodowane `Connection "upgrade"` zastapione przez
`Connection $connection_upgrade` z mapa http-context w default.conf.template.
Dla nie-WS requestow wysylamy teraz `Connection: close` zamiast mylacego
`upgrade` (keep-alive nie jest psuty), zachowujac upgrade dla realnego WS.

Mapa zyje w default.conf.template (kontekst http, wspoldzielony przez vhosty).
$http_upgrade/$connection_upgrade nie sa zmiennymi srodowiska, wiec envsubst
ich nie podmienia. Testy nginx -t montuja default.conf.template, wiec mapa
renderuje sie i zmienna rozwiazuje sie w blokach proxy.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mpasternak mpasternak merged commit acf0332 into main Jun 1, 2026
5 checks passed
@mpasternak mpasternak deleted the fix/grafana-websocket-live branch June 1, 2026 07:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant