古いALMiniumからの移行作業

やること

EC2上のCentOS6.10で稼働しているRedmine2.5.2(ALMinium)から、Lightsail上で稼働するRedmine5.1.1(bitnami_redmine)へ移行する
また、GitのリモートリポジトリをGitHubへ移行する

EC2からLightsailに切り替える

現状

  • EC2上に、CentOS6.10の仮想サーバ

  • ALMiniumを使用して、Redmine2.5.2が稼働

  • Gitのリモートリポジトリが存在し、Redmineと連携している

ゴール

  • Amazon Lightsail上で稼働するbitnami_redmineへ移行する

  • GitのリモートリポジトリをGitHubに移行する

補足

実行時出力について、見せられない部分は加工の上、可能な限り参考として載せておきます。

作業:Gitのリモートリポジトリ移行

リポジトリを読み取り専用に変更する。
切り替え作業をするのでpushしないよう通達を出しているが、念のため。

# bareリポジトリへ移動
cd /path/to/your/bare/repository

# 書き込み権限を削除
chmod -R a-w .

読み取り専用になったことを確認

  • git fetchしてみる ⇒ 成功

  • 適当なブランチを切って、pushしてみる ⇒ 失敗

移行用に、リポジトリをcloneする(実行時出力も参考として載せておく)

git clone https://???????/git/hoge.git
Cloning into 'hoge.git'...
remote: Counting objects: 415552, done.
remote: Compressing objects: 100% (83247/83247), done.
remote: Total 415552 (delta 331889), reused 411718 (delta 328923)
Receiving objects: 100% (415552/415552), 876.03 MiB | 9.71 MiB/s, done.
Resolving deltas: 100% (331889/331889), done.
Updating files: 100% (16353/16353), done.

本題からは外れるが、過去に誤って大きなファイルをcomitしてしまったことがあり、現状このリポジトリから分離したいサブディレクトリが存在したので、過去の履歴からこれを抹消する

# cloneしたリポジトリへ移動
cd hoge.git

# 履歴から特定サブディレクトリを抹消
git filter-repo --invert-path --path reomve/target/dirpath
Parsed 41871 commits
New history written in 19.17 seconds; now repacking/cleaning...
Repacking your repo and cleaning out old unneeded objects
HEAD is now at 3104ffc77a ※※※※※コミットメッセージ※※※※※
Enumerating objects: 414619, done.
Counting objects: 100% (414619/414619), done.
Delta compression using up to 8 threads
Compressing objects: 100% (82124/82124), done.
Writing objects: 100% (414619/414619), done.
Total 414619 (delta 329164), reused 414576 (delta 329122), pack-reused 0
Completely finished after 217.20 seconds.

masterブランチをmainブランチにリネーム

git branch master -m main

GitHub上で、移行先のリポジトリを作成し、リポジトリURLを取得する。

GitHubにてリポジトリ作成直後の画面

リモートリポジトリをGitHubのアドレスに変更

# git filter-repo を実行しているので、originの設定がすでに消えている
# git filter-repoを実行していない場合は、次の作業が追加で必要
# git remote remove origin

# GitHubのアドレスをoriginとして追加
git remote add origin https://github.com/?????/hoge.git

GitHubにpushする

# mainブランチのpushだけでよかったので以下を実行
git push origin -f main

開発で使用しているローカルブランチのリモートブランチをGitHubに切り替えて、問題ないことを確認する。
以下、懸念点

  • コミットしていない変更がローカルに大量にある

  • filtr-repoで除外したサブディレクトリが、ローカルには存在する

# ローカルの開発リポジトリに移動
cd /develop/local/repo/path

# 移行元リポジトリにおける最終状態を取得し反映しておく
git pull

# リモートURLをGitHubのアドレスに変更
git remote set-url origin https://github.com/?????/hoge.git

# 新しいoriginの情報を取得
git fetch origin
remote: Enumerating objects: 275479, done.
remote: Counting objects: 100% (3199/3199), done.
remote: Compressing objects: 100% (44/44), done.
remote: Total 275479 (delta 3156), reused 3169 (delta 3155), pack-reused 272280
Receiving objects: 100% (275479/275479), 269.01 MiB | 14.55 MiB/s, done.
Resolving deltas: 100% (218849/218849), completed with 930 local objects.
From https://github.com/?????/hoge.git
 * [new branch]            main       -> origin/main

# ローカルブランチmasterをmainにリネーム
git branch -m master main

# ローカルブランチmainが追従するリモートブランチをorigin/mainに変更
git branch -u origin/main
branch 'main' set up to track 'origin/main'.

