MisskeyでMiniO(オブジェクトストレージ)を使用する
やってみたかったので
オブジェクトストレージ
Misskeyのドライブにアップロードした画像などのデータは./files/
フォルダの中でこんな感じになっています

なんとなくthumbnailはわかりますけどよくわかんないですね…。
オブジェクトストレージといって、ファイルを階層化させず、オブジェクト単位で保存し扱いやすくさせる形式で保存されています。
オブジェクトストレージはサービスによっては保存したファイルの冗長性を高めたり、負荷を分散させたりできます。Amazonのs3だったり、Google Cloud Storageだったり、CDNサービスのCloudflareも最近サービスを始めました。保存の料金だったりデータの転送などに料金がかかったりします(内容によって無料も有り)。料金の見直しなどで別なオブジェクトストレージサーバーに移ることもあるため、現在大抵のオブジェクトストレージはAmazon s3と互換性のある形式で作成されています。
Misskeyでは外部のオブジェクトストレージが使えるので、フリーのs3互換オブジェクトストレージMiniOをインストールして使ってみました。
注意:後からオブジェクトストレージを設定すると今までMisskeyサーバー上に上げていた./files/内のファイルにはアクセス出来なくなります。
MiniOインストール
Dockerイメージで簡単に入れられるのでやっていきます。
Docker composeファイル作成
同じフォルダにdocker-compose.yamlと.envファイルを作成します。
docker-compose.yaml
services:
minio:
image: quay.io/minio/minio:latest
container_name: minio
ports:
- "9000:9000"
- "9090:9090"
volumes:
- ./data:/data
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
command: server /data --console-address ":9090"
restart: unless-stopped
.env
MINIO_ROOT_USER=minioユーザー名
MINIO_ROOT_PASSWORD=minioパスワード
sudo docker compose up -d
でDockerコンテナを立ち上げます。9000ポートで本体、9090ポートでコンソールにアクセスできます。
Nginxの設定
https://img.estampie.work/をMiniOサーバーを割り当ててエンドポイントにします。公式サイトを参考にしています。VPSでリッスンして自宅サーバーへ飛ばします。VPS側のNginx設定です。
/etc/nginx/conf.d/minio.conf
# HTTP to HTTPS redirect
server {
listen 80;
listen [::]:80;
server_name img.estampie.work;
// Let's Encrypt証明書のための設定
location ^~ /.well-known/ {
root /path/to/webroot; # replace with your web root path
try_files $uri $uri/ =404;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name img.estampie.work;
ssl_certificate 証明書.pem;
ssl_certificate_key 証明書鍵.pem;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_set_header Host $http_host;
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_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://自宅サーバーのIP:9000;
}
}
自宅鯖なのでコンソールはhttps://マシンのIP:9090/で内部からのみアクセスできるので設定していませんが、VPSなどで利用する場合は違うサブドメインやポート番号を設定します。
出来たらsudo systemctl restart nginx
でNginxを再起動します。
MiniOでバケット作成
バケットの作成
MiniOコンソールにアクセスして、設定したユーザー名とパスワードでログインします。
オブジェクトを格納するためのバケットを作成します。適当に命名。

バケットの設定を開いてAccess Policy→Customを選択します。ここをPublicにしてしまうと誰でもURLに当ててアップロード出来るようになってしまうので注意。

入力画面が出るので下記を入力します(Resourceにはバケット名を入れる)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::mybucket/*"
]
}
]
}
s3:GetObject
でパブリックからのファイルへのGET(アクセス)のみ許可しています。read/writeは許可されません。
Access key/Secret keyの生成
左メニューからAccess Keysを選択し、Create Access KeyをでAccess keyとSecret keyを生成します。設定はデフォルトで大丈夫です。
Misskeyの設定
コントロールパネルでオブジェクトストレージを選択します。
先ほど生成したAccess keyとSecret keyを入力します。後は上記を参照。最初Regionを記入していなくてちょっと上手く行きませんでした。上記の場合https://img.estampie.work/mybucket/files/(オブジェクトID)で保存されます。Prefixが空ならfiles部分は省略かも。
アップロードを試してみて表示されれば成功です。やったね。

ファイルが分かりやすくなりました。Previewを押すと内容も見れます。サムネ一覧とかは別途自分でスクリプト組むといいのかも。
あとは./data/
フォルダのバックアップ用のスクリプトを書いたりして他のメディアに定期バックアップを設定しています。
余裕があれば複数ストレージで冗長化とかもしてみたいですがミニマムなシングルサーバーなのでそんな余裕はないよ
ついでにWordpressも
ついでにWordpressの画像もこのMiniOサーバーを使用しています。(画像単体に飛ぶとURLが見れます) WordPressのMedia Cloudプラグインを使用しました。プラグイン検索でminioと打つと出てきます。設定ウィザードで簡単に設定できます。便利~