Case study: Transformacja infrastruktury 5 projektów - od skryptów i docker-compose do w pełni zautomatyzowanego klastra Kubernetes
Była 2:30 w nocy, gdy telefon zadzwonił po raz trzeci w tym tygodniu. Kolejny deployment się wysypał, klient krzyczy, a jedyna osoba w zespole, która wie jak to naprawić, właśnie wróciła z urlopu. Brzmi znajomo?
Tak wyglądały nasze deploymenty jeszcze rok temu. Dziś ten sam proces trwa 30 minut dla jednej osoby, działa automatycznie o każdej porze dnia i nie wymaga nocnych interwencji. Oto jak to zrobiliśmy.
Punkt wyjścia - Architektura Bólu
Czy znacie to uczucie, gdy telefon dzwoni o 2 w nocy i wiecie, że to nie może być nic dobrego? Tak wyglądało nasze życie jeszcze 4 lata temu. Każdy deployment był loterią - albo wszystko działało, albo ktoś z zespołu musiał wstać i naprawiać system do rana. Zacznę od początku. Gdy mieliśmy jeden system, nasze podejście sprawdzało się całkiem nieźle. Prosty skrypt, docker-compose, kilka komend w terminalu i gotowe. Problem zaczął się, gdy projektów zrobiło się więcej.
Zarządzaliśmy wtedy pięcioma różnymi projektami. Każdy miał swoją technologię, swoje sposoby wdrażania i swojego “właściciela” - osobę, która jako jedyna wiedziała, jak ten konkretny system uruchomić. To, co działało dla jednego projektu, kompletnie się nie sprawdzało przy pięciu.
Nasz proces deploymentu wyglądał mniej więcej tak: ktoś otwierał terminal, szukał odpowiedniego skryptu, zmieniał numery wersji obrazów w plikach docker-compose, przekrzywiał palce i uruchamiał komendę. Czasem działało za pierwszym razem. Częściej nie. A aktualizacje systemu? To był prawdziwy hardcore.
Wyobraźcie sobie sytuację: trzeba zaktualizować wszystkie pięć aplikacji jednocześnie, bo jedna z nich wymaga nowej wersji współdzielonej biblioteki. Każda aplikacja ma inną procedurę wdrożenia, inne zależności, inne potencjalne problemy. Całość trwała cały dzień, a czasem i noc. I modliliśmy się, żeby wszystko wróciło do normalnego stanu rano.
Problem leżał w tym, że skalowaliśmy chaos. Jeden system i docker-compose? Okej. Pięć systemów z różnymi bazami danych, integracjami, kopiami zapasowymi i wzajemnymi zależnościami? Koszmar.
Mieliśmy silosy wiedzy - Marek znał frontend, Asia backendową aplikację do fakturowania, a Tomek system logistyczny. Gdy któregoś z nich nie było, deployment się zatrzymywał. Brak zastępowalności oznaczał, że urlop czy choroba kluczowej osoby paraliżowały cały proces. Aktualizacje robiliśmy w nocy, bo nie mieliśmy wysokiej dostępności. Przestój systemu oznaczał klientów bez dostępu do usług, więc wybieraliśmy najmniejsze zło - pracę po nocach. Z czasem doszły dodatkowe wyzwania: więcej baz danych, skomplikowane kopie zapasowe, integracje między aplikacjami. Każdy nowy element to kolejna rzecz, która mogła się zepsuć.
Efekt? Zespół był sfrustrowany i przemęczony. Ludzie zaczęli bać się piątków, bo to wtedy często robiło się “gorąco”. Atmosfera w pracy zaczęła się psuć, a ja wiedziałem, że musimy coś z tym zrobić.
Moment Prawdy - Kiedy Skala Zabija
Przełomowy moment przyszedł w momencie, gdy biznes przestał tolerować przestoje. Klienci zaczęli wymagać, żeby systemy działały bez przerwy. Zero downtime stało się standardem, nie luksusem. A my wciąż robiliśmy aktualizacje w nocy, modląc się, żeby wszystko wróciło do życia rano.
Wyobraźcie sobie presję: z jednej strony biznes wymaga ciągłej dostępności, a z drugiej strony każda aktualizacja to rosyjska ruletka. Klient dzwoni rano z pytaniem, dlaczego nie może się zalogować do systemu. Ty budzisz się z zimnym potem, sprawdzasz logi i okazuje się, że jedna z pięciu aplikacji nie wstała po restarcie. I tak zaczyna się kolejny dzień.
Techniczne wyzwania rosły jak lawina. Początkowo mieliśmy jedną bazę danych - teraz było ich osiem. Kopie zapasowe, które kiedyś robiło się raz dziennie, teraz trzeba było synchronizować między systemami. Aplikacje zaczęły ze sobą rozmawiać przez API, więc awaria jednej oznaczała problemy w trzech innych.
Ale największym problemem byli ludzie. Nie chodzi o to, że zespół był zły - przeciwnie, mieliśmy świetnych programistów. Problem był w tym, że każdy stał się niewolnikiem swojego systemu. Marek nie mógł pojechać na urlop, bo “a co jak będzie trzeba aktualizować frontend?”. Asia siedziała w weekend, debugując problemy z integracją płatności. Tomek odbierał telefony o drugiej w nocy, bo system logistyczny znów się zawiesił.
Silosy wiedzy to była bomba zegarowa. Im więcej każdy wiedział o swoim systemie, tym mniej kto inny mógł go zastąpić. Wiedza była w głowach ludzi, nie w dokumentacji. Próby przekazywania tej wiedzy kończyły się na kilkugodzinnych sesjach, podczas których nowa osoba robiła notatki, a potem i tak dzwoniła do “eksperta”, gdy coś nie działało.
Koszt utraconych szans rósł każdego dnia. Biznes chciał wprowadzać nowe funkcje, ale my spędzaliśmy więcej czasu na gaszeniu pożarów niż na rozwoju. Deployment nowej funkcji to było minimum tydzień planowania, kilka godzin implementacji i cały dzień modlitwy, żeby wszystko działało.
Realny problem był prosty: zespół pracował po nocach, tracił motywację, a biznes tracił pieniądze na przestojach. Wiedziałem, że mamy dwie opcje: albo zrobimy coś radykalnego, albo pożegnamy się z najlepszymi ludźmi w zespole.
Sygnały alarmowe
Gdy zobaczyłem te sygnały, wiedziałem, że czas działać:
- Zespół zaczął unikać deploymentów w piątki
- Średni czas naprawy awarii przekroczył 4 godziny
- Dokumentacja była nieaktualna od ponad roku
- Nikt nie chciał brać odpowiedzialności za deployment
- Klienci zaczęli pytać o SLA dla dostępności systemów
- Rekrutacja nowych ludzi trwała miesiącami przez skomplikowane onboardowanie
- Koszt utrzymania infrastruktury rósł szybciej niż przychody
- Przestoje zaczęły wpływać na decyzje biznesowe klientów
- Zespół pracował nadgodziny regularnie, nie sporadycznie
- Rollback to był scenariusz, którego wszyscy się bali
To był moment, w którym zrozumiałem: nie możemy dłużej skalować chaosu. Musimy zbudować coś nowego.
Strategia Transformacji - Dlaczego Kubernetes?

