My Redmineの添付ファイルの使用容量はスクリプトを使用して計算しています


My Redmine

原田です。今回はMy Redmineの添付ファイルのストレージ使用容量についてお話しします。

My Redmineのストレージ容量はご利用プランによって異なります

弊社サービスMy Redmine JP Edition(Gen.2)はご利用プランによりご利用可能なストレージ容量が決まっています。


My Redmine G2. ご利用プランとストレージ容量

使用容量は定期的に確認しています

ストレージ容量に達するまではチケットなどにファイルを添付できます。弊社ではご契約プランのストレージ容量の上限を超過していないか定期的に使用容量を確認しています。また、お客様ご自身(システム管理者権限が付与されたユーザー)でもストレージの使用容量を確認できます。

参考: ストレージ使用容量の確認方法

スクリプトで使用容量を計算しています

My Redmineのアーキテクチャを弊社コーポレートブログでご紹介しました。このブログの中に記載の「アプリケーションのストレージ」はAmazon S3を使用しています。S3に対して弊社作成のスクリプトで使用容量を計算しています。

My Redmine G2. のアーキテクチャ(一部抜粋)

一部ですが、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"
...

使用容量の計算をAWSで実行するように改善したい

スクリプトを作成しCSVで使用容量を取得できました。しかしMy Redmineサービスは非常に多くのご契約を頂いており、さらにストレージ容量も大きいため、スクリプトの実行に約1時間30分を要します。ローカルPCからAmazon S3に対し、SDKを介してAPIを実行していることが時間を要する原因の1つです。スクリプトの処理をAWSで(Step FunctionsやLambdaなどを使用して)実施すれば、実行時間は削減できるかと思います。できる限り早く改善できるよう努めます。

My Redmine

こちらの記事もオススメです!
Redmineのクラウドサービス My Redmine のアーキテクチャ紹介 2023
My Redmine のサービスの構成図を公開。運用コストを削減するためにサーバーレスのサービスを中心に選択し実装。
RedmineのシステムテストをCIで実行するようにした
RedmineのシステムテストをGithub CIで実行するようにしました。
OSC2025名古屋に出展しました
OSC2025名古屋でブース出展とセミナーを実施。多くの来場者と交流できました
パスワード管理ツール LastPass からApple標準「パスワード」アプリに移行
パスワード管理ツール LastPass からApple標準「パスワード」アプリに移行。無料で複数デバイスで利用できるようになりました。
Redmine 6.1.0向けにガントチャートのサーバ側処理時間を40%短縮した
Redmineのガントチャートの高速化に取り組み、サーバ側での処理時間を40%短縮できました。
ファーエンドテクノロジーからのお知らせ(2025/06/18更新)
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」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け