使用 Restic 和 Cron 實現 Nextcloud 的自動化和一致性備份

為了確保 Nextcloud 備份的可靠性,請暫停使用者活動,匯出資料庫,然後使用 Restic 擷取匯出的檔案以及應用程式和資料目錄。將此任務放在 root 使用者擁有的腳本中,並使用 cron 進行定時任務;在依賴定時任務之前,請驗證快照並執行測試復原。

本範例假設伺服器為 Debian 或 Ubuntu 系統,Nextcloud 直接安裝在 `/usr/local/share/Nextcloud`目錄下/var/www/nextcloud,資料目錄位於 `/ usr/local/share/data` 目錄下/srv/nextcloud-data,並使用 MariaDB 資料庫。請將這些值替換為您實際的路徑和資料庫名稱。這些步驟已於 2026 年 10 月根據 Nextcloud 35 管理手冊和 Restic 0.19.1 文件進行驗證。

一張深色的終端示意圖顯示,在匯出 MariaDB 資料庫之前,Nextcloud 的維護模式已啟用。
終端風格的圖示,展示了啟動一致性備份的兩個操作:啟用維護模式和匯出資料庫。

Nextcloud備份必須包含哪些內容?

Nextcloud 的備份指南將配置、資料、資料庫、主題以及任何自訂應用程式列為需要保留的重要部分。備份完整的應用程式目錄通常包含其配置和捆綁的應用程序,但請檢查自訂應用程式、主題或資料目錄是否位於伺服器的其他位置。在 Restic 指令中包含每個單獨的路徑。

維護模式會在備份執行時鎖定現有工作階段並封鎖新的登入。這可以降低資料庫和檔案在不同時間點被更改的可能性,但也會導致 Nextcloud 在備份期間無法使用。對於大型資料存儲,請將備份作業安排在伺服器空閒時段。如果您的伺服器有直接寫入資料目錄的外部工作進程或腳本,也請暫停它們。

Nextcloud 的正式備份指南解釋了各個元件和資料庫匯出選項。此過程使用 MariaDB;對於 PostgreSQL、MySQL 或 SQLite,請使用對應手冊資料庫部分中的轉儲和復原命令。

準備好 Restic 並保護其憑證

使用發行版的可信任軟體套件來源安裝 Restic 和 MariaDB 用戶端。選擇位於不同磁碟或遠端備份目標上的儲存庫。僅儲存在 Nextcloud 伺服器上的儲存庫無法防止伺服器或其儲存遺失。請勿將儲存庫放置在任何要備份的目錄中。

Restic 會對儲存庫資料進行加密,但您需要儲存庫密碼才能復原資料。請建立密碼文件,並將其備份到伺服器外部,例如使用經過驗證的密碼管理器。如果密碼遺失,則無法讀取加密的儲存庫。請避免將密碼直接放在命令列、crontab 或腳本中。

sudo install -d -m 700 /root/.config/restic
sudo install -m 600 /dev/null /root/.config/restic/nextcloud-password
sudo install -m 600 /dev/null /root/.config/restic/nextcloud.env

將選取的 Restic 密碼安全地保存在密碼檔案中。將倉庫位置和密碼檔案路徑新增至環境變數檔案:

RESTIC_REPOSITORY=/mnt/backup/nextcloud
RESTIC_PASSWORD_FILE=/root/.config/restic/nextcloud-password

對於遠端後端,請使用該後端文件中記錄的倉庫 URL 和憑證,並以受限權限儲存。 Restic 在其倉庫準備指南中記錄了倉庫設定和支援的密碼檔案環境變數。只需初始化一次新倉庫,無需每次運行都初始化:

set -a
. /root/.config/restic/nextcloud.env
set +a
restic init
終端機圖示列出了 Restic 儲存庫路徑、密碼檔案路徑和 restic init 命令。
以下是加密 Restic 儲存庫的範例設定;密碼本身保存在一個單獨的受保護檔案中。