Gdy przyszedł czas na podjęcie decyzji, staliśmy przed wyborem: AWS, Azure, Google Cloud czy może coś własnego? Wszyscy dookoła mówili “cloud, cloud, cloud”, ale ja wiedziałem, że musimy myśleć strategicznie, nie modnie.
Przeanalizowałem nasze potrzeby i szybko zrozumiałem, że główny problem to nie brak skalowalności - to brak wysokiej dostępności. Nasze aplikacje nie musiały obsługiwać miliona użytkowników dziennie. One po prostu musiały działać 24/7 bez przestojów.
AWS oferował fantastyczną skalowalność. Mogliśmy uruchomić tysiące instancji w ciągu minut. Ale czy tego potrzebowaliśmy? Nie. Potrzebowaliśmy zagwarantować, że gdy jeden serwer padnie, drugi przejmie jego obowiązki bez mrugnięcia okiem. To różnica między Ferrari a niezawodną Toyotą - my potrzebowaliśmy Toyoty.
Drugi argument przeciwko AWS to były koszty. Policzyłem, ile zapłacimy za EKS, Load Balancery, RDS i wszystkie inne usługi. Kwota była przyzwoita, ale rosła liniowo z każdą nową aplikacją. A my planowaliśmy rozwój. Własna infrastruktura oznaczała wyższą inwestycję początkową, ale przewidywalne koszty operacyjne.
Kubernetes jako rozwiązanie było oczywiste. Nie dlatego, że to było modne, ale dlatego, że rozwiązywało nasze konkretne problemy. Chcieliśmy wysokiej dostępności? Kubernetes z wieloma replikami aplikacji. Chcieliśmy ujednolicić deploymenty? Kubernetes z manifestami YAML. Chcieliśmy monitoringu i automatycznego restartowania? Kubernetes to robi out-of-the-box.
Zaprojektowałem architekturę z 3 control plane i worker nodes. Dlaczego 3 control plane? Bo gdy jeden padnie, dwa pozostałe dalej zarządzają klastrem. Redundancja to klucz do wysokiej dostępności. Worker nodes mogą padać - aplikacje przeskakują na inne. Control plane nie może padać - dlatego mamy ich trzy.
Dodatkowym bonusem było to, że mieliśmy już wiele środowisk QA, ale gdy istniała potrzeba, DevOps był w stanie szybko stworzyć nowe środowisko za pomocą Helm charts, które opracowaliśmy na bazie templatów. To oznaczało, że tester czy programista mógł dostać izolowane środowisko w miarę potrzeb, bez czekania tygodniami na konfigurację.
Wiem, że brzmi to jak reklama Kubernetes, ale prawda jest taka: wybrałem go nie dlatego, że był cool, ale dlatego, że rozwiązywał nasze biznesowe problemy. Wysoką dostępność, ujednolicenie procesów, możliwość zastąpienia ludzi przez procesy.
Decyzja build vs buy
Kiedy podejmujesz podobną decyzję, zadaj sobie te pytania:
Wybierz własną infrastrukturę (build) gdy:
- Twoje aplikacje mają przewidywalny ruch, nie potrzebujesz elastycznej skalowalności
- Koszty chmury rosną szybciej niż korzyści z jej używania
- Masz kompetencje DevOps w zespole lub możesz je rozwinąć
- Wysoką dostępność cenisz bardziej niż skalowalność
- Planujesz długoterminowy rozwój i chcesz kontrolować koszty
Wybierz chmurę (buy) gdy:
- Twoje aplikacje mają nieprzewidywalny ruch, potrzebujesz szybkiej skalowalności
- Nie masz czasu ani ludzi na zarządzanie infrastrukturą
- Twój biznes rośnie tak szybko, że infrastruktura nie może być wąskim gardłem
- Koszty chmury to niewielki procent twoich przychodów
My wybraliśmy własną infrastrukturę, bo nasze potrzeby były jasne: niezawodność, kontrola kosztów i możliwość szybkiego rozwoju zespołu. I nie żałuję tej decyzji.
Implementacja Kubernetes - Droga do Wysokiej Dostępności
Kiedy już podjąłem decyzję o Kubernetes, przyszedł czas na najtrudniejszą część - implementację. Nie chodzi o to, że technologia była skomplikowana. Problem leżał w tym, że musieliśmy przenieść pięć działających systemów produkcyjnych bez przestojów biznesowych.
Zaprojektowałem architekturę docelową: wysokodostępny klaster z 3 control plane + worker nodes. Dlaczego akurat taka konfiguracja? Control plane to mózg całego klastra - jeśli padnie, nikt nie może zarządzać aplikacjami. Jeden control plane to single point of failure. Dwa to ryzyko split-brain. Trzy to minimum dla zapewnienia redundancji - jeśli jeden padnie, dwa pozostałe dalej zarządzają wszystkim.
Worker nodes to był prostszy temat. Mogły padać, bo aplikacje automatycznie przeskakiwały na inne węzły. Im więcej worker nodes, tym lepiej rozłożone obciążenie i większa odporność na awarie.
Migracja musiała być etapowa. Nie mogliśmy wyłączyć wszystkiego na weekend i modlić się, żeby w poniedziałek wszystko działało. Plan był taki:
Etap 1: Przygotowanie Helm Charts Mieliśmy już aplikacje skonteneryzowane, więc to nam oszczędziło miesięcy pracy. Ale zamiast tworzyć osobne manifesty Kubernetes dla każdej aplikacji, od razu poszliśmy w Helm charts z templatowaniem. Podobne usługi miały wspólne templaty, różniły się tylko parametrami. Backend aplikacje używały tego samego Helm chart, ale z różnymi wartościami dla baz danych, portów, zasobów.
Etap 2: Konfiguracja sieci i load balancingu Tu było ciekawie. Aplikacje musiały ze sobą rozmawiać, ale też być dostępne z zewnątrz. Kubernetes ma swój sposób na networking, który początkowo wydawał mi się magiczny. Ingress Controller, Service discovery, DNS - wszystko musiało być skonfigurowane tak, żeby ruch był prawidłowo kierowany między aplikacjami.
Etap 3: Migracja baz danych z persistent storage Najtrudniejszy kawałek. Bazy danych to nie aplikacje - nie można ich tak łatwo restartować czy przenosić. Musiałem zaprojektować persistent volumes, skonfigurować backup i recovery, przetestować procedury failover. To jest ta część, przy której wszyscy się stresują, bo tu można stracić dane.
Etap 4: Implementacja backupów w nowym środowisku Stare backupy działały na cronach i skryptach bashowych. W Kubernetes musiałem to przeprojektować. CronJobs, podmontowane volumeny, bezpieczne przechowywanie kopii zapasowych. Wszystko musiało być automatyczne i niezawodne.
Zarządzanie konfiguracją dla różnych środowisk (dev/stage/prod) rozwiązałem przez Helm values. Każde środowisko miało swoje wartości, ale ten sam template. W praktyce oznaczało to, że deployment na dev był identyczny z deploymentem na prod - różniły się tylko parametrami konfiguracyjnymi.
Automatyzacja CI/CD - Setki Pipeline’ów w GitLab
Kubernetes rozwiązał nam problem wysokiej dostępności, ale wciąż mieliśmy chaos w deploymentach. Pięć projektów, różne technologie, różne sposoby wdrażania. Potrzebowaliśmy czegoś, co ujednolici cały proces od commita w kodzie do działającej aplikacji na produkcji.
Problem był prosty do zdefiniowania, ale trudny do rozwiązania: jak zarządzać setkami pipeline’ów dla różnych projektów i środowisk? Każda aplikacja miała swoje środowiska dev, stage i prod. Każda miała swoje testy, swoje zależności, swoje sposoby budowania. Mnożyło się to szybko.
Wybrałem GitLab CI jako narzędzie, ale nie dlatego, że był najlepszy na rynku. Wybór był pragmatyczny: mieliśmy już GitLab do zarządzania kodem, więc dodanie CI/CD było naturalnym krokiem. Jenkins wymagałby osobnej infrastruktury i utrzymania. GitHub Actions nie było wtedy tak rozwinięte jak dziś. GitLab dawał nam wszystko w jednym miejscu.
Kluczem do sukcesu była standaryzacja procesów. Zamiast tworzyć osobny pipeline dla każdej aplikacji, zaprojektowałem templaty, które można było dostosować parametrami. Backend aplikacje używały tego samego szablonu, różniły się tylko konfiguracją bazy danych, portami, zasobami.
Struktura pipeline’a wyglądała tak:
Etap 1: Build & Test (5-15 minut) Testy jednostkowe, linting kodu, skanowanie bezpieczeństwa. To był etap, który łapał 80% problemów przed deploymentem. Jeśli kod nie przeszedł testów, pipeline się zatrzymywał. Nie ma sensu budować aplikacji, która się nie kompiluje.
Etap 2: Build Image (3-8 minut) Budowanie obrazów Docker i push do naszego prywatnego registry. Każdy obraz miał tag z numerem commita, więc zawsze wiedzieliśmy, która wersja kodu jest w której wersji obrazu. Registry było skonfigurowane z automatycznym czyszczeniem starych obrazów.
Etap 3: Deploy (2-10 minut) Automatyczne wdrożenie na środowiska przez Helm. Dev środowisko aktualizowało się przy każdym commicie do brancha develop. Stage wymagało ręcznego zatwierdzenia. Prod tylko z tagów release. Każde środowisko miało swoje własne parametry konfiguracyjne.
Etap 4: Health Check (1-3 minuty) Health checki w Helm zapewniały sprawdzenie, czy deployment rzeczywiście przeszedł pomyślnie. Jeśli aplikacja nie odpowiadała na podstawowe requesty lub nie przechodziła testów dostępności, deployment był automatycznie rollbackowany. To nam gwarantowało, że na produkcji zawsze działa stabilna wersja.
Szablony pipeline’ów to był game changer. Zamiast pisać 20 różnych plików .gitlab-ci.yml, miałem 3 główne templaty: dla aplikacji backendowych, frontendowych i mikroserwisów. Każda aplikacja includeowała odpowiedni template i przekazywała swoje parametry.
Zarządzanie sekretami rozwiązałem przez GitLab Variables i Kubernetes Secrets. Produkcyjne hasła, klucze API, certyfikaty - wszystko było bezpiecznie przechowywane i automatycznie wstrzykiwane do aplikacji podczas deploymentu. Nikt nie musiał znać produkcyjnych haseł, żeby wdrożyć aplikację.
To była różnica jak dzień i noc w porównaniu do poprzedniego systemu, gdzie deployment trwał godzinami i wymagał zaangażowania kilku osób.
Rezultaty - Liczby Nie Kłamią
Po roku pracy z nową infrastrukturą przyszedł czas na podsumowanie. Czy warto było? Spojrzałem na metryki z naszego systemu zarządzania zadaniami i było zgodnie z moimi założeniami.
Wydajność zespołu wzrosła trzykrotnie. To nie jest marketingowa przesada - to twarda liczba z ClickUp. Wcześniej deployment jednej aplikacji był osobnym taskiem, który angażował 10 godzin pracy kilku osób - bo zawsze były jakieś problemy. Teraz ten sam proces to 30 minut pracy dla jednej osoby, która głównie klika przyciski i sprawdza, czy wszystko się udało.
Konkretne liczby? Wcześniej deployment wszystkich pięciu aplikacji to był event na cały weekend. Planowanie od wtorku, przygotowania w piątek, deployment w sobotę rano, fixing w sobotę wieczorem, modlitwa w niedzielę, żeby w poniedziałek wszystko działało. Łącznie kilkadziesiąt godzin pracy wielu osób.
Dziś ten sam deployment to 30 minut pracy jednej osoby. I może zrobić to w środku dnia roboczego, bo zero downtime to już standard, nie marzenie.
Redukcja ręcznych procesów to była rewolucja. Wcześniej deployment wyglądał jak seria magicznych zaklęć: “idź na serwer X, uruchom skrypt Y, sprawdź czy Z działa, jeśli nie to zrób W”. Teraz? Git push, kliknij merge request, sprawdź czy CI przeszło. Koniec.
Dostępność systemu zmieniła się dramatycznie. Wcześniej każdy deployment oznaczał przestój. Dziś deploymenty są niewidoczne dla użytkowników końcowych. Rolling updates w Kubernetes oznaczają, że stara wersja działa, dopóki nowa się nie uruchomi.
Ale największą zmianą było to, co stało się z zespołem. Koniec nocnych deploymentów oznaczał koniec stresu związanego z weekendową pracą. Ludzie przestali bać się piątków. Atmosfera w pracy zmieniła się z “survival mode” na “development mode”.
Korzyści biznesowe były równie ważne. Szybsze time-to-market oznaczało, że mogliśmy reagować na potrzeby klientów w dniach, nie tygodniach. Nowa funkcja? Tydzień developmentu i jest na produkcji. Wcześniej ten sam proces trwał miesiąc - tydzień developmentu i trzy tygodnie planowania deploymentu.
ROI w liczbach
Czas deploymentu:
- Wcześniej: 10+ godzin pracy kilku osób
- Teraz: 30 minut pracy jednej osoby
- Oszczędność: 95% czasu
Częstotliwość deploymentów:
- Wcześniej: raz na 2-3 tygodnie
- Teraz: codziennie na dev, 2-3 razy w tygodniu na prod
- Wzrost: 1000%
Przestoje związane z deploymentami:
- Wcześniej: 2-4 godziny przestoju na deployment
- Teraz: 0 minut przestoju
Satysfakcja zespołu (skala 1-10):
- Wcześniej: 4/10 (stres, przepracowanie, frustracja)
- Teraz: 8/10 (spokój, przewidywalność, focus na rozwoju)
- Poprawa: 100%
To nie są liczby wymyślone dla ładnego raportu. To realne metryki z naszych systemów. I każdy, kto przeszedł podobną transformację, potwierdzi: automatyzacja to inwestycja, która zwraca się w miesiącach, nie latach.
Co Robiłbym Inaczej

