質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

436閲覧

RailsプロジェクトでのGitによるうまい画像管理の方法

maztak

総合スコア61

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/09/14 02:40

Railsを使ってUGCの投稿サイトのようなものを作成しています。投稿一覧ページにはサムネイル画像をつけるのですが、この画像の管理をGitコミットに含めるのに気持ち悪さを感じており、良い方法を知っている方に教えて欲しいです。

基本は変更しない画像なのでアセットパイプラインにのるapps/assets/images配下に配置していますが、たまに画像を変更したときには当然Gitコミットに含まれますよね。ですがサムネイル画像を変えただけのコミットがブランチにいくつも存在するのは管理しにくいし、嫌だなと感じます。

ググってもgitignoreで画像をGit管理から外す方法(それだと当然サムネイル変更がproductionに反映されないですよね?)しかでず、画像変更用のブランチを作ってそれを都度masterにマージすることも考えましたが、もっと別管理する良い方法はないかと思案しています。

サムネイル画像の読み込み先URLはDBにstringとして入っているだけなので、apps/assets/images配下ではなく別ドメインに画像をアップロードしてそっちから読み込むのがスマートなのか…。

このあたりで良い方法をご存知であれば教えて頂けますと幸いですm(._.)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

UGCに関して「一般ユーザーによって作れられたコンテンツ」くらいの理解しかありませんがご了承ください。
【徹底解説】UGCとは何か、なぜマーケティングで重要になってきたのか

サムネイル画像の読み込み先URLはDBにstringとして入っている

assetsに含まれる画像は、Webサイトを必要最低限作るのに必要なものだけ含まれているはずです。
なのでデータベースに問い合わせなくても利用シーンに応じて全てを適切に取り出せるべきです。

これが気持ち悪さの正体ですね。
更に言語化していきます。

サムネイル画像は「利用者が作ったコンテンツ」に内包されるものでしょう。
(Hugoのように開発者が先に作るものならまた話は変わってきますが)

開発環境を構築する場合、本番環境のデータベースと紐付けると何が起こるかわからないので、
ローカル上ではまた別のものを作って作業すると考えられます。

その時、サムネイル画像のURLはローカルのデータベース内に無いですよね?
作ったコンテンツが一切無いのに、assets内にサムネイル画像だけがデブリ(宇宙ゴミ)のように残り続ける。
これは明らかに不要なファイルです。


もっと別管理する良い方法はないかと思案しています。

まぁ既存の流れを汲むのであれば、
リポジトリを分けて、Railsプロジェクトからサムネイル画像だけを叩き出す。
これだけでプロジェクトの品質はぐっと良くなるでしょう。

でも、静的ファイルの配信用ディレクトリが2つ以上になりますよね?
困るんじゃないかと思ってリバースプロキシを構築する案を提案します。

なんのことはない、80番ポートに高速な静的ファイル配信用のWebサーバを用意して、
4000番ポート等の公開しないポートでRailsサーバを構築するだけです。

リバースプロキシとしてよく使われるのはnginxです。
例えば/thumbnail/*というパス配下の指定をされた場合、
nginxはサムネイル画像があるフォルダの配下を直で探して返す設定にしましょう。

Docker Composeを使えばdocker-compose.yml1ファイルに数行書き足して、
nginxの設定ファイル1個読み込ませてdocker-compose up -dコマンド一撃で終わりです。
準備は大変でしょうけど、環境構築さえ終わってしまえば既存の作業量からあまり変わらないはずです。


一般的で言えば、オブジェクトストレージを使った方が良いでしょうね。
サムネイル画像をGit管理しよう!という発想に至ったのは、
「ユーザーが登録した画像が消える」事が怖いからですよね?

ならファイルがあることを保証してくれるサービスを利用すれば良いと思います。
有名どころとしてはAmazon S3とかいかがでしょう?
これはインターネット上にHDDを持てるサービスで中々堅牢です。

CDNで高速に配信したり、WebAPI越しにRubyからファイルの出し入れが出来たりしますので、
アイデア次第で普通にファイルに保存する感覚であれこれ使えるはずです。
ローカルで開発時ではminioみたいなクローンソフトがあり、余計な課金を避けられます。

開発者はDocker等でminioのサーバを立ち上げ、
利用者用の画面から登録した画像や、それを元に生成したサムネイル等のファイルを保管すると良いでしょう。

オブジェクトストレージというサービスでは色々と選択肢はありますので、
競合他社を含めて検討してみてはどうでしょうか?

投稿2020/09/14 04:07

編集2020/09/14 07:28
miyabi-sun

総合スコア21203

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maztak

2020/09/15 02:39

詳しく回答ありがとうございます!やや付いていけないところも多かったですが、リバースプロキシやNginx, CDNについてのざっくりした知識はあったので考え方は理解できました! assets配下にはロゴ画像や見出し背景画像などを置いて、直接htmlやcssにファイル名を記述するような使い方をするのですね。 聞いた中では画像配信用のWebサーバーを立てるよりは、Amazonのストレージサービスを契約してそこにアップロード、配信できる仕組みを作るのが良さそうですね。 Firestoreは触ったことあるのですがAWSは慣れてなく…この気に慣れますかね(^^;) ご回答により気にしていた気持ち悪さが解消されました!詳しくありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問