MariaDB 憑證也需要保護。配置一個 root 使用者可讀的客戶端選項文件,例如/root/.my.cnf包含資料庫使用者名稱、密碼和主機名稱的文件,然後將其權限設定為 root使用者可讀600。下面的腳本會將該檔案傳遞給 `<command>` mariadb-dump,因此資料庫密碼不會出現在進程參數中。

建立一個備份腳本,將 Nextcloud 還原到服務狀態。

將以下內容儲存為/usr/local/sbin/nextcloud-restic-backup。調整NC_DATA_DIR和DB_NAME以匹配config/config.php。此腳本啟用維護模式,匯出 MariaDB,備份應用程式、資料和臨時 SQL 轉儲,然後即使後續命令失敗,也會停用維護模式。

#!/usr/bin/env bash
set -Eeuo pipefail
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

NC_DIR=/var/www/nextcloud
NC_DATA_DIR=/srv/nextcloud-data
DB_NAME=nextcloud
RESTIC_ENV=/root/.config/restic/nextcloud.env
DB_CNF=/root/.my.cnf

set -a
source "$RESTIC_ENV"
set +a
exec 9>/run/lock/nextcloud-restic.lock
flock -n 9 || exit 0

mountpoint -q /mnt/backup || {
  echo "Backup target is not mounted" >&2
  exit 1
}

install -d -m 700 /var/backups/nextcloud
STAGE_DIR=$(mktemp -d /var/backups/nextcloud/db.XXXXXX)
maintenance_on=0

