Restart i recovery¶
Procedury kolejnych poziomów eskalacji: pojedynczy serwis → cały kontener → reboot hosta → restore z backupu → host-son standby. Zawsze zaczynaj od najmniejszego kroku.
Krótko
- Pojedynczy serwis:
incus exec <container> -- docker compose -f /root/dapps/<service>/compose.yaml restart(per-usługa: Inwentarz Usług). - Cały kontener Incus:
incus restart <container>na hoście. - Reboot hosta:
ssh aio-{mom,dad,son} sudo reboot. Last resort dla pojedynczego hosta — kontenery wracają same. - Restore z backupu: gdy serwis działa ale dane są zepsute / utracone → patrz Backupy.
- host-son aktywacja: gdy host-mom + host-dad jednocześnie down → patrz niżej.
Diagnostyka — czy serwis jest niezdrowy?¶
Przed restartem zorientuj się, co się dzieje. Nie restartuj na ślepo.
1. Beszel — pierwsze spojrzenie¶
beszel.aiofactory.pl (login w Bitwardenie, panel-aio / beszel-admin).
Sygnały, że coś jest nie tak:
| Sygnał | Co znaczy |
|---|---|
| Czerwony badge Down przy hoście | Host nieosiągalny — netbird drop, sieć, hardware. Eskalacja od razu. |
| Czerwony badge przy kontenerze Docker | Kontener Exited lub Restarting w pętli. |
| Dysk > 90 % | Backupy się sypią, logi rosną — wyczyść lub powiększ wolumen. |
| RAM > 95 % stały | OOM killer już mógł zabić procesy. Sprawdź dmesg. |
| CPU 100 % przez >30 min | Pętla / wyciek wątków. Restart serwisu zwykle pomaga. |
2. Konkretne symptomy + reakcja¶
| Symptom (operator widzi) | Najpewniejsza przyczyna | Pierwszy strzał |
|---|---|---|
panel.aiofactory.pl zwraca 502 |
Kontener panel (dashboard) restartowany — Convex/dashboard albo windmill server |
ssh aio-dad incus exec panel -- docker compose ps → szukaj Exited |
panel ładuje się, ale „Brak danych" wszędzie |
Convex backend down lub dashboard nie ma admin keya | Beszel → convex-backend health; curl https://convex.aiofactory.pl/version |
| Synchronizacje marketplace stoją | Windmill workery zatrzymane / kolejka pełna | wmill job list --running --limit 50 z lokalnej stacji; incus exec panel -- docker compose ps windmill-worker-* |
| Mailcow nie wysyła wiadomości | Zwykle DNS/DKIM albo dovecot/postfix down | incus exec email -- docker compose ps na host-mom |
Sklep buyspace.pl 503 |
WP-FPM down albo MariaDB | incus exec web -- docker compose ps na host-mom |
| Backupy starsze niż 25 h | Backrest crash albo plan disabled | backrest.aiofactory.pl UI; wmill script run f/infra/backup_health_monitor |
3. Logi — przed restartem zerknij co krzyczy¶
ssh aio-<host>
sudo incus exec <container> -- bash -c 'cd /root/dapps && docker compose logs --tail=200 <service>'
Jeśli logi pokazują znany błąd (np. out of memory, connection refused to 127.0.0.1:5432) — nie restartuj na chybił trafił, napraw przyczynę.
Poziom 1 — restart pojedynczego serwisu (Docker compose)¶
Najtańsza i najczęstsza akcja. Per-serwis komendy w Inwentarzu Usług — ta sekcja pokazuje wzorzec.
Kontenery na host-dad / panel¶
ssh aio-dad
# Restart jednego serwisu (np. windmill-server po zmianie envs)
sudo incus exec panel -- bash -c "cd /root/dapps && docker compose restart windmill-server"
# Restart całego stosu (panel + convex + windmill + dashboard)
sudo incus exec panel -- bash -c "cd /root/dapps && docker compose restart"
Kontenery na host-mom / services¶
ssh aio-mom
sudo incus exec services -- bash -c "cd /root/dapps/listmonk && docker compose restart"
sudo incus exec services -- bash -c "cd /root/dapps/postiz && docker compose restart"
# itd. — każdy serwis ma własny katalog /root/dapps/<service>/
Mailcow — wieloserwisowy¶
ssh aio-mom
sudo incus exec email -- bash -c "cd /root/dapps/mailcow-dockerized && docker compose restart"
Mailcow restart trwa ~30s (ClamAV ładuje sygnatury). Wstrzymaj fetch IMAP w panelu Konfiguracja jeśli planujesz długi przestój.
Restart panelu (dashboard)¶
ssh aio-dad
sudo incus exec panel -- bash -c "cd /root/dapps && docker compose restart panel"
# albo, jeśli zmieniłeś sekrety w env:
sudo incus exec panel -- bash -c "cd /root/dapps && docker compose up -d --force-recreate panel"
Poziom 2 — restart całego kontenera Incus¶
Gdy poziom 1 nie wystarcza (np. caddy zwraca 502 niezależnie od serwisów wewnątrz, networking incusowy się zaciął):
ssh aio-<host>
sudo incus list # zobacz aktywne
sudo incus restart <container> # graceful — wysyła SIGTERM, czeka 30s, SIGKILL
sudo incus restart --force <container> # twardy restart, jeśli graceful zawiódł
Po restarcie kontenery Dockera w środku startują w kolejności z compose.yaml (depends_on). Czas: ~60s do pełnego zdrowia (Caddy + Postgres + serwis aplikacji).
Restart panel nie wymusza restartu Convexa lub Windmilla
Te trzy są w jednym kontenerze incus (panel na host-dad), ale to osobne usługi compose. incus restart panel restartuje wszystko naraz — co bywa ostry kij dla Convexa (DB stan w wolumenie). Wolisz pojedyncze docker compose restart <service> — patrz Poziom 1.
Poziom 3 — reboot hosta NixOS¶
Cały serwer fizyczny. Robisz to gdy kontenery wstają zepsute po incus restart, hardware sygnalizuje błędy w dmesg, albo jądro / sterownik wymaga przeładowania.
ssh aio-<host> sudo reboot
# host-mom / host-dad: ~3 min do pełnego zdrowia (BIOS POST + NixOS boot + incus + kontenery)
Po reboocie:
ssh aio-<host>— sprawdź, że SSH wraca.sudo incus list— wszystkie konteneryRUNNING.- Beszel → host green badge.
- Test funkcjonalny:
curl -I https://panel.aiofactory.pl(z lokalnej stacji),curl -I https://mail.aiofactory.pl.
Reboot host-mom — przerwa pocztowa
email kontener (Mailcow) wraca jako ostatni (~2 min). W tym czasie SMTP odbiera tymczasowe 421 try later — Gmail / pozostali wysyłający spróbują ponownie sami. Ale jeśli reboot trwa >10 min, możesz zacząć tracić maile (sender retries się kończą). Plan duże okno — między 03:00 a 06:00 ruch minimalny.
Poziom 4 — restore z backupu¶
Gdy stan danych jest zepsuty (corruption, accidental delete, schema mismatch), nie pomaga restart.
Pełna procedura per usługa: Backupy → Per-service runbooks. Skrót decyzji:
| Co restorować | Czas | Scenariusz |
|---|---|---|
| Pojedyncza tabela Convex | ~5 min | Operator usunął przez pomyłkę kluczowe dokumenty |
| Cały Convex DB | ~30 min | Korupcja schema, niezgrane migracje |
| Mailcow (skrzynki) | ~1 h | Akcydentalne usunięcie skrzynki, atak ransomware |
| WordPress (master / eu / de) | ~30 min | Zhackowany WP, przywrócenie do daty pre-attack |
| Windmill DB | ~15 min | Korupcja kolejki jobów, „zalany" stan |
Poziom 5 — host-son aktywacja (last resort)¶
host-son (OVH baremetal) jest w stanie standby — sprzęt skonfigurowany, NixOS zainstalowany, Incus + Docker — ale rutynowo nie obsługuje produkcji.
Aktywacja host-son to akt eskalacji — koszty i czas
Pełna replikacja stanu z host-mom + host-dad to godziny pracy:
- Restore Convex DB z B2 (
restic restore~20 min dla snapshot ~5 GB). - Restore Mailcow z B2 (~45 min — skrzynki + ClamAV signatures).
- Restore WordPress instancji (~30 min × 4 sklepy).
- Przepięcie IP failover OVH z host-mom/host-dad → host-son (kilka minut).
- Update DNS records (TTL 300s minimum).
- Wyłączenie scheduledów Windmill na czas restore'u (żeby nie pisały do na wpół zsynchronizowanego stanu).
Aktywuj host-son tylko gdy host-mom + host-dad są oba niedostępne (pożar w DC Hetzner + OVH jednocześnie — bardzo nieprawdopodobne). W innych przypadkach — repair na żywym hoście.
Procedura wysokopoziomowa — szczegóły przygotowane jako runbook w infra/host-son/ (osobne repo infra):
- SSH do
aio-son→ checkincus list. Standardowe kontenery: bare NixOS + incus. - Restore z B2 → najnowsze snapshoty per kontener (patrz
infra/host-son/restore.md). - Update Caddy config — point reverse-proxy na lokalne kontenery host-son.
- Update DNS A-records (provider: first-ns.de) — wskaż na host-son IP.
- OVH IP failover — przepnij z host-dad na host-son (panel OVH).
- Czekaj na DNS propagację (max 5 min jeśli TTL=300s).
- Smoke test:
panel.aiofactory.pl,mail.aiofactory.pl, każdy*.buyspace.pl.
Serwery → host-son — wysokopoziomowy opis filozofii „trzeciej linii obrony".
Awaria sieci — diagnostyka¶
Niektóre objawy „panel down" tak naprawdę są problemami sieciowymi, nie aplikacyjnymi.
# Z lokalnej stacji
ping -c 3 panel.aiofactory.pl # ICMP
curl -I --connect-timeout 5 https://panel.aiofactory.pl # TCP+TLS handshake
dig panel.aiofactory.pl # DNS resolution
mtr -n panel.aiofactory.pl # routing path
Jeśli dig zwraca pusty wynik — problem z DNS (ns1.first-ns.de albo Hetzner DNS).
Jeśli dig OK ale curl timeoutuje — problem z routingiem / firewallem hosta.
Jeśli curl zwraca 502/503 — kontener nie odpowiada Caddy'emu, restart kontenera (Poziom 1).
Netbird mesh-VPN (netbird.aiofactory.pl) musi być up żebyś dostał się do narzędzi wewnętrznych (Beszel, Backrest, Forgejo). Sprawdź klienta lokalnie: netbird status na laptopie operatora.
Powiązane¶
- Inwentarz Usług — pełna tabela kontener/serwis/restart-komenda.
- Backupy — gdy Poziom 4 (restore).
- Monitoring i Backupy — wysokopoziomowy obraz Beszela + harmonogramy backupów.
- On-call i eskalacja — kogo i kiedy pingować zamiast samemu walczyć.