Redmine Dashboards
Dashboardsすでにお使いのカスタムクエリから、そのままダッシュボードを組み立てられます。ドラッグ&ドロップのグリッドに KPI タイル・表・15 種類のグラフを並べ、集計は SQL 側で行い、閲覧者に見る権限のあるデータだけを対象にします。
複数サーバー: $399

- ウィジェット種別
- 23
- グラフの種類
- 15
- Redmine
- 4 · 5 · 6 · 7
- データベース
- MySQL, MariaDB, PostgreSQL
- コアの改変
- なし
ドラッグ&ドロップで組み立て
サイズ変更も並べ替えも自由で、作業しながら自動保存されるグリッドです。KPI・グラフ・表を並べ替えて、そのボードが伝えるべきことを伝えるまで整えられます。レイアウトファイルも、ページの再読み込みも不要です。
15 種類のグラフ
棒、横棒、積み上げ棒、折れ線、複数折れ線、エリア、円、ドーナツ、レーダー、極座標、ゲージ、ファネル、ヒートマップ、ツリーマップ、進捗リング。Apache ECharts で描画し、ライトでもダークでも読めます。
保存済みクエリを可視化
ウィジェットを保存済みクエリに向けるだけで、その絞り込みをそのまま引き継ぎます。カスタムフィールド・ウォッチャー・サブプロジェクトも含みます。クエリから 1 クリックでボード全体を生成することもできます。
SQL で集計
GROUP BY・COUNT・SUM・AVG はデータベース側で実行されるため、10 万件のチケットも「数える」だけでインスタンス化はしません。結果はユーザー・ウィジェット・適用中のフィルタ単位でキャッシュされます。
閲覧者に合わせて絞り込み
すべての読み取りは Issue.visible(user)、TimeEntry.visible(user)、Query.visible(user) から始まります。閲覧者がメンバーでないプロジェクトの数値が、グラフに合算されることはありません。
フィルタ・自動更新・ドリルダウン
1 本のフィルタバーでボード全体を絞り直し、ダッシュボードごとの更新間隔で壁掛けディスプレイを最新に保ちます。棒・扇形・セルはいずれも、その裏側のチケット一覧へ飛べます。
Redmine の中で動く姿を見る
ここにあるスクリーンショットはすべて、プラグインを plugins/ に置いただけの素の Redmine 6 から撮ったものです。ダッシュボードは Redmine 自身のヘッダーとメニューの下に表示されます。実際にそこで動いているからです。
ボードを組み立てる


ウィジェット


共有と切り替え


クエリが、そのままレポートになる
ここでは、データをもう一度定義し直す必要はありません。いつもどおりチケット一覧を絞り込んで保存すれば、その保存済みクエリがウィジェットの集計対象になります。Redmine が一覧を描画するときに使うのと、まったく同じリレーションです。
| 手順 | やること | 得られるもの |
|---|---|---|
| 1. クエリを保存する | チケット一覧を絞り込み(カスタムフィールド、ウォッチャー、サブプロジェクトなど)、「保存」を押す | 名前の付いたクエリ。共有した相手に見えます |
| 2. ウィジェットを向ける | ウィジェットのダイアログでそのクエリを選ぶ | データソースと妥当な既定のグループ化が自動的に導かれます |
| 3. またはボードごと生成する | 「クエリから作成」をクリック | そのクエリに紐づく KPI タイルとグラフのダッシュボードが、1 リクエストで完成します |
SQL ではなく、プルダウンで設定する
ウィジェットは、データソース・ディメンション・メジャー・集計方法の 4 つで決まります。チケットをステータス・優先度・トラッカー・担当者、あるいは任意の日付フィールドを日・週・月・年に丸めてグループ化し、件数を数える、予定工数を合計する、進捗率を平均する、といったことができます。グラフを 1 つ作るのにチームの誰も SQL を書きません。そして書く SQL がない以上、閲覧者の権限を越えて手を伸ばすクエリも存在しません。

どのウィジェットも、1 つのフォームで設定
KPI でも棒グラフでもドーナツでも、設定はすべて同じ短いフォームで行います。タイトルと種別、データソース、絞り込み用の任意の保存済みクエリ、メジャー、そして Top-N 付きのグループ化。種別を変えれば、フォームもそれに合わせて変わります。




