よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

Redmineのファイル保存先を変更する

Redmineを運用している方は、Redmine用のDBスキーマであったり、アップロードされたファイルを定期的にバックアップされていると思います。
そして、バックアップのこと等を考慮して、アップロードされたファイル等はある特定のデータ領域に保存しておきたいと思っている方も多いのではないでしょうか。
現状のRedmineでは、アップロードされたファイルは、${RAILS_ROOT}/files 以下に保存されてしまうため、嫌だなぁと感じていた方も多少なりともいるのではないでしょうか。#少なくとも私はそう感じました。
そのため、ファイルの保存先を簡単に変更する方法を紹介します。

環境変数にファイル保存先を設定する場合

ファイル保存先は${RAILS_ROOT}/app/models/attachment.rbに記述されているため、該当箇所を変更します。
今回は、ファイル保存先を示す環境変数が定義されていたら、そちらを利用するというものです。

Index: app/models/attachment.rb
===================================================================
--- app/models/attachment.rb (リビジョン xxxx)
+++ app/models/attachment.rb (リビジョン xxxx)
@@ -43,7 +43,8 @@
"LEFT JOIN #{Project.table_name} ON #{Document.table_name}.project_id = #{Project.table_name}.id"}

cattr_accessor :storage_path
- @@storage_path = "#{RAILS_ROOT}/files"
+ @@storage_path ||= ENV['STORAGE_PATH'] || "#{RAILS_ROOT}/files"

def validate
errors.add_to_base :too_long if self.filesize > Setting.attachment_max_size.to_i.kilobytes

続いてSTORAGE_PATH変数を${RAILS_ROOT}/config/environments以下の各モード用の設定ファイルに以下を追記します。#今回は保存先を/data/redmine/filesとしています。

ENV['STORAGE_PATH'] = '/data/redmine/files'

※各モードでファイルの保存先を変更する必要がないという場合は、${RAILS_ROOT}/config/environment.rbに追記するのでもよいと思います。

あとはredmineを再起動すればOKなはずです。

Redmineの各種設定が記録されているファイル(settings.yml)で設定する場合

環境変数で設定するのは嫌だという方は、${RAILS_ROOT}/config/settings.ymlに設定項目を持たせるのもありかと思います。

app/models/attachment.rbを以下のように変更

Index: app/models/attachment.rb
===================================================================
--- app/models/attachment.rb (リビジョン xxxx)
+++ app/models/attachment.rb (リビジョン xxxx)
@@ -43,7 +43,8 @@
"LEFT JOIN #{Project.table_name} ON #{Document.table_name}.project_id = #{Project.table_name}.id"}

cattr_accessor :storage_path
- @@storage_path = "#{RAILS_ROOT}/files"
+ @@storage_path ||= Setting.storage_path || "#{RAILS_ROOT}/files"

def validate
errors.add_to_base :too_long if self.filesize > Setting.attachment_max_size.to_i.kilobytes

続いて、settings.ymlにstorage_pathを追記

Index: config/settings.yml
===================================================================
--- config/settings.yml (リビジョン xxxx)
+++ config/settings.yml (作業コピー)
@@ -18,7 +18,6 @@

# DO NOT MODIFY THIS FILE !!!
# Settings can be defined through the application in Admin -> Settings

app_title:
default: Redmine
app_subtitle:
@@ -140,3 +139,6 @@
To change your notification preferences, please click here: http://hostname/my/account
gravatar_enabled:
default: 0
+storage_path:
+ default: '/data/redmine/files'

こちらも、設定後にRedmineを再起動してください。
ただ、settings.ymlには、DO NOT MODIFY THIS FILE !!!と書いてあるため、後者のやり方はあまりおすすめできません。

これでアプリケーションのソースとデータの保存先を分離することができましたね。
めでたしめでたし。