實用指南/VPS 備份與還原

VPS 備份與還原:靜態檔案演練

能從 VPS 之外取回備份並還原預期檔案,備份才真正有用。本演練封存一個靜態網頁與一份 Nginx 設定,複製到另一台電腦,再驗證還原後的位元組,過程不變更運作中的網站。

・更新日期:・閱讀時間:約 5 分鐘

本篇目錄

界定小型還原演練

在 Ubuntu 或 Linux/WSL 用戶端使用 Bash、GNU tar、sha256sum 及 OpenSSH。伺服器指令在同一個伺服器終端機執行;用戶端指令在另一台電腦的同一個終端機執行。保留兩個終端機,讓變數持續可用。任何指令出錯後都先停止。

演練使用家目錄下兩個可丟棄檔案,不會變更 Nginx、防火牆或正式內容,也不以 root 解壓縮。先使用下方測試檔;選用替換步驟只會使用靜態 HTTPS 部署指南的兩份檔案。

較大網站應另列素材、重新導向、載入設定、DNS 紀錄及相依項目。這個兩檔案範例不是完整機器或應用程式備份。

準備兩份檔案並保留現有網站

在伺服器建立私有練習目錄。下方設定只是要封存的檔案,不會啟用為服務設定。

umask 077
backup_lab=$(mktemp -d "$HOME/ubuntu-vps-backup.XXXXXX")
mkdir -p "$backup_lab/payload/site" "$backup_lab/payload/nginx" "$backup_lab/export"
printf '%s\n' '<!doctype html><html lang="en"><title>Restore drill</title><h1>Recovered static page</h1></html>' > "$backup_lab/payload/site/index.html"
printf '%s\n' 'server {' '    listen 8080;' '    server_name example.test;' '    root /var/www/first-site;' '}' > "$backup_lab/payload/nginx/first-site.conf"
printf 'Practice directory: %s\n' "$backup_lab"

選用步驟:若要備份教學中的實際網頁與 server block,以下指令只替換可丟棄副本。你的帳號必須能讀取兩份來源檔。先檢查設定是否含機密,收集期間暫停部署,確保檔案屬於同一版本。使用測試檔演練時,略過此區塊。

install -m 600 /var/www/first-site/index.html "$backup_lab/payload/site/index.html"
install -m 600 /etc/nginx/sites-available/first-site "$backup_lab/payload/nginx/first-site.conf"

這些指令只讀取正式來源,不修改它們,也不複製憑證私鑰或整個系統目錄。實際網站可能需要更多檔案,應有意識地加入資源清單與校驗碼清單。

建立封存檔與兩層校驗碼

在伺服器記錄所選檔案的校驗碼,以相對路徑建立封存檔,再計算封存檔校驗碼。此步驟期間保持內容不變。

(
    cd "$backup_lab/payload" &&
    sha256sum site/index.html nginx/first-site.conf > SHA256SUMS
)
tar -czf "$backup_lab/export/static-site.tar.gz" -C "$backup_lab/payload" site nginx SHA256SUMS
(
    cd "$backup_lab/export" &&
    sha256sum static-site.tar.gz > static-site.tar.gz.sha256
)
tar -tzf "$backup_lab/export/static-site.tar.gz"
printf 'Server export directory: %s\n' "$backup_lab/export"

列表應包含 site/、nginx/、兩份選定檔案及 SHA256SUMS。封存檔校驗碼可偵測傳輸檔案是否改變,內部清單則檢查解壓縮檔案。若有人能同時替換資料與預期校驗碼,兩層校驗都無法驗證備份來源真偽。

將備份複製到另一台電腦

在用戶端電腦,將 remote_backup 設為伺服器印出的確切匯出目錄。把範例位址、帳號及金鑰檔名換成可用的 SSH 資料。203.0.113.10 是文件專用位址;REPLACE 是佔位文字,不是 mktemp 產生的目錄尾碼。

umask 077
recovery_dir=$(mktemp -d "$HOME/ubuntu-vps-restore.XXXXXX")
remote_backup=/home/deploy/ubuntu-vps-backup.REPLACE/export
scp -i ~/.ssh/ubuntu_vps "deploy@203.0.113.10:$remote_backup/static-site.tar.gz" "$recovery_dir/"
scp -i ~/.ssh/ubuntu_vps "deploy@203.0.113.10:$remote_backup/static-site.tar.gz.sha256" "$recovery_dir/"

