カテゴリー: redmine Page 1 of 15

ケーススタディ・ModSecurity影響下でファイルアップロードできない事象に対応

概要

Redmineでファイルをアップロードしようとした際、ModSecurity (WAF) によってブロックされ、エラーになる事象が発生しました。
その原因と事象解決のメモです。

環境

  • Ubuntu 24.04
  • Apache 2.4
    • RedmineをApacheのMod_Passangerで稼働
  • Redmine 5.1
  • ModSecurity v2 / OWASP Core Rule Set (CRS)

事象の確認

環境をWebArenaからXServerに移行した直後。
Redmineのチケットでファイルをアップロードしようとすると、ファイルアップロードのプログレスバーが完了せず、アップロードできません。

原因の特定

こういうときの答えはたいがい、エラーログに書かれているのでそれを確認します。

見つけたログ(IPアドレスやホスト名は改変済み):

[Wed Aug 13 12:47:21.713637 2025] [security2:error] [pid 11190] [client AAA.BBB.CCC.DDD:40404] ModSecurity: Request body no files data length is larger than the configured limit (131072). [hostname "hoge.example.com"] [uri "/uploads.js"] [unique_id "aJwKye92u8EKc4H_FxCb5QAAABQ"], referer: https://hoge.example.com/issues/123

Request body no files data length is larger than the configured limit (131072)

これは、「ファイル以外のリクエストデータ(no files data)のサイズが、設定された上限値(131072バイト = 128KB)を超えています」という意味です。

Redmineは、ファイルをアップロードする際、ファイルそのものとは別に、チケットの題名や説明といったテキスト情報も同時にサーバーへ送信します。このテキスト情報の合計サイズが、ModSecurityのデフォルトの上限値である128KBを超えてしまったため、攻撃と誤認され、ブロックされる。

というのがAI(Gemini)の回答。

既にApacheのバーチャルサイトの.confファイルには

SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000

と記述していますが、サーバの入れ替えと同時にModSecurityのCRSをアップデートしたことで設定が足りなかったようです。

ここまで分かれば、解決まであと少し。

対処手順

設定ファイルのバックアップ

ModSecurityのメイン設定ファイルで、SecRequestBodyNoFilesLimitの上限値を設定で上書きしていきます。

  • エラーを起こしているバーチャルサイトの.confファイルのバックアップ
sudo cp -pi /etc/apache2/site-available/redmine.conf /path/to/backup/directory/redmine.conf.$(date +%Y%m%d)

.confの名前やバックアップディレクトリは自分の環境に合わせます。

  • バックアップ確認
diff -u /path/to/backup/directory/redmine.conf.$(date +%Y%m%d) /etc/apache2/site-available/redmine.conf

差分がなければ(エラーがなければ)バックアップ成功。

上限値を修正する

上述した設定ファイルを以下のように修正。

修正前(例):

SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000

修正後(例):

SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000
SecRequestBodyNoFilesLimit 524288000

両方の値を同じにしておくと、管理が分かりやすくなります。

なお、500MBとしているのは一時的に大きなファイルを置くこともあるからです。上限値は自分の運用方針やストレージ量に合わせましょう。

修正確認

  • ファイル修正後の差分
diff -u /path/to/backup/directory/redmine.conf.$(date +%Y%m%d) /etc/apache2/site-available/redmine.conf
  • 差分例
SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000
+SecRequestBodyNoFilesLimit 524288000

と、追記した行が出てくることを確認します。

設定反映&動作確認

  • confファイルの構文確認
sudo apache2ctl configtest

Syntax OKを確認します。

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

Running(active)を確認します。

  • 動作確認

Redmineのチケット作成/編集画面でファイルが正常にアップロードできるようになれば対処完了です。

まとめ

新環境の構築時、最新のCRSを導入したため、旧環境をそのまま引き継いだというのが直接的な原因でした。
こういう罠があちこちに潜んでいるので、何かあったらログを見て事象を確かめるのが事象解消の近道です。

