自架備份完整教學 2026:restic vs Kopia vs Duplicati 該選誰?3-2-1 策略、Docker 安裝、S3/B2 實戰指令、排程與還原演練一次學會

備份不是把檔案同步出去就好。這篇從 3-2-1 原則講起,比較 restic(3.6 萬星)、Kopia(1.4 萬星)、Duplicati(1.5 萬星)的架構、去重、加密、速度與踩坑,並附上 restic 備份到 Backblaze B2/S3 的完整可執行指令、systemd 排程、Docker 寫法、Kopia policy 與 maintenance 設定、保留策略、成本試算,以及每季一定要跑的還原演練清單。

  • Dennis
  • 15 分鐘閱讀
自架備份完整教學 2026:restic vs Kopia vs Duplicati 該選誰?3-2-1 策略、Docker 安裝、S3/B2 實戰指令、排程與還原演練一次學會

直接答案:該選哪一個?

個人自架、VPS、NAS 一律先選 restic;需要圖形介面與多線程速度選 Kopia;Duplicati 只建議用在「小量檔案 + 一定要滑鼠操作」的情境,不建議當長期主力。 三套都是開源、都做用戶端加密、都支援 S3/B2,差別在架構:restic 最穩最單純、Kopia 最快且有 GUI、Duplicati 最好上手但本機資料庫是弱點。

  • restic:36,711 星、BSD-2-Clause、Go、最新 v0.19.1(2026-07-05)
  • Kopia:14,402 星、Apache-2.0、Go、最新 v0.23.1(2026-06-16)
  • Duplicati:15,153 星、GitHub 判定為 NOASSERTION、C#、最新 2.4.0.1_stable(2026-10-07)

星數與版本為 2026-10-21 以 GitHub API 實際查詢。


一、先分清楚:備份、同步、快照不是同一件事

大部分人的「備份」其實是同步,這也是資料消失最常見的原因。

你以為的備份實際風險
Syncthing/Dropbox/Google Drive 同步同步會把你刪掉的東西一起刪掉;勒索病毒加密後,雲端版本跟著被覆蓋
RAID 1/RAID 5/ZFS 鏡像只防硬碟壞,不防誤刪、不防勒索、不防整機被搬走
筆電外接硬碟手動複製你三個月後就不會做了;而且硬碟跟筆電放在同一個包裡
雲端主機快照(VPS snapshot)同一個供應商、同一個帳號,帳號被盜就一起再見

真正的備份要有三個特性:版本化(能回到過去某一天)、異地(不在同一台機器/同一個帳號)、可還原(你實際測試過)。 第三點最多人漏掉。

3-2-1 原則,用台灣的場景翻譯

原則意思實作範例
3 份資料原始 + 2 份備份伺服器本體 + 本機外接碟 + 雲端物件儲存
2 種媒介不要兩份都在同一種儲存一顆 SSD/HDD + 一個 S3 相容 bucket
1 份異地至少一份不在同一個實體位置用 Backblaze B2/Cloudflare R2 放跨國節點

如果你只有一台 VPS,最低標準是:本機 restic repo(快、好還原)+ 雲端 object storage repo(異地、防整台機器消失),兩個 repo 各自備份。restic 支援多 repo,只要換 RESTIC_REPOSITORY 就好。


二、一表看懂三家規格

項目resticKopiaDuplicati
語言Go(單一執行檔)Go(單一執行檔)C#/.NET
授權BSD-2-ClauseApache-2.0GitHub 標示 NOASSERTION(無標準授權檔可辨識;第三方資料多寫 MIT,部分元件 LGPL)
GitHub 星數36,71114,40215,153
最新版本v0.19.1(2026-07-05)v0.23.1(2026-06-16)2.4.0.1_stable(2026-10-07)
官方 GUI無(CLI only,靠 backrest/resticprofile 等第三方)有 KopiaUI + Web UI有 Web UI(預設介面)
內建排程無(用 cron/systemd timer)有(policy 內建 snapshot 排程)有(內建 scheduler)
Docker 映像restic/restickopia/kopiaduplicati/duplicati
本機狀態幾乎無狀態(只有快取)快取目錄較大(實測可到 1GB+)強制依賴本機 SQLite 資料庫
多機寫同一個 repo支援(有 lock 機制)支援,但多使用者建議架 Repository Server支援
最適合VPS、Linux 腳本、Docker 主機Windows、桌面、要 GUI 的人想要「裝好就能點」的小規模備份