管理者向けの設定は 1 ページだけ
管理 › プラグイン › Redmine Charts で、ユーザー単位の結果キャッシュ、キャッシュ TTL(5〜86400 秒、既定は 300)、既定のライト/ダークテーマ、既定の自動更新間隔(0 で無効)を設定します。このページは Redmine 自身のプラグイン設定画面です。
23 種類のウィジェット、そして自作の余地
各種別はレジストリ上のメタデータです。設定画面はウィジェット自身の宣言から組み立てられるので、グラフごとに手書きのフォームを用意する必要はありません。
| 分類 | 種類 | 設定項目 |
|---|---|---|
| グラフ | 棒、横棒、積み上げ棒、折れ線、複数折れ線、エリア、円、ドーナツ、レーダー、極座標、ゲージ、ファネル、ヒートマップ、ツリーマップ、進捗リング | データソース、ディメンション、メジャー、集計方法 |
| KPI / 数値 | 独自のフィルタを持つ、単一の集計値 | count · sum · avg · min · max |
| テーブル | 同じ権限スコープのデータに対するページ送り付きの表 | 列の選択とフィルタ |
| コンテンツ | Markdown、メモ、HTML、iframe、活動フィード、最近のチケット | 自由記述、または Redmine 自身のフィード |
描画は Apache ECharts
15 種類のグラフはライトとダークの双方に合わせて調整され、サイズ変更時に描き直され、壁掛けディスプレイでも読めます。ビルド済みのバンドルを同梱しているため、インストールに Node もビルド手順も不要です。
どの要素からもドリルダウン
棒・扇形・ヒートマップのセルをクリックすると、その対象だけに絞り込まれた Redmine のチケット一覧が開きます。裏側の行にいつでも降りられるので、数字は常に検証可能なままです。
全体フィルタと自動更新
1 本のフィルタバーでボード上のすべてのウィジェットを一度に絞り直せます。ダッシュボードごとの更新間隔で、廊下のディスプレイも最新のままです。0 を指定すれば自動更新は止まります。
テンプレートとブループリント
ボードを再利用可能なテンプレートとして保存し、チームごとに複製できます。JSON のブループリントとして書き出して別インスタンスへ取り込めば、検証環境から本番環境へ手作業で組み直さずに移せます。
1 つのプラグインで、チームごとのボードを
デリバリーリード、サポートデスク、そして一人の開発者。それぞれが手元にあった保存済みクエリから、数分でこれらを作りました。





