Bash / Shell
Резервное копирование с ротацией
Дамп базы и файлов в архив, удаление копий старше N дней, проверка результата.
Код
#!/usr/bin/env bash
set -Eeuo pipefail
BACKUP_DIR="/var/backups/digitmind"
KEEP_DAYS=14
STAMP="$(date +%Y%m%d-%H%M%S)"
DB_NAME="digitmind"
mkdir -p "$BACKUP_DIR"
# Дамп PostgreSQL (пароль — в ~/.pgpass, не в командной строке)
pg_dump --format=custom --compress=9 "$DB_NAME" \
> "$BACKUP_DIR/db-$STAMP.dump"
# Файлы пользователей
tar -czf "$BACKUP_DIR/media-$STAMP.tar.gz" -C /var/www/digitmind media
# Проверяем, что архивы не пустые
for file in "$BACKUP_DIR"/*-"$STAMP".*; do
[[ -s "$file" ]] || { echo "Пустой архив: $file" >&2; exit 1; }
done
# Ротация: удаляем старые копии
find "$BACKUP_DIR" -type f \( -name '*.dump' -o -name '*.tar.gz' \) \
-mtime +"$KEEP_DAYS" -print -delete
echo "Готово: $(du -sh "$BACKUP_DIR" | cut -f1) в $BACKUP_DIR"