Dowiedz się, jak Guillermo Rauch, Vercel i Next.js uprościli wdrażanie, SSR i infrastrukturę frontendową, by stały się produktami dla mainstreamowych twórców.

Jeszcze niedawno wypuszczenie aplikacji webowej zwykle oznaczało: zbuduj, znajdź hosta, skonfiguruj i utrzymuj. Nawet przy prostym kodzie uruchomienie aplikacji często zmuszało do wyborów dotyczących serwerów, cache’owania, pipeline’ów builda, certyfikatów TLS i monitoringu. To nie było efektowne, ale nieuniknione — i regularnie odciągało zespoły od pracy nad produktem, który chcieli wypuścić.
Główna zmiana jest taka, że wdrożenie przestało być jednorazowym projektem technicznym, a stało się workflowem, który powtarzasz codziennie. Zespoły chciały podglądowych URLi dla każdego pull requesta, rollbacków, które nie wymagają detektywistycznej pracy, oraz niezawodnej ścieżki od lokalnego kodu do produkcji.
Gdy te potrzeby stały się powszechne w startupach, agencjach i korporacjach, wdrożenie zaczęło wyglądać mniej jak niestandardowe inżynierskie zadanie, a bardziej jak coś, co da się zapakować: produkt z sensownymi domyślnymi ustawieniami, UI, automatyzacją i przewidywalnymi efektami.
Server-side rendering (SSR) dodawał kolejną warstwę złożoności. To nie tylko „serwowanie plików”; to „uruchamianie kodu na serwerze, by wygenerować HTML, bezpiecznie go cache’ować i aktualizować bez psucia doświadczenia użytkownika.” Dobre wdrożenie SSR wymagało zrozumienia:
To było wykonalne dla specjalistów, ale łatwo to źle skonfigurować — i trudno utrzymać w miarę rozwoju projektu.
Co znaczy „sproduktywizować infrastrukturę frontendową”?
To uczynienie chaotycznych, podatnych na błędy elementów wysyłania frontendu — buildy, wdrożenia, podglądy, obsługę SSR/SSG, cache’owanie i dostawę na edge — standardowym, w większości automatycznym systemem, który działa podobnie w różnych projektach.
W kolejnych sekcjach cel jest praktyczny: zrozumieć, co się upraszcza, co zyskujesz i jakie kompromisy akceptujesz — bez konieczności zostawania ekspertem od ops.
Guillermo Rauch jest dziś najbardziej znany jako CEO Vercel i jeden z głównych głosów stojących za Next.js. Jego wpływ to nie jedna wynalazcza rzecz, lecz uporczywe dążenie: sprawić, by tworzenie sieci było „oczywiste” dla osób budujących produkty.
Rauch spędził dużą część kariery tworząc narzędzia deweloperskie publicznie. Przed Vercel budował i utrzymywał popularne projekty open source (między innymi Socket.IO) i pomagał rozwijać kulturę, w której dokumentacja, przykłady i sensowne domyślne ustawienia są częścią produktu, a nie dodatkiem.
Później założył ZEIT (przemianowane na Vercel), firmę skupioną na przekształceniu wdrażania w usprawniony workflow. Next.js, pierwotnie rozwijany w tym ekosystemie, stał się flagowym frameworkiem łączącym nowoczesne doświadczenie frontendowe z cechami gotowymi do produkcji.
Dobrym sposobem zrozumienia wpływu Raucha są powtarzające się wybory:
To podejście ukształtowało zarówno framework, jak i platformę: Next.js zachęcał zespoły do przyjęcia SSR i generowania statycznego bez nauki zupełnie nowej operacyjnej instrukcji, a Vercel popychał wdrożenia w stronę przewidywalnego, powtarzalnego domyślu.
Łatwo sprowadzić tę historię do narracji jednej osoby. Dokładniejsze podejście to stwierdzenie, że Rauch pomógł zrównać i skatalizować szerszy trend: zespoły frontendowe chciały szybszej iteracji, mniej przekazań i infrastruktury, która nie wymaga dedykowanego specjalisty ops przy każdej zmianie.
Vercel i Next.js są studium przypadku myślenia produktowego, bo zapakowały te potrzeby w domyślne rozwiązania, z których mainstreamowe zespoły mogły faktycznie korzystać.
Next.js to framework React, który daje „pełny zestaw startowy” nad Reactem. Nadal budujesz komponenty tak samo, ale Next.js dodaje brakujące elementy, które większość zespołów i tak musiałaby skompletować: strony, routing, sposoby pobierania danych i domyślne ustawienia przyjazne produkcji.
Routing i strony: W zwykłej aplikacji React zwykle dodajesz bibliotekę routera, ustalasz konwencje URL i wszystko łączysz. Next.js traktuje adresy i strony jako funkcję pierwszej klasy, więc struktura projektu naturalnie odwzorowuje trasy.
Ładowanie danych: Prawdziwe aplikacje potrzebują danych — listy produktów, kont użytkowników, treści z CMS. Next.js dostarcza powszechne wzorce ładowania danych po stronie serwera, w czasie builda lub w przeglądarce, bez zmuszania zespołów do tworzenia niestandardowego rozwiązania.
Domyślne ustawienia wydajności: Next.js ma wbudowane praktyczne optymalizacje — dzielenie kodu, mądrzejsze zarządzanie zasobami i opcje renderowania — więc dostajesz dobrą szybkość bez szukania długiej listy wtyczek.
Zwykła aplikacja React to często „React + mnóstwo decyzji”: biblioteka routingu, konfiguracja builda, narzędzia do SSR/SSG (jeśli potrzebne) i konwencje, które istnieją tylko w Twoim repo.
Next.js jest bardziej opiniotwórczy: standaryzuje powszechne wybory, dzięki czemu nowi deweloperzy szybciej rozumieją projekt, a zespoły spędzają mniej czasu na utrzymywaniu infrastruktury.
Next.js może być przesadą, jeśli budujesz małą, w większości statyczną stronę z kilkoma podstronami albo prosty wewnętrzny narzędzie, gdzie SEO i czas pierwszego załadowania nie są priorytetami.
Jeśli nie potrzebujesz wielu opcji renderowania, strukturalnego routingu ani ładowania danych po stronie serwera, lżejsze rozwiązanie React (albo brak Reacta) może być prostsze i tańsze.
W nowoczesnych aplikacjach webowych „gdzie tworzy się stronę” może się zmieniać. Proste podejście: SSR, SSG i CSR rozróżniać według tego, kiedy i gdzie powstaje HTML.
Przy SSR serwer generuje HTML dla każdego żądania (lub dla wielu żądań, jeśli używany jest cache). To pomaga SEO i sprawia, że pierwszy widok pojawia się szybko — szczególnie na wolniejszych urządzeniach — bo przeglądarka otrzymuje rzeczywistą treść wcześnie.
Częste nieporozumienie: SSR nie jest automatycznie szybszy. Jeśli każde żądanie wywołuje wolne zapytania do bazy, SSR może być wolny. Rzeczywista szybkość często wynika z cache’owania (na serwerze, CDN-ie lub edge), dzięki któremu powtarzające się wizyty nie powielają pracy.
Przy SSG strony są przygotowywane z wyprzedzeniem (w czasie builda) i serwowane jako pliki statyczne. To świetne rozwiązanie pod względem niezawodności i kosztów — często daje doskonałe czasy ładowania, bo strona jest „gotowa” zanim użytkownik przyjdzie.
SSG sprawdza się dla landingów, dokumentacji i treści, które nie zmieniają się co chwilę. Kompromis to świeżość: aktualizacja treści może wymagać rebuilda lub strategii przyrostowej aktualizacji.
Przy CSR przeglądarka pobiera JavaScript i buduje UI na urządzeniu użytkownika. To może być idealne dla mocno interaktywnych, spersonalizowanych części aplikacji (dashboardy, edytory), ale opóźnia pierwszy znaczący widok i komplikuje SEO, jeśli treść nie jest dostępna jako HTML na starcie.
Większość realnych produktów łączy tryby: SSG dla stron marketingowych (SEO i szybkość), SSR dla dynamicznych stron wymagających indeksowalnej treści (karty produktów, listingi), i CSR dla obszarów zalogowanych o wysokiej interaktywności.
Dobre wybory łączą się bezpośrednio z wynikami: SEO (wyszukiwanie), szybkość (konwersje) i niezawodność (mniej incydentów, stabilniejsze przychody).
Zanim platformy uczyniły wdrażanie rzeczą jednym kliknięciem, wysyłanie aplikacji webowej często oznaczało składanie własnego „mini projektu infrastrukturalnego”. Nawet prosty marketingowy site z dynamicznym formularzem kontaktowym mógł zamienić się w łańcuch serwerów, skryptów i usług, które musiały być idealnie zsynchronizowane.
Częsty setup wyglądał tak: przydzielałeś jeden lub więcej serwerów (VM), instalowałeś serwer WWW i konfigurowałeś pipeline CI, który budował aplikację i kopiował artefakty przez SSH.
Powyżej tego często konfigurowałeś reverse proxy (np. Nginx) do routingu żądań, terminowania TLS i kompresji. Potem cache: może HTTP cache, konfiguracja CDN i reguły, które strony można bezpiecznie cache’ować i na jaki czas.
Jeśli potrzebowałeś SSR, operowałeś procesem Node, który trzeba było uruchamiać, monitorować, restartować i skalować.
Problemy pojawiały się przy każdym wydaniu:
Lokalny development ukrywa bałagan: masz ciepły cache, inną wersję Node, inne env i brak realnego ruchu.
Po wdrożeniu te różnice wychodzą na jaw — często jako subtelne niezgodności SSR, brakujące sekrety lub reguły routingu działające inaczej zza proxy.
Zaawansowane setupy (SSR, multi-region, bezpieczne środowiska podglądowe) były możliwe, ale wymagały czasu operacyjnego. Dla wielu małych zespołów oznaczało to rezygnację z najlepszej architektury nie dlatego, że była gorsza, lecz że narzut wdrożeniowy był za duży.
Vercel nie tylko zautomatyzował wdrażanie — zapakował je jako domyślny workflow, który jest częścią pisania kodu. Idea produktu jest prosta: wdrażanie nie powinno być oddzielnym zadaniem ops; powinno być normalnym rezultatem codziennego developmentu.
„Git push = deploy” często opisuje się jak schludny skrypt. Vercel traktuje to bardziej jak obietnicę: jeśli Twój kod jest w Git, jest możliwy do wdrożenia — konsekwentnie, powtarzalnie i bez listy manualnych kroków.
To się liczy, bo zmienia, kto czuje się pewny przy wypuszczaniu zmian. Nie potrzebujesz specjalisty, by za każdym razem interpretować ustawienia serwera, reguły cache’u czy kroki builda. Platforma zamienia te decyzje w domyślne ustawienia i zabezpieczenia.
Podglądowe wdrożenia to duża część tego, dlaczego to wygląda jak workflow, a nie tylko narzędzie. Każdy pull request może generować URL do podglądu, który wiernie odtwarza zachowanie produkcji.
Projektanci mogą sprawdzać odstępy i interakcje w prawdziwym środowisku. QA testuje ten sam build, który miałby się pojawić. PM mogą przejść funkcję i zostawić konkretny feedback — bez czekania na „push do staging” czy proszenia kogoś o uruchomienie branchu lokalnie.
Gdy deployy stają się częste, bezpieczeństwo staje się codzienną potrzebą. Szybkie rollbacki sprawiają, że złe wydanie to niedogodność, nie incydent.
Parytet środowisk — utrzymanie podobnego zachowania w preview, staging i produkcji — zmniejsza problem „działa u mnie”, który spowalnia zespoły.
Wyobraź sobie, że wypuszczasz nową stronę cenową i małą zmianę w flow rejestracji. Z podglądami marketing może przejrzeć stronę, QA testuje flow, a zespół scala z pewnością.
Jeśli analityka pokaże problem po starcie, możesz cofnąć wydanie w kilka minut, naprawić i wdrożyć ponownie — bez zamrażania całej pracy zespołu.
CDN (Content Delivery Network) to sieć serwerów na świecie przechowujących i dostarczających kopie plików strony — obrazy, CSS, JavaScript, czasem HTML — tak, by użytkownicy pobierali je z bliskiej lokalizacji.
Cache’owanie to reguły określające, jak długo te kopie mogą być ponownie używane. Dobre cache’owanie to szybsze strony i mniejsze obciążenie origin. Złe cache’owanie to ryzyko serwowania przestarzałych treści lub unikania cache’u w obawie przed błędami.
Edge to następny krok: zamiast tylko serwować pliki globalnie, możesz uruchamiać małe fragmenty kodu blisko użytkownika, w czasie obsługi żądania.
To właśnie sprawia, że „infrastruktura frontendowa bez zespołu ops” staje się realna: wiele zespołów uzyskuje globalne rozproszenie i inteligentne przetwarzanie żądań bez zarządzania serwerami w wielu regionach.
Funkcje edge sprawdzają się, gdy trzeba szybko podjąć decyzję przed podaniem strony:
Jeśli Twoja strona jest głównie statyczna, ruch jest niski lub masz ścisłe wymagania dotyczące dokładnego miejsca wykonywania kodu (prawo, lokalizacja danych), edge może dodać złożoność bez wyraźnej korzyści.
Uruchamianie kodu w wielu lokalizacjach może utrudnić obserwowalność i debugowanie: logi i śledzenia są bardziej rozproszone, a reprodukcja problemów „tylko w jednym regionie” zajmuje czas.
Są też zachowania specyficzne dla dostawcy (API, limity, różnice runtime), które wpływają na przenośność.
Użyte rozważnie, możliwości edge dają zespołom „globalne domyślne” wydajności i kontrolę — bez zatrudniania zespołu ops do sklejania tego razem.
Framework i hosting „pasują do siebie”, gdy platforma rozumie, co framework produkuje w czasie builda i czego potrzebuje w czasie żądania.
To pozwala hostowi interpretować artefakty builda (pliki statyczne vs funkcje serwera), stosować odpowiednie reguły routingu (trasy dynamiczne, rewrites) i ustawiać sensowne zachowanie cache’u (co można cache’ować na edge, a co musi być świeże).
Gdy platforma zna konwencje frameworka, znika wiele pracy:
Efekt netto: mniej skryptów bespoke i mniej niespodzianek „działa u mnie” przy wdrożeniach.
Wadą jest lock-in wynikający z wygody. Jeśli aplikacja opiera się na funkcjach specyficznych dla platformy (API edge, własne reguły cache’owania, pluginy builda), migracja później może wymagać przepisania części routingu, middleware’u lub pipeline’u wdrożeniowego.
Aby zachować przenośność, rozdzielaj obawy: trzymaj logikę biznesową zgodną z frameworkiem, dokumentuj zachowania hosta i preferuj standardy (nagłówki HTTP, przekierowania, zmienne środowiskowe).
Nie zakładaj, że jest jedna najlepsza opcja. Porównuj platformy pod kątem: flowu wdrożenia, obsługiwanych trybów renderowania, kontroli cache, wsparcia edge, obserwowalności, przewidywalności cen i łatwości wyjścia.
Mały proof-of-concept — wdrożenie tego samego repo na dwóch dostawcach — często szybciej ujawni realne różnice niż dokumentacja.
Wydajność to nie tylko wynik w teście. To cecha produktu: szybsze strony zmniejszają współczynnik odrzuceń i poprawiają konwersje, a szybsze buildy pozwalają zespołom częściej wdrażać bez oczekiwania.
Dla użytkowników „szybko” oznacza, że strona staje się użyteczna szybko — szczególnie na przeciętnych telefonach i wolniejszych sieciach. Dla zespołów „szybko” oznacza, że deployy kończą się w minutach (lub sekundach), więc zmiany można wypuszczać z pewnością.
Vercel spopularyzował pomysł, że można optymalizować oba aspekty naraz, czyniąc wydajność częścią domyślnego workflowu zamiast osobnego projektu.
Tradycyjny build często przebudowuje wszystko, nawet jeśli zmieniłeś jedną linię na jednej stronie. Buildy przyrostowe starają się przebudować tylko to, co się zmieniło — jak zaktualizowanie jednego rozdziału książki zamiast ponownego drukowania całego tomu.
Cache pomaga, ponownie używając wcześniej obliczonych wyników:
W Next.js wzorce jak incremental static regeneration (ISR) wpisują się w ten model: podawaj szybkie, wcześniej zbudowane strony, a odświeżaj je w tle, gdy treść się zmienia.
Budżet wydajności to proste ograniczenie, na które się zgadzacie — np. „trzymaj homepage poniżej 200KB JS” lub „Largest Contentful Paint poniżej 2.5s na typowym mobile’u”. Chodzi nie o idealność, lecz o zapobieganie cichemu spowalnianiu.
Utrzymuj lekkie i spójne kontrole:
Gdy szybkość jest traktowana jako cecha, zyskujesz lepsze doświadczenie użytkownika i szybszy rytm zespołu bez zmieniania każdego wydania w pożar wydajnościowy.
Większość narzędzi nie staje się mainstreamowa, bo jest najbardziej elastyczna — wygrywają te, z którymi nowy użytkownik szybko odnosi sukces.
Główni użytkownicy (małe zespoły, agencje, product dev bez głębokiej wiedzy infra) oceniają platformy prostymi pytaniami:
Tutaj szablony, czytelna dokumentacja i „happy path” workflowi mają znaczenie. Szablon, który wdraża się w minuty i pokazuje routing, pobieranie danych i autoryzację, często przekonuje bardziej niż tabela funkcji.
Dokumentacja pokazująca jedną rekomendowaną ścieżkę (i kiedy odejść) skraca czas zgadywania.
Długa lista przełączników może być potężna, ale zmusza każdy zespół do zostania ekspertem, by podjąć podstawowe decyzje. Sensowne domyślne obniżają obciążenie poznawcze:
Gdy domyślne ustawienia są trafne, zespoły pracują nad produktem, a nie nad konfiguracją.
Budowniczy zaczyna często od sprawdzonych wzorców:
Najlepsze szablony nie tylko dobrze wyglądają — kodują sprawdzoną strukturę.
Dwa powtarzające się błędy:
Dobra krzywa nauczania kieruje zespoły na jedną jasną ścieżkę startową, a zaawansowane wybory czynią się aktualizacjami, nie obowiązkiem.
Platformy wdrożeniowe sfetryzowały ścieżkę od Gita do produkcji. Równoległy trend to produktyzacja ścieżki od pomysłu do działającej bazy kodu.
Koder.ai jest przykładem kierunku „vibe-coding”: opisujesz, czego chcesz w interfejsie czatowym, a platforma używa agentowych workflowów LLM, by wygenerować i iterować rzeczywistą aplikację. Obsługuje web, serwer i mobile (React frontend, Go + PostgreSQL backend, Flutter na mobile), z praktycznymi funkcjami jak eksport źródeł, deploy/hosting, custom domeny, snapshoty i rollback.
W praktyce łączy się to naturalnie z opisanym workflowem: skraca pętlę od intencji → implementacja → podgląd → produkcja, z możliwością wyjścia (eksport kodu) gdy przekroczysz domyślne ustawienia.
Wybór platformy frontendowej to nie tylko wybór hostingu. To wybór domyślnego workflowu, w którym będzie żył Twój zespół: jak kod staje się URLem, jak zmiany są przeglądane i jak radzi się z awariami.
Wiele platform wygląda podobnie na stronie głównej, potem różnią się szczegółami rozliczeń. Porównaj jednostki odpowiadające Twojemu realnemu użyciu:
Praktyczna wskazówka: oszacuj koszty na normalny miesiąc i na „tydzień premiery”. Jeśli nie możesz zasymulować obu, zaskoczy Cię to w najgorszym momencie.
Nie musisz być ekspertem infra, ale warto zadać kilka prostych pytań:
Jeżeli Twoi klienci są globalni, pokrycie regionów i zachowanie cache’u mogą być tak samo ważne jak surowa wydajność.
Szukaj codziennych zabezpieczeń, nie ogólników:
Użyj tego jako szybkiego filtra przed głębszą oceną:
Wybierz platformę, która redukuje liczbę „decyzji deployowych”, które zespół musi podejmować tygodniowo — jednocześnie dając wystarczającą kontrolę, gdy ma ona znaczenie.
Produktyzacja zmienia decyzje dotyczące wdrażania i renderowania z pracy inżynieryjnej na powtarzalne domyślne ustawienia. To zmniejsza tarcie w dwóch miejscach, które zwykle spowalniają zespoły: wdrażanie zmian i utrzymanie przewidywalnej wydajności.
Gdy ścieżka commit → podgląd → produkcja jest znormalizowana, iteracja przyspiesza, bo mniej wydań zależy od specjalisty (lub szczęśliwego popołudnia debugowania).
Zacznij od najmniejszej powierzchni dającej informację zwrotną:
Gdy to działa, rozszerz stopniowo:
Jeśli chcesz wejść głębiej bez zgubienia się, przeglądaj wzorce i studia przypadków na /blog, a potem sprawdź koszty i limity na /pricing.
Jeżeli eksperymentujesz też ze szybszymi sposobami przejścia od wymagań do działającej bazy kodu (szczególnie dla małych zespołów), Koder.ai może być użytecznym narzędziem towarzyszącym: wygeneruj pierwszą wersję przez czat, szybko iteruj z interesariuszami i zachowaj tę samą sfetryzowaną ścieżkę do podglądów, rollbacków i produkcji.
Zintegrowane platformy optymalizują szybkość wypuszczania i redukują decyzje operacyjne. Kosztem jest mniejsza kontrola niskiego poziomu (niestandardowa infrastruktura, unikalne wymagania zgodności, niestandardowe sieciowanie).
Wybierz najbardziej „sproduktywizowane” ustawienie, które nadal spełnia Twoje ograniczenia — i miej plan wyjścia (przenośna architektura, jasne kroki builda), aby decydować z siłą, a nie z powodu uzależnienia.
Oznacza to zapakowanie chaotycznych elementów wysyłania frontendu — buildy, wdrożenia, podglądy, obsługę SSR/SSG, cache’owanie i globalne dostarczanie — w powtarzalny workflow z rozsądnymi domyślnymi ustawieniami.
W praktyce redukuje to liczbę niestandardowych skryptów i „wiedzy plemiennej” potrzebnej, by przejść od commita do wiarygodnego adresu produkcyjnego.
Ponieważ wdrażanie stało się codziennym workflowem, a nie okazjonalnym projektem. Zespoły potrzebowały:
Gdy te potrzeby stały się powszechne, dało się je wystandaryzować jako doświadczenie produktowe zamiast wymyślać na nowo dla każdego zespołu.
SSR to nie tylko serwowanie plików — to uruchamianie kodu po stronie serwera, generowanie HTML, a następnie zapewnienie szybkości i bezpieczeństwa dzięki cache’owaniu i routingowi.
Typowe źródła złożoności to konfiguracja środowiska (Node/serverless), unieważnianie cache’u, cold starty, nagłówki/rewrites oraz zapewnienie, że zachowanie produkcyjne odpowiada lokalnemu developmentowi.
Pomyśl: kiedy HTML jest tworzony:
Wiele aplikacji miksuje te tryby: SSG dla landingów/docs, SSR dla indeksowalnych, dynamicznych stron, CSR dla mocno interaktywnych, zalogowanych obszarów.
Zwykła aplikacja React często staje się „React + stos decyzji” (routing, konfiguracja builda, strategia renderowania, konwencje). Next.js standaryzuje powszechne potrzeby:
Najbardziej przydaje się, gdy potrzebujesz SEO, wielu trybów renderowania lub spójnej struktury aplikacji.
Gdy budujesz małą, w większości statyczną stronę, prosty wewnętrzny tool lub cokolwiek, gdzie SEO i pierwszy czas ładowania nie są kluczowe, Next.js może być zbędnym narzutem.
W takich przypadkach lekkie statyczne rozwiązanie (lub prostsze SPA) może być tańsze w utrzymaniu i łatwiejsze do zrozumienia.
Podglądy generują udostępnialny URL dla każdego pull requesta, który bardzo przypomina produkcję.
To poprawia współpracę, bo:
Redukuje też niespodzianki „tylko stagingowe”.
Nie zawsze. SSR może być wolny, jeśli każde żądanie uruchamia kosztowne operacje (bazy, powolne API).
SSR jest odczuwalnie szybki, gdy towarzyszy mu mądra strategia cache’owania:
Zysk często pochodzi ze strategii cache’u, nie z samego SSR.
Edge uruchamia małe fragmenty kodu blisko użytkownika, co przydaje się do:
Może być przesadą, gdy strona jest głównie statyczna, ruch niski lub istnieją surowe wymagania co do miejsca wykonywania kodu (przepisy/dane). Debugowanie bywa też trudniejsze, bo logi i błędy rozproszone są po regionach.
Integracja upraszcza routing, podglądy i cache’owanie, bo host rozumie, co framework produkuje podczas buildu. W zamian za wygodę ryzykujesz vendor-lockin.
Aby zachować ścieżkę wyjścia:
Praktyczny test: wdroż ten sam repo na dwóch dostawcach i sprawdź różnice.