タグ: redmine Page 1 of 15

Redmineインストール後に行う避難訓練(Redmineの再作成)

ここでは、Redmineを立ち上げ、基本的な設定を済ませた人が行っていただきたい「避難訓練」について述べます。

環境

  • Ubuntu 22.04
  • 動かしていたRedmine:5.1
  • Apache 2.4 / mod-passangerでRubyアプリを使用(Ruby 3.2.3)
  • MySQL 8.0.3

避難訓練の内容

  • 最終的な目的
    • Redmineの再構築
  • 避難訓練で行うこと
    • DBバックアップ
    • 「稼働環境のDBの削除」
    • Redmine再構築
    • バックアップしたDBの流し込み
    • 再構築確認

何故このタイミングで?

「他の人が誰も使っていない状態だから」に尽きます。

自分以外の誰かが使っている中で

  • 障害が発生してしまった状況でいきなりリストアを行う
  • 最初にリストア訓練を行っている

状況下、安心できるのはどちらでしょうかという単純な問題。

そして、Redmineは古くから(2006年)使われているため

  • プラグインの相性問題
  • チューニングミス
  • 設定変更

などで簡単にぶっ壊れます。筆者は2桁単位で壊してます。なので「壊れないようにする」ではなく「壊れてもすぐ元に戻せる」心構えがRedmineは特に重要です。

作業前のチェック

以下が必須です。

  • [ ] 慎重な心構え
  • [ ] ある程度リラックスできて集中できる環境。

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

  1. スナップショットのバックアップ (推奨)
  2. DBのバックアップ
  3. redmineのディレクトリを一度mvでリネームしてバックアップ。
  4. apache停止
  5. redmineのDBを消す。
  6. redmineのDBを新たに作る。(ユーザは全て権限があるので問題なし)
  7. apache再開
  8. ディレクトリを再作成。
  9. themesとpluginを再配置。
  10. themesとpluginを再配置した状態でDBマイグレーション。
  11. DBリストア。
  12. 動作確認。

システム全体のバックアップ(推奨)

万一に備え、システム全体のバックアップを取ることを推奨します。AWSや仮想サーバ等の場合は、インスタンスをまるごとバックアップしておくと良いでしょう。

mysqldumpによるDBバックアップ

  • 保存ディレクトリに移動
cd /hoge

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

mysqldump -h localhost -u redmine -p --no-tablespaces --single-transaction redmine > redmine_backup.$(date +%Y%m%d).sql

DB名やDBユーザは自分の環境に合わせます。

データ退避

  • Redmineのルートディレクトリの上に移動
cd /home/www-data && pwd

Redmineが格納されているディレクトリの親ディレクトリに移動します。筆者環境は/home/www-dataなので、自分の環境に合わせます。

  • ディレクトリがあることを確認
ls -ld redmine

退避対象のディレクトリがあることを確認します。

  • リネームして退避
sudo mv redmine redmine_$(date +%Y%m%d)
  • 退避確認
ls -ld redmine_$(date +%Y%m%d)

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

apache停止

ここでWebサービスを停止するのは、DBを削除するためです。

  • apache停止前確認
systemctl status apache2.service

active(running)を確認します

  • apache停止
sudo systemctl stop apache2.service
  • apache停止後確認
systemctl status apache2.service

inactive(dead)を確認します

DB削除と再作成

この作業は慎重に行って下さい。

  • 管理者権限でmysqlにログイン
sudo mysql -u root -p
  • DB確認
SHOW DATABASES;

redmineのDBがあることを確認します。

  • RedmineのDBを削除
DROP DATABASE redmine;

DB名は再確認してください。この作業前に3回ほど深呼吸して、何か飲み物をゆっくり飲んでからにしましょう。

  • RedmineのDB削除確認
SHOW DATABASES;

RedmineのDBがないことを確認します。

  • 空のDB再作成
CREATE DATABASE redmine CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

同じDBを作り直します。

  • 空のDB再作成確認
SHOW DATABASES;

作成したDBがあることを確認します。

EXIT
  • redmineDBユーザでログイン
mysql -u redmine -p

DB再作成前、redemineのDBにアクセスできるユーザー名です。上記操作はDBの削除は行いましたがユーザーの削除は行っていません。従って、削除前のユーザー名とパスワードでRedmineのDBにアクセス可能です。

  • DB確認
SHOW DATABASES;

作成したDBがあることを確認します。

EXIT

ディレクトリ退避

  • Web格納ディレクトリに移動
cd /home/www-data && pwd

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

  • 退避前ディレクトリ確認
ls -ld redmine

