直接答案:該選哪一個?
個人自架、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 就好。
二、一表看懂三家規格
| 項目 | restic | Kopia | Duplicati |
|---|---|---|---|
| 語言 | Go(單一執行檔) | Go(單一執行檔) | C#/.NET |
| 授權 | BSD-2-Clause | Apache-2.0 | GitHub 標示 NOASSERTION(無標準授權檔可辨識;第三方資料多寫 MIT,部分元件 LGPL) |
| GitHub 星數 | 36,711 | 14,402 | 15,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/restic | kopia/kopia | duplicati/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 |
| Kopia | CAS + 分層打包: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 測試)
| 項目 | restic | Kopia |
|---|---|---|
| 去重效率 | 60%–80% | 65%–82% |
| 記憶體 | 100–200 MB | 200–400 MB |
| 本機備份速度 | 120–160 MB/s | 100–140 MB/s |
| 本機還原速度 | 140–180 MB/s | 200–250 MB/s |
B. 1TB 上傳到 S3(CloudCasa,EC2 m5.xlarge)
| 情境 | restic | Kopia | 判讀 |
|---|---|---|---|
| 單一 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 實測)
| 項目 | restic | Kopia |
|---|---|---|
| 完整備份時間 | 14 分 57 秒 | 10 分 30 秒 |
| 二次增量掃描 | 34 秒 | 10 秒 |
| 快取目錄大小 | 173 MB | 1,128 MB(約 7 倍) |
| 還原時間 | 5 分 54 秒 | 21 分 35 秒 |
| Zstd 壓縮後大小 | 10.4 GB | 10.3 GB |
D. 日常小量備份的社群觀察(Chris’ Blog):同一批資料 Duplicati 約 10 分鐘,restic 約 7 秒——這種極端差距通常是「Duplicati 每次都在重建清單」造成的,不代表所有情境。
怎麼讀這張表:
- 備份快 ≠ 還原快。 A 表說 Kopia 還原快,C 表卻說 restic 還原快 3.6 倍。差異來自資料集與檔案數量,不是工具本身「絕對」誰快。
- 單一大檔(VM image、備份檔)→ restic 明顯有利,因為 Kopia 的平行上傳在單檔上發揮不了。
- 大量小檔(專案目錄、照片庫)→ Kopia 有利,多線程能吃滿頻寬。
- 這些都是第三方測試,你自己的資料形狀才是最終答案。要驗證很簡單:拿 10GB 真實資料,兩邊各跑一次
time。
五、加密與完整性驗證:三家都比「同步」安全,但驗證方式不同
| 項目 | restic | Kopia | Duplicati |
|---|---|---|---|
| 內容加密 | AES-256-CTR + Poly1305 認證 | AES-256-GCM(預設)或 ChaCha20-Poly1305 | AES-256(或走 GPG) |
| 金鑰衍生 | scrypt | scrypt(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)。
但它有兩個必須知道的風險:
- 本機 SQLite 資料庫是弱點。 資料庫損壞或主機重裝後,
Database Recreate要從遠端重建,TB 級資料常要好幾天,中途失敗的案例在社群不算少見。 - 不要備份到 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 GB | 60 GB | US$0.42 | US$5.00 | US$0.90 | US$10.80 |
| 500 GB | 150 GB | US$1.04 | US$12.51 | US$2.25 | US$27.00 |
| 1 TB | 300 GB | US$2.08 | US$25.02 | US$4.50 | US$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 的說明文件。
十一、八個實測踩雷(含官方文件級的坑)
- restic 的
forget不會釋放空間。 一定要--prune,或分開跑restic prune。只跑 forget 的話 repo 會一直長大。 prune會鎖住 repo。 多台機器共用一個 repo 時,兩台同時 prune 會互卡。要錯開時間,或讓「一台專門負責 prune」。- 網路上「restic prune 很慢」的文章要看版本。 restic 在 0.18/0.19 系列對 prune 做過效能重構(CHANGELOG 可見),舊文的結論建議用最新版重測再判斷。
- Kopia 的快取很大。 實測 25GB 資料集產生 1.1GB 快取,小容量 VPS(20GB 磁碟)要先把 cache 目錄指到別的位置,否則會撐爆根分割區。
- Kopia 的格式相容政策較嚴。 只保證往前一個版本的唯讀相容,升級前請先看 release notes,重要環境別直接跳好幾版。
- Duplicati 不要備份到 SMB/CIFS。 見上一節,這是社群公認的地雷。
- 三家的密碼都沒有救援機制。 沒有「忘記密碼」按鈕,也沒有廠商可以幫你解密。密碼管理與異地保存是流程問題,不是工具問題。
- 資料庫不要直接複製資料檔。 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 最直覺,但別當唯一備份 |
| 多台機器寫同一個 repo | restic 或 Kopia + Repository Server | restic 有 lock 機制;Kopia 多使用者建議走 server 模式 |
| 團隊/企業 | restic(+ resticprofile 管理多任務) | 設定可版控、可 CI、審計容易 |
如果你完全不想選:restic 當主力、KopiaUI 當桌機那一份,兩者都用 S3 相容儲存,資料形狀不同時各自的優勢會互補。
站內延伸閱讀
- 自架 S3 物件儲存完整教學 2026:MinIO 社群版停止維護後該選誰?Garage、SeaweedFS、RustFS 完整比較+Docker 實戰、boto3/rclone/restic 範例
- Proxmox VE 9.2 完整教學 2026:從 ISO 安裝、ZFS、LXC/VM 選擇到 GPU 直通、PBS 備份與叢集
- Syncthing 完整教學 2026:89K 星開源 P2P 檔案同步,自架取代 Dropbox、Resilio Sync
資料來源與查證方法
- 官方一手來源: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 說法未逐一驗證。
