- Krok 9 (tmux): tee -> tee -a (nie nadpisuj configu), dodano focus-events on, poprawiono nazwę sesji na "bootstrap" - Krok 10: struktura katalogów odzwierciedla stan faktyczny (/srv i /srv/infra już istnieją, brakuje apps i data) - Krok 12: Claude Code oznaczony jako wykonany 20-08-2026, instalator natywny bez Node.js - Nowy Krok 14: audyt po bootstrapie (SSH, ufw, fail2ban, unattended-upgrades, swap, Docker, porty, klucze) - HANDOFF.md: poprawiona numeracja sekcji 6
4.2 KiB
Runbook 50 — awaria i rollback
Do czytania, gdy coś nie działa. Zasada nadrzędna: najpierw diagnoza, potem zmiany. Chaotyczne restartowanie wszystkiego zaciera ślady i zamienia jeden problem w trzy.
Kolejność diagnozy
Idź od zewnątrz do środka. Zatrzymaj się na pierwszym kroku, który zawiedzie — tam jest problem, dalej nie ma sensu szukać.
# 1. Czy maszyna żyje?
ping <IP>
ssh ubuntu@<IP>
# 2. Czy nie brakuje zasobów? (najczęstsza przyczyna)
df -h /
free -h
uptime
# 3. Czy Docker działa?
sudo systemctl status docker
docker ps
# 4. Czy Traefik żyje?
docker logs traefik --tail=50
# 5. Czy konkretna usługa żyje?
cd /srv/apps/<projekt>
docker compose ps
docker compose logs --tail=100
Typowe przyczyny, w kolejności prawdopodobieństwa
| Objaw | Sprawdź najpierw |
|---|---|
| Wszystko przestało działać naraz | df -h — pełny dysk zatrzymuje wszystko |
| Jedna usługa w restart loop | docker compose logs — zwykle brak zmiennej w .env lub zajęty port |
| 502 z Traefika | kontener działa, ale zły port w labelu loadbalancer.server.port |
| 404 z Traefika | zła reguła Host() albo brak traefik.enable=true |
| Błąd certyfikatu | logi Traefika, klucze API OVH, limity Let's Encrypt |
| Usługa wolna, serwer obciążony | docker stats — który kontener zjada CPU/RAM |
| Kontener zabity bez śladu | OOM killer: dmesg -T | grep -i oom |
Pełny dysk — najczęstsza awaria tej maszyny
Przy 100 GB to realne ryzyko. Objawy bywają mylące: bazy przestają zapisywać, Docker nie startuje kontenerów, logi się urywają.
df -h /
sudo du -h --max-depth=1 /var | sort -hr | head
sudo du -h --max-depth=1 /srv | sort -hr | head
docker system df
Szybkie odzyskanie miejsca, od najbezpieczniejszego:
sudo journalctl --vacuum-size=200M
docker builder prune -f
docker image prune -a -f
Dopiero potem szukaj przyczyny — zwykle jest to jeden kontener logujący bez limitu
albo rosnąca baza. Limity logów są w /etc/docker/daemon.json.
Rollback
Poziom 1 — konfiguracja usługi
cd /srv/apps/<projekt>
git log --oneline -10
git revert <commit>
docker compose up -d
Poziom 2 — wersja obrazu
Cofnij tag w compose.yaml do poprzedniej działającej wersji, docker compose up -d.
Dlatego przypinamy wersje — z :latest nie masz do czego wrócić.
Poziom 3 — snapshot OVH
Przywrócenie snapshota cofa całą maszynę do stanu z chwili jego zrobienia. Wszystko, co powstało później — inne projekty, dane, commity — znika.
Zanim to zrobisz:
- Czy problem faktycznie wymaga cofnięcia całej maszyny?
- Co powstało od czasu snapshota i czego nieodwracalnie stracisz?
- Czy dasz radę wyciągnąć potrzebne dane przed przywróceniem?
- Data snapshota — jest w
SERVER.md
To ostateczność. W większości przypadków szybciej jest naprawić usługę.
Odzyskanie dostępu po zablokowaniu SSH
Jeśli błąd w sshd_config albo ufw odciął Cię od maszyny:
- Panel OVH → Twój VPS → konsola KVM
- Logowanie jako
rootlububuntu(dlategoubuntuma ustawione hasło — przez konsolę klucz SSH nie pomoże) - Napraw konfigurację,
sudo sshd -t, restart usługi - Test z zewnątrz przed zamknięciem konsoli
To jest powód, dla którego przy każdej zmianie w SSH trzymamy otwartą drugą sesję.
Utrata Gitei
Gitea stoi na tym samym serwerze, którym zarządza — więc jej awaria zabiera kod i konfigurację naraz. Dlatego:
- repo
infrajest zmirrorowane na prywatne repo GitHuba - na maszynie zawsze jest aktualna kopia robocza
/srv/infra - odtworzenie: sklonuj
infraz GitHuba, postaw Traefika i Gitea z00-bootstrap.md, krok 13, przywróć dane repozytoriów z backupu
Jeśli mirror na GitHub nie jest jeszcze skonfigurowany — to najpilniejsza rzecz
z listy braków w SECURITY.md.
Po każdej awarii
- Wpis w dzienniku zmian w
SERVER.md: co się stało, co pomogło - Jeśli przyczyna była systemowa — dopisz punkt kontrolny do
40-utrzymanie.md - Jeśli dało się temu zapobiec regułą — dopisz ją do
CLAUDE.md
Runbooki mają rosnąć razem z doświadczeniem. Awaria, z której nic nie wynikło dla dokumentacji, powtórzy się.