Każdy projekt ma swoje wyzwania, których nie da się przewidzieć na etapie planowania. Ta transformacja nie była wyjątkiem. Gdybym miał zaczynać od nowa, pewne rzeczy zrobiłbym inaczej.
Największym wyzwaniem, którego nie przewidziałem, była migracja danych z legacy systemów. Brzmi prozaicznie, ale diabeł tkwił w szczegółach. Każda z pięciu aplikacji miała swoje sposoby przechowywania danych, swoje backupy, swoje procedury. Unifikacja tego wszystkiego zajęła dwukrotnie więcej czasu, niż zakładałem.
Drugi problem to była krzywą uczenia dla zespołu. Kubernetes i GitLab CI to nie są technologie, które poznaje się w weekend. Programiści musieli nauczyć się pisać manifesty, operować kubectl, rozumieć concepty jak namespaces czy persistent volumes. Pierwsze tygodnie to było dużo pytań i niepewności.
Trzecim wyzwaniem było zarządzanie zmianą w zespole. Ludzie przyzwyczajeni do określonych procedur nagle musieli myśleć inaczej. “Dlaczego nie mogę się zalogować na serwer i ręcznie edytować pliku konfiguracyjnego?” - takie pytania padały codziennie. Zmiana mentalności trwała dłużej niż zmiana technologii.
Nieoczekiwaną korzyścią okazały się dynamiczne środowiska QA, ale gdybym robił to ponownie, poszedłbym jeszcze dalej. Obecnie DevOps musi ręcznie tworzyć nowe środowiska na żądanie. Z Kubernetes to możliwe było zautomatyzować - dodałbym full automat na przycisk z pull requesta. Developer tworzy PR, klika “Deploy to test env” i w 5 minut ma gotowe środowisko testowe. Bez angażowania DevOps, bez czekania, bez ręcznej roboty.
Kiedy bym nie wdrażał kubernetes?
Kiedy NIE warto podejmować takiej transformacji? Jeśli masz jeden lub dwa proste projekty, to Kubernetes może być przesadą. Docker Compose plus prosty CI/CD może wystarczyć. Kubernetes zaczyna się opłacać, gdy masz wiele aplikacji, złożone zależności i potrzebujesz wysokiej dostępności.
Druga sytuacja, kiedy bym tego nie robił: brak kompetencji DevOps w zespole i brak możliwości ich rozwinięcia. Kubernetes to nie jest narzędzie “postaw i zapomnij”. Wymaga ciągłego utrzymania, monitoringu, aktualizacji. Jeśli nie masz kogoś, kto może się tym zająć, lepiej zostań przy prostszych rozwiązaniach.
Trzeci przypadek: bardzo ograniczony budżet czasowy. Jeśli potrzebujesz rezultatów “na wczoraj”, to taka migracja nie jest dla ciebie. To inwestycja długoterminowa, która zwraca się po miesiącach, nie tygodniach.
Czy żałuję tej decyzji? Absolutnie nie. Czy zrobiłbym to samo jeszcze raz? Tak, ale mądrzej i z większą świadomością wyzwań, które czekają.
Podsumowanie - Od Chaosu do Kontroli
Transformacja od skryptów i docker-compose do w pełni zautomatyzowanego klastra Kubernetes to była jedna z najlepszych decyzji, jakie podjąłem jako lider technologiczny. Efekty? Trzykrotny wzrost efektywności, koniec nocnych deploymentów i zespół, który przestał bać się piątków.
Kubernetes okazał się nie być o skalowalności, ale o niezawodności. CI/CD w GitLab to inwestycja, która zwróciła się w miesiącach. Własna infrastruktura przy jasno zdefiniowanych potrzebach może być bardziej ekonomiczna niż cloud.
Najważniejsza lekcja? Nie musicie tak pracować. Deployment nie musi trwać dziesiątki godzin ani angażować pół zespołu. Zero downtime to dziś standard, nie luksus.
Potrzebujesz Pomocy?
Czy twój zespół wciąż budzi się w nocy przez deploymenty? Czy weekend to czas pracy zamiast odpoczynku?
Specjalizuję się w transformacji infrastruktury dla startupów i rosnących firm. Projektuję wysokodostępne klastry Kubernetes, automatyzuję procesy CI/CD i przeszkolę zespół tak, żeby był samodzielny po zakończeniu współpracy.
Nie sprzedaję gotowców. Każda firma ma swoje potrzeby. Ale gwarantuję solidne fundamenty, które będą działać przez lata.
Skontaktuj się ze mną, jeśli:
- Zarządzasz wieloma projektami i chcesz je ujednolicić
- Potrzebujesz wysokiej dostępności bez kosmicznych kosztów
- Szukasz kogoś, kto weźmie odpowiedzialność za rezultat
- Chcesz zbudować coś trwałego, nie tymczasowego
Przejdziemy przez wasz case razem - od diagnozy przez implementację po przekazanie wiedzy. Gotowi przejść od chaosu do kontroli? Napiszcie, a omówimy waszą transformację.