−25%

Windows 年繳方案適用,至 10 月 31 日。 檢視方案

EQVPS
開始使用

如何用 restic 備份 VPS(加密、異地存放)

用 restic 做加密、去重的 VPS 備份:儲存庫放在 S3 相容儲存或另一台伺服器上,配合 systemd 定時器、保留策略和恢復測試。

每個人都有備份,直到他們試著恢復一次。結果資料夾是空的,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 方案就夠了。

常見問題

如果把 restic 密碼弄丟了會怎樣?

備份就永遠沒了。restic 在用戶端加密一切,沒有恢復金鑰。請把密碼存在密碼管理器裡,而不是隻放在被備份的伺服器上。

儲存庫應該放在哪裡?

除了這台伺服器本身,放哪兒都行:S3 相容的物件儲存、透過 SFTP 連線的另一台 VPS,或者家裡的機器。和資料放在同一塊磁碟上的備份,會和那塊磁碟一起完蛋。

怎麼用 restic 備份資料庫?

先做轉儲,再備份轉儲檔案——PostgreSQL 用 'pg_dump -Fc',MySQL 用 'mysqldump --single-transaction'。直接複製執行中資料庫的檔案,可能得到一個啟動不了的備份。

備份會佔多少空間?

比您想的少。restic 會把檔案切成塊,每塊只存一次,所以對一台變化不大的伺服器,每天的備份只會增加變化的那部分資料。

那我還需要 Managed Backups 嗎?

它們解決的問題不同。Managed Backups 提供整台伺服器的每日還原點,可以在控制面板裡回滾。restic 提供由您掌控的、檔案級的異地副本。很多人兩個都用。

評論

目前還沒有評論。歡迎成為第一位。

發表評論

評論在顯示前會經過審核。