
九保すこひです(フリーランスのITコンサルタント、エンジニア)
さてさて、私は開発歴のある程度あったりするんですが、まだまだ知らないことだらけで、この間も以下のようなことがありました。
え!そんな便利なヤツあんの!?(しかも無料で使える)
そうです。
開発の世界は新しいものが頻繁に登場するので、そんな中「いいものであったとしても私のところまで届いていない」という事柄がたまに出てきたりするんですね。(もしくはアンテナがそっち向いてなかったのかも…)
そして、今回そう思わされるきっかけになったのが、
MinIO(みにおー)
です。
MinIO
は、簡単にいうと「自前で用意できる Amazon S3」です。
つまり、S3
のようなストレージを自分でインストールして使えるというスグレモノです!
しかも、何がすごいって「S3 互換」なので .env を変更するだけで S3 用のコードが動くんです。
なので、開発にはもってこいなんですね。
そして、なんならVPS
にインストールしてどこからでもアクセスできるようにしてみたくなりました。
そこで
今回はMinIO
をVPS
にインストールしてローカル環境のLaravel
からファイルをアップロードしてみたいと思います。
ぜひ何かの参考になりましたら嬉しいです。
「MinIO は GUI も
すばらしかったです」
開発環境: Ubuntu 20.04、nginx 1.18、Laravel 10.x
目次 [非表示]
前提として
まずVPS
にnginx
のウェブサーバーが入っていて、ちゃんとウェブサイトが動く状態になっている必要があります。
そして、今回は以下2つのようなサブドメインでアクセスできるようにします。
- minio-api.example.com: API 部分
- minio-console.example.com: コンソール(GUI)部分
なので、この2つのDNS
設定は先に済ませておいてください。(各サービスで設定方法が違うのでここでは省略します)
では、今回も楽しんでやっていきましょう
Go 言語をインストールする
MinIO
をインストールする前にGo
言語をインストールします。
というのも、MinIO
はGo
言語で作られているからです。
以下のコマンドを実行してください。
sudo apt update && sudo apt upgrade
sudo apt install golang
では、念のため以下のコマンドでインストールうまくいっているかチェックしておきましょう。
go version
すると、以下のような表示になるはずです。
go version go1.13.8 linux/amd64
これでGo
言語はOK
です!
MinIO をインストールする
続いて、SSH
でVPS
にログインしたらMinIO
をインストールしていきましょう。
今回はバイナリバージョンをインストールします。
以下のコマンドを実行してください。
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
※ ちなみに/usr/local/bin/
はパスが通ってる(≒ ショートカットで実行できる)場所です。環境によって違うかもですが基本的に/usr/local/bin/
で大丈夫じゃないでしょうか
これでminio
コマンドが使えるようになりました。
以下のコマンドでバージョンを表示してみましょう。
minio -v
すると、以下のような表示になるはずです。
minio version RELEASE.2023-10-16T04-13-43Z (commit-id=edfb310a59edb6f1b645fc456b03dfcea770e1b4)
Runtime: go1.21.3 linux/amd64
License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
Copyright: 2015-2023 MinIO, Inc.
※ ちなみに、昔はApache License Version 2.0
でしたが、今はAGPL-3.0 license
になってます。
では、以下のコマンドでMinIO
が起動できるか試してみましょう。
minio server ~/minio-data
これでファイルを~/minio-data
で管理するMinIO
が起動し、以下のような表示になります。
確認ができたら一旦「Ctrl + C」でMinIO
をストップしてください。
ちなみに、ローカルで使う場合はこれで作業は完了です。
Laravel
では以下のようにすればOK
でしょう。
.env
AWS_ACCESS_KEY_ID=minioadmin
AWS_SECRET_ACCESS_KEY=minioadmin
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=your-bucket-name
AWS_USE_PATH_STYLE_ENDPOINT=true
AWS_ENDPOINT=http://127.0.0.1:9000
でも、今回はnginx
を使ってminio-api.example.com
のようなサブドメインで運用したいので、作業を続けます。
なお、AWS_USE_PATH_STYLE_ENDPOINT
はAPI
へのアクセス方法の設定でtrue
の場合は「パス形式」と呼ばれるドメインのURL
に下にバケット名が入ってくる形になります。
例: https://**********/bucket-name/filename
逆にfalse
の場合は「バーチャルホスト型」と呼ばれ、サブドメインとしてバケット名が使用されます。
例: https://bucket-name.*********/filename
今回はシンプルにいきたいので「パス形式」で実装しています。
環境変数をセットする
続いてMinIO
で使うログイン情報を作っておきます。
以下のファイルを作ってください。
/etc/default/minio
MINIO_ROOT_USER=(あなたのユーザー名)
MINIO_ROOT_PASSWORD=(あなたのパスワード)
systemd にサービスとして登録する
もちろんMinIO
はコマンドでいつでも起動できますがnginx
やMySQL
のようにサービスとして起動できると再起動のときに自動的に起動してくれたりするなど管理がしやすいです。
そこで、systemd
を独自につくってサービスとして使えるようにしましょう。
以下のファイルをvi
コマンドなどで作成してください。
/lib/systemd/system/
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
ExecStart=/usr/local/bin/minio server /minio-data --address ":9001" --console-address ":9002"
User=minio-user
Group=minio-user
Restart=always
EnvironmentFile=-/etc/default/minio
[Install]
WantedBy = multi-user.target
※ とても基本的な構成になっています。もしより詳細を設定したい場合は本家のブログを参考にしてみてください。
参考ページ: Configuring MinIO with SystemD
なお、ExecStart
の意味は以下のとおりです。
- フォルダは、/minio-data を使ってね
- API は 9001 番ポートだよ
- コンソール(GUI)は 9002 番ポートだよ
また、EnvironmentFile
が先ほど作成したログイン情報の入ったファイルをセットしています。
ユーザー&グループをつくる
次に、まだ「minio-user」というユーザー&グループが存在していないのでこの2つを作ります。
sudo useradd -M -r -g minio-user
sudo useradd -M -r -g minio-user minio-user
そして、systemd
の設定をリロードしておきます。
sudo systemctl daemon-reload
フォルダの権限を変更する
なお、忘れてはいけないのですが、今回は/minio-data
というフォルダにファイルを保存するようになっています。
しかし、このフォルダには先ほどのユーザー(今回の場合は、minio-user
)がアクセス権限をもっていないといけません。
そこで、以下のコマンドを実行してフォルダをつくり、権限をつけてあげましょう。
sudo mkdir /minio-data
sudo chown minio-user:minio-user /minio-data/
これでsystemd
の設定は完了しました。
以下のコマンドでMinIO
を起動してみましょう。
sudo systemctl start minio.service
そして、念のためうまく起動できているかをチェックします。
sudo systemctl status minio.service
すると、こんなカンジで表示されるはずです。
ちなみに、このままではシステムをreboot
コマンドなどで再起動してしまうと、MinIO
サービスは停止してしまいます。
そのため、以下のコマンドで再起動しても自動でMinIO
サービスが起動できるようにしておくといいでしょう。
sudo systemctl enable minio.service
これでsystemd
の作業は完了です
nginx から MinIO を実行できるようにする
では、以下2つのドメインからアクセスできるようにnginx
の設定を追加しましょう。
- minio-api.example.com: API 部分
- minio-console.example.com: コンソール(GUI)部分
/etc/nginx/sites-available/default
# 以下を追加
# MinIO API
server {
listen 80;
server_name minio-api.(あなたのドメイン);
location / {
proxy_pass http://localhost:9001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# MinIO Console
server {
listen 80;
server_name minio-console.(あなたのドメイン);
location / {
proxy_pass http://localhost:9002;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# To support websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
変更したら以下のコマンドでnginx
を再起動してください。
sudo systemctl restart nginx
すると、セットしたドメインへアクセスすることができるようになります。
※ なお、本来はhttps
でアクセスできるようにすべきですが今回は省略します。certbot
を使うと便利ですよ
これでMinIO
のインストールは完了です。
バケットをつくる
では、http://minio-console.(あなたのドメイン)にアクセスしてログインします。
すると、画面左側にメニューがあるので「Buckets」をクリック。
すると、バケットのページに移動するので「Create Bucket」ボタンをクリック。
バケットを登録するフォームが表示されるので、適当な名前をつけて「Create Bucket」ボタンをクリックします。
※ バケット名は他の部分でも統一してください。
すると、以下のようにバケットが保存されます。
Laravel の .env に接続情報をセットする
では、.env
に今回インストールしたMinIO
サーバーへの接続情報をセットしておきましょう。
.env
AWS_ACCESS_KEY_ID=(あなたのユーザー名)
AWS_SECRET_ACCESS_KEY=(あなたのパスワード)
AWS_BUCKET=test-bucket
AWS_ENDPOINT=http://minio-api.********.com/(API への URL)
なお、(あなたのユーザー名)と(あなたのパスワード)はEnvironmentFile
として/etc/default/minio
の中に保存した内容と同じです。
S3 用のパッケージをインストールする
では、最後にLaravel
にS3
用のパッケージをインストールしましょう。
以下のコマンドを実行してください。
composer require league/flysystem-aws-s3-v3 "^3.0" --with-all-dependencies
これで全ての作業は完了です。
お疲れ様でした
テストしてみる
では実際にLaravel 10.x
から今回インストールしたMinIO
にファイルをアップロードしてみましょう。
まず、ルートに以下のコードを追加してください。
routes/web.php
use Illuminate\Support\Facades\Storage;
// 省略
Route::get('minio_upload', function(){
if(! Storage::disk('s3')->put('test.txt', 'うまい肉が食いたいなぁ')) {
dd('アップロードに失敗しました');
}
dd('アップロードに成功しました');
});
では、MinIO
が起動していることを確認してからブラウザで「http://******/minio_upload」へアクセスします。
すると・・・・・・
はい
「アップロードに成功しました」と表示されました。
では、実際にコンソールの方でも確認してみましょう。
どうなったでしょうか・・・・・・
はい
うまくアップロードできていますね。
では、念のためプレビューで中身も確認しておきましょう。
うまくいっているでしょうか・・・・・・
はい
ちゃんとテキストも保存されています。
すべて成功です
ちなみに: Storage をデバッグするには
先ほどのコードではもしアップロードのときにエラーが発生してもウンともスンとも言いません。
これは以下のようにtry ~ catch
にしても同じです。
try {
Storage::disk('s3')->put('test.txt', 'うまい肉が食いたいなぁ')
} catch (\Exception $e) {
dd($e->getMessage());
}
もしStorage
のデバッグをするには、これプラスconfig/filesystems.php
のdisks.s3.throw
をtrue
にする必要があります。
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
'throw' => true, //
ここを true にする
],
これでエラー内容を知ることができるので開発しやすくなると思います。
企業様へのご提案
これは、S3
ストレージに限らずですがaws
の「ちょっと困ったところ」として従量課金なので料金が読みにくいという部分があるかと思います。
しかし、今回のMinIO
を月額固定のVPS
に設置すれば毎月同じ費用で運用することができます。
もしそういったご希望がございましたら、いつでもお気軽にご相談ください。
お待ちしております。
終わりに
ということで、今回はいつもとは違ってサーバー内の構築をメインにしてお届けしました。
ちなみに今回初めてsystemd
を本格的に触りましたがいろいろと便利な使い方ができそうです。また機会があったらこの辺も深ぼっていこうかなってカンジです。
とにかく、MinIO
いいですね。
Laravel
のパッケージでも同じようなのが出てきたらもっと楽なのにな、なんて考えてました。(誰かつくって。please)
今回は以上です。
ではでは〜
「インボイスの事務処理、
やっぱめんどくさい!
仕事量まで負担増…」