minioを普通のサービスっぽく動かす

# 前提条件

* Fedora Server 28 にて実施
* サーバがインターネットに接続できること

# 制約事項

* この手順で構築を行うと、nginx(Webサーバ)はminio専用になります

# minioって何？

Amazon S3 互換のオブジェクトストレージ。

[公式サイト](https://www.minio.io/)

設定の手間がほとんどいらず、手軽に立てることができる。

たとえば[公式の立て方の(drive)](https://www.minio.io/drive.html)にあるように、minioのバイナリを取得して

```bash
$ minio server /data
```

とするだけで動作する。本当に簡単。


# 目的

* `systemctl (start|restart|stop) minio.service` できるようにする。
* 設定ファイルを外出しする。
* http (or|and https) 経由でserveできるようにする。
* 専用ユーザで動かして、セキュリティにも配慮する。


# 構築手順

## minio専用ユーザの作成と、ディレクトリの用意

サービスはユーザ権限でのみ動くようにしたい

```bash:一般ユーザ作業
# minioユーザを作る
$ sudo adduser minio
``` 

```bash:minioユーザ作業
$ pwd
/home/minio
$ mkdir data
$ mkdir config
$ mkdir bin
```

## minioバイナリの取得

`/home/minio/bin` に置いて、実行できるようにする

[公式のインストール手順](https://www.minio.io/downloads.html#download-server-linux-x64)に則ってバイナリを取得、実行できるようフラグを付与する

```bash:minioユーザ作業
$ cd bin
$ pwd
/home/minio/bin
$ wget https://dl.minio.io/server/minio/release/linux-amd64/minio
$ chmod +x minio
$ ls -l
合計 27360
-rwxrwxr-x 1 minio minio 28014688  6月  9 12:43 minio
```

## minioのサービス化

systemdを用いている。

### サービス用設定ファイルの作成

```bash:一般ユーザ作業
$ sudo vi /etc/systemd/system/minio.service
```

```ini:minio.service
[Unit]
Description=minio Object Storage Service
After=network.target

[Service]
Type=simple
User=minio
ExecStart=/home/minio/bin/minio server --config-dir /home/minio/config /home/minio/data
Restart=on-abort
WorkingDirectory=/home/minio/

[Install]
WantedBy=multi-user.target
```

`minio`ユーザ権限で動かし、コマンドライン引数にて設定ファイルおよびデータ格納ディレクトリを指定している。
`minio server`はフォアグラウンドで立ち上がるタイプのようだったので、`type`は`simple`としてみた。
`restart` 他オプションはお好みで。

### サービスの起動

まず、サービス用設定ファイルを読み込ませる。

```bash:一般ユーザ作業
$ sudo systemctl daemon-reload
```

エラーが出ないようであれば、読み込めているか確認する。

```bash:一般ユーザ作業
$ sudo systemctl status minio.service
● minio.service - minio Object Storage Service
   Loaded: loaded (/etc/systemd/system/minio.service; disabled; vendor preset: disabled)
```

動かしてみる。

```bash:一般ユーザ作業
$ sudo systemctl start minio.service
$ sudo systemctl status minio.service
● minio.service - minio Object Storage Service
   Loaded: loaded (/etc/systemd/system/minio.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2018-06-09 12:53:09 JST; 54s ago
 Main PID: 4944 (minio)
    Tasks: 6 (limit: 1149)
   Memory: 7.1M
   CGroup: /system.slice/minio.service
           └─4944 /home/minio/bin/minio server --config-dir /home/minio/config /home/minio/data

 6月 9 12:53:10 minio minio[4944]: Browser Access:
 6月 9 12:53:10 minio minio[4944]:    http://10.1.1.5:9000  http://172.17.0.1:9000
 6月 9 12:53:10 minio minio[4944]: Command-line Access: https://docs.minio.io/docs/minio-client-quickstart-guide
 6月 9 12:53:10 minio minio[4944]:    $ mc config host add myminio http://10.1.1.5:9000 (AccessToken) (AccessTokenSecret)
```

:tada: Active! やったね！

表示からも分かる通り、`TCP/9000`で待ち受けしている。
(ファイアウォール等でポートが塞がれてなければ)ブラウザからアクセスするとログイン画面が表示される。

必要に応じて、自動起動するように設定する。

```bash:一般ユーザ作業
$ sudo systemctl enable minio.service
```

## nginxでリバースプロキシ

このままだとちょっと不格好だよねってことで、流行りの(?)リバースプロキシをかける。

何らかの方法でnginxを入手する。たとえば`yum`。

```bash:一般ユーザ作業
$ sudo yum -y install nginx
```

設定ファイルをさわる。

```bash:一般ユーザ作業
$ sudo vim /etc/nginx/nginx.conf
```

※さわった部分のみ抜粋

```conf:nginx.conf
http {

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    client_max_body_size 1000M;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        access_log  /var/log/nginx/access_log;
        error_log   /var/log/nginx/error_log warn;

        location / {
                # minio settings
                proxy_set_header Host $http_host;
                proxy_pass http://localhost:9000;
        }
}
```

大事なのは以下の3点。

* デフォルトで `TCP/9000`に流すようにしましたよ
* アクセスログを取るようにしましたよ
* 最大データ量(`client_max_body_size`)を大きくしましたよ

## ファイアウォールを開ける

firewalldを用いている。

```bash:一般ユーザ作業
$ sudo firewall-cmd --add-service=http --zone=FedoraServer --permanent
$ sudo firewall-cmd --reload
```

## 動作確認する

ブラウザからアクセスする。

![画面キャプチャ](https://qiita-image-store.s3.amazonaws.com/0/129737/cef36910-b6b4-95d0-aac5-ff222f7466f9.png)

こんなのが出たら成功。 :tada:


# あとがき

* 自分用にメモした手順です。必要に応じて読み替えてください。
* こうしたほうがいいよ的なアドバイスを頂けると大変助かります

# TODO

* minioの設定ファイルの内容を確認
* 動作確認項目の追加

以上