Skip to content

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 root przez systemd
  • 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:

restic-password.txt
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.

db-backup.env
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:

restic-excludes.txt
/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:

/root/.ssh/config
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.

Zobacz


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 prawa 600

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