接受新主機前,透過可信任管道驗證 SSH 主機指紋。若因 SSH 失敗而無法複製,使用SSH 診斷指南,不要停用主機金鑰檢查來完成傳輸。

SCP 透過 SSH 保護傳輸,但 tar.gz 本身只有壓縮,沒有加密。保護目的帳號及儲存位置;資料有需要時,使用靜態資料加密。同一 VPS 上的另一個目錄不算伺服器外副本。

驗證並還原至新的空目錄

在用戶端解壓縮前檢查封存檔,只有 sha256sum 顯示 OK 才繼續。失敗需調查或重新傳輸,不要覆寫預期校驗碼來隱藏問題。

(
    cd "$recovery_dir" &&
    sha256sum -c static-site.tar.gz.sha256
)
tar -tzf "$recovery_dir/static-site.tar.gz"

將可信任封存檔解壓縮至新目錄。keep-old-files 會拒絕取代既有檔案,no-same-owner 則避免還原封存的擁有權。不要把目的地改成 /,也不要使用 sudo 解壓縮。

restore_dir=$(mktemp -d "$recovery_dir/restored.XXXXXX")
tar -xzf "$recovery_dir/static-site.tar.gz" -C "$restore_dir" --keep-old-files --no-same-owner
(
    cd "$restore_dir" &&
    sha256sum -c SHA256SUMS
)
cat "$restore_dir/site/index.html"

site/index.html 與 nginx/first-site.conf 都應顯示 OK,並看到還原網頁的標題。這驗證檔案內容,不驗證正式環境擁有權、ACL、服務可用性或網站所有相依項目。

區分檔案還原與服務復原

還原設定仍是未啟用的文字檔。使用前,在獨立替代伺服器檢視路徑、載入設定、模組、權限及憑證。先驗證組合後的 Nginx 設定,再重新載入並從外部檢查 HTTP/HTTPS。在未變更的正式伺服器上做語法檢查,不能驗證這份還原副本。

此封存刻意不含 TLS 私鑰,需規劃重發憑證或另行保護的憑證備份。不要用這套 tar 方法複製運作中的資料庫檔案;應使用資料庫支援的一致性備份與還原程序。

供應商快照可協助機器復原,但需檢查保存期限、故障範圍及還原程序。有快照不代表匯出的網站檔案已能在替代主機上還原。

記錄復原目標與結果

RPO 以時間表示可接受的資料遺失範圍,RTO 表示恢復服務的目標時間。小型靜態資訊網站可能設定 24 小時 RPO 及 60 分鐘 RTO;這些只是業務目標範例,不是本演練測得的結果。每日備份只有成功完成且保持可還原,才符合預定排程。

小螢幕可左右捲動表格,查看所有欄位。

紀錄能說明的事項
備份時間與版本識別碼可還原哪個版本
獨立目的地及保存期限副本能在哪裡存續、保留多久
封存檔及檔案校驗結果是否還原所選位元組
還原開始與完成時間指定還原步驟所耗時間
缺少檔案、權限或相依項目服務復原前仍需完成的工作
替代環境外部 HTTPS 驗證網站是否確實恢復

在認為 RTO 可達成前,先計時完整替代流程,包括存取、建立資源、設定、憑證,以及必要的 DNS 操作。快速本機解壓縮不是中斷復原效能測試。保留數個合適還原點並檢查失敗的備份工作。主機比較時也要檢視備份保存與還原支援條件。

常見問題

可以刪除原網站來證明備份可用嗎?

不需要刪除。還原至獨立空目錄並檢查清單,就能驗證檔案副本而不造成中斷。完整服務則在獨立替代環境測試。

校驗碼成功,是否代表整個網站已備份?

它只確認清單中的檔案,無法找出遺漏的素材、資料庫、機密或 DNS 設定。維護資源清單,並在服務還原後演練網站實際功能。

檔案驗證與完整服務復原是不同範圍。先使用可丟棄測試檔,再依實際網站擴充清單與復原程序。

官方資料來源

  1. 文件 1:ubuntu.com
  2. 文件 2:www.gnu.org
  3. 文件 3:www.gnu.org
  4. 文件 4:man.openbsd.org

相關指南