System backup.sh (Linux)
#!/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/
Для восстановления всей системы:
- Загрузись с Live Linux или другой машины.
- Смонтируй новый диск: