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

以前書いた [Golangでディレクトリorファイルのバックアップツールを作ってる](http://qiita.com/shinofara/items/f840436054d2ed089331) のほぼほぼ完成版と宣伝

[shinofara/stand](https://github.com/shinofara/stand) の紹介と、使ってFB下さいと布教活動です。
マサカリ待ち受けてます！

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

# 改めてまして、これは何？（What is this?）

`YAML` を引数に渡すだけで複数のターゲット（ファイルorディレクトリ）を複数のストレージにバックアップをとってくれるツールです。
また、バックアップ保持世代管理も対応させてますので、過去N台はストレージに保存する、ソレ以降は削除と行った事が可能になっています。

# 何故作ったの？（Why did you make this?）

仕事とか、プライベートで作ってるシステム、や使ってるツールのバックアップファイルとかを
S３とかマウント先に転送して保存したいなー。なにかないかな？とりあえず作っちゃえという気持ちで作りました。

よくよく調べてみるとRuby製の[Backup](http://backup.github.io/backup/v4/) があったり  
Python製の[Bakthat](http://bakthat.readthedocs.io/en/latest/) があったりするけど、ちゃうんや俺は、バックアップツールの為に何かを入れたくないんや、シングルバイナリ、極論はシェルでええんやという事で、Golangを使いました。  
シェルでも良かった説は無視しておこう
※既に既出だったら僕の調査不足でした。。

# 何処に保存できるの？（Where can I back up?）

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

* 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` とする事でディレクトリモードとなります。
このモードでは、 `path` を `compression` で定めたアーカイブ化and圧縮化を行います。
その後、 `storages` で定めた保存先に保存を行います。

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

### 保存先の設定について

ここでは、 `storages` について書きます。
`storages` は `s` があるので、お気づきかも知れませんが複数記述できます。

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

このように記述すると、対処のファイルを `dir1`, `dir2` 両方に保存します。
あまり `local` が２つだと意味がないかもしれないので、次の例では、 `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、そして保存したいバケット（存在する事）を記述
すると、バックアップ対象のファイルはS３にも保存されるようになります。 

また、 `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](https://github.com/shinofara/stand) に対してStarを貰えると励みになります。
READMEの修正とかでもPRもらえれればありがたいです！
issueとかもお待ちしています。

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