ボードゲーム『タッジーマッジー』感想。

18枚のカード、2回のドラフトでひりつく勝負が楽しめる「花束」をモチーフにしたカードゲームです。

概要

プレイヤーはロンドンでお茶を楽しむ人たち。合間合間に花束を贈り、その(行間ならぬ)花間にメッセージを込めようとしています。限られた時間の中で、誰が一番メッセージをうまく伝えることができるでしょうか?

ゲームシステム

いわゆるドラフトとセットコレクション。流れは以下の通りです。

  1. 各プレイヤーには2枚のカード(花)が配られます。
  2. 1枚を表(花束)、もう1枚を裏(思い出)として隣接するプレイヤーに公開します。
  3. 隣のプレイヤーはそれらの中から向きを変えずに受け取ります。選ばれなかったカードは保持します。(裏のカードは受け取るまで見られません)
  4. これを2回繰り返し4枚の花からなるアレンジを作ります。このとき、「披露の準備」と書かれてればそれに従います。
  5. カード(花)に従った得点計算を行います。

これを3ラウンドに渡って繰り返し、一番高い得点を獲得したプレイヤーが勝利となります。

良かったと思った点

コンボの多彩さ

18枚のオールユニークなカードはいずれも組み合わせれば得点の相乗効果が見込まれます。運と戦略が合致して大量得点を出したときの喜びはかなり得がたいものがあります。

虚々実々のブラフ

上述したように「一枚は表/一枚は裏」で隣のプレイヤーに選択を任せるため、

「表に弱めのカードがあるけど裏はいいカードなのか?」
「相手、既にこちらが取ったカードとコンボするカード見せてるけど……」

と、裏をかいたりしてやられたりの駆け引きが最大の魅力です。

シンプルで美麗なイラストに込められたメッセージ

「カード」というより「タイル」と言った方がいい大きく厚いカード(日本版)に描かれた美麗なイラストは並べるだけで花束という形。
いずれもカード効果と合った花言葉が書かれているのもまた魅力の一つです。

やや残念だと思ったところ

経験者有利となるテキスト量

TCG慣れしていない人にはちょっと手間取るテキストがカード上にいくつかあります。(特に思い出と花束の位相を参照するカードなど)そして、そのテキスト慣れがそのままゲーム上の得点行動につながります。

  1. 最初に全てのカードを全プレイヤーに見せる
  2. インスト時に実際の流れを説明すると共に得点を披露する

の処理は必要です。

“徒花”マリーゴールドの使いどころ

これは一項目を使うべき問題。

このカードは披露の準備(得点計算の前)として他の花を捨て札にする強烈なデメリットがあります。
これによってコンボの邪魔となるカードを払うことができるのもまた事実ではありますが、引いた(引かれた)時に顔に出るほどです。

まとめ

最初に言ったように、たった18枚、2回のドラフト。4枚のカードで駆け引きやコンボを楽しめるのは、さすが『ウイングスパン』のデザイナーによる作品。
15分~30分と手短に終わるので言語依存に抵抗がないプレイヤーがいる中でのスターターやアイスブレイクにぴったりでした。

ボードゲーム『キャンバス』感想。

ようやく崩す機会がありました。話題になっていただけあって、

  • とにかく映える盤面
  • 比較的シンプルでわかりやすいルール
  • 高いリプレイ性
  • 楽しい感想戦

などが秀逸なゲームとなっていました。

概要

プレイヤーは芸術祭に参加する画家。コントラストや強調、余白などを意識しながら主催者の意向に沿うように定められた条件に沿った絵を出品していきます。

良かったと思った点

視覚に訴えるコンポーネント群

3枚のクリアなカードを背景のカードと組み合わせて一対の絵にするアイディアはとかく壮観。ゲームが進むごとに盤面が華やかになり、「絵を出品する」気分を高めてくれます。

インストしやすいルール

プレイヤーのアクションは2つのみ。

  1. カードを取る
  2. カード3枚を組み合わせてリボン(得点)を得る

右に行けば行くほど資源(パレット)を消費する制限がカードを取るアクションで発生するものの直感的で分かりやすいです。絵を組み合わせることによって発生する細かい得点計算も裏に書かれている親切設計なのもポイントです。

