Go言語製の重複排除付きバックアップツール Duplicacy を試してみる

プッシュ型のバックアップですね

gilbertchen/duplicacy: A new generation cloud backup tool

バックアップ先は、 ローカルディスク、SFTP、Dropbox、Amazon S3、Google Cloud Storage、Microsoft Azure、Backblaze、Google Drive、Microsoft OneDrive、Hubic に今の所対応しているので十分かと。

Go製なので、レンタルサーバーなど制限された環境でも導入しやすいです。素敵です。

注意点としては FAIR 5 SOURCE LICENCE というライセンス形態になっており、 5ユーザーを越えると有料とのことです。

GUIは個人は初年度$20、次年度以降$5、法人は初年度$50、$10とありますが、 command lineは値段がわからない...

インストール

go get github.com/gilbertchen/duplicacy
cd $GOPATH/src/github.com/gilbertchen/duplicacy
go get ./...
go build -o $GOPATH/bin/duplicacy main/duplicacy_main.go

バックアップテスト用のディレクトリ作成

mkdir ~/dev/private/duplicacy_test
mkdir ~/dev/private/duplicacy_test/backup_shitai  # バックアップ対象
mkdir ~/dev/private/duplicacy_test/storage        # バックアップ保存先

初期化

cd ~/dev/private/duplicacy_test/backup_shitai
duplicacy init mywork ~/dev/private/duplicacy_test/storage
ls -la ./  # .duplicacy ディレクトリができている
ls -la ~/dev/private/duplicacy_test/storage  # chunks/, config, snapshots/ ができている

.duplicacy/preference の中身

$ cat .duplicacy/preference
[
    {
        "name": "default",
        "id": "mywork",
        "storage": "/Users/tmnm/dev/private/duplicacy_test/storage",
        "encrypted": false,
        "no_backup": false,
        "no_restore": false,
        "no_save_password": false,
        "keys": null
    }
]

バックアップのヘルプ確認

$ duplicacy backup --help                                                                                                                                                                                                                                                           2017-06-10 08:43:06

NAME:
   duplicacy backup - Save a snapshot of the repository to the storage

USAGE:
   duplicacy backup [command options]

OPTIONS:
   -hash                        detect file differences by hash (rather than size and timestamp)
   -t                      assign a tag to the backup
   -stats                       show statistics during and after backup
   -threads                  number of uploading threads
   -limit-rate            the maximum upload rate (in kilobytes/sec)
   -vss                         enable the Volume Shadow Copy service (Windows only)
   -storage       backup to the specified storage instead of the default one

初期バックアップ実行

$ duplicacy backup -stats

Storage set to /Users/tmnm/dev/private/duplicacy_test/storage
No previous backup found
Indexing /Users/tmnm/dev/private/duplicacy_test/backup_shitai
Backup for /Users/tmnm/dev/private/duplicacy_test/backup_shitai at revision 1 completed
Files: 0 total, 0 bytes; 0 new, 0 bytes
File chunks: 0 total, 0 bytes; 0 new, 0 bytes, 0 bytes uploaded
Metadata chunks: 3 total, 8 bytes; 2 new, 6 bytes, 24 bytes uploaded
All chunks: 3 total, 8 bytes; 2 new, 6 bytes, 24 bytes uploaded
Total running time: 00:00:01

もう一回。

$ duplicacy backup -stats                                                                                                                                                                                                                                                           2017-06-10 08:05:12

Storage set to /Users/tmnm/dev/private/duplicacy_test/storage
Last backup at revision 1 found  # 1個目のバックアップがあるで
Indexing /Users/tmnm/dev/private/duplicacy_test/backup_shitai
Backup for /Users/tmnm/dev/private/duplicacy_test/backup_shitai at revision 2 completed  # revision が1つカウントアップされた
Files: 0 total, 0 bytes; 0 new, 0 bytes
File chunks: 0 total, 0 bytes; 0 new, 0 bytes, 0 bytes uploaded
Metadata chunks: 3 total, 8 bytes; 0 new, 0 bytes, 0 bytes uploaded
All chunks: 3 total, 8 bytes; 0 new, 0 bytes, 0 bytes uploaded
Total running time: 00:00:01

ファイル作ってバックアップ

echo README >> README.md
duplicacy backup -stats                                                                                                                                                                                                                                                           2017-06-10 08:05:12
Storage set to /Users/tmnm/dev/private/duplicacy_test/storage
Last backup at revision 2 found
Indexing /Users/tmnm/dev/private/duplicacy_test/backup_shitai
Uploaded chunk 1 size 7, 7B/s 00:00:01 100.0%
Uploaded README.md (7)
Backup for /Users/tmnm/dev/private/duplicacy_test/backup_shitai at revision 3 completed
Files: 1 total, 7 bytes; 1 new, 7 bytes
File chunks: 1 total, 7 bytes; 1 new, 7 bytes, 16 bytes uploaded
Metadata chunks: 3 total, 247 bytes; 3 new, 247 bytes, 276 bytes uploaded
All chunks: 4 total, 254 bytes; 4 new, 254 bytes, 292 bytes uploaded
Total running time: 00:00:01

ファイルを更新してバックアップ

$ echo README2 >> README.md
$ duplicacy backup -stats

