カテゴリー: redmine Page 1 of 12

Redmine 5.1対応版のknowledgebaseプラグインを検索できるように修正。

Redmine 5.1でも動くようになったknowlegebaseプラグイン。

なぜかその記事が検索で引っかからなかったので対処を行います。

環境

  • Ubuntu 24.04
  • Redmine 5.1
  • Apache 2.4
  • Ruby 3.2
  • knowlegebase 5.0.0

手順

参考:Redmine v5.1系で knowledgebaseプラグインの記事を検索する

Redmineのknowlegebaseディレクトリに移動します。

  • knowlegebaseのlibディレクトリに移動
cd /redmine/root/directory/plugins/plugins/redmine_knowledgebase/lib/ && pwd

/redmine/root/directory/は自分の環境に合わせます。

rbファイルのバックアップを取得します。

  • ファイルバックアップ
sudo cp -pi redmine_knowledgebase.rb /path/to/backup/directory/redmine_knowledgebase.rb

任意のバックアップディレクトリを指定します。

  • バックアップ確認
diff -u /path/to/backup/directory/redmine_knowledgebase.rb redmine_knowledgebase.rb

エラー(差分)がないことを確認します。

ファイルの編集を行います。

redmine_knowledgebase.rb

の、

base_url = File.dirname(__FILE__)
REQUIRED_FILES.each { |file| require(base_url + '/' + file) }

module RedmineKnowledgebase
end

の箇所を、

module RedmineKnowledgebase

  Redmine::Activity.register :kb_articles
  Redmine::Search.available_search_types << 'kb_articles'
end

となるように編集します。

  • 差分確認
diff -u /path/to/backup/directory/redmine_knowledgebase.rb redmine_knowledgebase.rb
 module RedmineKnowledgebase
+
+  Redmine::Activity.register :kb_articles
+  Redmine::Search.available_search_types << 'kb_articles'
 end

設定の反映と修正確認を行います。

  • Webサービス再起動
sudo systemctl restart apache2.service
  • Webサービス再起動確認
systemctl status apache2.service

active(running)を確認します。

  • 動作確認

修正を行ったRedmineにアクセスし、knowlegebaseへのアクセス権があるユーザーでログインします。

Redmineの検索機能で、knowledgebaseプラグインの記事が検索できていれば設定完了です。

Redmineのリマインダースクリプトをもう少し改良。

概要

Redmine標準で備わっているリマインダー。

締め切りが近いチケットを担当者に送付できる機能をcronで登録しています。これを更に改良です。

スクリプト

#!/bin/bash

# 引数でルートディレクトリを指定(デフォルトは/home/www-data/redmine)
REDMINE_ROOT=${1:-"/home/www-data/redmine"}

# 引数で日数を指定(デフォルトは3日)
DAYS=${2:-3}

# Redmineのルートディレクトリに移動
cd $REDMINE_ROOT

# リマインダーを送信
bundle exec rake redmine:send_reminders days=$DAYS RAILS_ENV=production

前は締め切り日数を

./redmine_reminder.sh 5

のように、引数で指定していました。新しいスクリプトでは

./redmine_reminder.sh /home/wwww-data/redmine2 5

と、同一サーバ上にある別Redmineでもルートディレクトリを指定できるようになっています。

後はこれを

20 8 * * * /home/hoge/scripts/redmine_reminder.sh /home/www-data/redmine2 31

など、crontabでの自動化を行いやすくしました。

Redmine 5.1にenhanced_uxプラグインをインストール。

概要

以下のように、UX回りを大幅にパワーアップするプラグインです。

  • Ctrl+クリックでポップアップ
  • 二画面モードの追加

動作を確認した環境

  • Ubuntu 24.04
  • Redmine 5.1
  • Apache 2.4

さっくりとした手順

  1. Redmineのプラグイン配置ディレクトリに移動します。
  2. git cloneを行います。
  3. Webサービスを再起動します。
  4. 動作を確認します。

Redmine プラグイン配置ディレクトリに移動

cd /home/www-data/redmine && pwd

自分の環境に合わせます。

プラグインインストール

  • git clone
sudo -u www-data git clone https://github.com/sk-ys/redmine_enhanced_ux
  • clone 確認
ls -ld redmine_enhanced_ux

ディレクトリがあることを確認します。

Webサービス再起動

