それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

s3互換ストレージminio をインストール(2021版)

minio のインストール

最近バージョンアップしたので最新版(2021-09-27現在)で起動やり直したのでメモ、

  • 管理画面にダッシュボードがついた
  • 管理画面のポートが変更になった。
  • 管理画面とストレージのポートが別れた。

管理画面とストレージを別々に起動するのは地味に迷惑なので困った。

あと管理画面でユーザー系の機能が追加されて、軽量なストレージではなくなった。

個人では使わない機能が追加されてるが、S3代用として十分に使えるものになった印象。

公式マニュアルがdocker からpodman に変わった。

docker での起動

docker 起動は、公式マニュアルではとてもシンプルに記述しているが、実際に動かすには、ポートとユーザー環境変数と永続化ボリュームが必要であった。

IMAGE=minio/minio
NAME=minio
PORT_EXPOSE=80801
PORT_WEB_EXPOSE=8080
VOLUME_PERSIST=$( realpath ./data )
docker run -d
    --rm
    --name $NAME
    -p $PORT_EXPOSE:9000
    -p $PORT_WEB_EXPOSE:9001
    -v $VOLUME_PERSIST:/data
    -e MINIO_ROOT_PASSWORD=$MINIO_ROOT_PASSWORD
    -e MINIO_ROOT_USER=$MINIO_ROOT_USER
    $IMAGE server /data   --console-address ':9001'

イメージのレポジトリは、dockerhub か redhatレジストリ quay.io のどちらかを使う。

#dockerhub
minio/minio
# quay.io
quay.io/minio/minio

サクッと停止起動用のスクリプトにしておく。

#!/usr/bin/env bash
# https://takuya-1st.hatenablog.jp/
## : vim

cd $( dirname $( realpath $0 ) )
DIR=$(pwd)


NAME=minio
PORT_WEB_EXPOSE=8080
PORT_EXPOSE=8081
VOLUME_PERSIST=$( realpath ./data )
DOCKER_ID_CMD="docker ps -q  --filter name=$NAME"
IMAGE=minio/minio

MINIO_ROOT_USER=xxxxadminxxx
MINIO_ROOT_PASSWORD=xxxxxxpasswordxxxx


function stop(){
    if [[ ! -z $( $DOCKER_ID_CMD ) ]] ; then
      echo  $NAME is already started. stopping...
      docker stop $( $DOCKER_ID_CMD )
      while [[ ! -z $( $DOCKER_ID_CMD ) ]] ; do
        sleep 1
      done
      echo done

    fi
}
function update(){
  CMD="docker pull $IMAGE "
  echo $CMD
  $CMD

}

function start(){
  CMD="docker run -d
    --rm
    --name $NAME
    -p $PORT_EXPOSE:9000
    -p $PORT_WEB_EXPOSE:9001
    -v $VOLUME_PERSIST:/data
    -e MINIO_ROOT_PASSWORD=$MINIO_ROOT_PASSWORD
    -e MINIO_ROOT_USER=$MINIO_ROOT_USER
    $IMAGE server /data   --console-address ':9001'
  "

  echo $CMD
  $CMD
}


case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  update)
    update
    ;;
  *)
    stop
    update
    start
    ;;
esac

nginx でプロキシする。

複数ドメインをつけるとめんどくさいので、同一ドメインでサブディレクトリで運用したいが、管理画面をサブディレクトリにするのは面倒だったので。ドメインを別に設定した。

管理画面 http://s3admin.example.com/
ストレージ http://s3.example.com/

nginx の設定を作る

## 2021-09-27 takuya

server {

  listen 80;
  server_name s3admin.example.com;
  server_tokens off;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;

    proxy_connect_timeout 300;
    # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    chunked_transfer_encoding off;
    proxy_pass http://docker.lxd:8081;
  }

}
server {

  listen 80;
  server_name s3.example.com;
  server_tokens off;

location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    ##
    chunked_transfer_encoding off;
    proxy_set_header Connection '';
    proxy_http_version 1.1;
    proxy_buffering off;
    proxy_cache off;
    rewrite ^/storage(.*)$ $1 break;
    proxy_pass http://docker-host.lxd:8080;
  }

}

これで、/storage/へのアクセスがS3アクセスになる。

以前のminio のデータもちゃんとそのまま見える。ただ公開範囲や権限は設定し直しになった。 f:id:takuya_1st:20210927224400p:plain

アップロードとダウンロードをテストする

mc ( minio client )がインストールされたdocker があるのでこれを使ってアップロードしてみる。 これで、取得とテスト実行ができる

docker run --rm minio/mc ls play

実際に使ってみる。

docker run  --rm -it  --entrypoint=/bin/bash  minio/mc

minio S3ホストへの接続設定

endpoint=https://s3.example.com/
accesskey=fuheejuShaogae2gggggggggg
secret=ier8Ayaesieghggggggg
mc alias set myS3 \
$endpoint $accesskey $secret

バケットの作成

mc mb myS3/aaa

バケットの一覧

mc ls myS3

ファイルのアップロード

mc cp myS3 hello.txt myS3/aaa/

バケットをpublic に

 mc policy set public myS3/aaa

あとはブラウザから見てみよう

curl https://s3.example.com/aaa/hello.txt

行けそうですね。

参考資料