VPS Storage może pełnić rolę zewnętrznego miejsca na kopie zapasowe stron internetowych, aplikacji i innych danych. Nie trzeba przy tym instalować rozbudowanego systemu backupu. W wielu przypadkach wystarczy prosty skrypt Bash, który połączy się ze wskazanym serwerem, pobierze z niego pliki, spakuje je do jednego archiwum i usunie stare kopie.
W tym poradniku przygotujemy właśnie takie rozwiązanie. Skrypt będzie uruchamiany na VPS Storage, dzięki czemu to serwer kopii zapasowych sam pobierze dane ze źródła. Gotowe archiwa otrzymają w nazwie datę i godzinę utworzenia.
Jak będzie działać kopia zapasowa?
Cały proces składa się z kilku prostych etapów:
- VPS Storage łączy się ze źródłowym serwerem przez SSH.
- Program
rsyncpobiera wybrany katalog do katalogu roboczego. - Pobrane dane są pakowane do archiwum
tar.gz. - Dla archiwum tworzona jest suma kontrolna SHA-256.
- Katalog roboczy jest usuwany, a starsze kopie są kasowane zgodnie z ustaloną retencją.
W przykładzie wykonamy kopię katalogu /home/example/domains/example.pl/public_html/ ze zdalnego serwera. Ścieżki, nazwę użytkownika oraz czas przechowywania kopii można łatwo zmienić w konfiguracji skryptu.
1. Instalacja potrzebnych narzędzi
Na VPS Storage z systemem Debian lub Ubuntu instalujemy pakiety rsync, tar oraz util-linux. Ostatni z nich udostępnia polecenie flock, które zabezpieczy skrypt przed uruchomieniem kilku kopii jednocześnie.
apt update
apt install -y rsync tar util-linux
Na serwerze źródłowym również powinien być zainstalowany program rsync.
2. Logowanie kluczem SSH
Automatyczna kopia nie może czekać na ręczne wpisanie hasła. Na VPS Storage tworzymy więc osobny klucz SSH:
ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519_backup -C "vps-storage-backup"
Podczas tworzenia klucza pozostawiamy puste hasło. Następnie kopiujemy klucz publiczny na serwer źródłowy:
ssh-copy-id -i /root/.ssh/id_ed25519_backup.pub backup@server.example.pl
Użytkownik backup musi mieć prawo odczytu katalogu, który ma zostać skopiowany. Najlepiej utworzyć w tym celu osobne konto i przyznać mu tylko niezbędne uprawnienia. Nie należy używać konta root, jeżeli nie jest to konieczne.
Przed uruchomieniem skryptu warto sprawdzić połączenie:
ssh -i /root/.ssh/id_ed25519_backup backup@server.example.pl
Przy pierwszym połączeniu SSH wyświetli odcisk klucza serwera. Przed jego zaakceptowaniem należy porównać go z odciskiem podanym przez administratora serwera źródłowego.
3. Skrypt tworzący kopię plików
Na VPS Storage tworzymy plik /usr/local/sbin/backup-files.sh o następującej zawartości:
#!/usr/bin/env bash
set -Eeuo pipefail
# Dane serwera źródłowego
SOURCE_HOST="server.example.pl"
SOURCE_USER="backup"
SOURCE_PATH="/home/example/domains/example.pl/public_html/"
SSH_KEY="/root/.ssh/id_ed25519_backup"
# Ustawienia lokalne na VPS Storage
BACKUP_NAME="example-pl"
BACKUP_ROOT="/data/backups/${BACKUP_NAME}"
ARCHIVE_DIR="${BACKUP_ROOT}/archives"
WORK_DIR="${BACKUP_ROOT}/work"
LOG_FILE="${BACKUP_ROOT}/backup.log"
LOCK_FILE="/var/lock/backup-${BACKUP_NAME}.lock"
# Liczba dni przechowywania kopii
RETENTION_DAYS=30
BACKUP_DATE="$(date '+%Y-%m-%d_%H-%M-%S')"
STAGING_DIR="${WORK_DIR}/${BACKUP_DATE}"
ARCHIVE="${ARCHIVE_DIR}/${BACKUP_NAME}-${BACKUP_DATE}.tar.gz"
TEMP_ARCHIVE="${ARCHIVE}.part"
mkdir -p "${ARCHIVE_DIR}" "${WORK_DIR}"
touch "${LOG_FILE}"
chmod 600 "${LOG_FILE}"
# Zapis komunikatów do pliku i na ekran
exec > >(tee -a "${LOG_FILE}") 2>&1
# Tylko jedna kopia może być wykonywana w danym momencie
exec 9>"${LOCK_FILE}"
if ! flock -n 9; then
echo "[$(date '+%F %T')] Inna kopia jest już wykonywana. Kończę."
exit 1
fi
cleanup() {
rm -rf -- "${STAGING_DIR}"
rm -f -- "${TEMP_ARCHIVE}"
}
trap cleanup EXIT
echo "[$(date '+%F %T')] Rozpoczynam pobieranie plików."
mkdir -p "${STAGING_DIR}/files"
rsync -a --delete \
-e "ssh -i ${SSH_KEY} -o BatchMode=yes" \
"${SOURCE_USER}@${SOURCE_HOST}:${SOURCE_PATH}" \
"${STAGING_DIR}/files/"
echo "[$(date '+%F %T')] Tworzę archiwum ${ARCHIVE}."
tar -C "${STAGING_DIR}" -czf "${TEMP_ARCHIVE}" files
# Gotową nazwę otrzymuje dopiero kompletne archiwum
mv -- "${TEMP_ARCHIVE}" "${ARCHIVE}"
sha256sum "${ARCHIVE}" > "${ARCHIVE}.sha256"
echo "[$(date '+%F %T')] Usuwam kopie starsze niż ${RETENTION_DAYS} dni."
find "${ARCHIVE_DIR}" -type f \
\( -name "${BACKUP_NAME}-*.tar.gz" -o -name "${BACKUP_NAME}-*.tar.gz.sha256" \) \
-mtime "+${RETENTION_DAYS}" -delete
echo "[$(date '+%F %T')] Kopia została zakończona poprawnie."
echo "Archiwum: ${ARCHIVE}"
du -h "${ARCHIVE}"
Najważniejsze wartości znajdują się na początku skryptu:
SOURCE_HOST– adres serwera, z którego pobieramy pliki,SOURCE_USER– użytkownik SSH na serwerze źródłowym,SOURCE_PATH– katalog przeznaczony do skopiowania,BACKUP_ROOT– katalog kopii na VPS Storage,RETENTION_DAYS– liczba dni przechowywania archiwów.
Po zapisaniu pliku nadajemy mu prawo wykonywania:
chmod 700 /usr/local/sbin/backup-files.sh
4. Pierwsze uruchomienie i sprawdzenie kopii
Skrypt uruchamiamy ręcznie, aby sprawdzić konfigurację:
/usr/local/sbin/backup-files.sh
Po poprawnym zakończeniu w katalogu archiwów powinny pojawić się dwa pliki:
ls -lh /data/backups/example-pl/archives/
Pierwszy z nich to właściwe archiwum tar.gz, a drugi zawiera jego sumę kontrolną. Poprawność archiwum możemy zweryfikować poleceniami:
cd /data/backups/example-pl/archives
sha256sum -c example-pl-2026-09-04_02-30-00.tar.gz.sha256
tar -tzf example-pl-2026-09-04_02-30-00.tar.gz | head
Nazwę pliku w powyższym przykładzie należy zastąpić nazwą rzeczywiście utworzonego archiwum.
5. Automatyczne wykonywanie kopii
Po udanym teście możemy dodać skrypt do harmonogramu cron:
crontab -e
Poniższy wpis uruchomi kopię codziennie o godzinie 2:30:
30 2 * * * /usr/local/sbin/backup-files.sh
Przebieg kolejnych operacji będzie zapisywany w pliku:
/data/backups/example-pl/backup.log
Jak odzyskać pliki z archiwum?
Najpierw warto ponownie sprawdzić sumę kontrolną, a następnie rozpakować kopię do osobnego katalogu:
mkdir -p /data/restore/example-pl
cd /data/backups/example-pl/archives
sha256sum -c example-pl-2026-09-04_02-30-00.tar.gz.sha256
tar -xzf example-pl-2026-09-04_02-30-00.tar.gz -C /data/restore/example-pl
Odzyskane dane znajdą się w katalogu /data/restore/example-pl/files/. Dopiero po sprawdzeniu ich zawartości należy przenieść je do właściwego miejsca.
O czym warto pamiętać?
- Zaplanuj wolne miejsce. Podczas wykonywania zadania VPS przechowuje jednocześnie pobrane pliki oraz tworzone archiwum. Wymagany zapas może więc być znacznie większy niż rozmiar pojedynczej kopii.
- Regularnie testuj odtwarzanie. Sam fakt istnienia pliku
tar.gznie daje pewności, że zawiera on komplet potrzebnych danych. - Nie przechowuj wszystkiego w jednym miejscu. VPS Storage może być drugą lokalizacją kopii, ale dla ważnych danych warto stosować zasadę 3-2-1: trzy kopie danych, dwa różne nośniki i co najmniej jedna kopia poza główną lokalizacją.
- Pamiętaj o bazach danych. Ten skrypt kopiuje pliki. W przypadku WordPressa, PrestaShop, WHMCS lub innej aplikacji korzystającej z MySQL albo PostgreSQL potrzebny jest również osobny, spójny zrzut bazy danych.
- Chroń dostęp SSH. Oddzielny użytkownik i osobny klucz dla backupu ograniczają skutki ewentualnego przejęcia jednego z serwerów.
Podsumowanie
Prosty VPS Storage może działać jako praktyczne, zewnętrzne repozytorium kopii zapasowych. Po jednorazowej konfiguracji serwer sam pobiera wskazane dane, tworzy uporządkowane archiwa i usuwa kopie starsze niż ustalony okres. Rozwiązanie jest przejrzyste, nie wymaga specjalnego panelu i można je łatwo rozbudować o kopie baz danych, powiadomienia e-mail lub wysyłanie archiwów do kolejnej lokalizacji.
Najważniejsze jest jednak regularne sprawdzanie logów i wykonywanie próbnego odtwarzania. Kopia zapasowa jest naprawdę przydatna dopiero wtedy, gdy wiemy, że da się z niej poprawnie odzyskać dane.