Przejdź do głównej zawartości

Odzyskiwanie po awarii z AI

Odzyskiwanie po awarii w zespołach pracujących z AI obejmuje dwa promienie rażenia: zmianę wypuszczoną przez agenta, cofaną checkpointami, przyrostowymi commitami, feature flagami i celowanymi revertami, oraz infrastrukturę pod nią, odtwarzaną runbookami PITR dla Postgresa, kopiami Velero i przećwiczonym failoverem. Oba łączy jedna dyscyplina: zapisane cele odtwarzania, przećwiczona procedura i człowiek przy każdej nieodwracalnej bramce.

Agent AI właśnie zrefaktoryzował twój moduł uwierzytelniania w 47 plikach. Testy przechodzą, typy się zgadzają, scalasz. Dwie godziny później tokeny sesji nie są walidowane w API administracyjnym, trzy inne PR-y zostały scalone na wierzchu, a rollback nie jest już jednym kliknięciem. Miesiąc później przychodzi inna katastrofa: twój główny region gaśnie w trakcie wdrożenia, strona statusu wciąż świeci na zielono, bo nikt jej nie zaktualizował, a runbook to strona w Confluence edytowana ostatnio czternaście miesięcy temu, odwołująca się do hosta Postgresa wycofanego wiosną.

Inna skala, to samo pytanie — jak szybko wrócicie i ile stracicie po drodze? Odzyskiwanie po awarii to ten jeden obszar, w którym „napiszemy dokumentację później” po cichu zamienia się w „straciliśmy sześć godzin i kawałek danych klientów”. Dobra wiadomość: wolne, żmudne części — pisanie precyzyjnych runbooków, tworzenie eksperymentów chaosu, które naprawdę sprawdzają twoje RPO, utrwalanie bieżącego zachowania kodu, zanim agent go przepisze, zamiana bałaganiarskiej osi czasu w bezobwiniający post-mortem — to dokładnie to, w czym narzędzia AI są dobre, o ile zakotwiczysz je w prawdziwych narzędziach i utrzymasz człowieka przy bramce zatwierdzania.

  • Konfigurację siatek bezpieczeństwa dla wszystkich trzech narzędzi, żeby agent nie mógł wykonać zmiany w 47 plikach, której nie da się cofnąć
  • Prompt wymuszający adwersaryjny przegląd diffu agenta, polujący na ciche zmiany zachowania, których testy nie łapią
  • Procedury odzyskiwania po regresjach wprowadzonych przez AI na każdym etapie: przed scaleniem, po scaleniu i przy uszkodzeniu danych
  • Gotowy do wklejenia prompt, który zamienia twój stos w runbook point-in-time recovery dla Postgresa z jawnymi celami RTO/RPO i weryfikacją łańcucha WAL
  • Chaos Mesh Schedule, który co tydzień zabija pod głównej bazy i sprawdza failover przy RPO 5 minut — wygenerowany, a nie wyklepany z pamięci
  • Podręcznik z bramką ludzką na czas prawdziwej awarii regionu oraz prompt szkicujący bezobwiniający post-mortem z prawdziwych logów
  • Listę trybów awarii, które po cichu psują plany odzyskiwania, i sposób na złapanie ich, zanim zrobi to katastrofa

Plan odzyskiwania jest użyteczny tylko wtedy, gdy nazywa, z czego odzyskuje. Niemal wszystko, co idzie źle w zespole pracującym z AI, wpada do jednego z dwóch kubełków, a każdy z nich chce innych narzędzi:

  • Zmiana. Agent wprowadził regresję. Promień rażenia to commit, PR albo wdrożenie. Odzyskiwanie to checkpoint, revert, przełączenie feature flagi albo hotfix — mierzone w minutach i sprowadzające się do pytania, czy zmiana była na tyle mała, by dało się ją czysto cofnąć.
  • Infrastruktura. Zniknęła baza danych, region albo klaster. Promień rażenia to wszystko, co na nich stoi. Odzyskiwanie to restore albo failover — mierzone względem celów ustalonych z wyprzedzeniem i sprowadzające się do pytania, czy to przećwiczyliście.

Dyscyplina jest w obu przypadkach identyczna: zapisz cel przed incydentem, przećwicz procedurę, trzymaj człowieka przy każdym nieodwracalnym kroku i utrwal to, czego się nauczyliście. Reszta tego przewodnika prowadzi tę dyscyplinę na obu skalach.

Każdy artefakt DR poniżej zależy od dwóch liczb na poziom usługi: RTO (jak długo do przywrócenia usługi) i RPO (ile danych możesz stracić). Zapisz je jawnie, zanim cokolwiek wygenerujesz — runbook celujący w „szybkie odzyskanie” jest bezużyteczny, a ten celujący w „RTO 15 min, RPO 5 min dla płatności” da się przetestować.