confファイルのチューニングでPassangerのメモリ量を節約。

WebArenaからXServerに移行し、メモリを6GBまで増強したものの、スワップの使用量増加が止まらず。

これをチューニングによりなんとか抑えられたというメモ書きです。

経緯

  1. スペックの負荷状況を調べるためにGrowiを導入
  2. 十分な性能が見込めたためにNextcloudやBookStackなどを入れていく
  3. それでも稼働していったのでRedmineの移行を終える。
  4. Redmineを入れた途端、スワップ使用率が高くなった。

環境

  • Ubuntu / Debian系OS
  • Apache 2.4
  • libapache2-mod-passengerがインストール済み
  • Redmineを複数稼働

チューニングの目的

上記環境のmod_passengerは、筆者のように複数のアプリケーションを、リソースが限られたVPSで運用する場合(いわゆる逸般的な使い方)は、メモリを過剰に消費し、サーバー全体のパフォーマンスを低下させる可能性があります。

事実、free -hコマンドで、Swapの使用量が放置しているのに高まってきたという状況でした。

そこで、リクエストがあれば都度、プロセスを増やしてしまうpassengerの機能をチューニングで抑制します。

さっくりとした手順

  1. passengerの設定ファイルのバックアップを行います。
  2. ファイルの修正によるチューニングを行います。
  3. 設定を反映させ、状況を確認します。

Passengerの設定ファイルをのバックアップ

※この設定は、バーチャルサイト個別設定ではなく、一括で設定を行います。

なぜなら、Passenger関連のディレクティブが、<VirtualHost>ブロックの中に書くことができないからです。

  • ファイルのバックアップ
sudo cp -pi /etc/apache2/mods-available/passenger.conf /path/to/backup/direcotry/passenger.conf.$(date +%Y%m%d)

バックアップディレクトリは自分の環境に合わせます。(筆者環境:/etc/conf/backup)

  • ファイルのバックアップ確認
diff -u -pi /path/to/backup/direcotry/passenger.conf.$(date +%Y%m%d) /etc/apache2/mods-available/passenger.conf 

差分がなく、エラーがなければバックアップはできています。

メモリ管理ディレクティブを追記

上記passenger.confファイルを開き、<IfModule mod_passenger.c>...</IfModule>ブロックの中に、以下の設定を追記します。

<IfModule mod_passenger.c>
  PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
  PassengerDefaultRuby /usr/bin/ruby

  # --- ▼ここから追記▼ ---
  # Passengerが起動するRubyプロセスの最大数を4に制限
  PassengerMaxPoolSize 4
  # 各アプリケーションごとに起動する最大プロセス数を1に制限
  PassengerMaxInstancesPerApp 1
  # プロセスが300秒(5分)アイドルだったら停止させる
  PassengerPoolIdleTime 300
  # --- ▲ここまで追記▲ ---
</IfModule>

各ディレクティブの解説

ディレクティブ説明
PassengerMaxPoolSizePassengerがサーバー全体で起動するRubyプロセスの最大総数です。サーバーのメモリ上限を超えないよう、搭載メモリ量に応じて設定します。
PassengerMaxInstancesPerApp各アプリケーションごとに起動できるプロセスの最大数です。例えば1に設定すると、一つのRedmineサイトは同時に1つのプロセスしか使えなくなります。
PassengerPoolIdleTimeプロセスがここで指定した秒数以上アクセスがない場合、Passengerはそのプロセスを停止させ、メモリを解放します。

設定の反映

ファイルを保存した後、Apacheを再起動して設定を反映させます。

  • 構文確認
sudo apache2ctl configtest

Syntax Okを確認します。エラーが出たらその箇所を確認し、Syntax OKが出るまで修正します。

  • Apache再起動
sudo systemctl restart apache2.service
  • Apache再起動確認
systemctl status apache2.service

Running(Active)を確認します。

動作確認

この状態で一晩ほど様子を見ました。

free -h
               total        used        free      shared  buff/cache   available