三、架構差異:為什麼會影響「速度」與「救不回來」

三家都做去重(deduplication),但「怎麼記帳」完全不同,這就是踩坑的根源。

工具儲存庫結構實務後果
restic內容可定址(CAS):用 Rabin 指紋切 chunk → 加密 → 打包成約 50MB 的 pack file;索引以 index blob 記錄 chunk 對應結構最單純、最容易救。沒有本機資料庫,換一台機器只要有密碼就能讀 repo。缺點是 hash 與加密偏單線程,10GbE 這種超高速網路會卡在單核 CPU
KopiaCAS + 分層打包:p-blob 放加密後的內容 chunk、q-blob 放目錄與 metadata;本機有記憶體映射的索引快取掃描與增量比對極快、原生多線程。缺點是快取很大(實測 1.1GB vs restic 173MB),而且索引一旦壞了修復比 restic 難
Duplicati切成約 100KB 區塊 → 上傳 .dblock/.dindex/.dlist;本機用 SQLite 記錄所有檔案與區塊對照介面最友善,但本機 SQLite 是單點故障:資料庫一壞、或主機重裝,就要跑 Database Recreate,得把遠端所有索引重新下載掃一遍,TB 級資料集常常要數天,還可能中途失敗

一句話記住:restic 的真相在雲端,Kopia 的真相在雲端+大快取,Duplicati 的真相有一半在你這台電腦的 SQLite 裡。


四、效能實測:兩份 benchmark 互相打架,怎麼看

這裡要特別小心。網路上流傳的數字差異很大,因為資料集形狀不同,結論會反過來。以下整理兩組公開測試,數字都標明來源。

A. 100GB 級本機備份/還原(Onidel Cloud 2025/2026 測試)

項目resticKopia
去重效率60%–80%65%–82%
記憶體100–200 MB200–400 MB
本機備份速度120–160 MB/s100–140 MB/s
本機還原速度140–180 MB/s200–250 MB/s

B. 1TB 上傳到 S3(CloudCasa,EC2 m5.xlarge)

情境resticKopia判讀
單一 1TB 大檔4 小時 06 分(約 68 MB/s)10 小時 33 分(約 26 MB/s)單一大檔無法平行,Kopia 的多線程優勢吃不到
100 個檔共 1TB(16 執行緒)較慢1 小時 15 分(約 220 MB/s)大量小檔時 Kopia 反超,約為 restic 的 4 倍

C. Linux 根目錄約 25GB(SSD 實測)

項目resticKopia
完整備份時間14 分 57 秒10 分 30 秒
二次增量掃描34 秒10 秒
快取目錄大小173 MB1,128 MB(約 7 倍)
還原時間5 分 54 秒21 分 35 秒
Zstd 壓縮後大小10.4 GB10.3 GB

D. 日常小量備份的社群觀察(Chris’ Blog):同一批資料 Duplicati 約 10 分鐘,restic 約 7 秒——這種極端差距通常是「Duplicati 每次都在重建清單」造成的,不代表所有情境。

怎麼讀這張表:

  1. 備份快 ≠ 還原快。 A 表說 Kopia 還原快,C 表卻說 restic 還原快 3.6 倍。差異來自資料集與檔案數量,不是工具本身「絕對」誰快。
  2. 單一大檔(VM image、備份檔)→ restic 明顯有利,因為 Kopia 的平行上傳在單檔上發揮不了。
  3. 大量小檔(專案目錄、照片庫)→ Kopia 有利,多線程能吃滿頻寬。
  4. 這些都是第三方測試,你自己的資料形狀才是最終答案。要驗證很簡單:拿 10GB 真實資料,兩邊各跑一次 time。