Storage set to /Users/tmnm/dev/private/duplicacy_test/storage
Last backup at revision 3 found
Indexing /Users/tmnm/dev/private/duplicacy_test/backup_shitai
Uploaded chunk 1 size 15, 15B/s 00:00:01 100.0%
Uploaded README.md (15)
Backup for /Users/tmnm/dev/private/duplicacy_test/backup_shitai at revision 4 completed
Files: 1 total, 15 bytes; 1 new, 15 bytes
File chunks: 1 total, 15 bytes; 1 new, 15 bytes, 25 bytes uploaded
Metadata chunks: 3 total, 250 bytes; 3 new, 250 bytes, 279 bytes uploaded
All chunks: 4 total, 265 bytes; 4 new, 265 bytes, 304 bytes uploaded
Total running time: 00:00:01

ファイルを削除してバックアップ

rm README.md
duplicacy backup -stats
Storage set to /Users/tmnm/dev/private/duplicacy_test/storage
Last backup at revision 4 found
Indexing /Users/tmnm/dev/private/duplicacy_test/backup_shitai
Backup for /Users/tmnm/dev/private/duplicacy_test/backup_shitai at revision 5 completed
Files: 0 total, 0 bytes; 0 new, 0 bytes
File chunks: 0 total, 0 bytes; 0 new, 0 bytes, 0 bytes uploaded
Metadata chunks: 3 total, 8 bytes; 0 new, 0 bytes, 0 bytes uploaded
All chunks: 3 total, 8 bytes; 0 new, 0 bytes, 0 bytes uploaded
Total running time: 00:00:01

リストアコマンドの確認

$ duplicacy restore --help

NAME:
   duplicacy restore - Restore the repository to a previously saved snapshot

USAGE:
   duplicacy restore [command options] [--] [pattern] ...

OPTIONS:
   -r                 the revision number of the snapshot (required)
   -hash                        detect file differences by hash (rather than size and timestamp)
   -overwrite                   overwrite existing files in the repository
   -delete                      delete files not in the snapshot
   -stats                       show statistics during and after restore
   -threads                  number of downloading threads
   -limit-rate            the maximum download rate (in kilobytes/sec)
   -storage       restore from the specified storage instead of the default one

リストア

$ duplicacy list                                                                                                                                                                                                                                                                    2017-06-10 08:21:34

Storage set to /Users/tmnm/dev/private/duplicacy_test/storage
Snapshot mywork revision 1 created at 2017-06-10 08:05 -hash
Snapshot mywork revision 2 created at 2017-06-10 08:05
Snapshot mywork revision 3 created at 2017-06-10 08:07  # README\nと書いた時のバックアップ
Snapshot mywork revision 4 created at 2017-06-10 08:09  # README\nREADME2\nと書いた時のバックアップ
Snapshot mywork revision 5 created at 2017-06-10 08:11  # README.mdを削除した時のバックアップ
$ duplicacy restore -r 3

Storage set to /Users/tmnm/dev/private/duplicacy_test/storage
Restoring /Users/tmnm/dev/private/duplicacy_test/backup_shitai to revision 3
Downloaded README.md (7)
Restored /Users/tmnm/dev/private/duplicacy_test/backup_shitai to revision 3
Total running time: 00:00:01
$ cat README.md

README
$ duplicacy restore -r 4

Storage set to /Users/tmnm/dev/private/duplicacy_test/storage
Restoring /Users/tmnm/dev/private/duplicacy_test/backup_shitai to revision 4
File README.md already exists.  Please specify the -overwrite option to continue
$ cat README.md  # 上書きはされないようになっている

README
$ duplicacy restore -r 4 -overwrite

Storage set to /Users/tmnm/dev/private/duplicacy_test/storage
Restoring /Users/tmnm/dev/private/duplicacy_test/backup_shitai to revision 4
Downloaded README.md (15)
Restored /Users/tmnm/dev/private/duplicacy_test/backup_shitai to revision 4
Total running time: 00:00:01
$ cat README.md  # 上書きしたら戻る(そりゃそう

README
README2
$ duplicacy restore -r 5 -overwrite
$ ls

README.md  # 削除は別にされない

ローテーション(リテンション)ポリシー

これ嬉しいですね -keep は日単位みたいなのでサクッとテストできませんでしたので Githubのコメントを和訳で...

※ snapshotをバックアップデータと訳しています

duplicacy prune -r 1            # revision number 1 のバックアップデータを削除
duplicacy prune -t quick        # 'quick' とタグづけされたバックアップデータを全て削除
duplicacy prune -keep 1:7       # 7日経過したバックアップデータは1日あたり1つだけ残して削除する
duplicacy prune -keep 7:30      # 30日を超えたバックアップデータは7日あたり1つだけ残して削除する
duplicacy prune -keep 0:180     # 180日を超えたバックアップデータは削除する

なので、バックアップ戦略を、当週は1日1つ、7日をすぎたら1日を残して削除 28日を過ぎたら1日を残して削除...とするなら

日時タスク例

#/bin/bash
duplicacy backup -stats
duplicacy prune -keep 7:7   # 7日経過したバックアップデータは7日あたり1つだけ残して削除する
duplicacy prune -keep 28:28 # 30日を超えたバックアップデータは28日あたり1つだけ残して削除する
duplicacy prune -keep 0:180 # 180日を超えたバックアップデータは削除する

かな?

ここまでやって、ライセンスがうーんとなって restic/restic の方が良さそうな気持ちになっています。

Duplicacyのresticに対するアドバンテージとしては Lock-free であるとは書いてあります。 (詳細は長くて読めていない...)