Mem:           5.8Gi       3.3Gi       551Mi       141Mi       2.3Gi       2.4Gi
Swap:          2.0Gi       1.5Mi       2.0Gi

のまま。チューニング前はSwapを100~500MBも使用していたことから、動作は安定。設定は有効のようです。

Redmine5.1にadditionalsをインストール

以前も書いていたadditonalsプラグインのインストール、Redmine5.1版です。

このプラグインの最新版はRedmine6.0のみ対応しています。そのため、ややバージョンの落ちるRedmine5.1で動かすには少し手間があります。

概要

Redmineにかなり強力なマクロを付与するプラグイン:additionalsをインストールします。

また、このプラグインは「additonal_tags」プラグインでも必要です。

プラグイン名

注意

2025年にリリースされているプラグインはRedmine 5.xをサポートしていないため、動くバージョン(タグ)をダウンロードしてのインストールです。

動作を確認した環境

  • Ruby 3.1
  • Redmine 5.1
  • Apache 2.4

さっくりとした手順

  1. SSHログイン後、作業ディレクトリに移動
  2. wgetでRedmine5.1に即したパッケージをダウンロード
  3. パッケージの配置
  4. 新規ジェムをインストール
  5. DBマイグレーション
  6. Webサービス再起動

作業用ディレクトリに移動します。

cd /hoge

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

Redmine5,1に即したバージョンをダウンロードして展開します。

  • ファイル入手
wget https://github.com/AlphaNodes/additionals/archive/refs/tags/3.4.0.zip
  • zipファイルの所有者変更
sudo chown www-data:www-data 3.4.0.zip

apache / nginxの実行ユーザに所有者を合わせます

  • 解凍
sudo -u www-data unzip 3.4.0.zip

Redmineディレクトリにプログラムを配置します。

  • ファイル配置
sudo -u www-data mv additionals-3.4.0 /path/to/redmine/root/directory/plugins/additionals

このとき、リネームも行います。(-3.4.0を外す)

自分の環境に合わせます。(筆者環境/home/www-data/redmine/plugins/)

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

cd /path/to/redmine/root/directory && pwd

自分の環境に合わせます。(筆者環境/home/www-data/redmine)

Gemをインストールします。

sudo -u www-data bundle install

DBのマイグレーションを行います

sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production

Webサービスを再起動します。

sudo systemctl restart apache2

動作確認

  1. Redmineに管理者アカウントでログインします。
  2. 管理に「Additionals」が加わっていればインストールされています。

公開用Redmineの整備。

別サイトとして運営している

(上記マルチドメインのため、どちらのサイトでも同じ内容です)

こちら、『ライザのアトリエ トリロジーDX』のリリースにより整備する必要が出てきました。

プロジェクトの追加とキャッチ画像の追加

プロジェクト - クーケン島観光ガイド

それぞれにBing Image Creatorで生成したアイコンを指定。

更に、今まで作っていなかったプロジェクトとして

概要 - 02_arライザのアトリエ1 - クーケン島観光ガイド

『ライザのアトリエ』を追加です。DX版に伴い、もう一度、最初からやっていき言語化していきたいなと思った次第です。

ただ、それまでの間に今止まっている

  • 『ユミアのアトリエ』のクエストなどの整理
  • 『ライザのアトリエ2』陽炎の島の装備の解説

など、やることは多いです。

Redmine_View_Customizeでチケットのステータスにラジオボタンを追加する

やりたいこと

Redmineのステータス一覧のドロップダウンリストにラジオボタンを追加し、ステータスの遷移を行いやすくします。

前提

  • Redmine View Customize がインストールされていること。
  • Redmine 5.1で動作を確認しています。

手順

画面移動

  1. Redmineに管理者権限でログインします。
  2. 管理>表示のカスタマイズに移動します。

カスタマイズ作成:JavaScript

表示のカスタマイズに移動後、「新しい表示のカスタマイズ」をクリックします。

