Ruby on RailsのActive Storageは、Amazon S3などのクラウドオブジェクトストレージと連携してファイルを管理するのに非常に便利です。しかし、開発やテストの段階で、実際のクラウドストレージを利用するのはコストがかかったり、セットアップが手間だったり、オフライン環境で利用できなかったりする場合があります。
そこでおすすめなのが、オープンソースのS3互換オブジェクトストレージである「MinIO」をDocker Composeでローカル環境に構築する方法です。これにより、実際のS3とほぼ同じAPIを持つストレージ環境をローカルで手軽に再現でき、開発やテストを効率的に進めることができます。
この記事では、Docker Composeを使ってMinIOサーバーとMinIOクライアント(mc
)コンテナを起動し、RailsアプリケーションのActive Storageバックエンドとして設定する手順を詳しく解説します。
前提:
- DockerおよびDocker Composeがインストールされていること。
*基本的なRailsアプリケーションのセットアップが完了していること。

(※本記事はMinIOとDocker Composeを用いた一般的な設定手順を解説します。特定のRailsバージョンやMinIOバージョンでの詳細な挙動や設定オプションについては、公式ドキュメント等で最新情報をご確認ください。)
1. Docker Composeの設定 (compose.yaml)
まず、compose.yaml
ファイルに、minio
サービスと、バケット作成などを自動化するためのmc
サービスを追加します。
version: "3.9"
services:
app:
....(省略)
environment:
MINIO_ROOT_USER: root
MINIO_ROOT_PASSWORD: password
MINIO_BUCKET: myapp
minio:
condition: service_healthy
minio:
image: minio/minio:latest
command: server /data --console-address ":9001"
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio_data:/data
environment:
MINIO_ROOT_USER: root
MINIO_ROOT_PASSWORD: password
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 5s
timeout: 3s
retries: 3
mc:
image: minio/mc:latest
depends_on:
minio:
condition: service_healthy
entrypoint: ["/bin/sh", "-c"]
command: |
mc alias set myminio http://minio:9000 root password
mc mb myminio/myapp --ignore-existing --region=ap-northeast-1;
mc anonymous set public myminio/myapp;
volumes:
minio_data:
ポイント:
minio
サービス-
S3互換ストレージサーバー本体。
healthcheck
で正常起動を確認できるようにしています。 mc
サービス-
MinIOクライアントツール。
minio
サービスがhealthyになった後に起動し、command
に指定されたシェルスクリプト(エイリアス設定とバケット作成)を実行します。 app
サービス-
Railsアプリ。
minio
サービスにdepends_on
で依存し、必要な接続情報を環境変数経由で受け取れるようにしています。 - ポートマッピング
-
minio
の9000番ポート(API)は主にコンテナ間通信で使いますが、ホストにも公開しておくと疎通確認に便利です。9001番ポート(Console)はホストのブラウザからアクセスするために公開します。
3. Rails Active Storageの設定
次に、Railsアプリケーション側でMinIOに接続するための設定を行います。
3.1. aws-sdk-s3
Gemの追加
Active StorageがS3互換APIを利用するために、aws-sdk-s3
Gemが必要です。Gemfile
に追加し、bundle install
を実行してください。
# The official AWS SDK for Ruby[https://github.com/aws/aws-sdk-ruby]
gem 'aws-sdk-s3', require: false
bundle install
3.2. config/storage.yml
の設定
MinIO用のサービス設定(ここでは :minio
)を追加します。
config/storage.yml
minio:
service: S3
access_key_id: <%= ENV.fetch("MINIO_ROOT_USER") %>
secret_access_key: <%= ENV.fetch("MINIO_ROOT_PASSWORD") %>
endpoint: http://minio:9000
bucket: <%= ENV.fetch("MINIO_BUCKET") %>
region: ap-northeast-1
force_path_style: true
ポイント:
service: S3
-
MinIOはS3 API互換のため、
S3
を指定します。 endpoint
-
Railsコンテナから見たMinIOサービスのURL (
http://<サービス名>:<ポート>
) を指定します。 access_key_id
,secret_access_key
,bucket
-
appの環境変数を参照しています。
region: 'ap-northeast-1'
-
S3 SDKがリージョンを要求するため、ダミー値を設定します。
force_path_style: true
-
MinIOへの接続にはほぼ必須の設定です。これにより、バケット名がホスト名ではなくパスの一部として扱われます。
3.3. config/environments/development.rb
の設定
開発環境で :minio
サービスを使用するように指定します。
config/environments/development.rb
Rails.application.configure do
# ...
config.active_storage.service = :minio
# ...
end
4. 実行と確認
設定が完了したら、以下の手順で実行・確認します。
- Docker Composeコンテナのビルド
-
docker compose build
(特にDockerfileやGemfileに変更があった場合) - Docker Composeコンテナの起動
-
docker compose up -d
- バケット作成の確認
-
mc
サービスのログを確認します (docker compose logs mc
)。”Bucket … setup complete.” のようなメッセージが出ていれば成功です。- ブラウザでMinIO Console (
http://localhost:9001
) にアクセスし、.env
で設定した認証情報でログインして、指定したバケットが作成されているか確認します。
- Railsアプリケーションでの動作確認
-
Railsアプリケーションからファイルアップロード機能を試します。アップロードしたファイルがMinIO Consoleで確認できれば成功です。
まとめ
Docker ComposeとMinIOを利用することで、ローカル環境にS3互換のオブジェクトストレージを簡単に構築でき、Active Storageの開発・テストを効率化できます。
この設定により、クラウド環境に依存せず、コストもかけずにS3をバックエンドとしたファイル管理機能の開発を進めることが可能になります。ぜひ活用してみてください。