目次

Synology NAS 上で S3 互換 MinIO サーバー起動

ビジネスや私用ともに、とても便利に使える Synology NAS ですが、1 点だけ不満があります。それはオブジェクトストレージ API 機能が存在しないことです。
スクリプトでバックアップ作業等を自動化する際、オブジェクトストレージ API があるととても便利です。

MinIO という Go 言語で書かれたオブジェクトストレージが使えそうです。

ネットを検索すると Synology NAS のコンテナ機能を使って MinIO をホストする記事が多いのですが、私の使っている DS216J はメモリも少なくコンテナは起動しません。

そこで、Synology NAS のネイティブ OS 上で動くバイナリを探して、お手軽に MinIO を起動してみた、という記録です。

公式

インストールと起動

https://dl.min.io/server/minio/release/

SynologyNAS DS216j は Intel CPU ではないので ARM 用のバイナリを探します。 linux-arm を選び、ダウンロード。

Synology NAS の機種別 CPU はこちら

cd /usr/local/bin
wget https://dl.min.io/server/minio/release/linux-arm/minio
chmod +x minio
./minio server /volume1/minio/data
 
Endpoint:  http://192.168.254.199:9000  http://127.0.0.1:9000
AccessKey: minioadmin
SecretKey: minioadmin
 
Browser Access:
   http://192.168.254.199:9000  http://127.0.0.1:9000
 
Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide
   $ mc config host add myminio http://192.168.254.199:9000 minioadmin minioadmin
 
Object API (Amazon S3 compatible):
   Go:         https://docs.min.io/docs/golang-client-quickstart-guide
   Java:       https://docs.min.io/docs/java-client-quickstart-guide
   Python:     https://docs.min.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide
Detected default credentials 'minioadmin:minioadmin', please change the credentials immediately using 'MINIO_ACCESS_KEY' and 'MINIO_SECRET_KEY'

ブラウザで NAS のポート 9000 にアクセスすると管理画面が表示される。

TLS 対応(成功編)

以下の失敗編では、オレオレ証明書では AWS CLI も MC もアクセスを受け付けてくれなかったため、SynologyNAS 本体に設定した LetsEncrypt 証明書のフックを試みる。

SynologyNAS の Nginx の設定から、証明書の保存場所を割り出す。

# cat /etc/nginx/nginx.conf | grep ssl_
    ssl_certificate           /usr/syno/etc/certificate/system/default/fullchain.pem;
    ssl_certificate_key       /usr/syno/etc/certificate/system/default/privkey.pem;
    ...

場所は判ったが、minio のドキュメントを見ると、minio 側では秘密鍵、証明書のファイル名がそれぞれ、private.key、public.crt でなければならないらしいため、ファイル名を変えてシンボリックリンクを作成する.

# cd /root/.minio/certs
# ln -s /usr/syno/etc/certificate/system/default/privkey.pem ./private.key
# ln -s /usr/syno/etc/certificate/system/default/fullchain.pem ./public.crt

なお、この証明書はドメイン名を使用したものであり、グローバル IP 経由の接続となるので、Firewall で ターゲットポートが通過できるよう、ブロードバンドルーターで Port Forwarding を行った。

この状態で minio server を起動すると、mc コマンドも AWS CLI も成功!

TLS 対応(失敗編)

openssl で生成した秘密鍵、証明書を ~/.minio/cert に保存し、サービスを再起動する.

$ cd /root/.minio/cert
$ openssl genrsa -out private.key 2048
Generating RSA private key, 2048 bit long modulus
.......................................................................................
.........+++++
...........................+++++
e is 65537 (0x10001)
 
$ openssl req -new -x509 -days 3650 -key private.key -out public.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [TW]:JP
State or Province Name (full name) [Taiwan]:XXXXXX
Locality Name (eg, city) [Taipei]:XXXXXX
Organization Name (eg, company) [Synology Inc.]:XXXXXX
Organizational Unit Name (eg, section) []:XXXXXX
Common Name (e.g. server FQDN or YOUR name) []:XXXXXX
Email Address [product@synology.com]:XXXXXX
# 以下のコマンドでも大丈夫かも知れない.
# openssl req -new -x509 -days 3650 -key private.key -out public.crt -subj "/C=JP/ST=XXXXXX/L=XXXXXX/O=XXXXXX/CN=XXXXXX"