以下の通りに入力します。

  • パスのパターン
  • /issues/[0-9]+
  • プロジェクトのパターン
  • 空白
  • 挿入位置
  • 全ページのヘッダ
  • 種別
  • JavaScript

コード

$(function() {
  const $select = $('#issue_status_id');
  if ($select.length === 0) return;

  const currentVal = $select.val();

  // ラジオボタンを入れるコンテナ
  const $radioContainer = $('<div class="status-radio-container"></div>');

  $select.find('option').each(function() {
    const val = $(this).val();
    const label = $(this).text();

    if (!val) return; // 空value(プレースホルダなど)はスキップ

    const id = 'status_radio_' + val;

    const $radio = $('<input type="radio">').attr({
      id,
      name: 'issue_status_radio',
      value: val
    });

    if (val === currentVal) {
      $radio.prop('checked', true);
    }

    const $label = $('<label>').attr('for', id).text(label);
    const $wrapper = $('<div class="radio-wrapper"></div>').append($radio, $label);

    $radioContainer.append($wrapper);
  });

  // ドロップダウンを非表示にし、ラジオボタンを挿入
  $select.hide().after($radioContainer);

  // ラジオ選択時に元のselectを更新
  $radioContainer.on('change', 'input[type=radio]', function() {
    $select.val($(this).val());
  });
});
  • コメント
  • 任意「チケットステータスにラジオボタンを追加する-JavaScript-」など
  • 有効
  • チェック
  • プライベート
  • チェックを外す

設定後、保存をクリックします。

カスタマイズ作成:CSS

表示のカスタマイズに移動後、「新しい表示のカスタマイズ」をクリックします。

以下の通りに入力します。

  • パスのパターン
  • /issues/[0-9]+
  • プロジェクトのパターン
  • 空白
  • 挿入位置
  • 全ページのヘッダ
  • 種別
  • CSS

コード

.status-radio-container {
  display: flex;
  flex-wrap: wrap;
  gap: 10px 20px;
  margin-top: 5px;
}

.radio-wrapper {
  display: flex;
  align-items: center;
  width: 220px; /* カラム幅は調整可能 */
}

.radio-wrapper label {
  margin-left: 6px;
  cursor: pointer;
}
  • コメント
  • 任意「チケットステータスにラジオボタンを追加する-CSS-」など
  • 有効
  • チェック
  • プライベート
  • チェックを外す

設定後、保存をクリックします。

動作を確認します。

任意のチケット編集画面をクリックします。

ステータス変更画面がドロップダウンリストからラジオボタンに変わっていれば成功です。

Redmine View_Customize_Pluginによる「ヘッダに新規チケット発行のリンク」。

やりたいこと

Redmineのヘッダに「新しいチケットの作成」のリンクを入れ、トップページから特定のプロジェクトでチケットを発行できるようにします。

前提

  • Redmine View Customize がインストールされていること。
  • Redmine 5.1で動作を確認しています。

手順

画面移動

  1. Redmineに管理者権限でログインします。
  2. 管理>表示のカスタマイズに移動します。

カスタマイズ作成:JavaScript

表示のカスタマイズに移動後、「新しい表示のカスタマイズ」をクリックします。

以下の通りに入力します。

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

コード

$(function() {
  // ▼▼▼ ここにチケットを作成したいプロジェクトの「識別子」を記述してください ▼▼▼
  const TARGET_PROJECT_ID = 'project-id';
  // ▲▲▲ ------------------------------------------------------------ ▲▲▲

  // プロジェクト識別子が設定されていない場合は処理を中断
  if (!TARGET_PROJECT_ID || TARGET_PROJECT_ID === 'your-project-identifier') {
    return;
  }

  const newIssueUrl = '/projects/' + TARGET_PROJECT_ID + '/issues/new';

  // トップメニューにリンクを追加
  $('#top-menu ul').append(
    $('<li>').append(
      $('<a>', {
        href: newIssueUrl,
        'class': 'new-issue',
        text: '新しいチケットの作成'
      })
    )
  );
});
  • コメント
  • 任意「ヘッダにチケット作成追加」など
  • 有効
  • チェック
  • プライベート
  • チェックを外す