cleanup() {
  if [[ "$maintenance_on" -eq 1 ]]; then
    sudo -u www-data php "$NC_DIR/occ" maintenance:mode --off ||
      logger -t nextcloud-restic "Could not disable maintenance mode"
  fi
  rm -rf "$STAGE_DIR"
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM

sudo -u www-data php "$NC_DIR/occ" maintenance:mode --on
maintenance_on=1

mariadb-dump --defaults-extra-file="$DB_CNF"   --single-transaction --default-character-set=utf8mb4 "$DB_NAME"   > "$STAGE_DIR/nextcloud.sql"
test -s "$STAGE_DIR/nextcloud.sql"

restic backup "$NC_DIR" "$NC_DATA_DIR" "$STAGE_DIR" --tag nextcloud

設定所有權和權限,確保只有 root 使用者才能編輯或執行腳本,然後在維護視窗期間手動測試。此mountpoint檢查可防止備份磁碟缺失導致大型儲存庫靜默地傳送到伺服器的本機檔案系統。如果您的儲存庫位於遠端而非本機掛載,請用後端可靠的檢查方法取代此檢查。

首次運行前請檢查路徑。如果資料資料夾已存在於指定路徑下/var/www/nextcloud,請勿假定範例路徑正確;請使用 Nextcloud 配置中的實際資料目錄。此外,請確認儲存在應用程式目錄之外的自訂應用程式或主題已明確包含在內。

終端機圖示顯示 Restic 正在備份 Nextcloud 應用程式目錄、一個單獨的資料目錄以及一個用於 SQL 轉儲的暫存目錄。
Restic 備份包括為本次運行所建立的應用程式、使用者檔案和資料庫轉儲。

安排 cron 任務並檢查結果

手動運行成功後,新增一個 root 使用者 crontab 條目sudo crontab -e。此範例使用腳本的完整路徑,每天凌晨 2:30 啟動任務,並記錄輸出以便進行故障排除:

30 2 * * * /usr/local/sbin/nextcloud-restic-backup >> /var/log/nextcloud-restic.log 2>&1

Cron 提供的環境有限,因此腳本會明確設定PATH並自行載入 Restic 設定。請檢查您的發行版是否已啟用 cron,並確保此時間不會與 Nextcloud 的後台作業執行程式或其他維護任務衝突。 Linux crontab 手冊詳細介紹了 cron 的調度格式和提供的環境。

/var/log/nextcloud-restic.log透過檢查是否成功退出以及列出最近的快照來確認任務是否已完成:

sudo bash -lc 'set -a; source /root/.config/restic/nextcloud.env; set +a; restic snapshots'
sudo bash -lc 'set -a; source /root/.config/restic/nextcloud.env; set +a; restic check'

Restic 的常規check驗證功能會檢查儲存庫結構。完整讀取資料耗時較長,並且可能會佔用大量頻寬(針對遠端儲存庫);建議restic check --read-data定期執行此操作,或--read-data-subset分階段檢查部分資料。請參閱 Restic 的儲存庫完整性文件。

快照清單並非恢復測試。請使用 `npm run dev` 將最近的快照還原到單獨的臨時目錄restic restore latest --target /tmp/nextcloud-restore-test,然後確認應用程式檔案、資料目錄和 SQL 轉儲檔案均已存在。切勿在運作中的系統上進行復原測試。要進行實際恢復,請將文件和資料庫作為一個整體進行恢復;Nextcloud 的恢復說明涵蓋了資料庫重建和用戶端同步注意事項。

此設定可提供可重複的加密快照,但 cron 不會監控自身的故障,Restic 也不會決定您的保留策略。請查看日誌或配置失敗運行的警報,保留一份單獨的儲存庫憑證副本,並定期測試復原功能。如果維護視窗過長,請使用協調檔案系統快照和專為您的儲存平台設計的資料庫一致性匯出,而不是即時備份變更的檔案。

終端機圖示顯示了 Nextcloud Restic 腳本的每日 cron 條目以及 restic snapshots 命令。
該計劃每天呼叫 root 使用者擁有的腳本;快照清單可以快速檢查運行是否已被記錄。

留下評論

使用 Systemd 定時器可靠地執行 ownCloud 後台作業

將按需作業運行替換為 systemd 定時器,該定時器每 15 分鐘執行一次 ownCloud 支援的 occ system:cron 命令。

透過尋找故障路由來恢復 ownCloud WebDAV 同步

透過 Apache、Nginx 或反向代理程式追蹤 WebDAV 請求,然後使用經過驗證的 PROPFIND 測試確認 ownCloud 同步功能正常。

設定 Nextcloud 的公共 URL,以便它可以存取自身。

透過設定其規範 URL 並從伺服器本身檢查 DNS、HTTPS 和反向代理路由,修復 Nextcloud 缺少出站位址警告的問題。

在 Ubuntu 24.04 上設定 Nextcloud Redis 快取

在 Ubuntu 24.04 上設定 Nextcloud Redis 快取

透過本機 Unix 套接字配置 APCu 和 Redis,以實現 Nextcloud 快取和檔案鎖定,並提供目前和舊版 Nextcloud 的步驟。

使用 Systemd 定時器自動執行 Nextcloud Cron

檢查 Nextcloud 的 cron 模式,修復其 systemd 服務和計時器,並驗證後台作業在啟動後以及每隔五分鐘運行一次。

使用 Redis 清除 Nextcloud 的檔案鎖定警告

啟用可靠的 Nextcloud 檔案鎖定,選擇適當的 Redis 或 Valkey 後端,並驗證警告是否清除,同時避免並發檔案變更的風險。

如何才能獲得 Nextcloud A+ 安全評級

如何才能獲得 Nextcloud A+ 安全評級

使用最新更新、HTTPS 和 HSTS、精確的反向代理信任以及針對公共伺服器的檢查,修復 Nextcloud 掃描中常見的錯誤。

啟用 Nextcloud 伺服器端加密,並評估其影響

為需要加密的儲存配置 Nextcloud SSE,保護加密金鑰,並在加密現有文件之前測量傳輸和 CPU 影響。

將 Elasticsearch 全文搜尋功能新增至 Nextcloud

將 Nextcloud 的檔案搜尋連接到 Elasticsearch,索引文件內容,並選擇適合您的伺服器和安全需求的設定。

為 Nextcloud 已刪除檔案設定可靠的過期策略

為 Nextcloud 已刪除檔案設定可靠的過期策略

配置 Nextcloud 在規定的保留期後刪除已刪除的文件,可靠地安排後台作業,並避免執行清除所有使用者回收站的命令。