sudo systemctl restart apache2.service

動作確認

  1. Redmineに管理者権限でログインします。
  2. 管理>プラグイン>Redmine Enhanced UX plugin>設定に移動します。
  3. 有効にしたい機能を選び、チェックしていきます。

利用者にとっては、ない方がよかった機能もいくつかあります。そこはユーザーと調整しながら行ってください。

Redmine、ヘッダーに別サイトへのリンクを追加。(redmine_view_customize)

ヘッダーに別のサイトのリンクがほしいときは割とあるので、そのメモです。

動作環境

  • Redmine 4.2 /5.0/5.1
  • view_customize_pluginがインストール済み

コード

「新しい表示のカスタマイズ」で

  • パスのパターン:空白
  • プロジェクトのパターン:空白
  • 挿入位置:ヘッダー
  • 種別:JavaScript

で、以下のように入力。

$(document).ready(function(){
  // メニューの準備
  const menus = `
<li><a href="https://manualmaton.com" rel="noopener noreferrer">WordPress(manualmaton.com)</a></li>
<li><a href="http://barrel.reisalin.com" target="_blank" rel="noopener noreferrer">BookStack(Barrel Gazer)</a></li>
`;
  // 追加する
  $('#top-menu>ul').append(menus);
});

こうすることで、Redmineのヘッダーに

このようにリンクが追加されます。

AWS Lightsail → WebARENAへの移行完了。

はじめに

個人的に用いているVPSのコンテンツを、AWS LightsailからWebARENAへと移行完了。

今までUbuntu 20.04で動いていたサーバがUbuntu 24.04へと変わったことにより、Ubuntu 20.04のEOL対応を済ませたという形。

それぞれが、URLもそのままに、バージョンが上がった状態で表示されているという形です。

移行のきっかけ

Ubuntu 20.04のEOLが近づいてきた

これが一番の理由。Lightsailを最初に使い始めた頃は2022年5月だったので、まだ余裕があったのですが、そこから2年も経つとさすがに対応するしかないという形。

Lightsailにそのままインスタンスを移行させても良かったのですが

円安によるLightsail利用料高騰

という立ちはだかる壁があり、

  • 4GB Memory
  • 80 GB SSD

をもう一つ作り維持して行くには結構辛いものがありました。その上、

IPv4アドレスに追加料金

という更に手痛い値上げも発表されます。

迫るEOLに維持費の高騰、それをどうにかするために選んだのがWebARENAです。

WebARENAに切り替えた理由

利用費の安さ

https://web.arena.ne.jp/indigo

2024/10/12現在、

  • 4vCPU
  • 4GB Memory
  • 80GB SSD

で月額1630円。(筆者がサインアップしたときは1年間有効のクーポン付きでした)

Lightsailの24USD/月より安価なのは魅力的でした。

キャリア運営による回線の安定。

今回はNextcloudを使うと決めているだけに、回線が安定しているキャリア(docomo)のvpsを利用しました。

移行が思ったよりスムーズだった理由

元からデータをクラウドストレージに保存していた

これが一番大きかったです。クラウドストレージWasabiをs3でマウントしていたために、他のサーバに画像を転送する必要すらありませんでした。

また、mysqldumpの転送も、同じようにs3経由で引っ張るだけです。

サービス構築のメモを最初に残していた

冒頭の外部サイトやこのブログに

  • うまくいった手順
  • ハマったこと
  • 失敗した理由

など書いていたのが助かりました。手順を基本的にコピペで済むように済ませていたのも自賛する点です。

事前検証

この検証のように、別サーバに移行することをやっていたのもまた助かりました。

今後

最小限構成でのLightsailの転用

とはいえ、「LightsailのDNS機能」が有用であるため、一番安いインスタンスを残しつつ他の用途に使っていきます。

Redmine5.1のコードブロックにコピーボタンを実装。

概要

性質上、RedmineのチケットやWikiにコードを貼り付ける機会は多々あると思います。

と、コードで囲まれている部分の脇にコピーボタンをつけて、コピペの手間を軽減します。

確認した環境

Redmine 5.1

さっくりとした手順

  1. 設定ファイル(4個分)のバックアップを取ります。
  2. パッチファイル(4個分)を作成します。
  3. 4つのファイルに対してパッチを適用します。
  4. Webサービスを再起動します。