Realistyczna macierz startowa wygląda tak:

PoziomPrzykładowe usługiRTORPOPodejście do kopii
Krytycznyauth, płatności15 min0–5 minReplika synchroniczna/strumieniowa + archiwizacja WAL
Wysokigłówne API1 godzina5 minArchiwizacja WAL + częste kopie bazowe
Średnifunkcje drugoplanowe4 godziny1 godzinaMigawki co godzinę
Niskinarzędzia wewnętrzne24 godziny24 godzinyKopie dzienne

Zapobieganie: siatka bezpieczeństwa, zanim agent zacznie

Dział zatytułowany „Zapobieganie: siatka bezpieczeństwa, zanim agent zacznie”

Najlepsze odzyskiwanie po awarii to takie, którego nie potrzebujesz. Każde narzędzie ma własne miejsce na reguły, a to właśnie reguły sprawiają, że duża zmiana prowadzona przez agenta pozostaje odwracalna.

System checkpointów Cursora daje automatyczne punkty powrotu:

  • Checkpointy to automatyczne migawki zmian Agenta w twoim kodzie
  • Aby się cofnąć, kliknij Restore Checkpoint przy odpowiednim wcześniejszym żądaniu albo przycisk + po najechaniu na wiadomość
  • Checkpointy są trzymane lokalnie i są niezależne od Gita — do trwałej kontroli wersji używaj Gita, nie checkpointów

Dodaj jawne reguły bezpieczeństwa:

.cursor/rules
SAFETY REQUIREMENTS:
Before any multi-file refactoring:
1. List all files that will be modified
2. Verify the test suite passes BEFORE making changes
3. After changes, run the full test suite
4. If any test fails, revert ALL changes and report what went wrong
NEVER delete files without explicit user confirmation.
NEVER modify configuration files (*.config.*, .env*, Dockerfile) without showing the diff first.

Kontrola typów i zielony zestaw testów to najsłabszy dowód, jaki masz na temat refaktoru agenta. Poproś o przegląd, który poluje na to, co one przepuszczają:

Zrób zmianę na tyle małą, by dało się ją cofnąć

Dział zatytułowany „Zrób zmianę na tyle małą, by dało się ją cofnąć”

Dwa nawyki robią dla odwracalności więcej niż jakiekolwiek narzędzia: commituj krokami, z których każdy przechodzi testy, i utrwal istniejące zachowanie w testach przed przepisaniem kodu.

Wdrażaj tak, by rollback był przełącznikiem, a nie alarmem pożarowym

Dział zatytułowany „Wdrażaj tak, by rollback był przełącznikiem, a nie alarmem pożarowym”
  1. Feature flagi dla zmian generowanych przez AI

    Wdrażaj zmiany wspomagane przez AI za feature flagami. Gdy coś pójdzie źle, przełącz flagę zamiast wycofywać wdrożenie.

  2. Wdrożenia kanarkowe

    Skieruj 5% ruchu na nową wersję. Monitoruj poziom błędów, opóźnienia i kluczowe metryki biznesowe przez 30 minut, zanim poszerzysz.

  3. Automatyczne wyzwalacze rollbacku

    Ustaw automatyczne wycofanie, gdy poziom błędów przekroczy 2x bazę albo opóźnienie p99 przekroczy 3x bazę.

  4. Monitoring po wdrożeniu

    Obserwuj dashboardy przez 4 godziny po wdrożeniu zmian generowanych przez AI. Tryby awarii kodu z AI są często subtelne — przypadki brzegowe i wyścigi, a nie wywrotki.

Najłatwiejsze odzyskiwanie, a zarazem to, w którym mechanika zależy od użytego narzędzia.

Użyj checkpointów Cursora, aby przywrócić ostatni dobry stan:

  1. Znajdź żądanie tuż przed psującą zmianą
  2. Kliknij przy nim Restore Checkpoint (albo przycisk + po najechaniu na tę wiadomość), aby wrócić do tego stanu
  3. Alternatywnie użyj Cmd+Z, aby cofnąć ostatnie edycje

Checkpointy są trzymane lokalnie i niezależnie od Gita, więc gdy potrzebujesz trwałego punktu powrotu, sięgnij po Gita.

Tu szybkość liczy się bardziej niż elegancja. Skieruj agenta na konkretny PR i zabroń mu poprawiania czegokolwiek po drodze:

Najgroźniejszy scenariusz i ten, w którym podręczniki na poziomie zmiany i infrastruktury się spotykają: naprawą jest odtworzenie z kopii.

  1. Zatamuj krwotok

    Wdróż rollback natychmiast. Nie próbuj naprawiać do przodu, gdy zagrożona jest integralność danych.

  2. Oceń szkody

    Odpytaj bazę o rekordy zmodyfikowane w oknie incydentu. Ustal zasięg uszkodzenia.

  3. Odtwórz z kopii

    Użyj poniższego runbooka point-in-time recovery, by przywrócić dotknięte dane do stanu sprzed incydentu.

  4. Analiza przyczyny źródłowej

    Ustal, który kod wygenerowany przez AI spowodował uszkodzenie. Brakująca walidacja? Złe zapytanie? Wyścig?

  5. Zapobiegnij powtórce

    Dodaj konkretne przypadki testowe dla tego trybu awarii. Dodaj ograniczenia w bazie, które wyłapią uszkodzenie na warstwie danych. Zaktualizuj reguły agenta, aby zapobiec podobnym wzorcom.

Najcenniejszym artefaktem DR dla większości zespołów jest runbook point-in-time recovery dla Postgresa, który dyżurny inżynier może wykonać o 3 nad ranem bez myślenia. Wzorzec, który naprawdę działa na produkcji, to archiwizacja WAL plus zewnętrzne narzędzie do kopii bazowychpgBackRest lub WAL-G — a nie funkcja plpgsql po stronie serwera. Odtwarzanie PITR ustawia restore_command i recovery_target_time i opiera się na nieprzerwanym łańcuchu WAL między kopią bazową a czasem docelowym.

Niech twoje narzędzie AI napisze runbook na podstawie twojej faktycznej konfiguracji, a nie ogólnego szablonu:

Czytaj krytycznie to, co powstanie. Dwie rzeczy, które AI najczęściej tu przekręca, to wymyślanie flag pgBackRest i prześlizgiwanie się nad sprawdzeniem luki w łańcuchu WAL — dokładnie tej awarii, która zostawia cię w połowie odtwarzania. Jeśli komenda wygląda nieznajomo, sprawdź ją w pgbackrest --help, zanim trafi do runbooka.

Sam runbook jest identyczny niezależnie od narzędzia — to plik Markdown w twoim repozytorium. Różni się to, jak prowadzisz generowanie i jak utrzymujesz go w zgodzie z rzeczywistością.

Otwórz runbook w edytorze i użyj trybu agenta, żeby Cursor mógł przeczytać twoje faktyczne pgbackrest.conf, docker-compose.yml i pliki migracji jako źródło prawdy, zamiast zgadywać nazwy hostów i stanz. Iteruj w miejscu: gdy krok wygląda źle, zaznacz go i poproś Cursora o poprawę tylko tego kroku. Ustaw checkpoint, zanim pozwolisz mu ruszyć wiele plików, żeby móc cofnąć złe przepisanie jednym kliknięciem.

To najszybsza pętla, gdy konfiguracja DR mieszka w tym samym repozytorium, które edytujesz, i chcesz widzieć diffy na bieżąco.

Baza danych rzadko jest całą historią. Dla obciążeń na Kubernetes Velero tworzy kopie zasobów klastra i wolumenów trwałych i to jego warto kazać skonfigurować asystentowi AI — a nie wymyślonej wewnętrznej usłudze kopii.

Dla obiektowych magazynów i zarządzanych baz danych wybieraj natywne funkcje dostawcy — replikację międzyregionową i point-in-time (na przykład automatyczne kopie RDS z PITR albo S3 Cross-Region Replication) — zamiast pisać własne. Poproś narzędzie AI o wygenerowanie dla nich Terraforma, a potem przejrzyj IaC tak samo, jak przejrzałeś runbook.

Nieprzetestowany plan DR to hipoteza. Najtańszy sposób ciągłego testowania failoveru to zaplanowany eksperyment Chaos Mesh, który zabija pod głównej bazy i sprawdza, czy system wraca w ramach zadeklarowanych celów. CRD Schedule (apiVersion: chaos-mesh.org/v1alpha1) uruchamia PodChaos typu pod-kill na cronie.

Wygenerowany manifest to łatwiejsza połowa. Runbook definiujący zaliczenie/oblanie względem twoich RTO/RPO to ta połowa, która nadaje próbie sens — bez niego tylko zabijasz pody i masz nadzieję. Traktuj przekroczone RTO w sobotniej próbie jak zgłoszenie P2, a nie ciekawostkę.

  1. Uruchamiaj próbę na klastrze staging odwzorowującym topologię produkcji, nigdy na żywym ruchu klientów.

  2. Zbieraj oś czasu automatycznie: czas zabicia, czas promocji, pierwszy udany zapis do nowego primary.

  3. Porównaj zmierzone RTO/RPO z celami i załóż zgłoszenie dla każdego przekroczenia.

  4. Podaj logi z próby prosto do promptu post-mortem poniżej, żeby luki zamieniły się w zadania, a nie zostały zapomniane do poniedziałku.