設定後、保存をクリックします。

動作を確認します。

上記設定後、以下を確認します。

  • ヘッダに「新しいチケットの作成」リンクが追加されていること
  • クリック後、チケット作成画面に遷移すること
  • その際、指定したプロジェクト(URLにプロジェクト識別子があること)

Redmineにfavicon(サイトアイコン)を設定。

概要

こちらのように、サイトアイコン(favicon)をRedmineに設定するメモです。

環境

  • Ubuntu 24.04
  • Redmine 5.1
  • Apache 2.4
    • サービス実行ユーザはデフォルトのwww-data

で実施しています。(Redmine 6.xはディレクトリ構造が異なります)

準備

  1. ファイルfavicon.pngfavicon.icoを用意します。
  2. このファイルをRedmineサーバに転送します。
  3. ファイルの所有者をRedmine実行ユーザに変更します。sudo chown www-data:www-data favicon.png など

手順

faviconファイルの配置

  • faviconディレクトリの作成
cd /path/to/redmine/root/directory/public/theme/theme_name && pwd

ルートディレクトリやテーマディレクトリは自分の環境に合わせます。 (筆者環境/home/www-data/redmine/public/themes/redmine_theme_kodomo)

sudo -u www-data mkdir favicon && cd favicon && pwd

faviconディレクトリにいることを確認します。

  • 転送したファイルの配置
sudo -u cp -pi /hoge/favicon.png ./

上記、転送した際のディレクトリを指定します。

Redmineサイトの設定

  1. Redmineのサイトに管理者権限でログインします。
  2. 管理>設定>表示に移動します。
    3.「Gravatarのアイコンを使用する」にチェックを入れて保存します。

この後、ブラウザをリロードしてアイコンが変わっていることを確認できれば設定完了です。

Redmine Knowledgebase プラグイン (v5.0.0) on Redmine 5.1 (Ruby 3.2+, Rails 6.1+) インストール・マイグレーション手順

自分にとってのキラープラグインと言えるRedmine Knowledgebase。

これをRedmine 5.1に導入する際に恐ろしくハマったので、解決したときのメモです。

なお、本件の解決にはGoogle Gemini Advanced(2.5 Pro preview)の助けが必要でした。

環境

  • Ubuntu 24.04
  • Redmine 5.1.x
  • Apache 2.4で稼働
  • Ruby 3.2.x (本手順は Ruby 3.2.3 で確認)
  • Rails 6.1.x (本手順は Rails 6.1.7.10 で確認)
  • データベース: MySQL 8.0 (他のデータベースでも同様の問題が発生する可能性があります)
  • プラグインソース: alexbevi/redmine_knowledgebase

盛大にハマった結果で得た手順

  1. DBのバックアップを取得します。
  2. プラグインのインストールを行います。
  3. マイグレーションエラーに対応します。
  4. マイグレーションの成功を確認します。
  5. Redmine(Webサービス)を再起動します。
  6. プラグインのインストールと動作確認を行います。

バックアップを取得します。

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

任意のバックアップディレクトリに移動します

  • mysqldumpによるバックアップ
mysqldump -h localhost -u redmine -p --no-tablespaces --single-transaction redmine > redmine_backup.$(date +%Y%m%d).sql

それぞれ-h ホスト名 -u redmine -p ユーザ オプション db名です。パスワードはRedmineインストール時に設定したDBユーザのものです。

環境が許すなら、VPSのスナップショットのようにシステム全体のバックアップを取ることを強く推奨します。

プラグインのインストール

  • Redmineのプラグインディレクトリに移動
cd /path/to/redmine/root/directory/plugins && pwd

筆者環境/home/www-data/redmine/plugins

  • git clone
sudo -u www-data git clone https://github.com/alexbevi/redmine_knowledgebase

