Резервное копирование Docker-сервисов

Копия «на всякий случай» бесполезна, если из неё нельзя восстановиться. Разберём, как снимать согласованные копии данных Docker-сервиса, шифровать их и хранить в двух местах.

Согласованность важнее скорости

Простое копирование файлов тома работающей базы данных даёт «размазанный» снимок: часть страниц уже изменилась, часть — нет. Такую копию база может не принять. Правильный путь — снимать дамп штатным инструментом СУБД, а тома с файлами копировать отдельно.

#!/usr/bin/env bash
set -euo pipefail
DAY=$(date +%F)
TMP=$(mktemp -d)

# согласованный дамп базы прямо из контейнера
docker exec db pg_dump -U postgres app > "$TMP/db.sql"

# файлы приложения из тома
docker run --rm -v app_data:/data -v "$TMP":/out alpine \
  tar czf /out/data.tgz -C /data .

# один зашифрованный архив
tar cf - -C "$TMP" . | openssl enc -aes-256-cbc -pbkdf2 -salt \
  -pass file:/root/.backup-pass -out "/backups/app-$DAY.tar.enc"
rm -rf "$TMP"

Два места хранения

Копия рядом с сервисом не спасёт, если площадка недоступна целиком. Держите вторую копию на другом узле или у другого провайдера. Мы отправляем шифрованный архив на отдельный сервер сразу после создания и следим, чтобы обе копии были свежими.

Проверяйте восстановление

Бэкап, который ни разу не разворачивали, — это предположение, а не гарантия. Раз в период поднимайте копию на тестовом узле и убеждайтесь, что сервис стартует. Это единственный способ узнать, что план работает, до того как он понадобится.

← Все заметки