pullしてみる
※filter-repoを実行していないリポジトリの場合、`Already up to date.`と出力され、この時点で完了となる。


git pull
Performing inexact rename detection: 100% (9524130/9524130), done.
Performing inexact rename detection: 100% (9325827/9325827), done.
完了Merge made by the 'ort' strategy.

filtr-repoで除外したサブディレクトリが再追加されたコミットができてしまった。

TortoiseGitのログ表示

ローカルのmainブランチをorigin/mainにリセットする。

git reset --mixed remotes/origin/main

無事に、新しいリポジトリの先頭に持ってこれた。

リセット後のログ

origin/HAEDが追従できていないので、修正する

git remote set-head origin main

無事、origin/HAEDも持ってこれた。

origin/HEAD修正後のログ

到達不可能な不要なブランチを一掃する

git fetch --prune origin
From https://github.com/?????/hoge.git
 - [deleted]               (none)     -> origin/dev
 - [deleted]               (none)     -> origin/dev251
 - [deleted]               (none)     -> origin/dev3681
 - [deleted]               (none)     -> origin/feature/fuga
 - [deleted]               (none)     -> origin/master

最後にもう一度pullして、問題ないことを確認

git pull
Already up to date.

おまけ
git gcを実行し、ローカルリポジトリを整理(7.21GB ⇒ 6.93GB)

git gc
Enumerating objects: 474715, done.
Counting objects: 100% (474715/474715), done.
Delta compression using up to 8 threads
Compressing objects: 100% (111703/111703), done.
Writing objects: 100% (474715/474715), done.
Total 474715 (delta 384476), reused 448947 (delta 359630), pack-reused 0
Enumerating cruft objects: 730, done.
Traversing cruft objects: 2202, done.
Counting objects: 100% (730/730), done.
Delta compression using up to 8 threads
Compressing objects: 100% (463/463), done.
Writing objects: 100% (730/730), done.
Total 730 (delta 438), reused 371 (delta 266), pack-reused 0

作業:移行元Redmineのバックアップ

移行元のRedmineの状態を確認しておく

移行元の情報画面

データベースのエクスポートする。
移行元のDB名は「alminium」であるが、移行先は「bitnami_redmine」となるので、その調整も行う。
DBパスワードがわからない場合、`alminium/config/database.yml`を参照すればわかるかもしれない。

# mysqlからデータをエクスポート
mysqldump -u alminium -p --databases alminium \
 --add-drop-database > /tmp/migrate/redmine.sql
Enter password: DBパスワードを入力

# データベース名を`bitnami_redmine`に置換する
sed -i 's/`alminium`/`bitnami_redmine`/g' /tmp/migrate/redmine.sql

添付ファイルをエクスポートする

cd /opt/alminium
tar czf /tmp/migrate/redmine_files.tar.gz files

# 今回pluginは移行しないことにしたので、以下は未実施
# tar czf /tmp/migrate/redmine_plugins.tar.gz plugins

作業:移行先のRedmineを用意

Amazon Lightsailを開き、「Create instance」を選択する

Amazon Lightsailのトップ画面

locationは、東京リージョン(ap-northeast-1a)を選択

OSは`Linux/Unix`、blueprintに`Redmine`を選択

その他、各項目を必要に応じて選択、変更し「Create Instance」をクリックすると、インスタンスの準備が始まる。(Pennding)

しばらく経ってから画面更新すると実行中に切り替わりました。
(日本語表示できることに気づいて、以降日本語表示に変わっています)

右上のコンソールっぽいオレンジのアイコンをクリックするとコンソールが開く

SSHクライアントを使用して、SSH接続もできる(説明割愛)

ドメインとIPを紐づけたいので静的IPの作成と設定をする


Route53にて静的IPにドメインを割り当てる(説明割愛)

設定したドメインをブラウザでアクセスすると新しいRedmineが開きます。

作業:Redmineの移行

公式の手順を参考に作業を行っていきます。
https://docs.bitnami.com/virtual-machine/apps/redmine/administration/upgrade/

新Redmineのコンソールに接続し、管理者IDとパスワードを確認する

abitnami@ip-172-26-5-87:~$ cat bitnami_credentials 
Welcome to the Bitnami package for Redmine

******************************************************************************
The default username and password is 'user' and '??????????'.
******************************************************************************

You can also use this password to access the databases and any other component the stack includes.

Please refer to https://docs.bitnami.com/ for more details.

SFTなどを使用して、移行元でエクスポートしたDBデータと、圧縮ファイルを転送する。
例では、`/home/bitnami/migrate`に転送

bitnami@ip-172-26-5-87:~$ cd migrate/
bitnami@ip-172-26-5-87:~/migrate$ ls -la
total 248912
drwxr-xr-x 2 bitnami bitnami      4096 Apr 20 05:05 .
drwxr-xr-x 4 bitnami bitnami      4096 Apr 20 05:05 ..
-rw-r--r-- 1 bitnami bitnami 176388724 Apr 20 03:13 redmine_files.tar.gz
-rw-r--r-- 1 bitnami bitnami  78484993 Apr 20 03:10 redmine.sql

Apacheの停止

bitnami@ip-172-26-5-87:~/migrate$ sudo /opt/bitnami/ctlscript.sh stop apache
Stopped apache

データベースのリストアを実行する
パスワードは上で取得したパスワードを使用する

mariadb -u root -p < /home/bitnami/migrate/redmine.sql
Enter password: 

データベース以外のデータ移行作業

# tmpへ移動
cd /tmp

# 移行元からもってきた添付ファイルのアーカイブを展開
sudo tar xvf ~/migrate/redmine_files.tar.gz

# オーナーを修正
sudo chown -R bitnami:daemon files

# ファイルを移動
sudo mv /tmp/files/* /bitnami/redmine/files/

# redmineディレクトリへ移動
cd /opt/bitnami/redmine

# 一時的に書き込み権限を付与
sudo chmod 666 log/production.log

# 公式では`sudo`を使用していないが、`sudo`無しだと最後にpermissionエラーが発生する
sudo bundle exec rake db:migrate RAILS_ENV=production
sudo bundle exec rake tmp:clear

# 権限を元に戻す
sudo chmod 644 log/production.log

文字コードを補正する
utf8(utf8mb3)から、uft8mb4に変更する。
※事前の練習時、これを実施していなかった為、後の作業でエラーとなってハマった。
コンバートは、https://zappy.hatenablog.jp/entry/2015/05/19/015044を参考にしました。

# コンバートスクリプト作成
(echo 'alter database `'"bitnami_redmine"'` default character set utf8mb4;'; mariadb -uroot -p bitnami_redmine -e "show tables" --batch --skip-column-names | xargs -I{} echo -e 'alter table `'{}'` ROW_FORMAT=DYNAMIC;\nalter table `'{}'` convert to character set utf8mb4;') > /tmp/convert_script
Enter password:

# コンバート実施
mariadb -u root -p bitnami_redmine < /tmp/convert_script

# 結果確認
bitnami@ip-172-26-5-87:/opt/bitnami/redmine$ echo 'show CREATE TABLE changesets;' | mariadb -u root -p bitnami_redmine
Enter password: 
Table   Create Table
changesets      CREATE TABLE `changesets` 
・・・
\n) ENGINE=InnoDB AUTO_INCREMENT=85369 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC

Apacheの再開

# 停止したApacheを再開
sudo /opt/bitnami/ctlscript.sh start apache

再度、ブラウザでアクセスするとデータの移行ができている。
(隠しすぎて分かりづらいですが、元の内容を表示できており、登録していたユーザーでログインできています)

以降直後のホーム画面

GitHubにリポジトリを移動した分をRedmineに反映
プロジェクトの設定を開き、リポジトリを選択する

移行元で設定していた状態となっているので、GitHubのリポジトリを参照できるように設定する
但し、直接GitHubにここから接続することはできず、Subversionを使用して回避する方法も2024年1月から使えなくなったため、cloneを行いbareリポジトリをサーバに作成して参照する

# bareリポジトリ作成用ディレクトリを作成
sudo mkdir -p /var/opt/git/

# 作成したディレクトリに移動
cd /var/opt/git

# bareリポジトリとしてクローンする
git clone --bare リポジトリアドレスなど

Redmineの画面に戻り、まず今残っている古い設定を「削除」をクリックして削除する

左上の「新しいリポジトリ」を選択し、上で作成したbareリポジトリを参照するように設定する

プロジェクトの「リポジトリ」をクリックすると、コミットとチケットの関連付けが実行され、しばらくすると画面が開く
(コミット数が多い場合、かなり時間がかかるが辛抱強く待つこと)
※文字コードの調整を行っていなかった場合、ここでエラーとなった。
 理由:コミットログに絵文字が使われていたため

リポジトリの内容が参照できている

作業:他実施した作業(手順省略)

  • 通知メールの設定を行う(Amazon SES)

  • 2要素認証必須化

  • プラグインを移行しなかったので、個別に必要なプラグインを追加

  • SSL設定(bitnami/bncert-tool)

移行完了後

移行完了後の情報画面はこんな感じ
(プラグイン追加前です)


この記事が気に入ったらサポートをしてみませんか?