使用 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 關閉螢幕的 SUSE 伺服器

診斷卡在 systemd 關閉螢幕的 SUSE 伺服器

使用 systemd 作業和先前的啟動日誌來尋找運行緩慢的服務、掛載點或儲存依賴項,然後修正它,而不掩蓋原因。

僅開放 SLES 15 伺服器所需的網路流量

僅開放 SLES 15 伺服器所需的網路流量

使用 firewall-cmd 檢查活動區域,安全地允許 HTTP,保留 SSH 訪問,並驗證該規則在 SLES 15 上重新加載後是否仍然存在。

診斷 SLES PAM 登入失敗問題,避免被鎖定

診斷 SLES PAM 登入失敗問題,避免被鎖定

追溯 PAM 故障到其服務、帳戶原則或身分提供者,然後在保持管理員會話正常運作的情況下修復正確的 SLES 配置。

在 ONLYOFFICE 文件伺服器中新增字型:Docker 與 Linux

在 ONLYOFFICE 文件伺服器中新增字型:Docker 與 Linux

在 ONLYOFFICE 文件伺服器中安裝自訂字體,比較持久 Docker 掛載與直接複製,重建字體列表,並驗證結果。

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

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

將 Nextcloud 的檔案和 MariaDB 一起備份,使用 cron 安排加密的 Restic 快照,並在不危及執行伺服器的情況下驗證復原。

使用 TGZ Exports 備份和還原 Zimbra CE 郵箱

使用 TGZ Exports 備份和還原 Zimbra CE 郵箱

匯出單一 Zimbra Community Edition 信箱,驗證其 TGZ 備份,並在不覆寫現有郵件的情況下還原遺失的項目。

允許已批准的使用者使用 Keycloak 登入建立 Jitsi 會議室

允許已批准的使用者使用 Keycloak 登入建立 Jitsi 會議室

僅允許已批准的帳戶使用 Keycloak 和令牌身份驗證啟動 Jitsi Meet 會議室,同時在需要時允許訪客加入。

透過 LDAP 將 Active Directory 使用者與 ONLYOFFICE DocSpace 同步。

透過 LDAP 將 Active Directory 使用者與 ONLYOFFICE DocSpace 同步。

將 ONLYOFFICE DocSpace 連接到 Active Directory 或 OpenLDAP,安全地匯入使用者和群組,映射帳戶字段,並安排可靠的同步。

在 SLES 15 安全啟動上安裝和簽署自訂核心模組

在 SLES 15 安全啟動上安裝和簽署自訂核心模組

在不停用安全啟動的情況下載入自訂 SLES 15 核心模組。匹配正在運行的內核,對 .ko 檔案進行簽名,註冊 MOK 金鑰,並驗證載入情況。

將 ONLYOFFICE Docs 置於 HAProxy 之後而不影響編輯功能

將 ONLYOFFICE Docs 置於 HAProxy 之後而不影響編輯功能

為 ONLYOFFICE Docs 設定 HAProxy HTTPS、轉送標頭、WebSocket 逾時和執行狀況檢查,然後驗證編輯和儲存功能。