====== 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/