Edited at

ワンバイナリで配布できるディレクトリ&ファイルバックアップツールをGolangで実装した(している)

More than 3 years have passed since last update.

以前書いた Golangでディレクトリorファイルのバックアップツールを作ってる のほぼほぼ完成版と宣伝

shinofara/stand の紹介と、使ってFB下さいと布教活動です。

マサカリ待ち受けてます!

まだ、細かいテスト、バグシュウセイ、ログ出しなどのタスクは残ってます。


改めてまして、これは何?(What is this?)

YAML を引数に渡すだけで複数のターゲット(ファイルorディレクトリ)を複数のストレージにバックアップをとってくれるツールです。

また、バックアップ保持世代管理も対応させてますので、過去N台はストレージに保存する、ソレ以降は削除と行った事が可能になっています。


何故作ったの?(Why did you make this?)

仕事とか、プライベートで作ってるシステム、や使ってるツールのバックアップファイルとかを

S3とかマウント先に転送して保存したいなー。なにかないかな?とりあえず作っちゃえという気持ちで作りました。

よくよく調べてみるとRuby製のBackup があったり


Python製のBakthat があったりするけど、ちゃうんや俺は、バックアップツールの為に何かを入れたくないんや、シングルバイナリ、極論はシェルでええんやという事で、Golangを使いました。


シェルでも良かった説は無視しておこう

※既に既出だったら僕の調査不足でした。。


何処に保存できるの?(Where can I back up?)

現在は下記2箇所のみ対応しております。


  • Local dirctories

  • S3


It's Local dir

こちらは一時的な保存用途だったり、マウントディレクトリや、Google Drive、Boxのようなクラウドストレージ利用に使えると思います。


It's S3 on AWS

説明するまでも無く、AWSのS3に保存


ただし、Bucket PolicyやAccess Controllは、責務外としています。

保存したものをシェアしたいなど利用用途は十人十色


YAMLの書き方って?(How do I write is YAML?)


とあるディレクトリ以下に存在するファイルの最新版を保存したい

これは、アプリケーションが定期的に書き出すファイルのバックアップなどに使えます。

# /path/to/config.yml

- type: file
path: /path/to/file/dir
storages:
- type: local
path: "/path/to/output/dir"
life_cycle: 1

type: file とする事でファイルモードとなります。

このモードでは、 path 配下に存在する一番最後に更新されたファイルがバックアップ対象となります。

storages に関しては、詳しくは後述


とあるディレクトリをアーカイブ化and圧縮して保存したい

定期的に添付ファイルディレクトリとか、そういう失いたく無いディレクトリなどに使えると思います。

# /path/to/config.yml

- type: dir
path: /path/to/file/dir
compression:
format: zip
storages:
- type: local
path: "/path/to/output/dir"
life_cycle: 1

type: dir とする事でディレクトリモードとなります。

このモードでは、 pathcompression で定めたアーカイブ化and圧縮化を行います。

その後、 storages で定めた保存先に保存を行います。

storages and compression に関しては、詳しくは後述


保存先の設定について

ここでは、 storages について書きます。

storagess があるので、お気づきかも知れませんが複数記述できます。

  storages:

- type: local
path: "/path/to/output/dir1"
life_cycle: 1
- type: local
path: "/path/to/output/dir2"
life_cycle: 1

このように記述すると、対処のファイルを dir1, dir2 両方に保存します。

あまり local が2つだと意味がないかもしれないので、次の例では、 S3 に保存する方法を書きます。

  storages:

- type: local
path: "/path/to/output/dir1"
life_cycle: 1
- type: s3
path: "/path/to/s3/path"
life_cycle: 2
s3:
access_key_id: AKXXXXXXXXXXXX
secret_access_key: yXxxxxxxXXXXXXXXXXXXXXXX
region: "ap-northeast-1"
bucket_name: "backup_bucket_name"

type: s3 と書く事でS3に保存する設定を記述出来ます。

path はバケット以下のパスとなります。

そして、 s3: 以下には、 AWSアクセストークン、Secret、region、そして保存したいバケット(存在する事)を記述

すると、バックアップ対象のファイルはS3にも保存されるようになります。

また、 life_cycle はデフォルト 無限 担っていますので、保存しておきたい世代数を記述していただければ、それより古い世代は消されるようになります。


ディレクトリの圧縮モード

compression ですが、現在はzip, tar(gzip) に対応しています。


どうやって使うの?(How use it)

インストールスクリプトを準備しました。

$ curl https://raw.githubusercontent.com/shinofara/stand/master/bin/install.py | python

$ which stand
/usr/local/bin/stand

実行方法

$ stand -c /path/to/config.yml >> /path/to/logfile

# log
{"msg":"Compression has been completed","level":"info","ts":1468440300377471157,"fields":{"size":3526652970}}

定期的に実行したい場合は

$ echo "0 0 * * * root  /usr/local/bin/stand -c /path/to/config.yml >> /var/log/stand.log" > /etc/cron.d/stand_schedule

とcronに登録してお使いください

現時点ではツール単体でのschedule機能は対応しておりません....


今後追加したい機能


  • リストア機能

  • スケジューラ機能(cron的な)

  • 通知機能(Slackとか、メールとかなんやかんや)


最後に(Finally)

shinofara/stand に対してStarを貰えると励みになります。

READMEの修正とかでもPRもらえれればありがたいです!

issueとかもお待ちしています。

是非使って見て下さいm(__)m