原田です。今回はMy Redmineの添付ファイルのストレージ使用容量についてお話しします。
弊社サービスMy Redmine JP Edition(Gen.2)はご利用プランによりご利用可能なストレージ容量が決まっています。
ストレージ容量に達するまではチケットなどにファイルを添付できます。弊社ではご契約プランのストレージ容量の上限を超過していないか定期的に使用容量を確認しています。また、お客様ご自身(システム管理者権限が付与されたユーザー)でもストレージの使用容量を確認できます。
参考: ストレージ使用容量の確認方法
My Redmineのアーキテクチャを弊社コーポレートブログでご紹介しました。このブログの中に記載の「アプリケーションのストレージ」はAmazon S3を使用しています。S3に対して弊社作成のスクリプトで使用容量を計算しています。
一部ですが、Rubyスクリプトをご紹介します。
添付ファイルは契約単位に分けて格納していますので、まずは契約ごとのディレクトリ名を抽出します。
# List contract directories(Application ID) in the bucket
app_ids = []
opts = {
bucket: s3_bucket_name,
delimiter: '/',
prefix: '<接頭辞>',
}
loop do
response = s3.list_objects_v2(opts)
break if response.common_prefixes.empty?
# Extract contract directory names
response.common_prefixes.each do |common_prefix|
# Skip if the prefix does not match the expected pattern
next unless common_prefix.prefix =~ /\A(<接頭辞>\d{X})\/\z/
app_ids << $1
end
# Check if there are more objects to list
break unless response.is_truncated
break unless response.next_continuation_token
# Update the continuation token for the next request
opts[:continuation_token] = response.next_continuation_token
# Sleep for a random duration between 0.2 and 0.3 seconds to avoid throttling
sleep Random.rand(0.2..0.3)
end
添付ファイルの使用容量は以下の処理で合計値を計算しています。
# List objects each Application ID in the bucket
csv_data = []
app_ids.each do |app_id|
total_size = 0
opts = {
bucket: s3_bucket_name,
prefix: "#{app_id}/files/",
}
loop do
response = s3.list_objects_v2(opts)
break if response.contents.empty?
# Calculate the total size of S3 objects
response.contents.each do |object|
total_size += object.size
end
# Check if there are more objects to list
break unless response.is_truncated
break unless response.next_continuation_token
# Update the continuation token for the next request
opts[:continuation_token] = response.next_continuation_token
# Sleep for a random duration between 0.2 and 0.3 seconds to avoid throttling
sleep Random.rand(0.2..0.3)
end
# Add the application id, total size to the CSV data
csv_data << [app_id, total_size]
end
スクリプトを実行すると、以下のようなCSVデータが取得できます。
"app_id","total_size" "xxxxxx1","20763380150" "xxxxxx3","13909071357" "xxxxxx8","196136496" "xxxxxx2","6824128" "xxxxxx1","9327474248" "xxxxxx3","24281292" "xxxxxx4","25651924" "xxxxxx0","2742282729" ...
スクリプトを作成しCSVで使用容量を取得できました。しかしMy Redmineサービスは非常に多くのご契約を頂いており、さらにストレージ容量も大きいため、スクリプトの実行に約1時間30分を要します。ローカルPCからAmazon S3に対し、SDKを介してAPIを実行していることが時間を要する原因の1つです。スクリプトの処理をAWSで(Step FunctionsやLambdaなどを使用して)実施すれば、実行時間は削減できるかと思います。できる限り早く改善できるよう努めます。
![]() |
My Redmine のサービスの構成図を公開。運用コストを削減するためにサーバーレスのサービスを中心に選択し実装。 |
![]() |
RedmineのシステムテストをGithub CIで実行するようにしました。 |
![]() |
OSC2025名古屋でブース出展とセミナーを実施。多くの来場者と交流できました |
![]() |
パスワード管理ツール LastPass からApple標準「パスワード」アプリに移行。無料で複数デバイスで利用できるようになりました。 |
![]() |
Redmineのガントチャートの高速化に取り組み、サーバ側での処理時間を40%短縮できました。 |
![]() |
Redmine Japan Vol.4(7/25開催)に弊社代表の前田が招待講演として登壇 オープンソースのプロジェクト管理ソフトウェア Redmine のイベント「Redmine Japan Vol.4」に弊社代表でRedmineコミッターの前田剛が招待公演に登壇します。 |
![]() |
オープンソースカンファレンス 2025 Shimane(6/21開催)登壇・ブース出展 オープンソースカンファレンス 2025 Shimaneで登壇・ブースを出展します。 |
![]() |
RedMica 3.2 バージョンアップのお知らせ My Redmineで提供しているソフトウェアをRedMica(ファーエンドテクノロジー版Redmine) 3.1 から 3.2 へバージョンアップいたします。 |
![]() |
プロジェクト管理ツール「RedMica」バージョン 3.2.0をリリース Redmine互換のオープンソースソフトウェア 今日使える明日のRedmine「RedMica」の最新バージョン3.2.0をリリースしました。 |
![]() |
Redmineの最新情報をメールでお知らせする「Redmine News」配信中 新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け |