Redmineプラグイン開発環境を作成する（MySQL）

Redmineのプラグインを保守するにあたって、ノートPCへRedmineの環境を作成しました。今までbitnamiのWindows用インストーラーを使って開発環境を作成してきたのですが、正直しんどくなってきました。
何度かLinuxのサーバーをVM上で作成して環境作ってみたものの、失敗に失敗を重ねて挫折したままでしたが、コロナの影響もあり勤務時間が多少短くなったのを機に、開発用環境づくりに再チャレンジしています。

当記事は、その時の手順を記録した、個人的な備忘記事です。今後何度かチャレンジして修正していくつもり。

ちなみに、私はlinuxをほとんど触ったことがない初心者。色々webで調べてもすべてが呪文のように見えてしまうレベルです。

## 今後この記事を修正したい点

* CentOSのインストール方法を詳細化
なんとなく上手くできただけっぽいので手順をちゃんと残しておきたい

* ファイアーウォールの設定とMySQLの設定
bitnamiのVMを使ってredmineをノートPCにインストールした際に、MySQLを外部アクセスできるようにできなかったため要勉強。

## 利用した環境、ツール

Windows10 home 64bit (AMD)
Oracle VM Virtualbox
CentOS8(CentOS-8.1.1911-x86_64-dvd1.iso)
Redmine4.1
Ruby2.7

## 参考にしたサイト

初期設定 : ファイアウォール
初期設定 : SELinux
https://www.server-world.info/query?os=CentOS_8&p=initial_conf&f=2

[CentOS] CentOS8.1を新規インストールしてRedmine4.1環境作成
https://vertys.net/centos-install-newly-and-create-redmine-environment/


## CentOS8のインストール
サーバーはOracle VM VirtualBoxを使って作りました。
最小構成で作成しています。これは難なくクリア。

## CentOS8の諸設定
上記のサイトを参考に、SELinuxの無効化、ファイアーウォールの無効化をしました。
開発目的で利用するため、かつ、MySQLをゲストからアクセスしていじりたかったので、設定が面倒そうなファイアーウォールを無効化しました。もう少し時間があったら、ちゃんと設定したい。

## CentOS8の最新化
Teratermでサーバーにrootでログイン

```
cd ..
yum update
```

## 開発用ツールのインストール
ここからは参考にしたサイトと同じ手順で実施。

```
dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf -y groupinstall "Development Tools"
dnf -y install openssl-devel readline-devel zlib-devel curl-devel libffi-devel
```
## Subversionのインストール
Redmineをインストールする際にSubversionを使うため。

```
dnf module -y install subversion
```

## MySQLのインストール

```
dnf -y install @mysql:8.0 mysql-devel
```

## Apacheのインストール
```
dnf -y install httpd httpd-devel
```

## Rubyのインストール
このパートは結構時間がかかりました。

```
curl -O https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.gz
tar xvf ruby-2.7.0.tar.gz
cd ruby-2.7.0
./configure --disable-install-doc
make
make install
```

インストール後の確認

```
ruby -v
```
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux]
と出ればOK

## Bundllerのインストール

```
gem install bundler
```

## MySQLの設定

```
systemctl enable mysqld
systemctl start mysqld
mysql_secure_installation
```

聞かれた質問には以下のように回答していく

```
Press y|Y for Yes, any other key for No: y
※VALIDATE PASSWORDを変更するのでy

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
※開発で使いたいだけなのでLOW

New password:（設定したいパスワードを入力）
Re-enter new password:（設定したいパスワードを再入力）

Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
※設定したパスワードで続行するのでy

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
※匿名ユーザーは不要なのでy

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
※rootでリモートログインはしないのでy

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
※テスト用のデータベースは不要なのでy

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
※ここまでの設定を反映させたいのでy
```

## Redmine用MySQLのユーザー作成と権限付与

MySQLにログインしてみます。上記で設定したPASSWORDを入力になります

```
mysql -u root -p
```

redmineが利用するユーザーを作成します。ここで設定したパスワードは後のどRedmineの設定で使います。

```
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'DBのパスワード';
```

権限を付けます。このユーザーがアクセスするのは仮想サーバー内からだけ。外部からアクセスするためのユーザーは後で作成します。

```
GRANT ALL ON *.* TO 'redmine'@'localhost' WITH GRANT OPTION;
```

```
FLUSH PRIVILEGES;
CREATE DATABASE redmine CHARACTER SET utf8mb4;
exit
```