Redmineの実行ユーザでgit cloneとした方が、後にsudo chownする手間が省けます。

  • clone確認
ls -l redmine_knowledgebase

ファイル一式があることと、ファイル群の所有者がwww-data(Redmineの実行ユーザ)であることを確認します。

  • Redmineのルートディレクトリに戻ります。
cd /path/to/redmine/root/directory/plugins && pwd

筆者環境/home/www-data/redmine/

  • (必要に応じて)依存関係をインストールします。
sudo -u www-data bundle install

初回マイグレーション実行 (エラー発生との対処)

以下のコマンドでプラグインのマイグレーションを実行します。このとき、壮大にハマったので、AIの力を借りて(というよりもほぼその指示に従って)解決しました。

sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production --trace

マイグレーションエラーの修正

エラーが発生した場合は、以下の手順で関連ファイルを修正し、その都度上記 redmine:plugins:migrate コマンドを再実行してください。

修正箇所1: 20121205100143_add_versioning.rb ファイルの対応

このマイグレーションでは、以下の2つのエラーが連続して発生する可能性があります。

  • Mysql2::Error: Duplicate column name 'version_comments' (in kb_articles table)
  • ArgumentError: wrong number of arguments (given 2, expected 1) (in KbArticle.create_versioned_table 内部の create_table 呼び出し)

対象ファイルA: plugins/redmine_knowledgebase/db/migrate/20121205100143_add_versioning.rb

以下に従って修正していきます。

  • 修正前の class AddVersioning ... end の内容(主要部分):
  class AddVersioning < ActiveRecord::Migration
    def self.up
      KbArticle.create_versioned_table
      add_column :kb_articles, :version_comments, :string, :limit => 255, :default => ""
    end

    def self.down
      remove_column :kb_articles, :version_comments
      KbArticle.drop_versioned_table
    end
  end
  • 修正後の class AddVersioning ... end の内容:
  class AddVersioning < ActiveRecord::Migration[6.1] # Rails 6.1 互換にする
    def self.up
      # kb_article_versions テーブルが存在しない場合のみ作成
      unless ActiveRecord::Base.connection.table_exists?(:kb_article_versions)
        if defined?(KbArticle) && KbArticle.respond_to?(:create_versioned_table)
          KbArticle.create_versioned_table # この呼び出しは次の acts/versioned.rb の修正が必要
        else
          # このエラーは通常発生しないはずだが、念のため
          raise "Cannot create kb_article_versions: KbArticle model or create_versioned_table method is not available."
        end
      end

      # kb_articles テーブルに version_comments カラムが存在しない場合のみ追加
      unless column_exists?(:kb_articles, :version_comments)
        add_column :kb_articles, :version_comments, :string, :limit => 255, :default => ""
      end
    end

    def self.down
      if column_exists?(:kb_articles, :version_comments)
        remove_column :kb_articles, :version_comments
      end
      if ActiveRecord::Base.connection.table_exists?(:kb_article_versions)
        if defined?(KbArticle) && KbArticle.respond_to?(:drop_versioned_table)
          KbArticle.drop_versioned_table
        end
      end
    end
  end

対象ファイルB: plugins/redmine_knowledgebase/lib/active_record/acts/versioned.rb

KbArticle.create_versioned_table が内部で呼び出す create_tableArgumentError が発生します。このファイルを修正します。

  • 修正対象箇所 (ファイル内の create_versioned_table メソッドの中、通常503行目あたり):
  # 修正前
            self.connection.create_table(versioned_table_name, create_table_options) do |t|

Ruby

  # 修正後 (create_table_options の前に ** を追加)
            self.connection.create_table(versioned_table_name, **create_table_options) do |t|

上記AとBの両ファイルを修正後、再度以下を実行しましたが、エラーが発生しました。

sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production --trace
修正箇所2: 20150326093122_add_taggings_counter_cache_to_tags.rb ファイルの対応

