Zarządzanie kopiami zapasowymi
Dokumentacja dla administratorów systemu Ready4Docs
Ostatnia aktualizacja: 2025-12-28
Spis treści
Dział zatytułowany „Spis treści”- Przegląd systemu backupu
- Konfiguracja
- Harmonogram automatyczny
- Ręczne zarządzanie
- Przywracanie z backupu
- Monitorowanie
- Rozwiązywanie problemów
Przegląd systemu backupu
Dział zatytułowany „Przegląd systemu backupu”Architektura
Dział zatytułowany „Architektura”┌─────────────────────────────────────────────────────────────────┐│ System Backup Ready4Docs │├─────────────────────────────────────────────────────────────────┤│ ││ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ ││ │ PostgreSQL │───▶│ pg_dump │───▶│ /home/ready4docs │ ││ │ (Docker) │ │ (gzip) │ │ /backup/db/ │ ││ └──────────────┘ └──────────────┘ └──────────────────┘ ││ ││ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ ││ │ .env │───▶│ cp │───▶│ /home/ready4docs │ ││ │ configs │ │ │ │ /backup/config/ │ ││ └──────────────┘ └──────────────┘ └──────────────────┘ ││ ││ ┌──────────────────────────────────────────────────────────┐ ││ │ Systemd Timers: │ ││ │ • ready4docs-backup.timer → 03:00 daily │ ││ │ • ready4docs-backup-cleanup.timer → 04:00 daily (30 dni) │ ││ └──────────────────────────────────────────────────────────┘ ││ │└─────────────────────────────────────────────────────────────────┘Co jest backupowane
Dział zatytułowany „Co jest backupowane”| Element | Lokalizacja źródłowa | Częstotliwość | Retencja |
|---|---|---|---|
| Baza danych PostgreSQL | Docker: ready4docs-db | Codziennie 03:00 | 30 dni |
Konfiguracja .env | /home/ready4docs/public_html/backend/.env | Codziennie 03:00 | 30 dni |
Lokalizacja backupów
Dział zatytułowany „Lokalizacja backupów”/home/ready4docs/backup/├── db/ # Backupy bazy danych│ ├── ready4docs_20251228_030000.sql.gz│ ├── ready4docs_20251227_030000.sql.gz│ └── ...├── config/ # Backupy konfiguracji│ ├── backend.env.20251228_030000│ └── ...├── full/ # Pełne backupy (ręczne)├── weekly/ # Backupy tygodniowe├── monthly/ # Backupy miesięczne└── temp/ # Pliki tymczasoweKonfiguracja
Dział zatytułowany „Konfiguracja”Pliki konfiguracyjne
Dział zatytułowany „Pliki konfiguracyjne”| Plik | Opis |
|---|---|
/home/ready4docs/public_html/scripts/backup.sh | Główny skrypt backupu |
/home/ready4docs/public_html/backend/config/backup.php | Konfiguracja Laravel |
/etc/systemd/system/ready4docs-backup.service | Usługa systemd |
/etc/systemd/system/ready4docs-backup.timer | Timer systemd |
Zmienne środowiskowe
Dział zatytułowany „Zmienne środowiskowe”Skrypt backup.sh odczytuje ustawienia z /home/ready4docs/public_html/backend/.env:
# Opcjonalne nadpisanie w środowiskuBACKUP_ROOT=/home/ready4docs/backup # Katalog backupówDB_CONTAINER=ready4docs-db # Nazwa kontenera DockerDB_NAME=ready4docs # Nazwa bazyDB_USER=ready4docs # Użytkownik bazyDB_HOST=127.0.0.1 # Host bazyDB_PORT=5433 # Port bazyKonfiguracja retencji
Dział zatytułowany „Konfiguracja retencji”Edytuj /home/ready4docs/public_html/backend/config/backup.php:
return [ 'retention_days' => env('BACKUP_RETENTION_DAYS', 30), // Dni przechowywania 'max_backups' => env('BACKUP_MAX_COUNT', 10), // Max liczba backupów 'compress' => env('BACKUP_COMPRESS', true), // Kompresja gzip];Harmonogram automatyczny
Dział zatytułowany „Harmonogram automatyczny”Aktywne timery
Dział zatytułowany „Aktywne timery”# Sprawdź status timerówsudo systemctl list-timers | grep ready4docs| Timer | Godzina | Opis |
|---|---|---|
ready4docs-backup.timer | 03:00 | Backup bazy danych i konfiguracji |
ready4docs-backup-cleanup.timer | 04:00 | Usuwanie backupów starszych niż 30 dni |
Zarządzanie harmonogramem
Dział zatytułowany „Zarządzanie harmonogramem”# Włącz automatyczne backupysudo systemctl enable ready4docs-backup.timersudo systemctl start ready4docs-backup.timer
# Wyłącz automatyczne backupysudo systemctl stop ready4docs-backup.timersudo systemctl disable ready4docs-backup.timer
# Zmień godzinę backupu (edytuj timer)sudo systemctl edit ready4docs-backup.timerPrzykład zmiany godziny na 02:00:
[Timer]OnCalendar=*-*-* 02:00:00Po edycji:
sudo systemctl daemon-reloadsudo systemctl restart ready4docs-backup.timerRęczne zarządzanie
Dział zatytułowany „Ręczne zarządzanie”Wykonaj backup teraz
Dział zatytułowany „Wykonaj backup teraz”# Uruchom backup natychmiastsudo systemctl start ready4docs-backup.service
# Lub bezpośrednio skryptemBACKUP_ROOT=/home/ready4docs/backup /home/ready4docs/public_html/scripts/backup.shLista backupów
Dział zatytułowany „Lista backupów”# Pokaż wszystkie backupy bazy danychls -lah /home/ready4docs/backup/db/
# Pokaż 10 najnowszychls -lt /home/ready4docs/backup/db/*.sql.gz | head -10
# Rozmiar całkowity backupówdu -sh /home/ready4docs/backup/Usuń stare backupy ręcznie
Dział zatytułowany „Usuń stare backupy ręcznie”# Usuń backupy starsze niż 7 dnifind /home/ready4docs/backup/db -name "*.sql.gz" -mtime +7 -delete
# Usuń konkretny backuprm /home/ready4docs/backup/db/ready4docs_20251225_030000.sql.gzSkopiuj backup na zewnętrzny serwer
Dział zatytułowany „Skopiuj backup na zewnętrzny serwer”# SCP do zdalnego serwerascp /home/ready4docs/backup/db/ready4docs_20251228_*.sql.gz user@backup-server:/backups/
# Rsync (dla regularnej synchronizacji)rsync -avz /home/ready4docs/backup/ user@backup-server:/backups/ready4docs/Przywracanie z backupu
Dział zatytułowany „Przywracanie z backupu”⚠️ UWAGA
Dział zatytułowany „⚠️ UWAGA”Przywracanie nadpisuje wszystkie dane w bazie!
Przed przywróceniem:
- Upewnij się, że masz backup aktualnych danych
- Poinformuj użytkowników o planowanej przerwie
- Zatrzymaj aplikację
Procedura przywracania
Dział zatytułowany „Procedura przywracania”1. Zatrzymaj aplikację
Dział zatytułowany „1. Zatrzymaj aplikację”# Zatrzymaj PHP-FPM i kolejkisudo systemctl stop php8.4-fpmsudo docker stop readynextos-queue readynextos-reverb2. Wybierz backup do przywrócenia
Dział zatytułowany „2. Wybierz backup do przywrócenia”# Lista dostępnych backupówls -lt /home/ready4docs/backup/db/*.sql.gz
# Sprawdź rozmiar i datęls -lah /home/ready4docs/backup/db/ready4docs_20251228_030000.sql.gz3. Przywróć bazę danych
Dział zatytułowany „3. Przywróć bazę danych”# Metoda 1: Przywrócenie z kompresji (zalecane)gunzip -c /home/ready4docs/backup/db/ready4docs_20251228_030000.sql.gz | \ docker exec -i ready4docs-db psql -U ready4docs ready4docs
# Metoda 2: Rozpakuj najpierw, potem przywróćgunzip -k /home/ready4docs/backup/db/ready4docs_20251228_030000.sql.gzdocker exec -i ready4docs-db psql -U ready4docs ready4docs < \ /home/ready4docs/backup/db/ready4docs_20251228_030000.sql4. Weryfikacja
Dział zatytułowany „4. Weryfikacja”# Sprawdź czy baza działadocker exec ready4docs-db psql -U ready4docs -c "SELECT COUNT(*) FROM users;"
# Sprawdź integralnośćcd /home/ready4docs/public_html/backendphp artisan tinker --execute="echo 'Users: ' . \App\Models\User::count();"5. Uruchom aplikację
Dział zatytułowany „5. Uruchom aplikację”# Uruchom usługisudo systemctl start php8.4-fpmsudo docker start readynextos-queue readynextos-reverb
# Wyczyść cachecd /home/ready4docs/public_html/backendphp artisan cache:clearphp artisan config:clearPrzywracanie pojedynczej tabeli
Dział zatytułowany „Przywracanie pojedynczej tabeli”# 1. Rozpakuj backupgunzip -k /home/ready4docs/backup/db/ready4docs_20251228_030000.sql.gz
# 2. Wyodrębnij tabelę (np. users)grep -A 10000 "COPY public.users" ready4docs_20251228_030000.sql | \ grep -m 1 -B 10000 "^\\\." > users_only.sql
# 3. Przywróć tylko tę tabelędocker exec -i ready4docs-db psql -U ready4docs ready4docs < users_only.sqlPrzywracanie do innej bazy (testowej)
Dział zatytułowany „Przywracanie do innej bazy (testowej)”# 1. Utwórz testową bazędocker exec ready4docs-db psql -U ready4docs -c "CREATE DATABASE ready4docs_test;"
# 2. Przywróć do testowej bazygunzip -c /home/ready4docs/backup/db/ready4docs_20251228_030000.sql.gz | \ docker exec -i ready4docs-db psql -U ready4docs ready4docs_test
# 3. Po testach usuńdocker exec ready4docs-db psql -U ready4docs -c "DROP DATABASE ready4docs_test;"Monitorowanie
Dział zatytułowany „Monitorowanie”Sprawdź status ostatniego backupu
Dział zatytułowany „Sprawdź status ostatniego backupu”# Logi ostatniego backupujournalctl -u ready4docs-backup.service -n 50
# Status usługisudo systemctl status ready4docs-backup.serviceSprawdź czy backup się wykonał
Dział zatytułowany „Sprawdź czy backup się wykonał”# Sprawdź czy dzisiejszy backup istniejeTODAY=$(date +%Y%m%d)ls -la /home/ready4docs/backup/db/*${TODAY}*.sql.gz
# Jeśli brak - sprawdź logi błędówjournalctl -u ready4docs-backup.service --since todayAlerty (opcjonalne)
Dział zatytułowany „Alerty (opcjonalne)”Dodaj do /home/ready4docs/public_html/scripts/backup.sh na końcu:
# Wyślij powiadomienie email po backupieBACKUP_FILE=$(ls -t /home/ready4docs/backup/db/*.sql.gz | head -1)BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)echo "Backup completed: $BACKUP_FILE ($BACKUP_SIZE)" | \ mail -s "Ready4Docs Backup OK" admin@example.comRozwiązywanie problemów
Dział zatytułowany „Rozwiązywanie problemów”Backup nie wykonuje się
Dział zatytułowany „Backup nie wykonuje się”# 1. Sprawdź czy timer jest aktywnysudo systemctl status ready4docs-backup.timer
# 2. Sprawdź logijournalctl -u ready4docs-backup.service -n 100
# 3. Uruchom ręcznie z debugowaniemBACKUP_ROOT=/home/ready4docs/backup bash -x /home/ready4docs/public_html/scripts/backup.shBłąd połączenia z bazą
Dział zatytułowany „Błąd połączenia z bazą”# Sprawdź czy kontener działadocker ps | grep ready4docs-db
# Sprawdź połączeniedocker exec ready4docs-db pg_isready -U ready4docs
# Restart konteneradocker restart ready4docs-dbBrak miejsca na dysku
Dział zatytułowany „Brak miejsca na dysku”# Sprawdź miejscedf -h /home/ready4docs/backup
# Usuń stare backupyfind /home/ready4docs/backup/db -name "*.sql.gz" -mtime +7 -delete
# Sprawdź największe plikidu -sh /home/ready4docs/backup/db/* | sort -rh | head -10Uszkodzony backup
Dział zatytułowany „Uszkodzony backup”# Sprawdź integralność gzipgzip -t /home/ready4docs/backup/db/ready4docs_20251228_030000.sql.gzecho $? # 0 = OK, 1 = uszkodzony
# Jeśli uszkodzony - użyj poprzedniego backupuls -lt /home/ready4docs/backup/db/*.sql.gz | head -5Przywracanie po awarii bazy (WAL corruption)
Dział zatytułowany „Przywracanie po awarii bazy (WAL corruption)”Jeśli baza danych uległa uszkodzeniu (np. błędy WAL):
# 1. Zatrzymaj kontenerdocker stop ready4docs-db
# 2. Usuń uszkodzone dane (UWAGA: nieodwracalne!)sudo rm -rf /home/ready4docs/postgres-data/data/pgdata/*
# 3. Uruchom kontener (utworzy nową bazę)docker start ready4docs-dbsleep 10
# 4. Przywróć z ostatniego backupugunzip -c /home/ready4docs/backup/db/OSTATNI_BACKUP.sql.gz | \ docker exec -i ready4docs-db psql -U ready4docs ready4docs
# 5. Uruchom migracjecd /home/ready4docs/public_html/backendphp artisan migrate --forceChecklist administratora
Dział zatytułowany „Checklist administratora”Codzienny
Dział zatytułowany „Codzienny”- Sprawdź czy backup z poprzedniej nocy istnieje
- Sprawdź logi błędów:
journalctl -u ready4docs-backup.service --since yesterday
Tygodniowy
Dział zatytułowany „Tygodniowy”- Sprawdź miejsce na dysku:
df -h /home/ready4docs/backup - Zweryfikuj losowy backup:
gzip -t /home/ready4docs/backup/db/PLIK.sql.gz - Skopiuj najnowszy backup na zewnętrzny serwer
Miesięczny
Dział zatytułowany „Miesięczny”- Wykonaj test przywracania do testowej bazy
- Przejrzyj retencję i usuń niepotrzebne backupy
- Zaktualizuj dokumentację jeśli zmieniła się konfiguracja
Kontakt
Dział zatytułowany „Kontakt”W przypadku problemów z backupami:
- Sprawdź tę dokumentację
- Przejrzyj logi:
journalctl -u ready4docs-backup.service - Skontaktuj się z zespołem DevOps