Rails Active Storage: Docker ComposeとMinIOでローカルS3開発環境を構築

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をバックエンドとしたファイル管理機能の開発を進めることが可能になります。ぜひ活用してみてください。

未経験からエンジニアへ転職!おすすめの転職サービスはこちら

「未経験だけどエンジニアになりたい…」「IT業界に興味があるけど、どこから始めるべきかわからない…」
そんな方におすすめなのが、プログラミングスクールを活用した転職活動です。
実績豊富なスクールを利用すれば、未経験からでもエンジニアとしての転職がぐっと近づきます!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次