次のエラーとして NameError: uninitialized constant ...::RedmineCrm が発生する可能性があります。

対象ファイル: plugins/redmine_knowledgebase/db/migrate/20150326093122_add_taggings_counter_cache_to_tags.rb

  • 修正前の class AddTaggingsCounterCacheToTags ... end の内容(主要部分):
  class AddTaggingsCounterCacheToTags < Rails.version < '5.1' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2] # 古い形式
    def self.up
      RedmineCrm::Tag.reset_column_information
      # ... (RedmineCrm::Tag を参照するコードが続く) ...
    end
    def self.down
      # ... (関連する可能性のある remove_column など) ...
    end
  end
  • 修正後の class AddTaggingsCounterCacheToTags ... end の内容:

(Redmine Crmプラグインを使用していない場合、関連処理をスキップします)

  class AddTaggingsCounterCacheToTags < ActiveRecord::Migration[6.1] # Rails 6.1 互換にする
    def self.up
      puts "INFO: Skipping 'up' method in 20150326093122_add_taggings_counter_cache_to_tags.rb due to missing RedmineCrm module or intentional skip."
      # 元の RedmineCrm::Tag に関連する処理は全てコメントアウトまたは削除
    end

    def self.down
      puts "INFO: Skipping 'down' method in 20150326093122_add_taggings_counter_cache_to_tags.rb."
      # 元の remove_column 処理なども、up で対応する処理を行わないためコメントアウトまたは削除
    end
  end

上記ファイルを修正後、更に以下を実行します。

sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production --trace

これらの手順で、ようやく、

  • コンソールにエラーメッセージが出ないこと
  • db:schema:dumpがログに出力されること

を確認しました。

マイグレーション完了の確認

念のため、

mysql -u root -p

としてMySQLコンソールにログイン。

USE DATABASE redmine;

(自分が使っているRedmineのDBを指定します)

  • kb_article_versionsテーブルの確認
SHOW TABLES LIKE 'kb_article_versions';
DESCRIBE kb_article_versions;
DESCRIBE kb_articles;

それぞれ、テーブルが作成されていること、kb_articles テーブルに version_comments カラムが存在すること、および content カラムの型が変更されていること(ChangeColumnArticleToLongText マイグレーションによる)を確認します。

Redmineの再起動

ここではWebサービス(Apache)の再起動を前提とします。

  • 稼働前確認
systemctl status apache2.service

active(running)を確認します。

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

active(running)を確認します。

プラグインの動作確認

Redmineにログインし、ナレッジベースプラグインの各機能

  • 記事の作成
  • 編集
  • 表示
  • バージョン管理
  • ファイル添付

などが正常に動作するか確認してください。

注意点:

  • 上記の手順は、特定のバージョンの組み合わせで発生した問題への対処法です。プラグインやRedmineのバージョンが異なる場合は、別の問題が発生したり、異なる修正が必要になる場合があります。
  • 途中でマイグレーションが認識されなくなるなどの不可解な問題が発生した場合は、一度プラグインディレクトリを削除し、データベースをリストア(または関連テーブルを手動削除)、再度GitHubからクリーンにクローンし直してから上記手順を開始すると、問題が解消されることがあります。

おまけ:切り戻し手順

この手順で成功したとはいえ、失敗はつきものです。そのため、以下に切り戻し手順を記します。

通常の切り戻し

ディレクトリ移動

  • Redmineのルートディレクトリに戻ります。
cd /path/to/redmine/root/directory/plugins && pwd

筆者環境/home/www-data/redmine/

プラグインアンインストール

sudo -u www-data bundle exec rake redmine:plugins:migrate NAME=redmine_knowledgebase VERSION=0 RAILS_ENV=production

ディレクトリ削除

sudo rm plugins/redmine_knowledgebase -Rf

Webサービス再起動

  • 稼働前確認
systemctl status apache2.service

active(running)を確認します。

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

active(running)を確認します。

それでもダメだった切り戻し(DBリストア)

  • DBをバックアップしたディレクトリに移動