標準で 2 つ、その隣に自作のデータソースを
チケットと作業時間は、ディメンションとメジャーがあらかじめ登録された状態で同梱されています。どちらも Redmine 自身の可視性スコープの内側にあり、別のプラグインが追加したデータソースもまったく同じ扱いを受けます。
| データソース | ディメンション | メジャー |
|---|---|---|
| チケット | ステータス、優先度、トラッカー、プロジェクト、担当者、作成者、カテゴリ、対象バージョン、作成日、更新日、期日 | チケット件数、予定工数、進捗率 |
| 作業時間 | プロジェクト、ユーザー、作業分類、日付 | 時間、記録件数 |
| 自作のもの | 登録したものすべて | 登録したものすべて |
拡張はパッチではなく、登録で行う
データソースとは、名前・ディメンション・メジャー、そして権限で絞り込まれた base_scope を持つクラスです。ウィジェット種別は単なるハッシュです。自分のプラグインの init.rb から RedmineCharts.register_data_source または register_widget_type で登録すれば、設定画面にすぐ現れ、フィルタ・キャッシュ・ドリルダウンをそのまま引き継ぎます。そのために本プラグインへ手を入れる必要はありません。
読めないものは、誰にも集計できない
ダッシュボードは数字を漏らす近道になり得ます。だからこそ、すべての読み取りは最後に権限を確認するのではなく、閲覧者自身のスコープから始まります。
可視性が先、グループ化は後
Issue.visible(user)、TimeEntry.visible(user)、Query.visible(user) が、1 行でも数える前にリレーションを絞り込みます。自分がメンバーでないプロジェクトの合計値は、そもそも集合に含まれていないため、どのウィジェットにも現れません。
4 つの細かい権限
ダッシュボードの閲覧、作成、全体の管理、テンプレートの管理。いずれもロール単位で割り当てられます。そしてプロジェクトで「ダッシュボード」モジュールを有効にするまで、すべて無効のままです。
共有はメンバーシップ経由
ボードはユーザー・グループ・ロール・プロジェクト単位で共有できます。リクエストのたびに viewable_by? と editable_by? を Redmine 自身のメンバーシップから解決し直すので、やがてずれていく独自の権限一覧に頼りません。
データはサーバーの外に出ない
フロントエンドが通信する相手は、自社の Redmine 上にある本プラグインの JSON API だけで、既存のセッションと CSRF トークンをそのまま使います。外部サービスも、ライセンス確認の通信も、テレメトリもありません。
大規模インスタンスに耐える造り
10 万件のチケットを数えるために、10 万個のオブジェクトを読み込む必要はないはずです。ここでは実際に必要ありません。
| 論点 | 対処の仕方 |
|---|---|
| 集計 | GROUP BY・COUNT・SUM・AVG は SQL で実行され、数えるためだけに行をインスタンス化することはありません |
| 値の多いディメンション | 取り得る値が数千に及ぶ場合も、Top-N への畳み込みで応答を小さく保ちます |
| 繰り返しの閲覧 | 結果は Rails.cache により、ユーザー・ウィジェットの更新時刻・適用中のフィルタ単位でキャッシュされます。TTL は設定項目で、Redis もそのまま使えます |
| 遅いウィジェットが 1 つある | ウィジェットは個別に読み込まれるため、重いクエリ 1 本がボード全体を止めることはありません |
| JS バンドルがない | Rails が各ウィジェットのデータをサーバー側で描画してフォールバックするので、画面は真っ白にならず機能が落ちるだけで済みます |
移植性は偶然ではなく、設計の結果
複数バージョン・複数データベースへの対応は、最初から設計に組み込まれています。マイグレーション、JSON の格納、日付の区切り方は、どれも環境の違いを乗り越えるように書かれています。
| 論点 | 対応範囲 | 実現方法 |
|---|---|---|
| Redmine | 4.x、5.x、6.x、7.x | requires_redmine version_or_higher 4.0.0 を宣言。古びていくようなコアのオーバーライドはありません |
| Rails | 5.2 → 8.0 | マイグレーションは、8.0 までのすべてのリリースが解釈できる 5.2 を基準にしています |
| Ruby | 2.5+ | Redmine 4 の最低要件に合わせています |
| データベース | MySQL、MariaDB、PostgreSQL | JSON は通常の text カラムに格納(DDL はどこでも同一)。シリアライザが Rails のバージョンごとに適切な形式を選びます |
| 日付のグループ化 | 日、週、月、年 | 可搬な CAST(col AS DATE) でグループ化し、Ruby 側で区間に畳み込みます。ベンダー固有の SQL はありません |
| マイグレーションの再実行 | 安全 | 防御的に書かれているため、中断したアップグレードもやり直せます |
初日からスクリプトで操作できる
すべてのエンドポイントは /redmine_charts/api 配下にあり、JSON を返し、画面とまったく同じ権限を適用します。CI からボードを用意することも、チームごとに生成することもできます。
| メソッド | パス | 内容 |
|---|---|---|
| GET | /dashboards | 呼び出し元が閲覧できるすべてのダッシュボード |
| POST | /dashboards | ダッシュボードを作成する |
| GET | /dashboards/:id | ダッシュボードをウィジェットごと取得する |
| PATCH | /dashboards/:id | 名前・レイアウト・設定を変更する |
| POST | /dashboards/:id/duplicate | ウィジェットごと複製する |
| GET | /dashboards/:id/export | JSON ブループリントを書き出す |
| POST | /dashboards/import | ブループリントからボードを作成する |
| POST | /dashboards/:id/widgets | ウィジェットを追加する |
| GET | /widgets/:id/data | 集計済みで権限スコープの適用されたウィジェットのデータ |
| GET | /meta/data_sources | データソース、ディメンション、メジャー、利用可能な保存済みクエリ |
今日提供しているもの、次に来るもの
ロードマップの項目は、新しいデータソース、ウィジェット種別、書き出し機能といった追加的なものばかりなので、どれも移行作業を求めません。機能ではなくロードマップとして載せているのは、今日の箱の中身で判断していただくためです。
| 機能 | 状況 |
|---|---|
| ダッシュボード:作成、複製、既定に設定、書き出し、取り込み | 提供中 |
| ドラッグ&ドロップでリサイズできるグリッドと自動保存 | 提供中 |
| KPI、テーブル、ECharts のグラフ一式 | 提供中 |
| SQL 不要のビジュアルなウィジェット設定 | 提供中 |
| 保存済みクエリの再利用と、1 クリックでのボード生成 | 提供中 |
| ボード全体を更新する全体フィルタ | 提供中 |
| グラフからチケット一覧へのドリルダウン | 提供中 |
| ユーザーごとの権限スコープ付き SQL 集計とキャッシュ | 提供中 |
| 共有、テンプレート、ライト/ダークテーマ | 提供中 |
| 複数バージョン・複数データベース対応、サーバー側フォールバック | 提供中 |
| PDF・PNG・Excel への書き出し | 予定 |
| 非常に重いレポート向けのバックグラウンドジョブ | 予定 |
| WebSocket によるリアルタイム更新 | 予定 |
| スナップショットの定期作成とメール送信 | 予定 |
| キオスク/ウォールボードモード | 予定 |
| AI による自然言語のレポートビルダー | 予定 |
| カレンダー、バーンダウン、ガントサマリーのウィジェット | 予定 |
3 ステップで導入
シェルアクセスと rake タスクを実行できる権限が必要です。プラグインを導入する前に必ずバックアップを取ってください。
cd /path/to/redmine # unzip the package from your email or download link unzip redmine_charts-1.0.0.zip -d plugins/ bundle install
bundle exec rake redmine:plugins:migrate NAME=redmine_charts RAILS_ENV=production # optional: the built-in dashboard templates bundle exec rake redmine_charts:seed_templates RAILS_ENV=production touch tmp/restart.txt
# Project → Settings → Modules → Charts & Dashboards # then grant the dashboard permissions to the roles that need them # a Dashboards entry appears in the top menu for anyone who holds one