鉄の塊をオブジェクトストレージにする
Amazon S3互換のオブジェクトストレージ "MiniO"を自宅に建てます

概要
自宅の古いPCを有効活用するべく,Amazon S3互換のオブジェクトストレージ "MinIO"を建てます.
結論
立てた。良い。

あらすじ
大きな鉄の塊があります.

MacProです.MacOSはもう復旧できないのでLinux機としてがんばってもらう.
古のPCなので弱い.当時はすごかったんでしょう.ムーアの法則です.
macpro% lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 36 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Vendor ID: GenuineIntel
Model name: Intel(R) Xeon(R) CPU 5160 @ 3.00GHz
CPU family: 6
Model: 15
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 2
Stepping: 6
...
CPUはXeonの2コア×2
macpro% lsmem
RANGE SIZE STATE REMOVABLE BLOCK
0x0000000000000000-0x000000007fffffff 2G online yes 0-15
Memory block size: 128M
Total online memory: 2G
Total offline memory: 0B
メモリは2GB
CPUのせいかわかりませんが全体的に重いです.GPUも載ってますが貧弱.
HDDはすでに2つ刺さっていてなお,空きスロットは2つ.ギガビットイーサが2つ.
重い処理はできそうにないですが,ネットワーク的な接続性とストレージ面の拡張性はあるのでストレージとして使うことにしてみます.
よさげに見えたので,OSSのMinIOを使います.
構築
管理しやすいのでdocker composeです.
services:
minio:
image: minio/minio:RELEASE.2025-04-22T22-12-26Z-cpuv1
command: server ${MINIO_OPTS} ${MINIO_VOLUMES}
restart: always
user: "1000:1000"
ports:
- 9000:9000
env_file:
- .env
volumes:
- /mnt/minio-data:/data1
deploy:
resources:
limits:
cpus: "2"
memory: "1.5G"
.envはホスト名やadminの認証情報を書いてます.
他に,SSL通信のためnginxを噛ましたり,監視用のPrometheus exporter入れたりしていますが,本質ではないのでここは省略.
使用イメージはこれ.
https://hub.docker.com/r/minio/minio
あとはWebUIからバケットつくったり,ユーザつくったり,ポリシーつくったりすればOKです.
使い道
ファイルストレージ
画像や動画など,すぐ使わない大きなファイルをアップロード.ブラウザからディレクトリのように見えてプレビューもできます.


アップロードしたファイルはバージョン管理されるのも嬉しい.リストアも簡単.
バケットごとにVersioningするか決められる.
サーババックアップ
MinIOで作ったバケットをマウントしたうえで,rcloneでホームディレクトリを丸ごとバックアップ.
raspberrypi4% cat bak.sh
#!/bin/bash
rclone sync /home/pi4 minio:pi4/bak/home \
--no-check-certificate \
--exclude ".cache/**" \
--exclude ".cargo/**" \
--exclude ".docker/**" \
--exclude ".venv/**" \
--exclude ".gradle/**" \
--exclude ".git/**" \
--exclude ".go/**" \
--exclude "go/pkg/**" \
--exclude ".idea/**" \
--exclude ".vscode/**" \
--exclude ".rustup/**" \
--exclude ".local/**" \
--exclude "node_modules/**" \
--exclude "__pycache__/**" \
--exclude "code-server/data/**" \
--exclude "*.pyc" \
--exclude "*.log" \
--exclude ".DS_Store" \
--exclude "Thumbs.db" \
--exclude "tmp/**"

裏側
データがどんな感じで保存されているか見てみる.
前提として,起動ディスクとは別のHDDを/mnt/minio-dataにマウントし,MinIOでこのディレクトリを指定している.
先程も出てきた検証動画はファイル名になったディレクトリとして存在する.

さらにUUIDのディレクトリ名がぶら下がっている.おそらくこのあたりでオブジェクトの実態を管理していて,バージョン管理がxl.metaとかで行われてそう.
ファイルの中身はバイナリになっていて単純には見えなかった.
このあたりはなかなか深い話っぽいのでググったり,AIに聞いたほうがよさそうなのでここまで.
おわり
S3互換をもうちょっと有効活用したい…
CI/CDのビルドキャッシュとか,なにかしらのコンテンツ配信とか?