Przykładowy scenariusz (hipotetyczny): Jordan administruje małym serwerem Nextcloud w systemie Ubuntu. Pliki aplikacji znajdują się w /var/www/nextcloud, pliki użytkowników w /srv/nextcloud-data, MariaDB przechowuje bazę danych Nextcloud, a zewnętrzny host Linux jest dostępny przez SSH. Jordan potrzebuje nocnej kopii zapasowej, którą można przeglądać i przywracać, a nie tylko wpisu cron, który działa bez błędów.
Ten przykład przedstawia Jordanowi powtarzalny przepływ pracy Restic i cron. Ścieżki, konta usług, nazwy baz danych i harmonogram są przykładami; zastąp je wartościami z instalacji. Polecenia nie oznaczają, że ta konfiguracja została uruchomiona lub przetestowana na prawdziwym serwerze.
Co musi zawierać użyteczna kopia zapasowa Nextcloud
Samodzielna kopia folderu może pominąć informacje potrzebne Nextcloud do ponownego połączenia plików, użytkowników, udziałów i ustawień. Aktualny podręcznik administratora Nextcloud 35 wymienia pięć elementów, które należy zachować: katalog konfiguracji, aplikacje niestandardowe (jeśli występują), katalog danych, katalog motywu oraz bazę danych. W instrukcji przywracania podano, że baza danych, katalog danych i pliki konfiguracyjne są niezbędne. Przed dostosowaniem przykładu należy zapoznać się z instrukcją obsługi zainstalowanej wersji Nextcloud.
Jordan decyduje się na utworzenie kopii zapasowej całego katalogu aplikacji, który obejmuje konfigurację, aplikacje i motywy, a także oddzielny katalog danych i zrzut bazy danych. Osobna kopia każdej zewnętrznej lokalizacji pamięci masowej jest również potrzebna, jeśli NextCloud przechowuje dane użytkownika poza chmurą /srv/nextcloud-data. Restic może chronić tylko ścieżki, które proces tworzenia kopii zapasowej może odczytać.
Oficjalne instrukcje tworzenia kopii zapasowych Nextcloud opisują tryb konserwacji i kopie zapasowe bazy danych. Instrukcje przywracania pokazują, dlaczego baza danych i drzewo plików muszą pochodzić ze zgodnego punktu odzyskiwania.
1. Przygotuj Restic i jego dane uwierzytelniające
Zainstaluj Restic z zaufanego źródła pakietów i sprawdź, czy jest ono dostępne dla konta, na którym zostanie uruchomione zadanie. Przykład zakłada, że zadanie jest uruchamiane z uprawnieniami użytkownika root, aby mogło odczytać pliki Nextcloud i zrzut bazy danych. Korzysta ze zdalnego repozytorium SFTP, więc awaria serwera aplikacji Jordana nie spowoduje usunięcia jedynej kopii zapasowej.
restic version
install -d -m 700 /root/.config/restic
install -d -m 700 /root/.config/nextcloud
Utwórz silne hasło do repozytorium Restic i zapisz je /root/.config/restic/nextcloud-passwordz uprawnieniami użytkownika root. Przechowuj bezpieczną kopię zapasową tego hasła w innym miejscu niż serwer i repozytorium. Restic szyfruje dane w repozytorium, ale utrata hasła może uniemożliwić korzystanie z zaszyfrowanych kopii zapasowych. Nie wpisuj hasła bezpośrednio w skrypcie ani wierszu cron.
Skonfiguruj nieinteraktywny dostęp SSH dla konta kopii zapasowej na hoście zdalnym i zweryfikuj jego klucz hosta za pomocą zaufanego kanału. Ustaw lokalizację repozytorium poniżej na katalog, do którego konto może zapisywać:
export RESTIC_REPOSITORY='sftp:backup@vault.example.net:/srv/restic/nextcloud'
export RESTIC_PASSWORD_FILE='/root/.config/restic/nextcloud-password'
restic init
Zainicjuj repozytorium tylko raz. Przewodnik Restic dotyczący przygotowania repozytorium dokumentuje obsługiwane zaplecza pamięci masowej i inicjalizację. Traktuj plik haseł i klucz SSH jako poufne dane uwierzytelniające i ogranicz do nich dostęp.
2. Utrzymuj bazę danych i pliki w miejscu kompatybilnym
Nextcloud zaleca tryb konserwacji dla kopii zapasowych, ponieważ blokuje on nowe logowania i blokuje istniejące sesje, aby zapobiec niespójnościom danych. Polecenie musi zostać uruchomione jako użytkownik HTTP; w typowej konfiguracji pakietu Ubuntu tym użytkownikiem jest www-data. Okno konserwacji w Jordanie trwa do momentu zrzutu bazy danych i utworzenia kopii zapasowej Restic, więc użytkownicy nie mogą w tym czasie pracować w Nextcloud.
W przypadku MariaDB podręcznik Nextcloud używa mariadb-dump --single-transaction. Przechowuj dane uwierzytelniające bazy danych w chronionym pliku domyślnych ustawień klienta, na przykład /root/.config/nextcloud/mariadb.cnf, zamiast osadzać hasło w poleceniu:
[client]
user=nextcloud_backup
password=REPLACE_WITH_A_SECRET
host=localhost
Ogranicz plik za pomocą chmod 600 /root/.config/nextcloud/mariadb.cnf. Utwórz konto bazy danych z uprawnieniami wymaganymi tylko przez serwer i wykonaj procedurę zrzutu. Jeśli Twój NextCloud korzysta z PostgreSQL lub SQLite, zastąp go udokumentowaną metodą tworzenia kopii zapasowej; nie uruchamiaj polecenia MariaDB bez zmian.
3. Utwórz skrypt kopii zapasowej chronionej
Jordan zapisuje poniższy kod jako /usr/local/sbin/nextcloud-restic-backupi nadaje mu uprawnienia wykonywalne. Używa blokady, aby uniknąć nakładania się przebiegów, włącza tryb konserwacji przed utworzeniem zrzutu, tworzy kopię zapasową zrzutu wraz z katalogami aplikacji i danych oraz próbuje wyłączyć tryb konserwacji, nawet jeśli późniejsze polecenie się nie powiedzie.
#!/usr/bin/env bash
set -Eeuo pipefail
umask 077
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export RESTIC_REPOSITORY='sftp:backup@vault.example.net:/srv/restic/nextcloud'
export RESTIC_PASSWORD_FILE='/root/.config/restic/nextcloud-password'
NC_DIR='/var/www/nextcloud'
DATA_DIR='/srv/nextcloud-data'
DB_NAME='nextcloud'
DB_CNF='/root/.config/nextcloud/mariadb.cnf'
DUMP_DIR='/var/backups/nextcloud'
LOCK_FILE='/run/lock/nextcloud-restic-backup.lock'
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
DUMP_FILE="$DUMP_DIR/nextcloud-$STAMP.sql"
maintenance_started=0
mkdir -p "$DUMP_DIR"
exec 9>"$LOCK_FILE"
flock -n 9 || { echo 'A Nextcloud backup is already running.' >&2; exit 1; }
finish() {
result=$?
trap - EXIT
if [[ "$maintenance_started" == 1 ]]; then
sudo -u www-data -- php "$NC_DIR/occ" maintenance:mode --off || result=1
fi
rm -f -- "$DUMP_FILE" || result=1
exit "$result"
}
trap finish EXIT
sudo -u www-data -- php "$NC_DIR/occ" maintenance:mode --on
maintenance_started=1
mariadb-dump --defaults-extra-file="$DB_CNF" --single-transaction \
--default-character-set=utf8mb4 --databases "$DB_NAME" > "$DUMP_FILE"
restic backup --tag nextcloud "$NC_DIR" "$DATA_DIR" "$DUMP_FILE"
Po przejrzeniu ścieżek utwórz plik wykonywalny z uprawnieniami użytkownika root i trybem 700. Skrypt zakłada, że instalacja korzysta z www-dataMariaDB i wymienionych ścieżek; config/config.phpnajpierw sprawdź je pod kątem zgodności z konfiguracją serwera WWW. Zakłada również, że żaden inny administrator nie włączył trybu konserwacji. Jeśli polecenie, zrzut lub przesłanie Restic się nie powiedzie, powłoka zakończy działanie z błędem, a pułapka podejmie próbę przywrócenia usługi; sprawdź dzienniki, aby potwierdzić, że tak się stało. Zrzut jest przechowywany z ograniczonymi uprawnieniami i usuwany po uruchomieniu.
Ten prosty schemat sprawia, że witryna jest niedostępna przez cały czas skanowania i przesyłania danych przez Restic. W przypadku dużego katalogu danych, może to być zbyt długi czas. Użyj skoordynowanego zrzutu bazy danych i migawki pamięci masowej lub innego projektu tworzenia kopii zapasowych spójnego z aplikacją, jeśli obsługuje go Twój system plików lub platforma pamięci masowej. Upewnij się, że migawka bazy danych i pliku reprezentują zgodny punkt w czasie; niezależne kopiowanie aktywnej bazy danych i zmieniającego się katalogu danych może skutkować trudną do przywrócenia kopią zapasową.
4. Zaplanuj zadanie za pomocą cron
Po pomyślnym zakończeniu ręcznego uruchomienia Jordan instaluje skrypt i planuje jego działanie w trybie cichym. Jako root edytuj plik crontab roota sudo crontab -ei dodaj:
15 2 * * * /usr/local/sbin/nextcloud-restic-backup >> /var/log/nextcloud-restic.log 2>&1
Ten przykład rozpoczyna się o 2:15 nad ranem, zgodnie ze strefą czasową cron serwera; wybierz czas, w którym okno konserwacji jest akceptowalne. Cron ma mniejsze środowisko niż powłoka interaktywna, dlatego skrypt ustawia je PATHjawnie i używa ścieżek bezwzględnych. Utwórz plik dziennika z ograniczonymi uprawnieniami i skonfiguruj rotację dziennika lub wyślij dane wyjściowe do standardowej usługi rejestrowania w systemie. Harmonogram cron jedynie uruchamia zadanie: nie potwierdza, że kopia zapasowa została ukończona ani że przywracanie będzie działać.
5. Ustaw retencję i sprawdź wynik
Po pomyślnym utworzeniu kopii zapasowej Jordan sprawdza, czy pojawiła się migawka:
restic snapshots --tag nextcloud
restic check
restic checkSprawdza strukturę repozytorium. Cykl restic check --read-dataodczytuje również zapisane dane i może zużywać znaczną ilość czasu sieciowego i dyskowego, dlatego należy go zaplanować zgodnie z rozmiarem repozytorium i potrzebami odzyskiwania. Przewodnik Restic dotyczący przechowywania migawek wyjaśnia, że pomijanie migawek i usuwanie nieodwoływanych danych to oddzielne działania, a czyszczenie blokuje repozytorium. Zacznij od uruchomienia próbnego i strategii dopasowanej do Twoich wymagań dotyczących przechowywania:
restic forget --tag nextcloud --keep-daily 7 --keep-weekly 5 \
--keep-monthly 12 --dry-run
Przejrzyj migawki, które proponuje usunąć. Jeśli są spełnione, usuń je --dry-runi dodaj --prune; uruchom przycinanie, gdy nie koliduje to z nocną kopią zapasową. Te liczby retencji są przykładowe, a nie uniwersalne. Weź pod uwagę legalny czas retencji, dostępną przestrzeń dyskową i to, jak daleko wstecz możesz potrzebować odzyskać dane.
Sensownym testem jest ćwiczenie przywracania. Przywróć ostatnią migawkę do katalogu tymczasowego w osobnym systemie, a nie do ścieżek Jordana w chmurze Nextcloud:
restic restore latest --tag nextcloud --target /tmp/nextcloud-restore-check
Sprawdź, czy przywrócone drzewo zawiera oczekiwaną konfigurację, dane i zrzut bazy danych, a następnie sprawdź reprezentatywne pliki. Aby wykonać pełne odzyskiwanie, postępuj zgodnie z instrukcją przywracania Nextcloud w środowisku odizolowanym i sprawdź logowanie, dostęp do plików oraz oczekiwane udziały, zanim zastosujesz tę procedurę. Dokumentacja przywracania Restic opisuje wybór migawek i docelowych lokalizacji przywracania.
Jak stwierdzić, kiedy to podejście wymaga zmiany
Zadanie cron Jordana jest odpowiednie tylko wtedy, gdy okno konserwacji mieści się w czasie trwania kopii zapasowej, a wszystkie wymagane ścieżki danych są lokalne i czytelne. Zmień projekt, gdy pojawi się którykolwiek z poniższych objawów:
- Witryna pozostaje w trybie konserwacyjnym dłużej, niż użytkownicy mogą tolerować: zaplanuj skoordynowane migawki lub inną metodę spójną z aplikacją.
- Dzienniki pokazują brakujące ścieżki, błędy uprawnień, nieudany zrzut bazy danych lub wyjście Restic inne niż zero: napraw je przed uznaniem migawki za ukończoną.
- Dane znajdują się w pamięci zewnętrznej lub na innym serwerze: w planie odzyskiwania należy uwzględnić spójną kopię zapasową tej pamięci masowej.
- Podczas przywracania testowego brakuje plików, konfiguracji, stanu bazy danych lub wymaganego kodu aplikacji/motywu: zaktualizuj dane wejściowe kopii zapasowej i powtórz ćwiczenie.
- Hasło Restic i dane uwierzytelniające SSH znajdują się wyłącznie na serwerze, którego kopię zapasową tworzysz. Przechowuj dane uwierzytelniające odzyskiwania osobno i sprawdź, czy uprawniony administrator ma do nich dostęp.
W przypadku Jordana sukces jest widoczny: dziennik cron pokazuje ukończony przebieg, restic snapshotswyświetla listę ostatnio otagowanej migawki, kontrole repozytoriów nie zgłaszają błędów, a test przywracania przywraca spójną instancję Nextcloud. Zaplanowane polecenie to początek procedury tworzenia kopii zapasowej; tylko kompletny, możliwy do odtworzenia zestaw danych bazy danych, konfiguracji, aplikacji i użytkownika zapewnia praktyczną ścieżkę odzyskiwania.
Oficjalne referencje