Minio-それは何ですか
Minioは、シンプルで高速なAWS S3準拠のオブジェクトストレージです。 Minioは、写真、ビデオ、ログファイル、バックアップ、仮想マシンやコンテナの画像などの非構造化データをホストするように設計されています。 サイズが小さいため、Node.js、Redis、MySQLと同様に、アプリケーションスタックに含めることができます。 Minioは分散モードもサポートしています。これにより、複数のドライブを、異なるマシンにあるドライブを含む同じストレージサーバー上のオブジェクトに接続できます。
Minioのインストール
サーバーのインストール
Minioのインストールと実行は非常に簡単です。
brew install minio/stable/minio minio server ~/data
ドキュメントがアドバイスするように、以前のバージョンが安定性を示すことなく以前にインストールされた場合、それを削除して新しい安定版をインストールする必要があります。
brew uninstall minio brew install minio/stable/minio
サーバーコマンドのヘルプには、起動と構成の基本的な方法が表示されます。 ローカルで実行します
minio server --address localhost:9000 ~/data
サーバーを起動した後、彼は見つけられるアドレスと、それにアクセスするための秘密のパスワードを持つキーを書き込みます。 これは、原則として、Minioの使用を開始するのに十分です。詳細- 公式ドキュメント
クライアントのインストールと基本的なコマンド
Minioクライアントを使用すると、Unixコマンドラインと同様のストレージを操作できます。 クライアントを置いてチームを見る
brew install minio/stable/mc mc --help
有用から:
mc mb minio/my-uploads-store # mc policy -r public minio/my-uploads-store # mc ls minio/my-uploads-store #
公式リファレンスガイドでは、すべてが十分に詳細に説明されています
Nginx
基本設定
Nginxは多くの便利なことを行います。例えば:
- 内部ネットワーク上のストレージを非表示にします
- キャッシュを整理する
- 分散ストレージの負荷分散を整理する
- さて、アプリケーションの単一のエントリポイントです。これにより、将来リポジトリを簡単に変更できます。
Minioを使用するための最も簡単なNginxセットアップ
server { listen 80; server_name minio.dev; location / { proxy_set_header Host $http_host; proxy_pass http://localhost:9000; } }
これでminio.devのリポジトリにアクセスできます
キャッシング
記事で説明されているように、NginxのMinioキャッシングに問題がありました。 判明したように -私だけではありません。 次のようにねじを外します。
- Nginxを過ぎたリポジトリへの直接リンク(またはキャッシュなしでリポジトリを介して)によってリポジトリに書き込みます
- リポジトリからの読み取りは、キャッシングとの別のリンクを介して発生
- したがって、RoRアプリケーションでは、リンクが変更されます-書き込み中、読み取り中、キャッシュ中
proxy_cache_path /var/cache/nginx/minio_cache levels=1:2 keys_zone=minio_cache:10m max_size=10m inactive=60m use_temp_path=off; upstream minio_servers { # Load Balancing server localhost:9000; } server { listen 80; server_name minio.dev; location / { proxy_cache minio_cache; add_header X-Cache-Status $upstream_cache_status; proxy_cache_revalidate on; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; proxy_cache_lock on; proxy_ignore_headers Set-Cookie; proxy_cache_valid 1m; proxy_set_header Host $http_host; proxy_pass http://minio_servers; } }
RoRアプリケーション
一般設定
Shrineを使用してMinioに写真をアップロードします(作業のすべての詳細は、公式の優れたドキュメントおよびドキュメントに添付されている記事で確認できます。ここにMinioの機能のみを示します)。 Minioを直接使用するには、Gemfileに追加する必要があります
gem 'shrine-fog' gem 'fog-aws'
require 'shrine/storage/fog' require 'fog/aws' require 'image_processing/mini_magick' minio = Fog::Storage.new( provider: 'AWS', aws_access_key_id: '<key>', aws_secret_access_key: '<secret>', region: 'us-east-1', endpoint: 'http://localhost:9000/', # path_style: true, ) Shrine.storages[:cache] = Shrine::Storage::Fog.new( connection: minio, directory: '<cache-directory>', public: true, ) Shrine.storages[:store] = Shrine::Storage::Fog.new( connection: minio, directory: '<store-directory>', public: true, )
もちろん、Minioクライアントを介して適切なフォルダーを作成し、それらへのフルアクセスを与える必要があります(上記のセクション-Minioクライアントを参照)。
class AvatarUploader < Shrine include ImageProcessing::MiniMagick plugin :activerecord plugin :determine_mime_type, analyzer: :mime_types plugin :logging, logger: Rails.logger plugin :remove_attachment plugin :store_dimensions plugin :remote_url, max_size: 20*1024*1024 plugin :versions plugin :default_url plugin :processing plugin :host_url, host: 'minio.dev', port: '80' # , Attacher.default_url do |options| # , '/images/default.svg' end process(:cache) do |io, context| # , resize_to_fill!(io.to_io, 300, 300) end end
実際、ほとんどのプラグインはオプションです。 詳細については、公式の神社のドキュメントを参照してください。 通常通りの取り扱い:
User.find(1).avatar_url
リンク交換
交換用リンクをいじる必要がありました。 Shrineには、ほとんどの問題を解決するために使用できるさまざまなプラグインがあります。 default_url_optionsホストを置き換えるためのプラグインがありますが、この特定のケースでは役に立ちませんでした-ホストを変更し、ポートを無視します。 うーん、どうする? そして、独自のShrineプラグインを作成しましょう。 プラグインコードは、接続方法の下にあります-前のリスト(80番目のポートは、最終リンクでデフォルトで指定されていないため、他のすべてが表示されます。
class Shrine module Plugins module HostUrl def self.configure(uploader, options = {}) uploader.opts[:host_url] = (uploader.opts[:host_url] || {}).merge(options) end module FileMethods def url(**options) new_uri( URI.parse(super), uploader.opts[:host_url][:host], uploader.opts[:host_url][:port] ) end private def new_uri(uri, new_host, new_port) URI::HTTP.new( uri.scheme, uri.userinfo, new_host, new_port, uri.registry, uri.path, uri.opaque, uri.query, uri.fragment ).to_s end end end register_plugin(:host_url, HostUrl) end end
新しいプラグインのコードをlib / shrine / plugins / host_url.rbに配置します
データ移行
公式の指示では、原則として、すべてが詳細に説明されています。 確かに、いくつかのニュアンスがあります-(attacher = user.avatar_attacher).storedがある場合は? 何らかの理由でfalseを返します。小さなこともあります。既存の古いストアに新しいストアを追加し、移行を行ってから古いストアを削除する必要があります。
しかし、この特定のケースでは、すべてをはるかに簡単にすることができます。
rsync -zavP <>@<.>:/<___> ~/data/<store-directory>
実際、すぐに使用できるものはすべて新しいコードで機能します。
その他
はい、次のアプリケーションでMinioに移行するときに、このプラグインをgemに転送しました。
使用したソース
NGINX PlusとMinioおよびロシア語翻訳を 備えたエンタープライズグレードのクラウドストレージ