ファイルのバックアップ

  • app/views/journals/new.js.erb
sudo cp -pi /redmine/root/directory/app/views/journals/new.js.erb /path/to/backup/directory/new.js.erb.$(date +%Y%m%d)
  • app/views/journals/update.js.erb
sudo cp -pi /redmine/root/directory/app/views/journals/update.js.erb /path/to/backup/directory/update.js.erb.$(date +%Y%m%d)
  • public/javascripts/application.js
sudo cp -pi /redmine/root/directory/public/javascripts/application.js /path/to/backup/directory/application.js.erb.$(date +%Y%m%d)
  • public/stylesheets/application.css
sudo cp -pi /redmine/root/directory/public/stylesheets/application.css /path/to/backup/directory/application.css.erb.$(date +%Y%m%d)

/redmine/root/directoryは、自分の環境に合わせます。(var/lib/redmineなど)

また、/path/to/backup/directtoryは任意のバックアップディレクトリを指定します。

ファイルのバックアップ確認

  • app/views/journals/new.js.erb
diff -u /path/to/backup/directory/new.js.erb.$(date +%Y%m%d) /redmine/root/directory/app/views/journals/new.js.erb
  • app/views/journals/update.js.erb
diff -u /path/to/backup/directory/update.js.erb.$(date +%Y%m%d) /redmine/root/directory/app/views/journals/update.js.erb
  • public/javascripts/application.js
diff -u /path/to/backup/directory/application.js.erb.$(date +%Y%m%d) /redmine/root/directory/public/javascripts/application.js
  • public/stylesheets/application.css
diff -u /path/to/backup/directory/application.css.erb.$(date +%Y%m%d) /redmine/root/directory/public/stylesheets/application.css

それぞれ、バックアップしたファイル → バックアップ元ファイルで差分(diff)を取り、エラーがないこと(差分が無いこと)でバックアップを確認します。

パッチファイル作成

cd /hoge && pwd

任意の作業ディレクトリに移動します。

  • new.js.erb.patch
tee new.js.erb.patch > /dev/null << 'EOF'
--- new.js.erb
+++ new.js.erb.patch
@@ -11,3 +11,4 @@
 $('#issue_private_notes').prop('checked', true);
 <% end %>

+addCopyButtonToPreTag();
EOF
  • update.js.erb.patch
tee update.js.erb.patch > /dev/null << 'EOF'
--- update.js.erb
+++ update.js.erb.patch
@@ -7,6 +7,7 @@
   $("#journal-<%= @journal.id %>-notes").replaceWith('<%= escape_javascript(render_notes(@journal.issue, @journal, :reply_links => authorize_for('issues', 'edit'))) %>');
   $("#journal-<%= @journal.id %>-notes").show();
   $("#journal-<%= @journal.id %>-form").remove();
+  addCopyButtonToPreTag();
   var journal_header = $("#change-<%= @journal.id %>>div.note>h4.note-header");
   var journal_updated_info = journal_header.find("span.update-info");
   if (journal_updated_info.length > 0) {
EOF
  • application.js.patch
tee application.js.patch > /dev/null << 'EOF'
--- application.js
+++ application.js.patch
@@ -1123,6 +1123,49 @@
   });
 });