五、加密與完整性驗證:三家都比「同步」安全,但驗證方式不同

項目resticKopiaDuplicati
內容加密AES-256-CTR + Poly1305 認證AES-256-GCM(預設)或 ChaCha20-Poly1305AES-256(或走 GPG)
金鑰衍生scryptscrypt(format block)依後端設定
檔名/metadata 是否加密是是是
完整性檢查指令restic check(可加 --read-data 全部讀回、--read-data-subset=5% 抽樣)kopia snapshot verify、kopia repository verify透過 .dindex 雜湊校驗、可設定備份前後自動驗證
錯誤更正無有(Reed-Solomon ECC,實驗性)無

最重要的一句話:加密的代價是「密碼掉了,資料就真的沒了」。 三家都一樣,沒有後門、沒有救援服務。所以:

  • 密碼放在密碼管理器(例如自架的 Vaultwarden),不要只存在同一台要備份的機器上
  • 另外印一份紙本或放在保險箱(真的,這是業界標準做法)
  • restic 用 RESTIC_PASSWORD_FILE,檔案權限設 600,不要寫在 shell history 裡

六、實戰 A:restic 備份到 Backblaze B2/S3(完整可執行)

以下指令都以 Linux VPS + B2 的 S3 相容 API 為例(B2 官方也建議走 S3 API,比原生 B2 backend 更穩)。用其他 S3 相容服務(Cloudflare R2、Wasabi、自架 Garage/MinIO)只要換 endpoint。

1. 安裝

# Debian / Ubuntu
sudo apt update && sudo apt install -y restic
restic version

也可以從 GitHub Releases 抓單一執行檔(免安裝、適合放在容器或舊 distro):

# 示意:版本號請換成最新版
curl -L -o restic.bz2 https://github.com/restic/restic/releases/download/v0.19.1/restic_0.19.1_linux_amd64.bz2
bunzip2 restic.bz2 && chmod +x restic && sudo mv restic /usr/local/bin/

2. 設定環境變數與密碼檔

sudo mkdir -p /etc/restic
sudo sh -c 'openssl rand -base64 32 > /etc/restic/password'
sudo chmod 600 /etc/restic/password

sudo tee /etc/restic/env >/dev/null <<'EOF'
export RESTIC_REPOSITORY="s3:s3.us-west-004.backblazeb2.com/my-restic-bucket"
export RESTIC_PASSWORD_FILE=/etc/restic/password
export AWS_ACCESS_KEY_ID="<你的-key-id>"
export AWS_SECRET_ACCESS_KEY="<你的-application-key>"
EOF
sudo chmod 600 /etc/restic/env
source /etc/restic/env

B2 的 endpoint 格式是 s3.<region>.backblazeb2.com,region 依你建 bucket 時選的區域(例如 us-west-004)。AWS S3 則是 s3:s3.us-east-1.amazonaws.com/<bucket>。

3. 初始化 repo(只做一次)

restic init

restic 0.14 之後預設建立 repository version 2,預設就會壓縮——這是很多人不知道的好處,實際上傳量會比原始資料小。

4. 備份

restic backup /srv/data /etc /home \
  --exclude-caches \
  --exclude='*.tmp' \
  --exclude='**/.cache'

常用小技巧:

restic snapshots                 # 看有哪些快照
restic stats --mode raw-data     # 看 repo 實際佔用
restic diff <snap-a> <snap-b>    # 比對兩個快照差異
restic ls latest                 # 列出最新快照的檔案

5. 保留策略(GFS)+真正清理

restic forget \
  --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --keep-yearly 3 \
  --prune
  • forget 只是「忘記」快照,資料區塊還在
  • 加 --prune 才會真的把沒人引用的區塊刪掉、釋放空間
  • 也可以先 --dry-run 看會刪什麼再執行
