Restic
Instalacja
Instrukcja opisuje konfigurację backupu danych Dockera, sekretów oraz dumpów baz danych przy użyciu Restic na hoście Ubuntu z repozytorium na Hetzner Storage Box.
Założenia:
- Backup wykonywany jest na hoście (nie w kontenerze)
- Backup uruchamiany jest jako
rootprzezsystemd - Repozytorium Restic znajduje się na Hetzner Storage Box (SFTP)
- Odtworzenie serwera wymaga wyłącznie danych z backupu oraz dostępu do repozytorium
Zakres backupu:
- Dane aplikacji Docker
/srv/docker/data - Zmienne środowiskowe
/srv/docker/secrets - Dumpy baz danych
/srv/backups/db-dumps
Instalacja Restic
Instalujemy Restic z repozytorium APT:
sudo apt update
sudo apt install -y restic
Konfiguracja
Tworzenie struktury katalogów
Katalogi służą do przechowywania skryptów, konfiguracji Restic, cache, logów oraz dumpów baz danych.
sudo mkdir -p /srv/backups/db-dumps/postgres
sudo mkdir -p /srv/backups/db-dumps/mariadb
sudo mkdir -p /srv/backups/restic/cache
sudo mkdir -p /srv/backups/restic/logs
sudo mkdir -p /srv/backups/.locks
sudo chown root:root /srv/backups/.locks
sudo chmod 700 /srv/backups/.locks
Konfiguracja hasła repozytorium
Plik przechowuje hasło szyfrujące repozytorium Restic.
Tworzymy plik:
sudo micro /srv/backups/restic/restic-password.txt
Ustawiamy hasło:
TU_BARDZO_SILNE_HASLO_DO_RESTIC
Nadajemy uprawnienia:
sudo chown root:root /srv/backups/restic/restic-password.txt
sudo chmod 600 /srv/backups/restic/restic-password.txt
Konfiguracja danych do dumpów baz
Plik zawiera dane dostępowe do kontenerów baz danych wykorzystywane przez skrypty dumpów.
sudo micro /srv/backups/restic/db-backup.env
Ustawiamy zmienne zgodne z naszą konfiguracją kontenerów PostgreSQL i MariaDB.
POSTGRES_CONTAINER=postgres
POSTGRES_USER=postgres
MARIADB_CONTAINER=mariadb
MARIADB_ROOT_PASSWORD=TU_BARDZO_SILNE_HASLO_ROOT
Nadajemy uprawnienia:
sudo chown root:root /srv/backups/restic/db-backup.env
sudo chmod 600 /srv/backups/restic/db-backup.env
Konfiguracja wykluczeń
Plik definiuje ścieżki wyłączone z backupu danych aplikacji.
Tworzymy plik:
sudo micro /srv/backups/restic/restic-excludes.txt
Dodajemy ścieżki:
/srv/docker/data/postgres/**
/srv/docker/data/mariadb/**
**/logs/**
**/log/**
**/tmp/**
**/temp/**
**/runtime/**
**/*.pid
**/*.sock
**/cache/**
**/.cache/**
**/__pycache__/**
**/.pytest_cache/**
**/.mypy_cache/**
**/.ruff_cache/**
**/.tox/**
**/.venv/**
**/node_modules/**
**/.npm/**
**/.yarn/**
**/.pnpm-store/**
**/.turbo/**
**/.next/cache/**
**/.nuxt/**
**/.parcel-cache/**
**/dist/**
**/build/**
**/.DS_Store
**/Thumbs.db
**/*~
**/.swp
**/.swo
**/.Trash-*/**
Nadajemy uprawnienia:
sudo chown root:root /srv/backups/restic/restic-excludes.txt
sudo chmod 600 /srv/backups/restic/restic-excludes.txt
Konfiguracja SSH do Storage Box
Połączenie SSH umożliwia bezhasłowy dostęp do repozytorium Restic dla użytkownika root.
Generujemy klucz SSH:
sudo ssh-keygen -t ed25519 -a 64 -f /root/.ssh/id_ed25519_storagebox -C "root@$(hostname -s) storagebox"
Dane Storage Box
Instrukcja zawiera przykładowe dane uXXXXXX@uXXXXXX.your-storagebox.de, uXXXXXX - należy je zastąpić poprawną nazwą użytkownika i ID Hetzner Storage Box
Dodajemy klucz do Storage Box:
sudo bash -lc 'cat /root/.ssh/id_ed25519_storagebox.pub | ssh -p 23 uXXXXXX@uXXXXXX.your-storagebox.de install-ssh-key'
Konfigurujemy alias SSH:
Host storagebox
HostName uXXXXXX.your-storagebox.de
User uXXXXXX
Port 23
IdentityFile /root/.ssh/id_ed25519_storagebox
IdentitiesOnly yes
Nadajemy uprawnienia:
sudo chmod 600 /root/.ssh/config
Testujemy połączenie:
sudo ssh storagebox 'echo OK'
Skrypty backupu
Skrypty odpowiadają za wykonywanie dumpów baz danych oraz uruchomienie backupu Restic.
Lokalizacja skryptów
Skrypty znajdują się w katalogu:
/srv/config/scripts/backup-restic.sh/srv/config/scripts/backup-common.sh/srv/config/scripts/backup-db-postgres.sh/srv/config/scripts/backup-db-mariadb.sh
Skrypt backup-restic.sh uruchamia dumpy baz danych i oczekuje, że:
- skrypty dumpów są wykonywalne
- skrypty dumpów emitują zmienną
FINAL_OUT_DIR=... - po poprawnym wykonaniu tworzony jest marker
.SUCCESS
Treści skryptów
Treści skryptów
Treści skryptów opisane są w osobnych dokumentach:
backup-restic backup-db (PostgreSQL + MariaDB) backup-common
Inicjalizacja repozytorium
Inicjalizacja repozytorium Restic
Polecenie restic init wykonywane jest wyłącznie jeden raz – tylko przy pierwszym uruchomieniu nowego repozytorium.
Wpisujemy komendę inicjalizującą:
sudo bash -lc '
set -a
source /srv/backups/restic/restic.env
set +a
export RESTIC_PASSWORD_FILE=/srv/backups/restic/restic-password.txt
restic init
'
Test działania
Uruchomienie ręczne
Ręczne uruchomienie backupu zapisuje log do lokalnego katalogu /srv/backups/restic/logs/.
sudo stdbuf -oL -eL /srv/config/scripts/backup-restic.sh |& \
tee -a "/srv/backups/restic/logs/restic-backup-$(date +%Y%m%d_%H%M).log"
Weryfikacja snapshotów
sudo bash -lc '
set -a
source /srv/backups/restic/restic.env
set +a
export RESTIC_PASSWORD_FILE=/srv/backups/restic/restic-password.txt
restic snapshots --latest 5
'
Obsługa
Automatyczne uruchamianie
Backup uruchamiany jest cyklicznie przez systemd timer.
Konfiguracja systemd
Definicje restic-backup.service oraz restic-backup.timer opisane są w osobnym dokumencie.
Retencja danych
Polityka retencji wykonywana jest w skrypcie backupu:
- 7 backupów dziennych
- 4 backupy tygodniowe
- 6 backupów miesięcznych
Zasady bezpieczeństwa
- Sekrety nie są przechowywane w repozytorium Git
- Pliki konfiguracyjne Restic posiadają prawa
600 - Właścicielem plików konfiguracyjnych jest
root:root - Klucz SSH do Storage Box znajduje się w
/root/.ssh/i posiada prawa600
Podgląd logów
Logi z uruchomień cyklicznych:
journalctl -u restic-backup.service -n 200 --no-pager
Logi z uruchomień ręcznych:
ls -la /srv/backups/restic/logs
tail -n 200 /srv/backups/restic/logs/restic-backup-*.log