monitoring stron www Cyberapis - Changelog #6

Cyberapis v0.13.0 — domena cyberapis.pl, Cloudflare i dark mode

Cloudflare + Laravel — jak nie stracić requestu za proxy

Postawienie aplikacji Laravel za Cloudflare wprowadza warstwę pośredniczącą, która zmienia wszystko, co aplikacja wie o przychodzącym requeście. Adres IP klienta znika — zastępuje go IP Cloudflare. Protokół (HTTP vs HTTPS) może być inny po stronie origin niż to, co widzi przeglądarka. A port? Symfony Request::getPort() próbuje go odczytać z nagłówków X-Forwarded-Port lub X-Forwarded-Host — jeśli Nginx ich nie przekazuje (albo przekazuje puste), aplikacja dostaje 500.

Rozwiązaniem jest trustProxies() — ale z głową. Zaufanie '*' działa, ale jest niebezpieczne na współdzielonych hostach. W Cyberapis v0.13.0 skonfigurowaliśmy zaufanie tylko dla konkretnych nagłówków: FOR (X-Forwarded-For), PROTO (X-Forwarded-Proto), PREFIX (X-Forwarded-Prefix) oraz HEADER_X_FORWARDED_AWS_ELB. Celowo pomijamy HOST i PORT, które przy pustych wartościach z Nginx powodowały błędy Symfony.

Domena cyberapis.pl działa teraz przez Cloudflare (AAAA IPv6 do Mikrus VPS), a aplikacja poprawnie rozpoznaje prawdziwe IP klientów, protokół i nie rzuca 500-tkami przy pustych nagłówkach X-Forwarded.

Nowe funkcjonalności

Domena cyberapis.pl przez Cloudflare

Konfiguracja DNS: AAAA IPv6 do Mikrus VPS, SSL Flexible w Cloudflare. trustProxies('*') w bootstrap/app.php skonfigurowane pod kątem nagłówków Cloudflare.

Dokumentacja frontendu

docs/FRONTEND_CONTEXT.md — opis publicznego layoutu, struktury stopki, pułapek Tailwind/CSS, audytu linków i statusu wdrożenia produkcyjnego.

Tailwind v4 — @plugin @tailwindcss/typography

Wsparcie dla prose i dark:prose-invert w app.css — niezbędne do poprawnego renderowania treści artykułów blogowych.

Naprawione błędy

Produkcyjne HTTP 500 za Cloudflare

Puste X-Forwarded-Host / X-Forwarded-Port z Nginx powodowały błąd Symfony Request::getPort(). trustProxies ufa teraz tylko FOR, PROTO, PREFIX i AWS ELB headers — nie pustym host/port.

Dark mode dla stron /docs/*

Zastąpiono dark:bg-gray-900/dark:text-white (które nie działały przez kolejność budowania Tailwind) jawnymi regułami .docs-page-section/.docs-content w style.css — ten sam wzorzec co blog i strony prawne.

Dark mode — tabela monitoringu

Czcionki były za ciemne na ciemnym tle. Dodano jawne reguły .dark .monitoring-list.

Monitoring pause mode — wskaźnik na frontendzie

Strona publiczna pokazywała "Check in progress…" zamiast informacji o pauzie. getNextCheckIsoAttribute() zwraca teraz null gdy is_paused, a countdown.js wyświetla przetłumaczony komunikat.

Stopka w light mode

Jawne kolory tła w style.css, ponieważ klasy bg-gray-* Tailwind nie zawsze trafiały do produkcyjnego bundle CSS.

External confirmation — curl --fail

Callback curl w GitHub Actions używa flagi --fail, więc odpowiedzi HTTP 4xx/5xx oznaczają niepowodzenie kroku workflow.

Render probe — czyszczenie Chrome

Sprzątanie ograniczone do bieżącego efemerycznego profilu; timeout lock/job overlap podniesiony do 420s. Artefakty CSS timing zapisywane jako sukcesy informacyjne (nie błędne alerty).

Zmiany i ulepszenia

Tabela monitoringu — ujednolicenie frontend/backend

Layout HTML table z klasami monitoring-* zunifikowany z widokiem Filament. Wskaźnik pauzy, 60-sekundowe okno grace dla countdowna.

Stopka — nowy układ dwurzędowy

Górny rząd gray-900 (logo + kolumny linków), dolny rząd gray-950 (copyright + wersja). Akcentowa górna krawędź przez .site-footer::before w style.css.