cd /hoge && pwd
  • DBリストア
mysql -h localhost -u redmine -p redmine < redmine_backup.$(date +%Y%m%d).sql

パスワードはredmineインストール時に設定したDBユーザのものです

  • 稼働前確認
systemctl status apache2.service

active(running)を確認します。

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

active(running)を確認します。

再起動後、復旧しているかを確認します。

Redmineのマルチドメインのメモ。

公開用Redmine等で取得しているreisalin.com。今回、新たに「ryza.jp」を取得しました。

そこで、「1つのRedmineサイトに対して、別のドメインからアクセス可能にする」方法を取ったのでメモに残します。

やったこと

の両方からアクセスできるようにする。

環境

  • Ubuntu 24.04
  • Apache 2.4
  • Redmine 5.1
  • (DB等は割愛)

以下のように設定しています。

https://atelier.reisalin.com/projects/zettel/knowledgebase/articles/19

準備

  1. DNS設定で、両方のドメインから同一のIPが引けるように設定を行いました。
  2. ワイルドカード証明書を取得しました。

実施手順

ディレクトリ移動

cd /etc/apache2/sites-available && pwd

ファイルコピー

sudo cp -pi atelier.conf atelier_ryza.jp.conf

ファイル編集

  • 主な編集
-servername atelier.reisalin.com
+servername atelier.ryza.jp
  RewriteEngine On
         RewriteCond %{HTTPS} off
         RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

-    CustomLog /var/log/atelier/atelier_access.log combined env=!dontlog
+    CustomLog /var/log/atelier_ryza/atelier_access.log combined env=!dontlog

-SSLCertificateFile /etc/certs/reisalin.com.crt
-SSLCertificateKeyFile /etc/private/reisalin.com.key
+SSLCertificateFile /etc/certs/ryza.jp.crt
+SSLCertificateKeyFile /etc/private/ryza.jp.key

かなり単純な編集です。すなわち、コピーした後で

  • servernameを変える
  • ログの出力先を必要に応じて追加する
  • 証明書と秘密鍵をドメインに応じたものに変える

.conf有効化と反映

  • .conf有効化
sudo a2ensite atelier_ryza.jp.conf
  • 整合性確認
sudo apache2ctl configtest

Syntax OKを確認します。

Webサービス再起動

  • サービス再起動前確認
systemctl status apache2.service

active(running)を確認します。

  • サービス再起動
sudo systemctl restart apache2.service && $?

0を確認します。

  • サービス再起動後確認
systemctl status apache2.service

active(running)を確認します。

確認

以下、両方のサイトにアクセスします。

それぞれで同じコンテンツが見えればOKです。

備考

なぜ、このマルチドメインがうまくいったか?

Redmineのプログラムが、内部処理としてURLを参照しないというある種のおおらかさに救われました。また、リンクの参照なども(明示しない限りは)相対パスで記述されるため、混乱も少なかったと思います。

これが、他の(特にLalavelフレームワークのようなPHP環境)だとAPP_URLが関係するため、両立は今回のように上手くいきません。別途、リバースプロキシーを立てるなどの配慮が必要です。

『ユミアのアトリエ』発売に向けての準備。

アトリエシリーズ(コンシューマー向け)最新作、『ユミアのアトリエ』発売日と言うことで準備を行いました。

公開用Redmineにプロジェクトを追加

https://atelier.reisalin.com/projects/yumia

新規プロジェクトの作成。

ライザのアトリエ3ほどの熱量があるかは不明ですが、記録には遺そうと思っています。

プレイ中の水分と糖分補給の準備

『ライザのアトリエ3』立て続けにプレイした際、脳のエネルギー源が著しく消費した反省から、今回は過剰と言えるものにしています。

アウトレットでキャラメルポップコーンがあったのはある種の救いでした。

こちらを携えつつ、集中してプレイに臨めればと思っています。

Page 1 of 15

Powered by WordPress & Theme by Anders Norén