セルフホストストレージ比較:MinIO vs SeaweedFS vs Garage でS3互換ストレージを構築する
オープンソースラボ編集部 ・ 2026年6月14日
セルフホストストレージ比較:MinIO vs SeaweedFS vs Garage でS3互換ストレージを構築する
AWS S3($0.023/GB/月)・Google Cloud Storage・Azure Blob Storageなどのクラウドストレージに依存せず、S3互換APIでセルフホストできるOSSオブジェクトストレージは、大量ファイル・バックアップ・機械学習データセット・静的ファイル配信の基盤として重要です。MinIO(最大シェア・S3完全互換・Go製)・SeaweedFS(分散ファイルシステム特化・Go製)・Garage(Rust製・シンプル・地理分散対応)の3つが2026年のOSSオブジェクトストレージ主要選択肢です。
セルフホストストレージを使う理由
- コスト削減: AWS S3($0.023/GB/月)→セルフホストで$0.002/GB/月以下(NAS/VPS利用)
- S3互換API: 既存のS3 SDKをそのまま流用してコスト削減
- レイテンシ改善: オンプレミスまたは近隣データセンターに配置してレイテンシを短縮
- データ主権: EU・政府・医療等のデータ規制に対応した完全自社管理
主要ツールの概要
MinIO
2014年公開(MinIO Inc.)、Go製のOSSです。GitHubスター50k+。AWS S3と完全互換のOSSオブジェクトストレージで、世界最大シェアのS3互換セルフホストストレージです。マルチノードクラスタリング(イレイジャーコーディング)・バケットポリシー・ライフサイクル管理・レプリケーション・Lambda(イベント通知)・Web UIを完備しています。
# docker-compose.yml: MinIO(シングルノード・開発用)
version: "3.8"
services:
minio:
image: minio/minio:latest
restart: unless-stopped
ports:
- "9000:9000" # S3 API
- "9001:9001" # Web Console
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
MINIO_REGION: ap-northeast-1
MINIO_SITE_NAME: my-minio
command: server /data --console-address ":9001"
volumes:
- minio_data:/data
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
volumes:
minio_data:
# docker-compose.yml: MinIO 分散クラスター(4ノード・イレイジャーコーディング)
version: "3.8"
services:
minio1:
image: minio/minio:latest
command: server http://minio{1...4}/data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
volumes: [minio1_data:/data]
minio2:
image: minio/minio:latest
command: server http://minio{1...4}/data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
volumes: [minio2_data:/data]
# minio3, minio4 同様に定義
nginx:
image: nginx:alpine
ports: ["9000:9000"]
# nginxでload balancing
volumes:
minio1_data:
minio2_data:
# Python: boto3でMinIOをS3互換APIとして操作
import boto3
from botocore.client import Config
import os
# MinIOのS3クライアント(endpoint_urlでMinIOを指定)
s3 = boto3.client(
's3',
endpoint_url='http://localhost:9000', # MinIOエンドポイント
aws_access_key_id=os.environ['MINIO_ROOT_USER'],
aws_secret_access_key=os.environ['MINIO_ROOT_PASSWORD'],
config=Config(signature_version='s3v4'),
region_name='ap-northeast-1',
)
def upload_file(local_path: str, bucket: str, key: str) -> str:
'''ファイルをMinIOにアップロードして公開URLを返す'''
s3.upload_file(local_path, bucket, key,
ExtraArgs={'ContentType': 'application/octet-stream'})
url = s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': key},
ExpiresIn=3600)
return url
def list_files(bucket: str, prefix: str = '') -> list:
'''バケット内のファイル一覧を取得(S3 API互換)'''
paginator = s3.get_paginator('list_objects_v2')
files = []
for page in paginator.paginate(Bucket=bucket, Prefix=prefix):
files.extend([o['Key'] for o in page.get('Contents', [])])
return files
def setup_lifecycle_policy(bucket: str, days_to_expire: int = 365) -> None:
'''バケットにライフサイクルポリシーを設定(古いファイルを自動削除)'''
s3.put_bucket_lifecycle_configuration(
Bucket=bucket,
LifecycleConfiguration={
'Rules': [{
'ID': 'auto-expire',
'Status': 'Enabled',
'Prefix': 'temp/',
'Expiration': {'Days': days_to_expire},
}]
}
)
SeaweedFS
2014年公開、Go製のOSSです。GitHubスター22k+。分散ファイルシステムとS3互換レイヤーを統合したOSSストレージで、小さなファイルの大量保存(ユーザーアバター・サムネイル・ログファイル)に最適化されています。マスター/ボリュームサーバーの分離アーキテクチャで10億ファイル以上のスケールに対応します。
# docker-compose.yml: SeaweedFS
version: "3.8"
services:
seaweed-master:
image: chrislusf/seaweedfs:latest
restart: unless-stopped
command: master -ip=seaweed-master -port=9333
ports:
- "9333:9333"
seaweed-volume:
image: chrislusf/seaweedfs:latest
restart: unless-stopped
command: volume -mserver=seaweed-master:9333 -port=8080 -dir=/data
ports:
- "8080:8080"
volumes:
- seaweed_data:/data
depends_on: [seaweed-master]
seaweed-filer:
image: chrislusf/seaweedfs:latest
restart: unless-stopped
command: filer -master=seaweed-master:9333 -port=8888 -s3
ports:
- "8888:8888"
- "8333:8333" # S3互換API
depends_on: [seaweed-master, seaweed-volume]
volumes:
seaweed_data:
Garage
2020年公開(Deuxfleurs)、Rust製のOSSです。GitHubスター2k+。Rust製で超軽量・地理分散対応のS3互換オブジェクトストレージで、シンプルな設定ファイルと低リソース消費が特徴です。複数拠点・自宅サーバー・Raspberry PiクラスターへのデプロイでS3互換ストレージを運用するホームラボ・スモールチームに適しています。
# garage.toml: Garage設定ファイル
[garage]
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "sqlite"
replication_factor = 3 # 3拠点レプリケーション
[s3_api]
s3_region = "garage"
api_bind_addr = "0.0.0.0:3900"
[admin]
api_bind_addr = "0.0.0.0:3903"
metrics_token = "your-metrics-token"
[rpc_bind_addr]
addr = "0.0.0.0:3901"
# Garageのクラスター初期化とバケット作成
garage status # ノード状態確認
garage layout assign -z dc1 -c 1G <node-id> # ノードをゾーンに割り当て
garage layout apply # レイアウトを適用
# バケット作成とアクセスキー発行
garage bucket create my-backup-bucket
garage key create my-app-key
garage bucket allow --read --write --key my-app-key my-backup-bucket
# Garage CLI でオブジェクトの管理
# S3 APIはboto3でendpoint_url='http://localhost:3900'として使用
機能比較表
| 比較項目 | MinIO | SeaweedFS | Garage |
|---|---|---|---|
| S3互換度 | ✅ 完全 | ✅ 高 | ✅ 高 |
| 小さなファイル最適化 | △ | ✅ | △ |
| 地理分散 | △ | ✅ | ✅ |
| メモリ使用量 | 中 | 中 | ✅ 最低(Rust) |
| GitHub Stars | 50k+ | 22k+ | 2k+ |
オブジェクトストレージはDevOpsカテゴリ/categories/devopsのバックアップソリューション(Restic)と組み合わせてMinIOをResticのバックアップリポジトリとして使用し、S3互換API経由でデータを自社ストレージに安全に保存します。LLMツールカテゴリ/categories/llm-toolsの機械学習データセット管理(DVC)と組み合わせてMinIOをMLデータセットのリモートストレージとして使用してデータバージョン管理を実現します。
FAQ
Q. MinIOをNginxリバースプロキシで公開してHTTPS対応するには?
A. Nginxをリバースプロキシとして前段に置いてLet's EncryptでHTTPS化します。Nginx設定: server { listen 443 ssl; server_name storage.example.com; ssl_certificate /etc/letsencrypt/live/storage.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/storage.example.com/privkey.pem; location / { proxy_pass http://minio:9000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_buffering off; } }。重要ヘッダー: proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for・proxy_set_header X-Forwarded-Proto $scheme→MinIOがHTTPS対応URLを生成。コンソール(9001): server { listen 443 ssl; server_name console.storage.example.com; location / { proxy_pass http://minio:9001; } }でConsoleも独立したサブドメインで公開。MinIO SSL: MinIO自体のSSLは--certs-dir /certsで独自証明書も設定可能→内部通信にTLSを使うか、NginxのSSL終端のみかを選択。
Q. MinIOのイベント通知でS3バケットにファイルがアップロードされたらLambdaを実行するには?
A. MinIOのNotification機能でオブジェクト作成イベントをWebhook・SNS(AWS互換)・Kafkaに転送します。Webhook設定: MinIO Console→Events→Add Event Destination→Webhook→URL(n8n/Lambdaエンドポイント)を設定→バケットのEvent: s3:ObjectCreated:*→フィルター: prefix=uploads/・suffix=.pdf。Python処理: n8nのWebhookノードがMinIOイベントを受信→JSONにバケット名・オブジェクトキー・サイズ→Lambda(Python関数)でPDFを処理(テキスト抽出・OCR・サムネイル生成)→処理結果を別バケット/DBに保存。Kafka連携: MinIO→Kafka(mc event add myminio/uploads arn:minio:sqs::kafka: --event put)→Kafkaコンシューマーで高スループット処理。
Q. SeaweedFSはMinIOとどう違い、どのユースケースに適していますか?
A. SeaweedFSは小さなファイルの大量保存(数億〜数十億ファイル)に特化しており、MinIOは大きなファイル(GB〜TB単位のオブジェクト)のS3互換ストレージに強みがあります。SeaweedFS優位: ①小さなファイル(100KB以下)をボリューム単位でまとめて格納→iノードの枯渇なし②10億ファイル以上のスケールでもマスターのメモリ使用量が少ない③ボリュームIDとファイルIDのマッピングで高速ルックアップ④GeoReplication対応→複数データセンターへのリアルタイムレプリケーション。MinIO優位: ①S3 APIの互換性が最高→AWS SDKそのままで動作②EC(イレイジャーコーディング)でデータ冗長性を確保③Web UI(MinIO Console)が充実→S3ブラウザとしても使いやすい④多くのOSSツール(Airbyte・DVC・Restic)がMinIOをデフォルトサポート。選択基準: SNSのプロフィール画像・サムネイル・ログファイル等の小さなファイルが数億個→SeaweedFS、データレイク・バックアップ・機械学習データセット等のGBサイズのオブジェクト→MinIO。
Q. GarageをRaspberry Piクラスターに構築するには?
A. 3台以上のRaspberry Piに各ノードのGarageバイナリをインストールしてクラスターを構成します。インストール: wget https://garagehq.deuxfleurs.fr/_releases/latest/aarch64-unknown-linux-musl/garage→chmod +x garage→mv garage /usr/local/bin/(ARMv8用バイナリ)。garage.tomlの設定: replication_factor = 3(3台冗長)・rpc_bind_addr.addr = "0.0.0.0:3901"・data_dir = "/mnt/ssd/garage/data"(外付けSSD推奨)。ノード登録: 全ノードでgarage server起動後→garage node connect <other-node-id>@<ip>:3901でクラスター参加→garage statusで全ノード確認→garage layout assign -z home -c 500G <node-id>でゾーン・容量割り当て→garage layout apply。消費電力: 3台Raspberry Pi 4で合計15W→24時間稼働で月電気代100円以下→自宅ストレージ基盤として最低コスト。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| S3完全互換・大ファイル・エンタープライズ | MinIO |
| 億単位の小ファイル・分散ファイルシステム | SeaweedFS |
| 地理分散・低リソース・自宅サーバー | Garage |