この作業の後にサービスを起動すると、

/usr/local/bin# ./minio server /volume1/minio/data
Endpoint:  https://192.168.xxx.xxx:port  https://127.0.0.1:port
AccessKey: minioadmin
SecretKey: minioadmin
 
Browser Access:
   https://192.168.xxx.xxx:9000  https://127.0.0.1:9000
 
Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide
   $ mc config host add minio_host https://192.168.xxx.xxx:port minioadmin minioadmin
 
Object API (Amazon S3 compatible):
   Go:         https://docs.min.io/docs/golang-client-quickstart-guide
   Java:       https://docs.min.io/docs/java-client-quickstart-guide
   Python:     https://docs.min.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide
 
Certificate:
    Signature Algorithm: SHA256-RSA
    Issuer: C=JP, ST=XXXXXX, UnknownOID=2.5.4.7, O=XXXXXX, OU=XXXXXX, CN=XXXXXX, emailAddress=XXXXXX
    Validity
        Not Before: Thu, 09 Jul 2020 04:27:18 GMT
        Not After : Sun, 07 Jul 2030 04:27:18 GMT
 
Detected default credentials 'minioadmin:minioadmin', please change the credentials immediately using 'MINIO_ACCESS_KEY' and 'MINIO_SECRET_KEY'

となり、TLS 対応になっていることが判る. なお、この状態でブラウザからアクセスすると、セキュリティ警告はでるが問題なく利用できる. 但しこの状態だと、下記 AWS CLI によるアクセスは証明書の問題で拒否される. 同様に MC コマンドでも自己署名証明書で TLS にチャレンジすると接続できなくなった.

自分は SynologyNAS を前提に作業をするので、NAS で導入している証明書を流用することで解決した.
証明書を使う場合、接続はグローバル IP を使うことになるので Firewall のポートを空けることも忘れずに.

クライアントアクセス

AWS CLI

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-windows.html

とりあえず、動いた!

$ aws configure
# AccessKey と SecretKey を入力。Regionは何でもいい。
$ s3_url=http://<Synology NASのIP>:port
bucket_name="abc"
$ aws --endpoint-url $s3_url s3 mb s3://${bucket_name}
make_bucket: abc
$ aws --endpoint-url $s3_url s3 ls
2018-01-07 12:38:01 abc
$ echo Hello > ./hello.txt
$ aws --endpoint-url $s3_url s3 cp ./hello.txt s3://${bucket_name}/
upload: ./hello.txt to s3://${bucket_name}/hello.txt

MC (MinIO Client)

cd /c/users/me/bin
curl -L -O https://dl.min.io/client/mc/release/windows-amd64/mc.exe
mc config host add minio_host https://minio.fqdn AccessKey SecretKey
mc ls minio_host

手動で ~/mc/config.json を編集してもよい (linux の場合は ~/.mc/config.json)

稼働監視

/minio/health/live にアクセスし ステータスコード 200 が帰れば動いている. ちなみにレスポンスボディは空っぽ.

curl https://minio.fqdn:port/minio/health/live
echo $?
0 ← 動作中
7 ← 落ちている...

常時起動

#!/bin/env bash
 
export MINIO_ACCESS_KEY=some_access_key
export MINIO_SECRET_KEY=some_secret_key
 
curl https://minio.fqdn:port/minio/health/live
 
if [[ $? -ne 0 ]]
then
  cd /root/.minio/certs
  ln -s /usr/syno/etc/certificate/system/default/privkey.pem ./private.key
  ln -s /usr/syno/etc/certificate/system/default/fullchain.pem ./public.crt
  /usr/local/bin/minio server /volume1/minio/data &
fi

xserver.jp へ MC インストール

echo $PATH
cd ~
mkdir bin
cd bin
curl -L -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
mc config host add minio_host https://minio.fqdn:port MINIO_ACCESS_KEY MINIO_SECRET_KEY
Added `minio_host` successfully.
mc ls minio_host
[2020-07-08 17:42:55 JST]      0B abc/
[2020-07-09 18:28:18 JST]      0B xyz/