+function addCopyButtonToPreTag() {
+  $('.wiki .copy-contents').remove();
+  var copyContents =
+    $("<div class='copy-contents'>").append(
+      $("<button class='code-copy-button' title='Copy' onclick='copyText($(this).parent().next(\"pre\"), $(this).parent());'>")
+      .append("<span class='icon-only icon-copy'>")
+    );
+  $('.wiki pre').before(copyContents);
+  $('.code-copy-button[title]').tooltip({
+      show: {
+        delay: 400
+      },
+      position: {
+        my: "center bottom-5",
+        at: "center top"
+      }
+  });
+}
+function copyText(target, copyEl) {
+  // Selecting strings in 2 ways for cross-browser support
+  // 1. Use select();
+  copyEl.append("<textarea class='tmp'>");
+  var tmp = copyEl.find('.tmp');
+  tmp.val(target.text());
+  tmp.select();
+  // 2. Use createRange();
+  var range = document.createRange();
+  range.selectNode(target[0]);
+  window.getSelection().removeAllRanges();
+  window.getSelection().addRange(range);
+  // Copy and Cleanup
+  var copied = document.execCommand('copy');
+  window.getSelection().removeAllRanges();
+  tmp.remove();
+  // Show copied messages
+  if (copied){
+    copyEl.append("<div class='copied-message'>Copied.</div>");
+    var copiedMessage = copyEl.find('.copied-message');
+    copiedMessage.show();
+    copiedMessage.fadeOut('slow', function() { $(this).remove(); });
+  }
+}
+
 function inlineAutoComplete(element) {
     'use strict';

@@ -1241,6 +1284,7 @@
 $(document).ready(setupAttachmentDetail);
 $(document).ready(setupTabs);
 $(document).ready(setupFilePreviewNavigation);
+$(document).ready(addCopyButtonToPreTag);
 $(document).ready(setupWikiTableSortableHeader);
 $(document).on('focus', '[data-auto-complete=true]', function(event) {
   inlineAutoComplete(event.target);
EOF
  • application.css.patch
tee application.css.patch > /dev/null << 'EOF'
--- _old/application.css
+++ application.css.patch
@@ -449,6 +449,30 @@
   height: initial;
 }

+.copy-contents {
+  position: relative;
+}
+.copy-contents .code-copy-button {
+  position: absolute;
+  display: flex;
+  right: -13px;
+  top: 0px;
+  border: none;
+  background-color: transparent;
+}
+.copy-contents .copied-message {
+  position: absolute;
+  display: flex;
+  right: -13px;
+  top: 20px;
+  display: none;
+  color:#505050;
+}
+.copy-contents .tmp {
+  position: fixed;
+  left: 200%;
+}
+
EOF

パッチファイルの所有権変更

  • 変更前確認
ls -l *.patch

上記、作成した4つのパッチがあり、作業アカウントが所有者になっていることを確認

  • 所有者変更
sudo chown www-data:www-data *.patch

→ redmineの実行ユーザを指定します。

  • 変更後確認
ls -l *.patch

4つのパッチの所有者がredminの実行ユーザーになっていることを確認

パッチ適用

  • app/views/journals/new.js.erb にパッチ適用
sudo -u www-data patch /redmine/root/directory/app/views/journals/new.js.erb < /hoge/new.js.erb.patch
  • /app/views/journals/update.js.erb にパッチ適用
sudo -u www-data patch /redmine/root/directory/app/views/journals/update.js.erb < /hoge/update.js.erb.patch
  • public/javascripts/application.js にパッチ適用
sudo -u www-data patch /redmine/root/directory/public/javascripts/application.js < /hoge/application.js.patch
  • public/stylesheets/application.css にパッチ適用
sudo -u www-data patch /redmine/root/directory/public/stylesheets/application.css < /hoge/application.css.patch

それぞれ、ファイルがある箇所を絶対パスで実行してください。特に、application.jsとapplication.cssの取り違えに注意ください。

パッチが上手くいかないときは?

エディタなどを利用して、

https://www.redmine.org/attachments/25075

の内容を、追記してください。

diffによるパッチ適用確認

  • app/views/journals/new.js.erb
diff -u /path/to/backup/directory/new.js.erb.$(date +%Y%m%d) /redmine/root/directory/app/views/journals/new.js.erb
  • app/views/journals/update.js.erb
diff -u /path/to/backup/directory/update.js.erb.$(date +%Y%m%d) /redmine/root/directory/app/views/journals/update.js.erb
  • public/javascripts/application.js
diff -u /path/to/backup/directory/application.js.erb.$(date +%Y%m%d) /redmine/root/directory/public/javascripts/application.js
  • public/stylesheets/application.css
diff -u /path/to/backup/directory/application.css.erb.$(date +%Y%m%d) /redmine/root/directory/public/stylesheets/application.css

として、作成したパッチファイルと同じかを確認します。

設定反映

  • Webサービス再起動
sudo systemctl restart apache2.service
  • Webサービス再起動確認
systemctl status apache2.service

active(running)を確認します。

上記適用後、

  1. コードブロックにコピーボタンがあり、
  2. ボタンクリックで内容がクリップボードに保存される

ことが確認できれば設定完了です。

Ubuntu 20.04で動いていた Redmine 4.2のデータを Ubuntu 24.04上のRedmine 5.1に移行。

概要

Redmine 4.2 を動かしている Ubuntu 20.04 が2025年4月にEOLを迎えるため、Redmine 5.1 (Ubuntu 24.04)にリプレースをしました。

最初に

  • 「この手順で上手くいった」という筆者のメモ書きです。
  • Rubyのバージョン違いなどで動かないプラグインがいくつかあります。代替手段は別途考慮してください。

動かなかったプラグインとワークアラウンド

redmine_knowledgebase です。

5.xで動くフォークを試したものの、rubyの兼ね合いで動きませんでした。

そのため、記事をこのBookStackに移行させています。

環境

移行前環境

  • Ubuntu 20.04
  • Redmine 4.2
  • Ruby 2.7
  • Apache 2.4
  • MySQL 8.0.39

移行後環境

  • Ubuntu 24.04
  • Redmine 5.1
  • Ruby 3.2
  • Apache 2.4
  • MySQL 8.0.39

さっくりとはならない手順

  1. 【移行先】空のRedmineを構築します。
  2. 【移行元】DBのダンプファイルを作成し、移行先に転送します。
  3. 【移行元】ファイル、メール設定ファイルなどを移行先に転送します。
  4. 【移行先】DBをリストアします。
  5. 【移行先】gemのアップデートを行います。
  6. 【移行先】移行元で稼働していたプラグインを入れていきます。
  7. 【移行先】動作確認を行います。
  8. 【移行元】移行元のredmineを停止します。
  9. 【移行先】必要に応じてDNSの切り替えと移行先のサイト設定を行います。

【移行先】Redmineを構築していきます。

  • こちらのページに従って、移行先のUbuntu 24.04サーバに、Redmineを構築していきます。
  • 構築したてのRedmineのアカウントとパスワードは admin /admin なので、仮パスワードを設定しておきます。

【移行元】DBのダンプファイルを作成して転送します。

  • ディレクトリ移動
cd /hoge && pwd

任意のディレクトリを指定します。

  • ダンプファイル取得
mysqldump -h localhost -u redmine -p --no-tablespaces --single-transaction redmine > redmine_backup.$(date +%Y%m%d).sql

ユーザー名(-uの後)とDB名(>の前)は自分の環境に合わせます。

  • ダンプファイル内容確認
view redmine_backup.$(date +%Y%m%d).sql

SQL文が平文で読めることを確認します。

作成後、任意の安全な方法で移行先に転送します。

【移行元】各種ファイルを転送します。

以下のディレクトリやを任意の安全な方法で転送します。

/path/to/redmine/root/directory配下(移行前のRedmineルートディレクトリ)の

  • files ディレクトリ(添付ファイル一式)
  • config/configuration.yml ファイル(メール設定がある場合)
  • public/thme/配下のテーマディレクトリ

これらのファイルは転送後、移行後のRedmineに対応するディレクトリ/ファイルに、そのまま上書きます。

【移行先】DBのリストアを行います。

  • ダンプファイル格納ディレクトリに移動
cd /hoge && pwd
  • ダンプファイル確認
ls -l redmine_backup.$(date +%Y%m%d).sql

ファイルがあることを確認します。

  • DBリストア
mysql -h localhost -u redmine -p redmine < redmine_backup.$(date +%Y%m%d).sql

このときのパスワードは、「移行先のRedmineのDBユーザのパスワード」です。

  • Webサービス再起動
sudo systemctl restart apache2.service

Webサービス再起動後に

  1. 移行後のRedmineサイトが移行元と同じ見た目であること
  2. ログインできること
  3. プロジェクト一覧が見られること

までは確認しましたが、チケットを確認しようとすると

500 internal server error

が発生し、閲覧も編集もできない事態が発生しました。

【移行先】gemのアップデートを行います。

こちらの、チケット表示でinternal server errorを解消するため、

Has 500 Internal Server Error when upgrade 4.1.1 to 4.2.7, please help.
https://www.redmine.org/boards/2/topics/67435

この手順を追加します。

  • Redmineのルートディレクトリに移動
cd /path/to/redmine/root/directory && pwd

自分の環境に合わせます。

  • gem update
 sudo gem update

しばらく時間がかかります。

  • Webサービス再起動
sudo systemctl restart apache2.service

gemのアップデート後、今度はエラーが出ないことを確認です。

【移行先】各種プラグインを入れていきます。

移行前に動いていたプラグインを確認しながら、プラグインを入れていきます。

DBマイグレーション中にrake abortedが出た場合は、そのプラグインはRedmine/Rubyのバージョンが合わないので、動かないプラグインです。

【移行先】動作環境を行っていきます。

プラグインを入れながら、既存の機能(別のユーザーがログインできるか、アクセス権は合っているか、チケットの作成や更新ができるか)などを見ていきます。

【移行元】稼働していたRedmineサイトを停止します。

移行元のサーバにSSHログインし、

sudo a2dissite redmine.conf

redmine.confは自分の環境に合わせます。

で設定ファイルを無効化後、

  • Webサービス再起動
sudo systemctl restart apache2.service

として、稼働していた移行元のサイトにアクセスできないことを確認します。

【移行先】必要に応じてDNSの切り替えと移行先のサイト設定を行います。

これは、移行元でも同じURL(ドメイン)を使いたい場合の措置です。

  • DNS向き先変更

DNを利用して、ドメインを移行先のIPアドレスへと付け替えます。

各種DNSサービスによって異なるので、そちらを参照してください。

  • apacheバーチャルサイトの設定変更

/etc/apaches/site-available/redmine.conf (自分の環境に合わせます)

の以下の箇所を編集していきます。

<VirtualHost *:80>
servername hoge.example.com
# 今まで動いていたドメイン名

<VirtualHost *:443>
    ServerName hoge.example.com
# 今まで動いていたドメイン名
  • 構文確認
sudo apache2ctl configtest

Syntax OKを確認します。

  • Webサービス再起動
sudo systemctl restart apache2.service

切り替え後

  1. 前と同じドメインで、新しいRedmineサイトにログインできる
  2. (プラグインが廃止していなければ)同じ機能を使える

ことを確認できれば作業完了です。

移行後の処理

  1. DB移行時に利用したダンプファイルを削除します。
  2. 時期を見て旧サーバのデータの削除を行います。

Redmineのチケットリマインダースクリプト、改良。

このスクリプトを改良しました。

スクリプト内容

  • redmine_reminder.sh
#!/bin/bash

# Redmineのルートディレクトリを変数化
REDMINE_ROOT="/var/lib/redmine"

# 引数で日数を指定(デフォルトは3日)
DAYS=${1:-3}

# Redmineのルートディレクトリに移動
cd $REDMINE_ROOT

# リマインダーを送信
bundle exec rake redmine:send_reminders days=$DAYS RAILS_ENV=production

改良内容として

ルートディレクトリを変数化することで、サーバを変えても動かしやすくしています。

一番の改良点は引数を指定できること。

redmine_reminder.sh 7

を実行すれば7日以内に到来するチケット、

redmine_reminder.sh 31

で同様に31日前のチケットをメール送信させることができます。

あとはcrontabに

# 8:20に31日前のリマインダーを送信
20 8 * * * /home/hoge/scripts/redmine_reminder.sh 31
# 8:30に1日前のリマインダーを送信
30 8 * * * /home/hoge/scripts/redmine_reminder.sh 1

# 16:30に7日前のリマインダーを送信
30 16 * * * /home/hoge/scripts/redmine_reminder.sh 7
# 16:40に1日前のリマインダーを送信
40 16 * * * /home/hoge/scripts/redmine_reminder.sh 1

# 20:20に3日前のリマインダーを送信
20 20 * * * /home/hoge/scripts/redmine_reminder.sh 3
# 20:30に1日前のリマインダーを送信
30 20 * * * /home/hoge/scripts/redmine_reminder.sh 1

などと実行しておけば、柔軟な設定が可能になります。

Redmine View Customize Pluginによる期日自動入力。(日報などの時限性トラッカー)

やること

日報代わりにRedmineのチケットを用いる場合、作成日=期日というパターンは割とあります。

そこで、チケットの作成と同時に、期日を自動的に入れるスクリプトを入れました。

環境

  • Redmine 5.1
  • 要 Redmine View Customize plugin

設定

  1. Redmineに管理者権限でログインします。
  2. 管理>表示のカスタマイズ>新しい表示のカスタマイズをクリックします。

スクリプト内容

  • パスのパターン
    • /issues/new$
  • プロジェクトのパターン
    • 空白
  • 挿入位置
  • チケット入力欄の下
  • 種別
  • JavaScript

スクリプト内容

$(document).ready(function() {
// トラッカーの選択が変更されたときに実行
$('#issue_tracker_id').change(function() {
var selectedTrackerId = $('#issue_tracker_id').val();
var startDate = $('#issue_start_date').val(); // 開始日を取得

// 特定のトラッカーIDが選択された場合
// トラッカーIDは管理>トラッカーから確認可能
if (selectedTrackerId == '6') {
$('#issue_due_date').val(startDate); // 期日に開始日を設定
}
});

// ページ読み込み時にトラッカーが既に選択されている場合にも対応
var selectedTrackerIdOnLoad = $('#issue_tracker_id').val();
var startDateOnLoad = $('#issue_start_date').val();

// 先に指定したトラッカーIDを指定する
if (selectedTrackerIdOnLoad == '6') {
$('#issue_due_date').val(startDateOnLoad);
}
});

作成後、保存をクリックします。

挙動

設定したトラッカーがあるプロジェクトに遷移し、新しいチケットを作成します。

トラッカーを選択後、期日が当日になっていれば設定完了です。

Ubuntu 24.04に設定したMod_Securityでファイルアップロードエラーを退避。

事象

Redmineでクリップボードの画像を貼り付けようとした際、画像のアップロードができませんでした。

そこで、エラーログを確認したところ、以下のメッセージが表示されました。

ModSecurity: Request body no files data length is larger than the configured limit (131072). [hostname "redmine-url"] [uri "/uploads.js"] [unique_id "Zv0wom0FwSak1tXDUgFRLAAAAAw"], referer: https://redmine-url/issues/3

環境

  • Ubuntu 24.04
  • Apache 2.4
  • Mod_Security 2
  • Redmine 5.1

確認したこと

バーチャルサイトのMod_Securityの設定

SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000

と、50MBはアップロードできるようになっています。

Redmineでアップロード可能なファイル容量

管理> 設定 > ファイルの「添付ファイルサイズの上限でも`51200KB`を確認。

Mod_Security Confファイル確認

`cat /etc/modsecurity/modsecurity.conf |grep Limit` の結果、以下を確認しました。

SecRequestBodyLimit 13107200
SecRequestBodyNoFilesLimit 131072
SecRequestBodyInMemoryLimit 131072
SecRequestBodyLimitAction Reject
SecRequestBodyJsonDepthLimit 512
SecPcreMatchLimit 100000
SecPcreMatchLimitRecursion 100000
SecResponseBodyLimit 524288
SecResponseBodyLimitAction ProcessPartial

原因

`/etc/modsecurity/modsecurity.conf`の設定がバーチャルサイトの設定にオーバーライドしたため、こちらの設定が上書きされた模様です。

これを変更していきます。

対応手順

ファイルバックアップの作成

sudo cp -pi /etc/modsecurity/modsecurity.conf /path/to/backup/directory/modsecurity.conf.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

バックアップ作成確認

diff -u /path/to/backup/directory/modsecurity.conf.$(date +%Y%m%d) /etc/modsecurity/modsecurity.conf

バックアップできていること(差分がないこと)を確認します。

sedによる書き換え

sudo sed -i 's/SecRequestBodyNoFilesLimit 131072/SecRequestBodyNoFilesLimit 52428800/; s/SecRequestBodyInMemoryLimit 131072/SecRequestBodyInMemoryLimit 52428800/; s/SecRequestBodyLimit 13107200/SecRequestBodyLimit 52428800/' /etc/modsecurity/modsecurity.conf

ファイル書き換え確認

diff -u /path/to/backup/directory/modsecurity.conf.$(date +%Y%m%d) /etc/modsecurity/modsecurity.conf

以下の差分を確認します。

-SecRequestBodyLimit 13107200
-SecRequestBodyNoFilesLimit 131072
+SecRequestBodyLimit 52428800
+SecRequestBodyNoFilesLimit 52428800
 
 # Store up to 128 KB of request body data in memory. When the multipart
 # parser reaches this limit, it will start using your hard disk for
 # storage. That is slow, but unavoidable.
 #
-SecRequestBodyInMemoryLimit 131072
+SecRequestBodyInMemoryLimit 52428800

設定反映

sudo systemctl restart apache2.service

書き換え後、無事にファイルのアップロードができることを確認しました。

Page 1 of 12

Powered by WordPress & Theme by Anders Norén