## Redmineのインストール
SubversionのレポジトリからRedmineを取得する。

```
cd /var/lib
mkdir redmine
svn co https://svn.redmine.org/redmine/branches/4.1-stable /var/lib/redmine
```

RedmineのDBアクセスの設定ファイルを作成する

```
vi /var/lib/redmine/config/database.yml
```

以下の内容を追記

```
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: "DBのパスワード"
  encoding: utf8mb4
```

依存パッケージのインストール

```
cd /var/lib/redmine
bundle install --without development test --path vendor/bundle
```

## Redmine関連の初期設定

```
bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate
```

MigrationしたときにWarningが結構な数出たが先に進む。

## Passengerのインストール

```
gem install passenger -v 5.1.12
passenger-install-apache2-module --auto --languages ruby
```

## Apacheの設定

Redmine用のApche設定に必要な情報を以下のコマンドで表示させる

```
passenger-install-apache2-module --snippet
```

設定ファイルの作成

```
vi /etc/httpd/conf.d/redmine.conf
```

スニペットでの内容とともに以下の記述を追記

```
Alias /redmine /var/lib/redmine/public

<Location /redmine>
  PassengerBaseURI /redmine
  PassengerAppRoot /var/lib/redmine
</Location>

<Directory "/var/lib/redmine/public">
  Require all granted
</Directory>

LoadModule passenger_module /usr/local/lib/ruby/gems/2.7.0/gems/passenger-5.1.12/buildout/apache2/mod_passenger.so

<IfModule mod_passenger.c>
  PassengerRoot /usr/local/lib/ruby/gems/2.7.0/gems/passenger-5.1.12
  PassengerDefaultRuby /usr/local/bin/ruby
</IfModule>
```

```
systemctl enable httpd
systemctl start httpd
```

所有者apacheへ変えておく

```
chown -R apache:apache /var/lib/redmine
```

## Redmineの確認

http://（サーバのIPアドレス）/redmine

で画面が表示されるか確認。

ユーザー：admin
pass：admin

ログイン後は好きなように設定変更


## 開発しているプラグインの導入

開発しているプラグインを導入する。migrationをする際にwarningがいっぱい出る。

```
cd /var/lib/redmine/plugins
git clone https://github.com/momibun926/redmine_issue_evm /var/lib/redmine/plugins/redmine_issue_evm
bundle install
rake redmine:plugins:migrate NAME=redmine_issue_evm RAILS_ENV=production
chown -R apache:apache /var/lib/redmine
```

## Gitの設定
コミットした時のユーザーが、OSのログインユーザーになってしまうため、Gitの設定をしておく。

```
git config --global user.email e-mailアドレス
git config --global user.name "ユーザー名"
```

## MySQLを外部からアクセスできるようにする
プラグイン作成時にDBの値をいじりながら挙動を確認したいことがあるので、MySQLにホスト側（Window10）から接続したい。使っているツールはA5MK2です。

MYSQLにrootで入ります。

```
mysql -u root -p
```

外部アクセス用のユーザーを作成。本来は%のところをノートPCのIPで指定したほうが良いのだと思う。

```
CREATE USER 外部接続ユーザー IDENTIFIED BY '外部接続ユーザーのためのパスワード';
grant all privileges on *.* to 外部接続ユーザー@'%';
```

これで、ホスト側から外部接続のユーザー、パスワード使ってアクセスが可能になる。
ファイアーウォールを使っている場合は、別途ファイアーウォールの設定も必要。

## Visual studio codeでリモート接続

ssh接続用の設定に以下のようなエントリを追加して接続

```
Host Redmine4.1-CentOS8(MySql)
    HostName CentOSのIP
    Port 22
    User アクセスするユーザー
```

## Redmineの再起動
開発しているときは度々Redmineを再起動する必要が出てくるので以下コマンドをVisualStudioCodeのターミナルで入力してブラウザをリロードすると再起動する。

```
touch /var/lib/redmine/tmp/restart.txt
```

これで、コーディング、確認を繰り返しながら開発できる。
本来ならば、テストコード書きながらテスト実行が良いのですが、Redmineのプラグインならこの繰り返しで何とかなりそう。
ただし、テストコードがないとリファクタリングや機能の改善後のデグレテストが非常に大変。railsのチューとリアルでもやっておけばよかったと今更後悔している。そのうちテストコードが書けるようになったら、テストコードの記事も書きたい。