Gdy dzieje się naprawdę: podręcznik z bramką ludzką

Dział zatytułowany „Gdy dzieje się naprawdę: podręcznik z bramką ludzką”

W trakcie incydentu AI najlepiej służy do generowania i walidowania następnego działania — nigdy do odpalania nieodwracalnych komend prosto z wolnego tekstu. Trzymaj człowieka przy bramce zatwierdzania dla wszystkiego, co promuje replikę, przekierowuje DNS albo wyłącza zapisy.

W scenariuszu ransomware obowiązuje ta sama dyscyplina: użyj narzędzia, by znaleźć ostatnią czystą kopię sprzed szyfrowania i naszkicować reguły izolacji sieciowej, a wykonanie zostaw człowiekowi. Przydatne, konkretne wywołanie Claude Code:

Okno terminala
claude -p "Given the pgBackRest backup catalog in this repo's logs/ \
directory and the file-modification timeline in incident/timeline.csv, \
identify the most recent backup whose stop time precedes the first \
encryption event, and explain how you ruled out later backups." \
--allowedTools "Read,Grep"

Zwróć uwagę na bezgłową formę claude -p i listę dozwolonych narzędzi tylko do odczytu: to analizuje i rekomenduje, a nie odtwarza.

Obie skale zawodzą w przewidywalny sposób. Uważaj na te przypadki:

  • Luki w łańcuchu WAL. Reguły cyklu życia kubełka albo po cichu zawodzące archive_command wygaszają segmenty między kopią bazową a czasem docelowym. Odtwarzanie przerywa w połowie. Naprawa: runbook musi weryfikować ciągłość, a nie ją zakładać.
  • Opóźnienie replikacji przekracza RPO w najgorszym momencie. Przy skoku zapisów, który często poprzedza awarię, standby zostaje w tyle o minuty. Promocja traci więcej danych, niż pozwala twoje RPO. Naprawa: alertuj na opóźnienie względem liczby RPO, a krok failoveru niech sprawdza opóźnienie przed promocją.
  • Failover, który gubi zapisy. Promujesz standby, ale stary primary wciąż przyjmuje zapisy (split-brain) albo zapisy w locie nigdy się nie zreplikowały. Naprawa: pierwszym krokiem podręcznika jest zawsze wyłączenie zapisów na uszkodzonym primary, przed promocją.
  • Próba przechodzi, prawdziwa awaria nie. Staging ma 3 węzły, produkcja 30 i inną topologię. Naprawa: prowadź próby na klastrze odwzorowującym skalę produkcji i rotuj wstrzykiwaną awarię.
  • AI wymyśla flagi albo pola. Wygenerowana flaga pgBackRest albo pole Chaos Mesh, które nie istnieje, czyni artefakt nieuruchamialnym. Naprawa: zawsze waliduj wygenerowane komendy względem --help albo referencji CRD przed commitem — traktuj wynik AI jako szkic, nigdy jako ewangelię.
  • Nie da się cofnąć, bo inne zmiany zależą od kodu agenta. Właśnie to kupują ci przyrostowe commity. Jeśli problem wprowadził jeden commit, cofnij ten commit; jeśli zmiany są splątane, celowany hotfix bije rozplątywanie w trakcie incydentu.
  • Agent usunął pliki, których nikt nie zauważył przez tygodnie. Git cię ratuje: git log --diff-filter=D znajduje usunięte pliki, a git checkout <commit>^ -- <filepath> je przywraca. Dodaj sprawdzenie CI oznaczające usunięcia do dodatkowej uwagi w przeglądzie.
  • Strategia kopii nie pokrywa trybów awarii typowych dla AI. Kopie bazy i kod w Gicie pokrywają większość z nich. Unikalnym ryzykiem jest subtelna zmiana zachowania, która przechodzi każdą kontrolę — dlatego testy utrwalające zachowanie na ścieżkach krytycznych i wdrożenia za feature flagami należą do strategii kopii, a nie tylko do standardu kodowania.

Incydent nie kończy się, dopóki nauka nie zostanie utrwalona. AI jest naprawdę dobre w zamienianiu bałaganiarskiej osi czasu i ściany logów w ustrukturyzowany, bezobwiniający post-mortem — pod warunkiem że podasz mu prawdziwe artefakty.

Uruchom to z Claude Fable 5 (/model fable), gdy łańcuch przyczynowy jest splątany między usługami — jakość rozumowania jest warta kosztu w tym jednym dokumencie, który przeczytają wszyscy; przy ograniczonym budżecie zejdź na Opus 5. Trzymaj wynik w repozytorium obok runbooka, który ma poprawić, żeby kolejna próba testowała wnioski z ostatniego incydentu.