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 を選び、ダウンロード。
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 ← 落ちている...
常時起動
- 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/