پرش به محتوا

بکاپ رمزنگاری‌شده و افزایشی با BorgBackup روی Debian

یک مخزن Borg رمزنگاری‌شده روی سرور بکاپ بسازید، با کلید SSH محدود به همان مخزن بکاپ بگیرید، سیاست نگهداری تعریف کنید و بازیابی را آزمایش کنید.

Debian 13سطح: متوسطبرای: Debian 13، Debian 12به‌روزرسانی: ۱۷ آبان ۱۴۰۵

Borg فقط بخش‌های تغییرکرده را ارسال می‌کند (deduplication)، داده را فشرده و رمزنگاری می‌کند و هر بکاپ را به‌صورت یک نسخه‌ی کامل قابل بازیابی نگه می‌دارد. در این آموزش web01 بکاپ می‌گیرد و backup01 مخزن را نگه می‌دارد.

۱. نصب روی هر دو سرور

bash
sudo apt install -y borgbackup
borg --version

نسخه‌ی Borg دو سرور باید از یک سری (1.x) باشد.

۲. کاربر محدود روی سرور بکاپ

روی backup01:

bash
sudo adduser --disabled-password --gecos '' borg
sudo -u borg mkdir -p /home/borg/repos/web01

روی web01 یک کلید SSH مخصوص بکاپ بسازید:

bash
sudo ssh-keygen -t ed25519 -N '' -f /root/.ssh/borg_ed25519
sudo cat /root/.ssh/borg_ed25519.pub

روی backup01، کلید را با محدودیت به /home/borg/.ssh/authorized_keys اضافه کنید. این کلید فقط می‌تواند borg serve را روی همان مخزن اجرا کند و نه هیچ دستور دیگری:

command="borg serve --restrict-to-path /home/borg/repos/web01 --append-only",restrict ssh-ed25519 AAAA... root@web01

--append-only یعنی اگر web01 هک شود، مهاجم نمی‌تواند بکاپ‌های قبلی را پاک کند. این بهترین دفاع در برابر باج‌افزار است.

۳. ساخت مخزن

روی web01:

bash
export BORG_RSH='ssh -i /root/.ssh/borg_ed25519'
export BORG_REPO='ssh://borg@backup01/home/borg/repos/web01'
sudo -E borg init --encryption=repokey-blake2
sudo -E borg key export "$BORG_REPO" /root/borg-web01.key

رمز مخزن و فایل کلید را بیرون از هر دو سرور نگه دارید (مثلاً در گاوصندوق رمز). بدون این‌ها بکاپ قابل بازیابی نیست.

۴. اسکریپت بکاپ

/usr/local/sbin/borg-backup.sh:

bash
#!/bin/bash
set -euo pipefail
export BORG_RSH='ssh -i /root/.ssh/borg_ed25519'
export BORG_REPO='ssh://borg@backup01/home/borg/repos/web01'
export BORG_PASSCOMMAND='cat /root/.borg-pass'

borg create --stats --compression zstd,6 --exclude-caches \
  --exclude '/var/cache/*' --exclude '/var/tmp/*' \
  ::'{hostname}-{now:%Y-%m-%d_%H%M}' \
  /etc /var/www /home /root /var/backups

borg prune --list --keep-daily 7 --keep-weekly 4 --keep-monthly 6
bash
sudo chmod 700 /usr/local/sbin/borg-backup.sh
sudo sh -c 'read -rs -p "Repo passphrase: " p; echo "$p" > /root/.borg-pass'; sudo chmod 600 /root/.borg-pass

پایگاه داده را مستقیم از فایل‌هایش بکاپ نگیرید. پیش از Borg یک dump در /var/backups بسازید.

در حالت --append-only، دستور prune فقط علامت حذف می‌زند و فضای مخزن آزاد نمی‌شود. برای آزاد کردن فضا، borg compact را هر چند وقت یک بار از خود backup01 (با دسترسی کامل) اجرا کنید.

۵. زمان‌بندی با systemd

bash
sudo tee /etc/systemd/system/borg-backup.service >/dev/null <<'EOT'
[Unit]
Description=Borg backup
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/borg-backup.sh
EOT
sudo tee /etc/systemd/system/borg-backup.timer >/dev/null <<'EOT'
[Unit]
Description=Nightly Borg backup
[Timer]
OnCalendar=*-*-* 01:30
RandomizedDelaySec=15m
Persistent=true
[Install]
WantedBy=timers.target
EOT
sudo systemctl daemon-reload && sudo systemctl enable --now borg-backup.timer
sudo systemctl start borg-backup.service && journalctl -u borg-backup -n 30 --no-pager

۶. بازیابی (حتماً آزمایش کنید)

bash
sudo -E borg list
sudo -E borg list ::web01-2026-11-08_0130 etc/nginx
cd /tmp && sudo -E borg extract ::web01-2026-11-08_0130 etc/nginx/nginx.conf
sudo -E borg check --verify-data     # occasionally; reads all data

بکاپی که بازیابی‌اش را آزمایش نکرده‌اید، بکاپ حساب نمی‌شود. ماهی یک بار یک فایل را واقعاً بازیابی کنید.