上記のリボン(得点_を成す条件も毎回のように組み合わせが変わりますし、一定数存在する特別ボーナス(銀リボン)もあるので「ああでもないこうでもない」とのジレンマに悩まされるでしょう。

今風の脱落しないゲーム進行

サドンデスもなければ失点要素もありません。また、各プレイヤーには「3枚の絵」が確実に残るので最後までゲームに参加できます。

やや残念だと思ったところ

ダウンタイムの長さ

「組み合わせによって効率的な得点を重ねられる」が弱みになる形。高得点を目指すプレイヤーがいると手番が遅くなりがちです。(特に条件が複雑な場合)

写真撮影の悪条件

これは「映え」のお話。

アクリル板+スリーブと光が乱反射する悪条件が揃います。進行中や感想戦で写真をアップしたい方がいる場合は、その旨を伝える方がベターです。

まとめ

  • インパクトも見栄えも十二分なコンポーネント
  • 分かりやすいルール
  • 程よく終わるプレイ時間

はライト層を引きつける要素に満ちあふれています。特に、「どのカードをどの順番で重ねていくか」はアナログゲームの強みと言えるでしょう。

個人的には壁掛け用の穴まで箱にあり、パッケージそのものが一枚の絵になるのが特にお気に入り。
(インテリアとして機能するためにずっと部屋に飾られて崩す機会が失われていたほどです)

そのため、飾りにすることなく普通に遊んでいきたいと思った一本でした。

続・MySQLの自動バックアップ。(パスワードによる暗号化付与)

こちらの記事で挙げたRedmineなどのMySQLを実行するスクリプト。

この問題点を修正します。

問題点

  • むきだしのSQLファイルが平文で格納されてしまうのはセキュリティ的によろしくありません。
  • MySQLのバックアップ時に使うアカウントファイルが誰でも読み取れるのも問題です。

そこで、バックアップされたファイルにパスワードをかけることで簡単な防波堤を作ることにします。

前提

上記URLに併せます。

  1. MySQL dumpを行うDBにRELOAD権限があること。
  2. 次の環境で動作を確認しています。
  • Ubuntu 20.04
  • MySQL 8.0.32

実施した手順

さっくりとした手順

  1. バックアップディレクトリを作成します。
  2. DBにアクセスするためのアカウント情報を記したファイルを作成します。
  3. 開封パスワードを格納するディレクトリを作成します。
  4. バックアップスクリプトを作成します。
  5. crontabに登録します。

バックアップディレクトリを作成します。

sudo mkdir -p /home/backup/mysql
# 運用に合わせて指定ください。ファイルサーバや別パーティションにマウントしている方がサーバ事態の障害発生でも冗長化を持たせられます。

sudo chown -R hoge:hoge /home/backup/mysql
# ディレクトリの所有者をログインユーザに修正します

cd /home/backup/mysql && pwd
# 指定したディレクトリに移動します

DBにアクセスするためのアカウントファイルを作成します。

Cronによる自動実行を前提としているため、スクリプト実行時にDBユーザとパスワードを記したファイルを読み込むことでセキュリティのリスクを抑えます。

sudo mkdir -p /home/hoge/db_password
# 運用に合わせて指定ください。

cd /home/hoge/db_password && pwd
# 指定したディレクトリに移動します

以下の内容を教義・信仰に沿ったエディタで作成します。(【】内は取り除き、自分の設定に合わせます)

  • アカウントファイル内容
    • ファイル名:account.txt
[client]
user = 【RedmineのDBユーザ】
password = "【RedmineのDBユーザ用パスワード】"

その後、このファイルの読み取り権限を変更します。

chmod 400 account.txt

ls -l account.txt
# パーミッションが400であることを確認します

アカウントファイルでアクセスできることを確認

mysql --defaults-extra-file=【アカウントファイルを格納したディレクトリ】/account.txt

#MySQLのプロンプトが出れば成功です。exitで抜けます。

スクリプト作成

以下の内容を教義・信仰に沿ったエディタで作成します。

  • スクリプト内容
    • スクリプト名:pw_mysql_daily_backup.sh
#!/bin/bash

## 変数ここから ##
# SQLをバックアップするディレクトリ(保管先)を指定します。運用に合わせて指定ください。
backup_dir="/home/backup/mysql"
# 保持するバックアップの世代を日数で指定します。
keep_days=7
# ファイルに付与する日付/作業ディレクトリ名/バックアップファイル名を指定します。
current_date=$(date +%Y%m%d)
backup_name="redmine_mysql_${current_date}"
zip_file="redmine_mysql.${current_date}.zip"
# アカウントファイルを指定します。運用に合わせて指定ください。
credentials_file="$HOME/redmine/account.txt"
# パスワードを記録するファイル名を指定します。運用に併せてして指定ください。
password_dir="$HOME/restore_redmine"
password_file="${password_dir}/mysql-restore.$current_date.txt"
# redmineのデータベース名を指定します。
database_name=redmine
# バックアップ時に指定するオプションを指定します。
options="--defaults-extra-file=$credentials_file --no-tablespaces --single-transaction"
## 変数ここまで ##

## 処理ここから ##

# 1.アカウントファイルのパーミッションが400かどうかチェックします。
# 400以外は処理そのものを終了します。
permissions=$(stat -c "%a" "$credentials_file")
if [ "$permissions" != "400" ]; then
    echo "アカウントファイルのパーミッションは400である必要があります。"
    exit 1
fi

# 2.一時的なバックアップディレクトリを作成します。
mkdir "${backup_dir}/${backup_name}"

# 3. mysqldumpを実行してデータベースのバックアップを取ります。
mysqldump $options -h localhost $database_name > "${backup_dir}/${backup_name}/${backup_name}.sql"

# 4. パスワードによる暗号化を実施します。
password=$(openssl rand -base64 12)
cd "${backup_dir}/${backup_name}"
zip -r "${backup_dir}/${zip_file}" -P "$password" .
cd -

# 5. 一時的なバックアップディレクトリを削除します。
rm -rf "${backup_dir}/${backup_name}"

# 6. 解凍パスワードを指定ディレクトリに保存します。
echo $password > $password_file

# 7.パスワードの読み取り権限を600に変更します。
chmod 600 $password_file

# 8. 保持期間より古いバックアップファイルを削除します。
find "$backup_dir" -name "redmine_mysql.*.zip"  ! -type f -newermt "${keep_days} days ago" -delete
find "$password_dir" -name "*restore*.txt" ! -type f -newermt "${keep_days} days ago" -delete

## 処理ここまで

前回との修正点

  1. 変数と処理のセクションを明確化しています。
  2. アカウントファイルのパーミッションチェックを行い、400以外は処理を中止します。
  3. opensslで生成したパスワードで暗号化します。(このパスワードはランダムで生成されるので運用者は覚える必要がありません)
  4. 圧縮と同時に暗号化を行うので、gz形式からzip形式に変更しています。
  5. このパスワードを任意のディレクトリに転送します。
  • 実行権限の付与
chmod +x pw_mysql_daily_backup.sh

動作確認

cd 【スクリプトを格納したディレクトリ】 && pwd
bash pw_mysql_daily_backup.sh

以下を確認します。

  1. エラーなく実行できること
  2. バックアップ格納ディレクトリにredmine.sql.実行日付.zip形式でファイルが作成されること
  3. パスワードファイル格納ディレクトリにファイル名.実行日付.txt形式でファイルが作成されること
  4. unzip redmine.sql.実行日付.zipでファイル解凍時にパスワードを確認されること
  5. パスワードファイルで暗号化されたファイルを解凍することができること

Crontab設定

Cron登録

crontab -e

登録内容例

0 0 * * * /home/backup/mysql/pw_mysql_daily_backup.sh
# 実行時刻、頻度などは自分の運用形態に合わせます。
# また、既に平文でのバックアップスクリプトを設定している場合はコメントアウトして処理を外します。

Cron登録確認

sudo tail -20 /var/log/cron.log

操作時刻に

  • BEGIN EDIT
  • REPLACE
  • END EDIT

が表示されれば設定は完了です。

動作確認日

2023/02/18

特撮風背景。(特撮爆破アクリルスタンド感想)

ニュース記事を見て一目惚れした商品が届きました。

特撮爆破アクリルスタンド

この、特撮でよく見る爆破シーンを再現できるというアイテム。「これは万能感ある」と即座に注文。

作例

まずはアクリルスタンドと併せてみます。

爆炎と爆煙。これだけでもインパクト十分。

次はフィギュアの背景にします。

これまた爆破オチが漂う風景となりました。

1/7の立像との撮影

商品の高さは20cmほど。ソフビやねんどろいどなどには十分な高さであるものの、1/7以上の立像には高さが足りません。

そこで、背景をリフトアップして被写体をアップにします。

結果は上々です。今後の撮影シーンの選択肢が更に増えました。

ChatGPTによるスクリプト変換。(bash → Ruby)

ことのあらまし

手なりで作ったシェルスクリプトを発展させたり可読性を高めるために利用しているChatGPT。

考えを発展させて「スクリプトの変換はできるのではないか」と考えました。

元となったスクリプト

こちらにある

cat error.log | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { print  substr($0, RSTART, RLENGTH) }' | sort | uniq > /var/lib/redmine/log/suspicious_ip/suspicious_ip.`date +%Y%m%d`
  • error.logを読み込み
  • IPアドレスにマッチする正規表現を取り出し
  • ソートした上で重複を排除
  • 指定のディレクトリに書き出す

という一文のシェルスクリプトをRubyで動かすにはとChatGPTに質問しました。

出来上がったRubyスクリプト

require 'date'

## 変数指定ここから
# error.log の格納ディレクトリ
log_dir = '/path/to/log_dir'
# error.log の名前
log_file = 'error.log'
# 別ファイルの出力ディレクトリ
output_dir = '/path/to/output_dir'
# 重複を排除する場合は 1、しない場合は 0 を指定
remove_duplicates = 1
# 別ファイルの名前
output_file = 'output.txt'
# IPアドレスを抜き出すための正規表現パターン
ip_regex = /client (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/
# error.log ファイルのフルパス
log_path = File.join(log_dir, log_file)
## 変数指定ここまで

# error.log ファイルを開く
File.open(log_path) do |file|
  # IPアドレスのみを格納する配列
  ips = []

  # 各行をチェックする
  file.each_line do |line|
    # 正規表現パターンに一致するか確認する
    match = line.match(ip_regex)
    if match
      # 一致した場合、IPアドレスを配列に格納する
      ips << match[1]
    end
  end

  # 重複を排除する場合
  if remove_duplicates == 1
    ips.uniq!
  end

  # 昇順にソートする
  ips.sort!

  # 結果を出力するファイルのパス
  output_path = File.join(output_dir, "error_#{Date.today.strftime('%Y%m%d')}_#{output_file}")

  # 結果を出力する
  File.open(output_path, 'w') do |file|
    ips.each do |ip|
      file.puts ip
    end
  end
end

スクリプトは長くなりましたが、以下の利点があります。

  • 読み込むディレクトリや正規表現のパターンを変数化しているため、他のログにも転用可能
  • 重複を排除するかしないかを決められる

また、可読性も高くなっています。

何より、シェルスクリプトの動きをRubyで動かすための文法を学べるのも素晴らしく。

今後の作業の大きな力になります。

光る文字盤、照らす床面。-百均グッズの撮影用小物(その42)-

「百均」とは言えない価格だけあって、かなりの大物です。

LED ライトボックス

買ってみたのはこちらのライトボックス。「1,000円」だけあって、かなりの大きさです。

厚みのある板と透明プラ板の文字。隙間のスリットに差し込むことで、パッケージ絵にあるように文字を光らせることができるという仕掛け。

屋内撮影での検証

見た感じでは屋外での利用が想定されているよう。屋内でも同じことができないかと検証です。

わかっていたことですが、背面において光らせると逆光になります。それはそれで面白いのですが、別の可能性を見出しました。

すなわち:「これだけの面積を光らせることができる」特性です。

下からの光

試しに「光る床板」として使ってみたら、1/6サイズのフィギュアでも光が届くようになりました。ここに少し工夫。

クリアファイルを敷いた上で光らせると、その模様がほのかに光ります。

こういったクリアオブジェクトを於けば更に反射が増します。

これはかなり楽しめるグッズと言うか「ステージ」になります。

「檸檬」と「ローズ」。(丸善コラボLAMY 入手-3-)

このシリーズも揃ってきました。

今回入手した丸善コラボのLAMY。色はローズです。

この淡いのに目立つ色は視認性も抜群ですし、こういう撮影にも映えます。

  • 比較的入手しやすい価格
  • デザインに統一感があり
  • コラボや限定などの豊富なバリエーション
  • 勝手知ったる書き心地
  • スクリュー式でないためにさっと書ける

のはLAMYの強みです。

洗浄と、再詰め替え。(プレピー with コンバータ)

作業を実施した背景

とても安価なのに書き味がよく、コンバータと組み合わせることで様々なインクを入れることができる万年筆「プレピー」。

シールキャップによりインクの持ちが良かったのが(自分にとって)徒となりました。

インク、何を入れたのか問題

調子に乗って本数を増やし、その場のノリでインクを詰めていたので、いざ、インクを補充する時に

「これ、何色を詰めたっけ」

という疑問が湧き起こります。特に、青系のインクは似通っていたので更に迷いました。

解決策

そこで、ほとんどのプレピーのインクが尽きたタイミングを見計らって

  1. 全てのプレピーを分解洗浄し
  2. 乾燥し
  3. インクを再詰め替え
  4. その際にしっかりと記録を行う

でした。

作業開始に当たって

分解洗浄後、1週間ほど乾燥させるので作業忘れを懸念。そこで、Redmineでチケットを発行。早速の作業を開始です。

インクを抜きつつ水洗い

水を入れた容器に浸しつつ、インクを抜いては水をコンバータ内に入れて洗っていきます。定期的に水を交換し、インクの水色がなくなるまで繰り返します。

超音波洗浄

全てのパーツを分解。
更に超音波洗浄器に入れてこびりついたインクを抜きます。全部で9本あったのでここが一番時間がかかりました。

乾燥

入念に乾燥。ほぼ1週間をかけました。これで、ようやく準備が整います。

インクの再定義

同じ轍を踏まないように、以下、何を詰めたかの記録を行ってからインクを詰めます。

万年筆ボディインク色備考
プレピー黒(0.3mm)霧雨蜂のシール
プレピー黒(0.2mm)竹炭
プレピー黒(0.2mm)LAMY黒インクマステ
プレピー黄色(0.3mm)蛍火
プレピー紫(0.3mm)写楽黒茶
プレピー緑(0.3mm)竹林
プレピー赤(0.3mm)歌麿梅紫
プレピーピンク(0.3mm)秋桜
プレピー青(0.3mm)深海

こうしてできあがったのがこちら。

こういう洗浄は他にも定期的に行いたいものです。

また、こういう風にいくつかのステップがある作業をRedmineのチケットに残すことの重要さを改めて思い知りました。

https://atelier.reisalin.com/issues/13

Redmineの細かな用語を変更。(message_customizeプラグイン導入)

概要

細かな用語を変更してくれるプラグインを導入します。

プラグイン名

動作を確認した環境

Redmine 4.2

導入時

Gem追加:不要
DBマイグレーション:不要

手順

さっくりとした手順

  1. SSHログイン後、Redmineプラグインに移動
  2. gitでレポジトリをダウンロード
  3. Webサービス再起動

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

cd /home/www-data/redmine/plugins
# 自分の環境に合わせます。

プラグインを配置します。

sudo -u www-data git clone https://github.com/farend/redmine_message_customize

ls -ld redmine_message_customize
# このディレクトリがあることを確認します

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

sudo systemctl restart apache2

設定後の動作

  1. Redmineに管理者アカウントでログインします。
  2. 管理>メッセージのカスタマイズが表示されればインストールできています。

設定例

例として、additional_tagsプラグインに表示されている誤訳を変更しようと思います。

  1. Redmineに管理者アカウントでログインします。
  2. メッセージのカスタマイズをクリックします。

ここから、「金額」と入力します。

「label_amount_tags」を選択します。

「金額 tags」と表示されるので、「タグ総数」と変更してみます。

変更後に保存をクリックします。

保存後、該当箇所を表示します。

表示が変更されることを確認しました。

他の項目も同様に修正します。

動作確認日

2023/02/10

Redmineのファイル一式の日次バックアップ。(復旧方法込みのシェルスクリプト作成)

概要

Redmineのメンテナンスの中で重要となるDBのバックアップは記載しました。

ここでは、それ以外のファイル一式をバックアップするスクリプトを作成することで不測の事態に備えます。

バックアップ対象となるファイル群

基本的に、以下のファイル群が残っていれば復旧は(理論上)可能です。

  • /Redmine格納ディレクトリ/plugins配下一式
  • /Redmine格納ディレクトリ/files配下一式
  • /Redmine格納ディレクトリ/public/themes配下一式
  • /Redmine格納ディレクトリ/config/database.yml
  • /Redmine格納ディレクトリ/config/configuration.yml (メール設定などで設定している場合)
  • /Redmine格納ディレクトリ/config/additional_environment.rb (プラグインなどで追記している場合)

本記事で扱うこと

  1. 先に述べたバックアップ対象となるファイル群の定期バックアップを行うシェルスクリプトを作成します。
  2. バックアップ時、パスワードが書かれているコンフィグに関してはその箇所をマスクします。(これもスクリプトに組み込みます)
  3. 動作を確認し、cronに設定して日次でバックアップを行います。

動作を確認した環境

  • Ubuntu 20.04 LTS
  • Redmine 4.2

実施前提

  • 利用しているRedmine環境の容量を確認し、バックアップ先に十分な空き容量があることを確認してください。
  • 本スクリプトは「全てのデータを一時的なバックアップディレクトリにコピーした上で圧縮し、そのディレクトリは削除する」処理を取っています。その容量も加味してください。
  • バックアップ元(Redmine格納ディレクトリ)の所有者が全てRedmine実行ユーザ(通例はwww-data)となっていることを確認してください。
  • また、本記事において、Redmineの格納ディレクトリは/home/www-data/redmineと一般的な構成と異なっております。

確認した手順

  • Redmineが稼働しているUbuntuサーバのターミナル上での操作です。

さっくりとした手順

  1. バックアップディレクトリを作成します。
  2. バックアップスクリプトを作成します。(環境に合わせて修正します)
  3. crontabに登録します。

バックアップディレクトリ作成

sudo mkdir -p /home/backup/redmine
# 運用に合わせて指定ください

sudo chown -R www-data:www-data /home/backup/redmine
# Redmineディレクトリの所有者に設定します

cd /home/backup/redmine && pwd
# 指定したディレクトリに移動します

リストア方法のテキストファイル作成

バックアップから切り戻すとき、作業者はかなり焦るものです。そこで、簡単な手順をバックアップファイル一式に配置しておけばスムーズな復旧を行うことができます。

以下の内容を教義・信仰に沿ったエディタで作成します。(ここでは筆者が用いているテキスト内容です。必要に応じて修正してください)

  • テキスト内容
    • テキスト名:how_to_restore.md
    • テキストの所有者はスクリプトの実行者と同じ(またはroot)である必要があります。
    • 上記、設定したディレクトリと同じ場所に作成します。
# Redmine復旧方法

## 前提環境

- Ubuntu 20.04系サーバ
- MySQL 8.3以上
- Apache 2.4系
- Redmineの実行ユーザはデフォルトのwww-data

## 【リストア/移行方法】

### 移行先にRedmineを作成

1. 新たにRedmineサイトを立ち上げます。(移行元と移行先のバージョンは合わせます)
2. リストア先/移行先のdb名/dbユーザはバックアップ元と同じにします。
3. バックアップされたdatabase.ymlを /redmine/config/配下に上書きます。dbパスワードを設定してください。
4. この状態で、Redmineのデータマイグレーションまで行います。

### バックアップされたファイル一式の再配置

- files/ディレクトリ一式は /redmine/配下に上書きしてください。
- plugins/ディレクトリ一式は /redmine/配下に上書きしてください。
- themesディレクトリ一式は /redmine/public/配下に格納してください。
- configuration.yml : (あるなら)/redmine/config/配下に上書き。メールパスワードを設定してください。
- additional_environment.rb : (あるなら)/redmine/config/配下に上書きします。

※ それぞれのディレクトリ/ファイルの所有者を「www-data」にします。

sudo chown -R www-data:www-data /redmine格納ディレクトリ/
> 例 sudo chown -R www-data:www-data /var/lib/redmine

### プラグインのDBマイグレーション

1. redmineを配置したディレクトリに移動します。(例; cd /var/lib/redmine/
2. 以下のコマンドを発行して、プラグインのマイグレーションを行います。

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

### プラグインマイグレーション後のApache再起動

1. 以下を実施してWebサービスを再起動します。
sudo systemctl restart apache2.service

### DBのリストア

1. 別途、バックアップしたRedmineのsqlファイルを移行先サーバの任意のディレクトリに転送します。
2. 以下のコマンドを発行して、DBをリストアします。

mysql -u redmineのdbユーザ -p redmineのdb名 < バックアップしたsql
> 例  mysql -u redmine -p redmine < redmine_backup

### DBリストア後のApache再起動

1. 以下を実施してWebサービスを再起動します。

sudo systemctl restart apache2.service

### 動作確認

移行先(または復旧した)Redmineのホストにブラウザでアクセスし、バックアップした時の状態になっているかを確認します。

スクリプト作成

以下の内容を教義・信仰に沿ったエディタで作成します。

  • スクリプト内容
    • スクリプト名:redmine_daily_backup.sh
    • 実行ユーザ:Redmineの所有者 (通例はwww-dataです)、またはroot
#!/bin/bash

### ▼ここからはスクリプトの変数を定義します。""の記述は自身の環境に合わせて修正ください。▼ ###
# バックアップ先のディレクトリを指定します。
backup_dir="/home/backup/redmine"
# バックアップ元のRedmineが格納されているディレクトリを指定します。
redmine_dir="/home/www-data/redmine"
# ファイルに付与する日付/作業ディレクトリ名/バックアップファイル名を指定します。
current_date=$(date +%Y%m%d)
backup_name="redmine_backup_${current_date}"
zip_file="redmine_backup.${current_date}.zip"
# 保存する日数を指定します。(ここでは3日にします。)
retention_period=3
### ▲変数はここまでです▲ ###

# 一時的なバックアップディレクトリを作成します。
mkdir "${backup_dir}/${backup_name}"

# # Redmineのユーザデータ/プラグイン/テーマをバックアップディレクトリにコピーします。

cp -R "${redmine_dir}/plugins" "${backup_dir}/${backup_name}"
cp -R "${redmine_dir}/files" "${backup_dir}/${backup_name}"
cp -R "${redmine_dir}/public/themes" "${backup_dir}/${backup_name}"

# マイグレーション時に必要となるdatabase.ymlをコピーします。この時、パスワードが書かれている行をマスクします。
cp $redmine_dir/config/database.yml $backup_name
sed -i 's/password:.*/password: "type your db password"/' $backup_name/database.yml

# メール設定などでconfiguration.ymlを設定している場合、これもコピーします。(存在しない場合はコピーしません)
# 同様にパスワードが書かれていたらその行はマスクします。
if [ -f $redmine_dir/config/configuration.yml ]; then
  cp $redmine_dir/config/configuration.yml $backup_name
  sed -i 's/password:.*/password: "type your password"/' $backup_name/configuration.yml
fi

# プラグイン設定などでadditional_environment.rbを設定している場合、これもコピーします。(存在しない場合はコピーしません)
if [ -f $redmine_dir/config/additional_environment.rb ]; then
  cp $redmine_dir/config/additional_environment.rb $backup_name
fi

# スクリプトと同じディレクトリにあるhow_to_restore.txtをバックアップディレクトリに流し込みます。(存在しない場合はコピーしません)
if [ -f $backup_dir/how_to_restore.txt ]; then
  cp $backup_dir/how_to_restore.txt $backup_name/how_to_restore.md
fi

# バックアップディレクトリをzip形式で圧縮します。
cd "${backup_dir}"
zip -r "${zip_file}" "${backup_name}"

# 一時的なバックアップディレクトリを削除します。
rm -rf "${backup_dir}/${backup_name}"

# 上記retention_periodで指定した日数前のバックアップしたzipファイルを削除します。
find "${backup_dir}" -type f -name "redmine_backup.*.zip" -mtime +"${retention_period}" -delete
  • 実行権限の付与
chmod +x redmine_daily_backup.sh

動作確認

sudo -u www-data bash redmine_daily_backup.sh
# 管理者権限で実行する場合は sudo bash redmine_daily_backup.sh

以下を確認します。

  • エラーなく実行できること
  • redmine_backup.実行日付.zip形式でファイルが作成されること
  • sudo -u www-data unzip redmine_backup.実行日付.zipでファイルが解凍されディレクトリに移動できること
  • ymlファイルのパスワードが「type your (db) password」と本来のパスワードが上書きされていること
  • 設定したhow_to_restore.mdが回答したディレクトリの中にあり、参照できること

Crontab設定

Cron登録

sudo crontab -e -u www-data
# 管理者が実行する場合は sudo crontab -e -u root

登録内容例

5 0 * * * /home/backup/redmine/redmine_daily_backup.sh
# 実行時刻、頻度などは自分の運用形態に合わせます。

Cron登録確認

sudo tail -20 /var/log/cron.log

操作時刻に

  • BEGIN EDIT
  • REPLACE
  • END EDIT

が表示されれば設定は完了です。

動作確認日

2023/02/08

Page 86 of 246

Powered by WordPress & Theme by Anders Norén