System backup.sh (Linux)

From wiki.baghirzade.pro
Revision as of 06:11, 7 October 2025 by Sadmin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
#!/bin/bash
# ==========================================================
#  UNIVERSAL LINUX BACKUP SCRIPT
#  Author: Nijat Baghirzade
#  Version: 2.0
#  Date: 2025-10-07
#
#  Description:
#  Creates two compressed archives:
#    1) Full system backup
#    2) Configs + home backup
#
#  Works on: Debian, Ubuntu, RHEL, CentOS, Rocky, Fedora,
#            Raspberry Pi OS, Armbian, etc.
#
# ==========================================================

### === USER SETTINGS (CHANGE THESE) ======================

# Where to store backups (must exist or be mounted)
BACKUP_DIR="/mnt/backup"

# Compression method: gzip (slower, more compatible) or zstd (faster)
COMPRESSOR="zstd"   # options: gzip | zstd

# How long to keep old backups (in days)
RETENTION_DAYS=180   # 180 = 6 months

# Optional: custom exclude file (recommended for big systems)
EXCLUDE_FILE="/etc/backup.exclude"

### === DO NOT CHANGE BELOW UNLESS YOU KNOW WHAT YOU DO ===

DATE=$(date +%F)
HOSTNAME=$(hostname)
LOGFILE="$BACKUP_DIR/backup_${HOSTNAME}_${DATE}.log"

# Make sure backup directory exists
mkdir -p "$BACKUP_DIR"

echo "========== BACKUP STARTED on $HOSTNAME ($(date)) ==========" | tee -a "$LOGFILE"

### === 1. Check available space ===
REQUIRED_MB=2048
AVAILABLE_MB=$(df -Pm "$BACKUP_DIR" | awk 'NR==2 {print $4}')
if (( AVAILABLE_MB < REQUIRED_MB )); then
  echo "[ERROR] Not enough space on $BACKUP_DIR (need at least ${REQUIRED_MB}MB)" | tee -a "$LOGFILE"
  exit 1
fi

### === 2. Select compression parameters ===
if [[ "$COMPRESSOR" == "zstd" ]]; then
  TAR_CMD="tar -I zstd -cpf"
  EXT="tar.zst"
elif [[ "$COMPRESSOR" == "gzip" ]]; then
  TAR_CMD="tar czpf"
  EXT="tar.gz"
else
  echo "[ERROR] Unknown compressor: $COMPRESSOR" | tee -a "$LOGFILE"
  exit 1
fi

### === 3. Create default exclude file if missing ===
if [[ ! -f "$EXCLUDE_FILE" ]]; then
  cat <<EOF | sudo tee "$EXCLUDE_FILE" >/dev/null
/proc
/sys
/dev
/run
/tmp
/mnt
/media
/lost+found
/var/lib/docker
EOF
  echo "[INFO] Default exclude list created at $EXCLUDE_FILE" | tee -a "$LOGFILE"
fi

### === 4. Full system backup ===
FULL_BACKUP="$BACKUP_DIR/full_backup_${HOSTNAME}_${DATE}.${EXT}"
echo "[INFO] Creating full system backup → $FULL_BACKUP" | tee -a "$LOGFILE"

sudo $TAR_CMD "$FULL_BACKUP" --exclude-from="$EXCLUDE_FILE" / 2>>"$LOGFILE"

### === 5. Configs + home backup ===
CONF_BACKUP="$BACKUP_DIR/configs_backup_${HOSTNAME}_${DATE}.${EXT}"
echo "[INFO] Creating configs/home backup → $CONF_BACKUP" | tee -a "$LOGFILE"

sudo $TAR_CMD "$CONF_BACKUP" /etc /home 2>>"$LOGFILE"

### === 6. Cleanup old backups ===
echo "[INFO] Removing backups older than ${RETENTION_DAYS} days..." | tee -a "$LOGFILE"
find "$BACKUP_DIR" -type f -mtime +$RETENTION_DAYS -name "*.tar.*" -delete

echo "========== BACKUP COMPLETED SUCCESSFULLY ($(date)) ==========" | tee -a "$LOGFILE"
exit 0

🧾 Комментарии (что менять и как)

Раздел Что делает Можно менять
BACKUP_DIR="/mnt/backup" Куда сохраняются архивы ✅ Да — поставь свой путь, напр. /mnt/ssd/backups
COMPRESSOR="zstd" Тип сжатия (zstd быстрее, gzip совместимее) ✅ Да
RETENTION_DAYS=180 Срок хранения архивов (в днях) ✅ Да
EXCLUDE_FILE="/etc/backup.exclude" Путь к списку исключений ✅ Да (можно добавить свои каталоги)
REQUIRED_MB=2048 Минимум свободного места (в мегабайтах) ⚙️ Опционально
Остальное Основная логика (логи, tar, cleanup) ⚠️ Лучше не менять

⚙️ Установка и использование

1️⃣ Скопируй файл:

sudo nano /usr/local/bin/system_backup.sh

2️⃣ Вставь код, сохрани (Ctrl+O → Enter → Ctrl+X) 3️⃣ Сделай исполняемым:

sudo chmod +x /usr/local/bin/system_backup.sh

4️⃣ Проверь вручную:

sudo /usr/local/bin/system_backup.sh

5️⃣ Настрой автозапуск (ежемесячно):

sudo crontab -e

Добавь:

@monthly /usr/local/bin/system_backup.sh

📄 Пример /etc/backup.exclude

(создаётся автоматически, можно редактировать)

/proc
/sys
/dev
/run
/tmp
/mnt
/media
/lost+found
/var/lib/docker
/srv/videos

📦 Результат

После выполнения у тебя будет:

/mnt/backup/
  ├── full_backup_server1_2025-10-07.tar.zst
  ├── configs_backup_server1_2025-10-07.tar.zst
  ├── backup_server1_2025-10-07.log

🔄 Восстановление (README)

Для восстановления конкретных файлов:

tar xzf configs_backup_server1_2025-10-07.tar.gz -C /tmp etc/wireguard
sudo cp -r /tmp/etc/wireguard /etc/

Для восстановления всей системы:

  1. Загрузись с Live Linux или другой машины.
  2. Смонтируй новый диск:
sudo mount /dev/sdX1 /mnt/newroot

3. Распакуй архив:

sudo tar xpf full_backup_server1_2025-10-07.tar.zst -C /mnt/newroot

4. Исправь /etc/fstab и загрузчик, перезагрузи.