← Back to Docs

BACKUP DRILL REPORT

K0nsult CNC | AgroTony PostgreSQL | Fly.io Infrastructure

Informacje o drilu

Data wykonania
2026-03-21 (piatek)
Wykonawca
Claude Code (K0nsult Backup Agent)
Srodowisko
Fly.io / PostgreSQL 17.2 (Flex)
Ogolny status
WYMAGA DZIALANIA

Audyt infrastruktury Fly.io

AplikacjaTypStatusRegion
agrotonyApp (produkcja)deployedFRA
agrotony-dbPostgreSQL 17.2 FlexdeployedFRA
agrotony-devApp (dev)suspendedFRA
k0nsultAppdeployedFRA
gok-grlApp (Rails)suspended-
gok-grl-dbPostgreSQLdeployed-

Szczegoly bazy danych agrotony-db

ParametrWartosc
EnginePostgreSQL 17.2 (Flex) via flyio/postgres-flex:17.2
Rola maszynyPrimary (single node)
RegionFRA (Frankfurt)
Volumevol_4y5lzkydp35wzn9r — 1 GB (encrypted)
Uzycie dysku /data173 MB
Health checks3/3 passing
Bazy danychagrotony, agrotony_dev, postgres, repmgr
Uzytkownicyagrotony, agrotony_dev, flypgadmin, postgres, repmgr
Porty5432 (haproxy), 5433 (postgres direct), 9187 (exporter)
pg_dump dostepnyTak — v17.7

Status backupow — KRYTYCZNE USTALENIA

ElementStatusSzczegoly
Fly.io managed backups WYLACZONE Komenda fly pg backup list zwraca: "backups are not enabled"
Replikacja (replicas) BRAK Jeden node (primary only), brak standby
Point-in-time recovery (PITR) NIEDOSTEPNE Wymaga wlaczenia managed backups
Zewnetrzny backup (S3/GCS) BRAK Nie skonfigurowano eksportu na zewnetrzny storage
pg_dump reczny MOZLIWY pg_dump 17.7 dostepny na serwerze, mozna wykonac ad-hoc

Rekomendowane dzialania (priorytet)

  1. [P0 — NATYCHMIAST] Wlacz managed backups Fly.io:
    # Wlaczenie automatycznych backupow
    fly pg backup enable -a agrotony-db
    
    # Weryfikacja
    fly pg backup list -a agrotony-db
  2. [P0 — NATYCHMIAST] Wykonaj reczny backup teraz:
    # Proxy do bazy (w osobnym terminalu)
    fly proxy 15432:5432 -a agrotony-db
    
    # pg_dump przez proxy (nowy terminal)
    pg_dump "postgres://postgres:PASSWORD@localhost:15432/agrotony" \
      --format=custom --compress=9 \
      -f agrotony_backup_2026-03-21.dump
    
    # Alternatywnie: bezposrednio na serwerze
    fly ssh console -a agrotony-db -C \
      "pg_dump -h localhost -p 5433 -U postgres -Fc agrotony > /tmp/backup.dump"
  3. [P1 — TYDZIEN] Skonfiguruj cron backup do zewnetrznego storage (S3/GCS/Backblaze B2):
    # Przykladowy GitHub Action (codziennie o 3:00 UTC)
    name: Daily DB Backup
    on:
      schedule:
        - cron: '0 3 * * *'
    jobs:
      backup:
        runs-on: ubuntu-latest
        steps:
          - uses: superfly/flyctl-actions/setup-flyctl@master
          - run: |
              fly proxy 15432:5432 -a agrotony-db &
              sleep 5
              pg_dump "postgres://...@localhost:15432/agrotony" \
                --format=custom -f backup.dump
              aws s3 cp backup.dump s3://bucket/agrotony/$(date +%F).dump
  4. [P1 — TYDZIEN] Rozważ dodanie repliki read-only:
    fly machine clone MACHINE_ID --region fra -a agrotony-db
  5. [P2 — MIESIAC] Wdroż pełny DRP (Disaster Recovery Plan) z testowanym przywracaniem co kwartał.

Procedura przywracania (Restore)

Scenariusz A: Przywrocenie z managed backup (po wlaczeniu)

# Lista dostepnych backupow
fly pg backup list -a agrotony-db

# Przywrocenie do nowej instancji
fly pg backup restore BACKUP_ID -a agrotony-db --new-name agrotony-db-restored

# Po weryfikacji: przełącz app na nową bazę
fly secrets set DATABASE_URL="postgres://...@agrotony-db-restored.internal:5432/agrotony" -a agrotony

Scenariusz B: Przywrocenie z pg_dump

# 1. Proxy do bazy docelowej
fly proxy 15432:5432 -a agrotony-db

# 2. Stworz czysta baze (opcjonalne)
psql "postgres://postgres:PASSWORD@localhost:15432/postgres" \
  -c "CREATE DATABASE agrotony_restore;"

# 3. Przywroc z dumpa
pg_restore -h localhost -p 15432 -U postgres \
  -d agrotony_restore --clean --if-exists \
  agrotony_backup_2026-03-21.dump

# 4. Weryfikacja
psql "postgres://postgres:PASSWORD@localhost:15432/agrotony_restore" \
  -c "SELECT count(*) FROM information_schema.tables WHERE table_schema='public';"

# 5. Po weryfikacji: swap nazw baz (maintenance window!)
psql "postgres://postgres:PASSWORD@localhost:15432/postgres" <

Scenariusz C: Pelne odtworzenie (disaster)

# 1. Stworz nowa instancje PostgreSQL
fly pg create --name agrotony-db-new --region fra \
  --initial-cluster-size 1 --vm-size shared-cpu-1x \
  --volume-size 1

# 2. Przywroc backup
fly proxy 15432:5432 -a agrotony-db-new
pg_restore -h localhost -p 15432 -U postgres -d agrotony \
  agrotony_backup_2026-03-21.dump

# 3. Przełącz aplikację
fly secrets set DATABASE_URL="postgres://agrotony:PASS@agrotony-db-new.internal:5432/agrotony" -a agrotony

# 4. Restart aplikacji
fly apps restart agrotony

Checklista drilu backupowego

#KrokWynik
1Sprawdz czy baza jest onlineOK — 3/3 checks passing
2Zidentyfikuj bazy danychOK — 4 bazy: agrotony, agrotony_dev, postgres, repmgr
3Sprawdz rozmiar danychOK — 173 MB / 1 GB volume
4Sprawdz managed backupsFAIL — Backupy NIE SA wlaczone
5Sprawdz dostepnosc pg_dumpOK — pg_dump 17.7 dostepny
6Sprawdz replikacjeWARN — Brak replik, single node
7Sprawdz zewnetrzne backupyFAIL — Brak konfiguracji
8Sprawdz procedury restoreINFO — Udokumentowane w tym raporcie

Podsumowanie i decyzja

Status ogolny: BACKUP NIE JEST AKTYWNY

Baza danych agrotony-db (PostgreSQL 17.2, 173 MB danych) dziala poprawnie na Fly.io w regionie FRA. Jednak nie ma zadnego mechanizmu backupu — ani managed backups Fly.io, ani zewnetrznego eksportu, ani replikacji.

Kluczowe ryzyka:

Nastepny krok: Wykonaj fly pg backup enable -a agrotony-db i reczny pg_dump natychmiast.