GitOps na VPS: przewidywalne wdrożenia bez wielkiej platformy
Nie potrzebujesz klastra zarządzanego przez zespół lub zewnętrznego dostawcę, żeby mieć dobry i stabilny proces wdrażania. GitOps działa też na pojedynczym VPS — i może mieć większą wartość, niż się wydaje.
GitOps kojarzy się z Kubernetesem, operatorami i sporą platformą. To skojarzenie jest mylące. Sednem GitOps nie jest konkretne narzędzie, tylko zasada: stan systemu jest opisany w repozytorium, a wdrożenie to doprowadzenie rzeczywistości do zgodności z tym opisem. Tę zasadę można zastosować równie dobrze na pojedynczym VPS z Dockerem.
Problem, który GitOps rozwiązuje
Typowy VPS po roku eksploatacji to przysłowiowy "gorący kartofel". Ktoś kiedyś wgrał obraz ręcznie, ktoś zmienił konfigurację nginx po SSH, a zmienne środowiskowe żyją w pliku, którego nie ma w żadnym repozytorium. Odtworzenie takiego serwera od zera bywa niemożliwe, bo nikt nie wie, jak dokładnie wygląda jego stan.
GitOps odwraca tę sytuację. Jeśli repozytorium jest źródłem prawdy, serwer przestaje być miejscem, w którym trzyma się wiedzę.
Minimalny model
Do sensownego GitOps na VPS wystarczą trzy elementy: repozytorium z deklaratywnym opisem stanu, rejestr obrazów oraz mechanizm, który synchronizuje stan na serwerze z repozytorium.
# compose.yaml — deklaratywny opis tego, co ma działać na serwerze
services:
api:
image: registry.example.com/app/api:${APP_VERSION}
restart: unless-stopped
env_file: [ .env ]
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health/ready"]
interval: 10s
retries: 3
labels:
- "com.centurylinklabs.watchtower.enable=true"
Wersja aplikacji nie jest wpisana na sztywno — pochodzi ze zmiennej, którą ustawia pipeline. Może to być konkretna wersja lub np. commit SHA. Dzięki temu wdrożenie sprowadza się do zmiany jednej wartości i synchronizacji np. poprzez wywołanie jednego skryptu na VPS.
Przepływ wdrożenia
Proces jest prosty i całkowicie prześledzalny w historii Gita:
- Pipeline buduje obraz i publikuje go w rejestrze z konkretnym tagiem (np. skrótem commita lub pełnym SHA).
- Pipeline zdalnie wyzwala skrypt umieszczony na VPS, wykorzystując do tego ograniczone uprawnienia SSH lub webhook.
- Docker na VPS pobiera obraz i wdraża kontener za pomocą np. "compose", uwzględniając healthcheck.
# Uproszczony krok synchronizacji uruchamiany na serwerze
git -C /srv/stack pull --ff-only
docker compose -f /srv/stack/compose.yaml up -d --remove-orphans
Każde wdrożenie zostawia ślad: wiadomo, kto, co i kiedy zmienił. Wycofanie zmiany to powrót do poprzedniego commita — nie ręczne „przypominanie sobie", co było wcześniej.
Największa zaleta GitOps na VPS nie jest techniczna. To fakt, że proces jest deterministyczny, a zespół ma nad nim kontrolę.
Czego to nie zastąpi
GitOps na VPS nie daje automatycznego skalowania ani samoregeneracji na poziomie klastra. Jeśli potrzebujesz wielu węzłów, automatycznego rozkładania obciążenia i wdrożeń typu "rolling" między replikami, to sygnał, że czas na Kubernetesa.
Dla większości mniejszych i średnich systemów ta granica jest jednak dużo dalej, niż się wydaje. Pojedynczy, dobrze opisany VPS potrafi obsłużyć zaskakująco dużo — pod warunkiem, że jego stan nie jest rozmyty w głowach wielu osób.
Podsumowanie
GitOps to dyscyplina, nie platforma. Wdrożona nawet w minimalnej formie na VPS, zamienia serwer z kruchego, ręcznie utrzymywanego bytu w coś przewidywalnego i odtwarzalnego. A przewidywalność jest dokładnie tym, czego oczekujemy od środowiska produkcyjnego.