restic forget --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --dry-run

6. 驗證(這步最多人跳過)

# 只檢查結構與索引(快)
restic check

# 抽 5% 的資料實際下載解密比對(慢,但才是真的驗證)
restic check --read-data-subset=5%

7. 還原

# 還原整個最新快照到 /restore
restic restore latest --target /restore

# 只還原某個路徑
restic restore latest --target /restore --include /srv/data

# 用 FUSE 掛起來像資料夾一樣翻(找檔案超方便)
mkdir -p /mnt/restic && restic mount /mnt/restic

8. 排程:systemd timer(比 cron 好用,有 log)

# /etc/systemd/system/restic-backup.service
[Unit]
Description=restic backup to object storage
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
EnvironmentFile=/etc/restic/env
ExecStart=/usr/bin/restic backup /srv/data --exclude-caches
ExecStartPost=/usr/bin/restic forget --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --prune
ExecStartPost=/usr/bin/restic check --read-data-subset=5%
# /etc/systemd/system/restic-backup.timer
[Unit]
Description=Daily restic backup

[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
RandomizedDelaySec=600

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now restic-backup.timer
systemctl list-timers restic-backup.timer
journalctl -u restic-backup.service -n 50 --no-pager   # 看上次跑得怎樣

Persistent=true 很重要:機器關機錯過時間,開機後會補跑。

9. Docker 寫法(容器化主機)

docker run --rm \
  -e RESTIC_REPOSITORY -e RESTIC_PASSWORD \
  -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY \
  -v /srv/data:/data:ro \
  restic/restic backup /data

備份 Docker volume 的常見做法是「短暫停容器 → 備份 volume 目錄 → 起回來」,或直接備份 volume 在宿主機上的 _data 路徑。資料庫類(PostgreSQL/MySQL)請先 dump 再備份 dump 檔,不要在資料庫寫入中直接複製資料檔。


七、實戰 B:Kopia(要 GUI、要速度就選它)

Kopia 的指令結構跟 restic 不同,repository 是前置詞。

# 建立 S3 repo(B2/R2/MinIO 都走這條,換 endpoint 即可)
kopia repository create s3 \
  --bucket=my-kopia-bucket \
  --access-key="<key-id>" \
  --secret-access-key="<app-key>" \
  --endpoint=s3.us-west-004.backblazeb2.com

# 另一台機器連到同一個 repo
kopia repository connect s3 \
  --bucket=my-kopia-bucket \
  --access-key="<key-id>" \
  --secret-access-key="<app-key>" \
  --endpoint=s3.us-west-004.backblazeb2.com

備份與查看:

kopia snapshot create /srv/data
kopia snapshot list /srv/data
kopia manifest list          # 看 repo 內的物件清單

保留策略(policy 可以設在 global/host/path 層級):

kopia policy set --global \
  --keep-latest 10 --keep-daily 7 --keep-weekly 5 --keep-monthly 12 \
  --keep-annual 2

維護與驗證(Kopia 會自動跑,但也可以手動):

kopia maintenance info              # 看誰是 maintenance owner、上次跑何時
kopia maintenance run               # quick maintenance
kopia maintenance run --full        # 完整 GC + compaction(會慢)
kopia snapshot verify --verify-files-percent=5
kopia repository status

kopia maintenance run --full 必須由 maintenance owner 執行;效果不是即時的,可能要數小時到數個週期才會真的清掉 blob。不要為了快而用 --safety=none,除非你能保證當下沒有任何其他 client 在寫。

要 GUI 的話,本機跑:

kopia server start --insecure --address=127.0.0.1:51515

然後開瀏覽器連 http://127.0.0.1:51515。--insecure 只適用於 localhost 或走 SSH tunnel 的情境,要對外請務必設 TLS 與密碼(放到 Caddy/Nginx 後面)。

Windows/macOS 桌面使用者直接裝 KopiaUI,圖形介面就能建立 repo、設定 snapshot 排程與 policy,不用背指令——這是 Kopia 對一般使用者最大的優勢。


八、Duplicati:還能用,但要知道它的弱點

Duplicati 的定位很清楚:Web UI 最好懂、Windows 整合最好、支援的雲端最多(OneDrive、Dropbox、Mega、Box、Storj 通通有原生支援)。 如果你要備份的是幾十 GB 的文件與照片,而且堅持要有圖形介面,它仍然是合理選擇。

docker run -d --name duplicati \
  -p 8200:8200 \
  -v /srv/duplicati-config:/data \
  -v /srv/data:/source:ro \
  duplicati/duplicati

然後開 http://<主機>:8200 設定備份。Retention 選 Smart backup retention(等同 GFS)。

但它有兩個必須知道的風險:

  1. 本機 SQLite 資料庫是弱點。 資料庫損壞或主機重裝後,Database Recreate 要從遠端重建,TB 級資料常要好幾天,中途失敗的案例在社群不算少見。
  2. 不要備份到 SMB/CIFS 分享。 社群反覆警告:SMB 上的檔案 metadata 行為會讓 Duplicati 誤判大量檔案變更,嚴重時整個 repo 毀損。這點 restic 官方文件也提到 Linux 上掛 CIFS 的相容性問題。

實務建議: 如果你現在跑 Duplicati 而且備份量已經超過 500GB,至少加一份 restic 或 Kopia 的備份當第二份,不要讓它當唯一的那一份。


九、成本試算:其實比你想的便宜

物件儲存的價格變動很快,以下用 2026-10 查到的牌價估算(實際費用以官網為準):

  • Backblaze B2:US$6.95/TB/月(前 10GB 免費;egress 免費額度為平均儲存量的 3 倍)
  • Cloudflare R2 Standard:US$0.015/GB/月(egress 全免費;前 10GB 免費)

假設去重+壓縮後實際只佔原始的 30%(保守估計):

原始資料實際儲存B2 月費B2 年費R2 月費R2 年費
200 GB60 GBUS$0.42US$5.00US$0.90US$10.80
500 GB150 GBUS$1.04US$12.51US$2.25US$27.00
1 TB300 GBUS$2.08US$25.02US$4.50US$54.00

(以上數字以程式計算,四捨五入到小數第二位。營運成本另含 API 請求費與 egress,備份情境通常極低。)

一年一、兩千塊台幣以內,換一份異地、版本化、可還原的備份——這是整個自架環境裡投報率最高的一筆錢,比升級硬碟划算得多。


十、最重要的一節:還原演練清單

沒還原過的備份,不算備份。 每季至少跑一次,整段不要超過 30 分鐘:

  • 從雲端 repo 列出快照:restic snapshots / kopia snapshot list
  • 隨機挑一個「不是最新」的快照(要驗證舊版本能讀)
  • 還原到另一台機器或暫存目錄(不要還原回原路徑,避免蓋掉現有資料)
  • 開幾個檔案確認內容正確(不是 0 byte、不是亂碼)
  • 確認資料庫 dump 檔可以被讀取(例如 pg_restore --list)
  • 記錄這次演練的耗時與遇到的問題
  • 檢查 restic check --read-data-subset=5% 或 kopia snapshot verify 最近的結果
  • 確認密碼檔/金鑰在「非該主機」的地方也有一份

建議把這份清單寫進團隊的 runbook,並在日曆上排每季提醒。真正出事的那天,你不會想第一次讀 restic 的說明文件。


十一、八個實測踩雷(含官方文件級的坑)

  1. restic 的 forget 不會釋放空間。 一定要 --prune,或分開跑 restic prune。只跑 forget 的話 repo 會一直長大。
  2. prune 會鎖住 repo。 多台機器共用一個 repo 時,兩台同時 prune 會互卡。要錯開時間,或讓「一台專門負責 prune」。
  3. 網路上「restic prune 很慢」的文章要看版本。 restic 在 0.18/0.19 系列對 prune 做過效能重構(CHANGELOG 可見),舊文的結論建議用最新版重測再判斷。
  4. Kopia 的快取很大。 實測 25GB 資料集產生 1.1GB 快取,小容量 VPS(20GB 磁碟)要先把 cache 目錄指到別的位置,否則會撐爆根分割區。
  5. Kopia 的格式相容政策較嚴。 只保證往前一個版本的唯讀相容,升級前請先看 release notes,重要環境別直接跳好幾版。
  6. Duplicati 不要備份到 SMB/CIFS。 見上一節,這是社群公認的地雷。
  7. 三家的密碼都沒有救援機制。 沒有「忘記密碼」按鈕,也沒有廠商可以幫你解密。密碼管理與異地保存是流程問題,不是工具問題。
  8. 資料庫不要直接複製資料檔。 PostgreSQL/MySQL/SQLite(含 Karakeep、changedetection 這類 app 的資料庫)請先 dump/用一致性快照,否則還原出來是壞的。

十二、選型決策表

你的情境建議理由
Linux VPS(無 GUI)restic + systemd timer單一執行檔、RAM 100–200MB、無本機資料庫、腳本最好控制
自架 NAS/Homelab(多服務)restic(要 GUI 可搭 backrest)多服務、多 repo、可腳本化;社群與第三方工具最多
Windows 桌機/筆電KopiaUI有 GUI、可掛載、VSS 支援、多線程快
大量小檔(照片、專案)Kopia多線程能吃滿頻寬,同一批檔案上傳明顯較快
單一大檔(VM image、dump)restic單檔無法平行,Kopia 優勢消失;restic 反而快 2 倍以上
想要「裝好、點一點」就好Duplicati(小量)Web UI 最直覺,但別當唯一備份
多台機器寫同一個 reporestic 或 Kopia + Repository Serverrestic 有 lock 機制;Kopia 多使用者建議走 server 模式
團隊/企業restic(+ resticprofile 管理多任務)設定可版控、可 CI、審計容易

如果你完全不想選:restic 當主力、KopiaUI 當桌機那一份,兩者都用 S3 相容儲存,資料形狀不同時各自的優勢會互補。


站內延伸閱讀

資料來源與查證方法

  • 官方一手來源:restic GitHub README 與 CHANGELOG(v0.19.1)、restic 官方文件〈Preparing a new repository〉(repository version 1/2 與壓縮說明、S3 endpoint 寫法)、Kopia 官方文件(repository create s3 旗標表、Maintenance、policy set 旗標表)、Kopia GitHub README(backend 清單與授權)
  • API 現查(2026-10-21):GitHub API 查 restic/kopia/duplicati 的星數、授權、語言、最後推送時間;Releases API 查最新版本
  • NotebookLM deep 研究(2026-10-21,53 個來源):架構比較、效能 benchmark(Onidel Cloud、CloudCasa、25GB root 實測、Chris’ Blog)、加密機制、retention 設計、踩坑案例
  • 計價(2026-10 查詢):Backblaze B2 官網 US$6.95/TB/月;Cloudflare R2 官方文件 US$0.015/GB-month、egress 免費
  • 未做的事(請自行判斷):本文沒有在相同硬體上實測三套工具的速度,效能數字全部引自第三方 benchmark,且不同來源結論互相矛盾(已在第四節標明);沒有實際註冊 B2/R2 帳號跑過完整還原流程;成本表為估算,未含 API 請求費與稅金。Duplicati 的授權以 GitHub API 回報的 NOASSERTION 為準,第三方資料的 MIT 說法未逐一驗證。

📬 訂閱 most.tw 電子報

每週精選 AI 工具教學與技術乾貨,直接送到你的信箱。免費、隨時可退訂。

訂閱即表示同意收到 most.tw 電子報,隨時可一鍵退訂。

💬 有問題想討論?加 LINE 聯絡我

歡迎透過 LINE 官方帳號直接留言,我會盡快回覆你的問題。

加入 LINE 好友