Redmine格納ディレクトリは自分の環境に合わせます。このでぃれくとりがあることを確認します。

  • Redmineディレクトリ退避
sudo mv redmine /path/to/backup/redmine_$(date +%Y%m%d)

バックアップ環境は自分の環境に合わせます。

  • Redmineディレクトリ退避確認
ls -l /path/to/backup/redmine_$(date +%Y%m%d)

ディレクトリやファイル一式があることを確認します。

  • 退避後ディレクトリ確認
ls -ld redmine

退避させたディレクトリが元のでぃれくとりにないことを確認します。

ソースダウンロード

  • ディレクトリ作成
sudo mkdir /home/www-data/redmine

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

  • ディレクトリの所有者変更
sudo chown -R www-data:www-data /home/www-data/redmine
  • svnダウンロード
sudo -u www-data svn co https://svn.redmine.org/redmine/branches/5.1-stable /home/www-data/redmine

5.1系の最新安定版をダウンロードします

退避させたディレクトリからconfigファイルコピー

  • 退避させたRedmine→ 新規に作成したRedmineにコンフィグをコピー
sudo cp -pi /path/to/backup/redmine_$(date +%Y%m%d)/config/database.yml /home/www-data/redmine/config/database.yml

コピー元・コピー先は自分の環境に合わせます。

  • コンフィグの中身確認
cat /home/www-data/redmine/config/database.yml

コピーされていることを確認します。

  • 退避させたRedmine→ 新規に作成したRedmineにメール設定情報などをコピー
sudo cp -pi /path/to/backup/redmine_$(date +%Y%m%d)/config/configuration.yml /home/www-data/redmine/config/configuration.yml

コピー元・コピー先は自分の環境に合わせます。

  • 設定情報の中身確認
cat /home/www-data/redmine/config/configuration.yml

Redmineインストール

  • ディレクトリ移動
cd /home/www-data/redmine
  • bundle
sudo -u www-data bundle install --without development test --path vendor/bundle
  • シークレットトークン発行
sudo -u www-data bundle exec rake generate_secret_token
  • DBマイグレーション
sudo -u www-data RAILS_ENV=production bundle exec rake db:migrate
  • 言語設定
sudo -u www-data RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data

apache再開

  • apache再開前確認
systemctl status apache2.service

inactive(dead)を確認します

  • apache再開
sudo systemctl start apache2.service
  • apache再開確認
systemctl status apache2.service

active(runnning)を確認します

再作成後の仮パスワード作成

対象のRedmineにアクセスします。

IDとパスワードがadmin / admin に戻っている状態のため、ログイン後、仮パスワードを発行します。

退避したディレクトリからデータを再配置

この状況では単に「再作成されたRedmine」だけができている状況です。ここから、バックアップを流し込んでいきましょう。

  • 退避したRedmineのプラグインディレクトリに移動
cd /hpath/to/backup/redmine_$(date +%Y%m%d)/plugins && pwd
  • プラグイン一式のコピー
