HerokuでRedMica2.0を構築する

# はじめに

本記事は、[Redmine Advent Calendar 2021](https://adventar.org/calendars/6283)の12/2の記事です。
Qiitaには過去にRedmine2.5やRedmine3.0系をHerokuで構築する記事がありましたが、どうせならRedMica2.0を使ってみたいので、過去記事を参考に試行錯誤した結果、動作するようになりましたので紹介させていただきます。

### Herokuとは

セールスフォース・ドットコムが開発と運営を行っているPaaS（Platform as a Service）です。詳細はいろいろなところで紹介されていますので割愛いたします。

### RedMicaとは

ファーエンド・テクノロジー（株）が提供しているRedmine互換のOSSです。RedMica2.0はRedmine4.2.3をベースにして今後のRedmineに取り込まれる予定の機能を先行提供されています。（Redmineの機能を先取りしてリリースされているそうです）

https://www.redmica.jp/

# 前提条件
Windows10のPCを構築用に使います。（その他の環境でも同様のことはできるはずとおもいますが試してません。）

# 事前準備

#### Herokuにユーザ登録・Heroku CLIのインストール

詳細は割愛します。以下のBLOGなどを参照してユーザ登録、Heroku CLIのインストールを済ませておいてください。

https://tech-blog.rakus.co.jp/entry/20200813/heroku

#### その他の構築PC側準備
* git clientがインストールされていること。まだの方は[こちら](https://git-scm.com/downloads)からインストールしてください。
* PostgreSQLがインストールされていること。Herokuで現時点でサポートされているPostgreSQLの最新バージョンは12ですので、構築用PCにも12の最新版をインストールします。まだの方は[こちら](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads)からインストールしてください。（構築用PCでbundle installする際に、pg_config.exeというプログラムが必要で、そのためだけにインストールしています。実際に構築用PCでPostgreSQLサーバを動かすわけではありません）
* Ruby+devkitがインストールされていること。まだの方は[こちら](https://rubyinstaller.org/downloads/)からインストールしてください。
* （任意）作業をするのにVS Codeがあると便利です。インストールする方は[こちら](https://code.visualstudio.com/)から。詳細は割愛させていただきます。

# 構築手順
## RedMicaのソースをgit cloneする

Heroku用アプリケーションを作成するフォルダを任意の場所に作成し、git bashでそのディレクトリに移動します。そこで、以下のコマンドでgit cloneします。cloneしたら、そのディレクトリに移動します。クローンするフォルダ名は任意です。（後でHerokuにアップする時のアプリケーション名と合わせた方がわかりやすいでしょう）

```
$ git clone https://github.com/redmica/redmica.git redmica2
$ cd redmica2
```

ちなみにここでオリジナルのRedmineのリポジトリ`https://github.com/redmine/redmine.git`をクローンすればRedMicaではなくRedmineになります

## cloneしたファイルの編集
### .gitignoreの編集
#### .gitignoreから以下の行頭に#を追加してコメント化
```
/config/configuration.yml
/config/email.yml
/config/initializers/session_store.rb
/config/initializers/secret_token.rb
/public/plugin_assets
/Gemfile.lock
/Gemfile.local
```
#### .gitignoreに以下を追加する
```
/vendor/bundle
```
### Gemfileの編集
参考記事には、Gemfileにrubyのバージョンを2.2に指定する記述がありますがここでは実施しません。（もともと`ruby '>= 2.5.0', '< 3.1.0'`と指定されています）
#### Gemfileから以下の部分を削除する
```ruby:
# Include database gems for the adapters found in the database
# configuration file
require 'erb'
require 'yaml'
database_file = File.join(File.dirname(__FILE__), "config/database.yml")
if File.exist?(database_file)
  yaml_config = ERB.new(IO.read(database_file)).result
  database_config = YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(yaml_config) : YAML.load(yaml_config)
  adapters = database_config.values.map {|c| c['adapter']}.compact.uniq
  if adapters.any?
    adapters.each do |adapter|
      case adapter
      when 'mysql2'
        gem "mysql2", "~> 0.5.0", :platforms => [:mri, :mingw, :x64_mingw]
      when /postgresql/
        gem "pg", "~> 1.2.2", :platforms => [:mri, :mingw, :x64_mingw]
      when /sqlite3/
        gem "sqlite3", "~> 1.4.0", :platforms => [:mri, :mingw, :x64_mingw]
      when /sqlserver/
        gem "tiny_tds", "~> 2.1.2", :platforms => [:mri, :mingw, :x64_mingw]
        gem "activerecord-sqlserver-adapter", "~> 6.1.0", :platforms => [:mri, :mingw, :x64_mingw]
      else
        warn("Unknown database adapter `#{adapter}` found in config/database.yml, use Gemfile.local to load your own database gems")
      end
    end
  else
    warn("No adapter found in config/database.yml, please configure it first")
  end
else
  warn("Please configure your config/database.yml first")
end
```
#### 削除した部分に以下を追加する
```ruby
group :production do
  gem "pg", ">= 0.11.0", :platforms => [:mri, :mingw, :x64_mingw]
  gem 'rails_12factor'
  gem "activerecord-jdbcpostgresql-adapter", :platforms => :jruby
  gem 'rexml', '~> 3.2', '>= 3.2.4'
  gem 'puma'
end
```
### config/application.rbを編集する

`# require 'sprockets/railtie'`の行頭の#を消してコメントアウトを解除します

```
require 'sprockets/railtie'
```

また、以下を追加します。私はconfig.log_levelを設定しているところの下に追加しました。

```ruby
config.assets.initialize_on_precompile = false
```

### app/assets/config/manifest.jsを作成する

app/assets/configフォルダを作成します。その下に、manifest.jsというファイルを以下の内容で作成します。

```javascript:manifest.js
  //= link_tree ../../../public/images
  //= link_directory ../../../public/javascripts .js
  //= link_directory ../../../public/stylesheets .css
```

## Gemをインストール

### bundleのオプション設定

以下のコマンドを投入します。
（先にインストールしたPostgreSQLで、pg_config.exeというファイルが`C:\Program Files\PostgreSQL\12\bin\`にある想定です。パスが違う場合は適宜読み替えてください。）

```
$ bundle config set --local path 'vendor/bundle' 
$ bundle config set --local without 'development test rmagick' 
$ bundle config set --local build__pg "--with-pg-config='C:\Program Files\PostgreSQL\12\bin\pg_config.exe'"
```

### bundle install実行

bundle installを実行します。

```
$ bundle install
```

## ローカルのgitリポジトリにコミット

以下ではコメントを`Redmica for Heroku`としていますが、コメントは編集した内容に合わせて変更してください。

```
$ git add .
$ git commit -am "Redmica for Heroku"
```

## heroku側の作業
### herokuにログイン

以下のコマンドをうつと、ブラウザが起動し、二要素認証後にログイン完了します。

```
$ heroku login
```

### herokuアプリケーションを作成

`<app_name>`はユニークなアプリケーション名である必要があります。ここで作成したアプリケーション名は、後々使うURLの一部になりますので、わかりやすい名前をつけましょう。（私は`redmica2`にしました）

```
$ heroku create <app_name>
```

### herokuアプリケーションにPostgreSQLのアドオンを追加

```
$ heroku addons:add heroku-postgresql
```

### herokuにpush（アップロード）

```
$ git push heroku master
```

### herokuでDBのマイグレーションを実施

```
$ heroku run rake db:migrate RAILS_ENV=production
```

### herokuでDBの初期データを読み込み

```
$ heroku run rake redmine:load_default_data RAILS_ENV=production
```
`Select language: ar, az, bg,...`のように言語を選択するように表示されます。単にリターンを入力すると`en`（英語）になりますので、`ja`（日本語）を入力します。

## 動作確認

ブラウザから動作を確認してみましょう。Herokuアプリケーションを作るときに指定した`<app_name>`によって、`https://<app_name>.herokuapp.com`にアクセスするとRedMicaの初期画面が起動します。
admin/adminでログインするとパスワード変更画面になるので管理者用パスワードを入力してください。
これでHerokuサービス上でRedMicaを起動することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138759/89d729d5-f4f5-7c0b-3f80-251496a09bd9.png)

# 留意事項

ここまでの手順で、まずはRedMicaをHerokuで立ち上げているだけです。以下のような制約にご留意ください。

* メールサーバの設定を行っていないので、メール通知をすることはできません。
* ファイルの添付は、一見問題なく動作しますが、永続化の設定をしていないので、HerokuのDynoが再起動されるとなくなってしまいます。（HerokuのWeb Dynoは１日に1回は再起動されるそうです）
* リポジトリの設定を行っていないので、リポジトリは使えません。
* その他、全機能を確認したわけではないので、動かない機能があるかもしれません。

# 参考記事

https://qiita.com/ex_SOUL/items/b39fc001efb268be3084

https://qiita.com/KazuyaHara/items/27818ad3e7285cfefde1