====== Synology NAS 上で S3 互換 MinIO サーバー起動 ======
ビジネスや私用ともに、とても便利に使える Synology NAS ですが、1 点だけ不満があります。それはオブジェクトストレージ API 機能が存在しないことです。
スクリプトでバックアップ作業等を自動化する際、オブジェクトストレージ API があるととても便利です。
MinIO という Go 言語で書かれたオブジェクトストレージが使えそうです。
ネットを検索すると Synology NAS のコンテナ機能を使って MinIO をホストする記事が多いのですが、私の使っている DS216J はメモリも少なくコンテナは起動しません。
そこで、Synology NAS のネイティブ OS 上で動くバイナリを探して、お手軽に MinIO を起動してみた、という記録です。
===== 公式 =====
* https://docs.min.io/
* https://github.com/minio/minio
* https://min.io/
===== インストールと起動 =====
https://dl.min.io/server/minio/release/
SynologyNAS DS216j は Intel CPU ではないので ARM 用のバイナリを探します。 linux-arm を選び、ダウンロード。
[[ https://www.synology.com/ja-jp/knowledgebase/DSM/tutorial/Compatibility_Peripherals/What_kind_of_CPU_does_my_NAS_have | 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://: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 ← 落ちている...
===== 常時起動 =====
* SynologyNAS の cron 機能で以下のスクリプトを 15 分おきに実行
* DSM のアップデートで Nginx の privkey.pem と fullchain.pem が更新された(と思われる)後、シンボリックリンクが消えて https でのアクセスが失敗する障害が発生したため、起動スクリプトに証明書のシンボリックリンクを入れた
#!/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/