每個人都有備份,直到他們試著恢復一次。結果資料夾是空的,cron 任務三月份就停了,或者壓縮包就躺在剛剛壞掉的那塊磁碟上。restic 能解決其中的大部分:它在您這一端加密,每塊資料只存一次,恢復單個檔案和備份整台伺服器一樣簡單。
下面是一套我們真正信得過的設定,適用於 Ubuntu 或 Debian。
1. 安裝 restic
apt update && apt install -y restic
restic self-update
發行版自備的包往往比較舊;self-update 會拉取目前版本。
2. 選好儲存庫的位置
儲存庫不能放在您要保護的那台伺服器上。兩個常見選擇:
- 透過 SFTP 的另一台伺服器:
sftp:backup@203.0.113.20:/srv/restic/web1 - S3 相容的物件儲存:
s3:https://s3.example.com/my-bucket/web1
3. 儲存憑據
把所有東西放進一個只有 root 能讀的檔案裡,讓定時器和您的 shell 用同一套設定:
cat > /root/.restic-env <<'EOF'
export RESTIC_REPOSITORY="s3:https://s3.example.com/my-bucket/web1"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"
export AWS_ACCESS_KEY_ID="your-key-id"
export AWS_SECRET_ACCESS_KEY="your-secret"
EOF
openssl rand -base64 32 > /root/.restic-pass
chmod 600 /root/.restic-env /root/.restic-pass
現在把 /root/.restic-pass 的內容複製到您的密碼管理器裡。沒有它,備份就無法解密——您不行,任何人都不行。
4. 初始化並執行第一次備份
source /root/.restic-env
restic init
restic backup /etc /home /root /srv /var/www \
--exclude-caches --exclude '/root/.cache'
restic snapshots
根據資料實際所在的位置調整路徑。Docker 卷在 /var/lib/docker/volumes 下;應用資料通常在 /srv 或 /opt。
5. 資料庫:先轉儲,再備份
不要備份執行中資料庫的原始檔案。在備份前一刻做一次轉儲:
mkdir -p /var/backups/db
sudo -u postgres pg_dump -Fc mydb > /var/backups/db/mydb.dump
把 /var/backups/db 加進備份路徑。關於轉儲的更多內容,見我們的 PostgreSQL 指南。
6. 用 systemd 定時執行
這裡定時器比 cron 更好:它會把記錄寫進 journal,而且如果到點時伺服器是關著的,它會在之後補跑。
# /etc/systemd/system/restic-backup.service
[Unit]
Description=restic backup
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'source /root/.restic-env && restic backup /etc /home /root /srv /var/www /var/backups/db --exclude-caches && restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune'
# /etc/systemd/system/restic-backup.timer
[Unit]
Description=Daily restic backup
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now restic-backup.timer
systemctl list-timers restic-backup.timer
forget --prune 會保留 7 個每日、4 個每週和 6 個每月備份版本,其餘的刪除。如果有資料庫轉儲步驟,把它寫進 ExecStartPre= 那一行。
7. 真的恢復一次
正是這一步,把"我們有備份"變成事實。把一個目錄恢復到臨時資料夾裡看看:
source /root/.restic-env
restic restore latest --target /tmp/restore-test --include /etc/nginx
ls -la /tmp/restore-test/etc/nginx
restic check
現在做一次,以後每隔幾個月再做一次。restic check 會校驗儲存庫結構;恢復則證明資料真的在那裡。
restic 與 Managed Backups
它們並不衝突。Managed Backups 每天為整台伺服器產生一個還原點,可以在控制面板裡回滾——升級出問題後的快速補救。價格是每月 $2,所有年繳方案都免費包含。restic 則把檔案級副本存到您自己掌控的異地儲存裡,當問題是上週二刪掉的某個檔案,或者您想要一份完全在我們基礎設施之外的副本時,它就派上用場了。
如果您存的是敏感資料,可以把它和全盤加密搭配使用,或者參考加密儲存使用場景來執行您自己的備份目標。對大多數小伺服器和它們的備份任務來說,Micro 方案就夠了。
評論
目前還沒有評論。歡迎成為第一位。