sudo cp -pir ./* /home/www-data/redmine/plugins/
  • 退避したRedmineのテーマディレクトリに移動
cd /path/to/backup/redmine_$(date +%Y%m%d)/public/themes
  • テーマ一式のコピー
sudo cp -pir ./* /home/www-data/redmine/public/themes/

いくつかのファイルを上書きするか求められるので、yで返します。

  • 退避したRedmineの添付ファイル格納ディレクトリに移動
cd /path/to/backup/redmine_$(date +%Y%m%d)/files
  • 添付ファイル一式のコピー
sudo cp -pir ./* /home/www-data/redmine/files/
  • 退避したRedmineのログディレクトリに移動
cd /path/to/backup/redmine_$(date +%Y%m%d)/log
  • ログ一式のコピー
sudo cp -pir ./* /home/www-data/redmine/log/

プラグイン再マイグレーション

  • Redmineのルートディレクトリに移動
cd /home/www-data/redmine
  • bundle
sudo -u www-data bundle install
  • プラグインのDBマイグレーション
sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production

apacheリスタート

  • apache再開前確認
systemctl status apache2.service

active(running)を確認します

  • apache再開
sudo systemctl restart apache2.service
  • apache再開確認
systemctl status apache2.service

active(runnning)を確認します

DBリストア

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

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

apacheリスタート

  • apache再開前確認
systemctl status apache2.service

active(running)を確認します

  • apache再開
sudo systemctl restart apache2.service
  • apache再開確認
systemctl status apache2.service

active(runnning)を確認します

動作確認

この状態でRedmineに管理者権限でログインします。手順通りなら

  • テーマ
  • 添付ファイル
  • プラグイン
  • チケット一覧

などが有効に動いています。

オプション:作業後-退避前のディレクトリ一式を削除-

  • 退避させたディレクトリの直上に移動
cd /path/to/backup

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

  • 退避ディレクトリ確認
ls -ld redmine_$(date +%Y%m%d)

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

  • 退避ディレクトリ削除
sudo rm -rf redmine_$(date +%Y%m%d)
  • 退避ディレクトリ確認
ls -ld redmine_$(date +%Y%m%d)

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

オプション:作業後-MySQLのダンプファイルを削除-

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

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

  • ダンプファイル削除
rm redmine_backup.$(date +%Y%m%d).sql
  • ダンプファイル削除確認
ls -l redmine_backup.$(date +%Y%m%d).sql

ファイルが無いことを確認します。

備考

Redmineはバージョンさえ合っていれば

  • DB
  • 設定ファイル
  • 添付ファイル
  • プラグイン
  • テーマ
  • ログ

を移行することで、Redmineの作り直しのみならず、別のサーバへの引っ越しが可能になります。

この、避難訓練さえ行っていけば「何かがあってもバックアップさえあれば動かせる」という心の安定につながるでしょう。

Growi アップデートのエラーに対応。(node_module再インストール)

概要

Growiをアップデートをする中でエラーが発生したので対処した時のメモです。

環境

  • Growi v7.3.2 → v7.3.3にアップデートする際の出来事
    • こちらの手順でv7.3.xにアップデート済み
    • Growiの実行ユーザはroot
  • node v20.19.2
  • npm 11.4.0
  • Apacheによるリバースプロキシ

どの段階でエラーが発生したか

sudo git checkoutsudo pnpm isudo npm run app:buildを実行時に

Tasks:    0 successful, 7 total
Cached:    0 cached, 7 tota
  Time:    25.08s 
Failed:    @growi/pdf-converter#gen:swagger-spec
 ERROR  run failed: command  exited (1) 

が出たのでappのビルドが通りませんでした。

エラーの原因

@growi/pdf-converterが利用する@tsed/openapi-utilsというパッケージが、@tsed/diという別のパッケージからcontextという機能をインポートしようとしていますが、インストールされている @tsed/di のバージョンにその機能が存在しないため、SyntaxError となっています。

これは、pnpm のキャッシュや node_modules ディレクトリの状態が不整合になっている場合に発生するということを突き止めました。

もっと有り体に言うと、筆者環境はGrowiはv7.2.x→v7.3.xと順調にアップデートを重ねていったので、パッケージの混在が発生。言うなれば、複数の設計図が混じっていたので(依存関係の不適合)、建設を担当するnpmが「設計図と実装が矛盾している」としてエラーを吐いた次第です。

大前提

Growiプロセス停止確認(systemdに登録している場合)

systemctl status growi.service

で、growiが完全に停止していることを確認してください。

さっくりとした対処

  1. 依存関係をクリーンにします。
  2. 混在しているパッケージを退避します。
  3. パッケージを再インストールします。
  4. Growiのビルドを改めて実行します。

依存関係をクリアする

  • Growiルートディレクトリに移動&確認 (特に重要な作業)

※調査中に別のディレクトリに遷移しているということは極めて多く発生します。特にエラーの対処となればなおさらです。改めて、作業の現在地を確認します。

cd /growi/root/directroy && pwd

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

  • キャッシュクリア
sudo pnpm store prune

node_modulesディレクトリの退避

  • ディレクトリ退避前確認
ls -ld node_modules

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

sudo mv node_modules /path/to/backup/directory/node_modules.$(date +%Y%m%d)

任意のバックアップディレクトリを退避。$(date +%Y%m%d)変数をつけることで現在の日付を付与します。

  • ディレクトリ退避確認
ls -ld node_modules

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

  • 退避ディレクトリ確認
ls -ld /path/to/backup/directory/node_modules.$(date +%Y%m%d)

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

node_modules再配置

  • 再配置
sudo pnpm install

再びnode_modulesが配置されます。

  • 再配置確認
ls -ld node_modules

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

  • ビルド
sudo npm run app:build

Growiの再開

  • Growiサービス開始
sudo systemctl restart growi.service
  • サービス開始確認
systemctl status growi.service

active(running)を確認します。サービスが完全に上がっていないとブラウザでGrowiにアクセスしても503エラーが出ます。しばらく待ちましょう。

アップデート確認

Growiが最新バージョンにアップデートされていれば対処完了です。

ケーススタディ・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も使用していたことから、動作は安定。設定は有効のようです。

公開用Redmineのサーバ移行。

一般公開しているRedmine「クーケン島観光ガイド」、新規VPS、XServerへの移行に伴いデータの移設を行いました。

の構成はそのまま。コンテンツもそのまま移植しています。

ここに至るまで盛大にハマりましたが、なんとかなりました。

この時の記事は改めて記載します。

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にプロジェクト識別子があること)

Redmine5.xとGmailを連携させる。

前に書いたこちらの記事を、よりステップを追うと共に実運用に沿って記述したものです。

本記事で実施すること

  • RedmineとGmailアカウントを紐付け、Redmineからの各種通知をメールで受け取れるようにする。

想定している読者

  • メール通知機能を行いたいが、SMTPサービスを用意したくない
  • (AWSはSMTP機能を遮断しているなど)
  • Redmineのconfiguration.ymlを設定していない

前提

以下が必須です。

  • Redmine稼働サーバのSSHアクセス権限がある
  • かつ管理者権限を持っている
  • Gmailアカウントを持っている
    • ※この連携のためだけに、一つ、連携専用のアカウントを作成することを「強く、強く」推奨します。

また、Redmineのディレクトリを

/home/www-data/redmine

としていますので、自分の環境に合わせてください。

注意事項

本記事により、以下のリスクが発生します。

  • Gmailアプリパスワード漏洩により、用意したアカウントでメールが送信される。
  • その他、 Googleアカウント全体が危険にさらされる。

そのため、この作業は細心の注意を払ってください。

さっくりとした手順

  1. Gmailの2段階認証を有効にします。
  2. アプリパスワードを発行します。
  3. Redmine稼働サーバでメールの設定を行います。
  4. 送信確認を行います。

Googleアカウントで設定をします。

  1. Googleアカウント > セキュリティに移動します。
  2. Googleへのログインで「2段階認証プロセス」をオンにします。

どういう方法で認証をするかは運用に合わせてください。

アプリパスワードを用意します。

  1. Googleアカウント > セキュリティに移動します。
  2. Googleへのログイン > アプリパスワードに移動します。
  3. プルダウンメニューから以下を入力し、「生成」をクリックします。
  4. アプリを選択:メール
  5. デバイスを選択:その他(名前を入力)
  6. 任意の名前(redmine等)を入力
  7. 生成されたパスワードを控えます。
  8. このパスワードはGoogleアカウントへのアクセス権が付与されることに注意ください。
  9. このパスワードはRedmineサイトのDBパスワードと同様の厳密さで運用しましょう。

メールサーバ情報を設定します。(RedmineサーバにSSH接続)

【】内は、自分の環境に合わせます。

cat <<- __EOF__ | sudo tee -a 【/home/www-data/redmine/config/configuration.yml】
production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "smtp.gmail.com"
      port: 465
      ssl: true
      authentication: :plain
      domain: "smtp.gmail.com"
      user_name: "【Gmailアドレス】"
      password: "【上述したアプリパスワード】"
__EOF__
ls -l /home/www-data/redmine/configconfiguration.yml

配置したディレクトリは自分の環境に合わせます。

設定を反映します。

sudo systemctl restart apache2.service

自分が使っているWebサービスに合わせます。

Redmineサイトに管理者アカウントでログインします。

  1. 管理>設定に移動します。
  2. 「メール通知」がタブが有効になっているので、このタブをクリックします。

通知メールの設定を行います。

以下を設定して「保存」をクリックします。

  • 送信元メールアドレス:自分のメールアドレス
  • 宛先を非表示(bcc):チェックを外す
  • メール通知の送信対象とする操作:運用に合わせます。

通知メールの確認を行います。

  1. Redmineの個人設定に移動します。
    1.「自分自身による変更の通知は不要」のチェックを外し、保存をクリックします。
  2. 任意のチケットを発行/変更し、メールが届いていることを確認します。

以上で、設定は完了です。

トラブルシューティング:メールが届かない場合

Googleからのセキュリティ通知を確認する

新しいサーバー(VPS)からの最初のログインは、Googleによって「不審なログイン試行」と見なされ、一時的にブロックされることがあります。

その場合、Gmailアカウントの受信トレイに「セキュリティ通知」メールが届いているはずです。メールの内容に従い、「はい、心当たりがあります」などの操作を行って、アクセスを許可してください。

サーバーからGmailへの接続を確認する:

RedmineサーバーからGmailのSMTPサーバーに到達できるかを確認します。SSHで以下のコマンドを実行します。

telnet smtp.gmail.com 587

Connected to smtp.gmail.com.のように表示されれば、ネットワーク的な接続は問題ありません。(終了するには quit と入力します)

Page 1 of 15

Powered by WordPress & Theme by Anders Norén