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.