鉄の塊をオブジェクトストレージにする

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

鉄の塊をオブジェクトストレージにする
MinIO

概要

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

結論

立てた。良い。

クライアントアプリ”Cyberduck”からバケットを参照中

あらすじ

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

MacPro 2006

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を使います.

GitHub - minio/minio: MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.
MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license. - minio/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です.

使い道

ファイルストレージ

画像や動画など,すぐ使わない大きなファイルをアップロード.ブラウザからディレクトリのように見えてプレビューもできます.

スマホ向けのWebUI
動画のプレビュー

アップロードしたファイルはバージョン管理されるのも嬉しい.リストアも簡単.

バケットごとに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のビルドキャッシュとか,なにかしらのコンテンツ配信とか?