Ubuntu 22.04 (Raspberry Pi 4 上) に Redmine 4.2 を構築した手順

## この記事を書くに至った背景

* 業務PC上の仮想マシン(Ubuntu 20.04)にインストールした Remine 4.2 を Raspberry Pi 4 に移したい
    * PoC としてインストールしたが、PCを持ち運ぶと接続できなくなる…
    * DBのデータをそのまま移したいので、同じDB、Redmine を利用したい
* 慣れてる Ubuntu を利用したい(苦労の始まり)
    * 折角なら LTS がいい
    * Ubuntu 20.04 LTS は Raspberry Pi だといくつか問題があったのでパス
    * Ubuntu 22.04 LTS には OpenSSL 3系がインストールされているが、Redmine 4.2 が対応する Ruby 2.7系 のインストールには OpenSSL 1.1系が必要
        * OpenSSL をアンインストールしても良いものかわからなかった(無知)
        * RVM で強引に Ruby 2.7.2 をインストールしても、会社のプロキシに弾かれて bundle が上手く動作しない
    * 色々諦めて Podman を使ってコンテナで Redmine 4.2 を構築
        * Docker は会社の規模的に利用できない…
            * 製造業は IT エンジニア・予算が限られているのでそこらへんも考慮してほしいところ。。。
        * 今回初めてコンテナを利用…
            * きっと「そうじゃない」というところがいくつもあると予想
                * 可能であれば、ご指導ご鞭撻などよろしくお願いします
* 「これをなぞれば実装できる」という情報が見つからず、かなり苦戦したので Qiita にまとめることに
    * 誰かの役に立てば幸いです

## 今回の構成

* 環境
    * マシン: Raspberry Pi 4
        * RAM: 8GB
        * ストレージ: 256GB SSD (USBブート)
    * OS: Ubuntu 22.04 LTS
    * Redmine 4.2
    * PostgreSQL 12.9

ARMじゃないCPUでも役に立つんじゃないかと思います(未検証)

## 設定手順

Ubuntu 22.04 LTS はインストールされ、sudo 権限をもつユーザーでログインし、プロキシなどを通して apt ができている状態の前提で進めます。

### 1. Podman インストール ～ イメージの取得

1. Podman のインストール
   
   ```
   $ sudo apt install podman -y
   ```

2. /etc/containers/registries.conf の編集
   
   ```
   $ sudo nano /etc/containers/registries.conf
   ```
   
   以下 ``-`` 行を削除し、 ``+`` 行を追加

   ```
   - # unqualified-search-registries = ["example.com"]
   + unqualified-search-registries = ['docker.io']
   ```

4. イメージの pull
   
   ```
   $ podman pull redmine:4.2
   $ podman pull postgres:12.9
   ```
   
   * pull の成否は ``$ podman images`` で確認できる

### 3. pod・コンテナの作成

1. Pod の作成
   
   ```
   $ podman pod create -p 3000:3000,5432:5432 --name redmine-pod
   ```

2. DB のコンテナを作成
   
   ```
   $ podman run -d \
   --name=db-redmine --pod redmine-pod \
   -e POSTGRES_USER="redmine" \
   -e POSTGRES_PASSWORD="{Password}" \
   -e POSTGRES_DB="redmine" \
   -e LANG="en_US.UTF-8" \
   -e LANGUAGE="en_US.UTF-8" \
   -e LC_ALL="en_US.UTF-8" \
   -v /var/lib/postgresql/data postgres:12.9
   ```
   
   * もし「5432ポートは利用中」という旨のエラーが出た場合は、OSで既に PostgreSQL デーモンが起動している可能性がある。OS側の PostgreSQL を停止するか、 pod ・コンテナのポート番号を変更するかのどちらかで対応できる。
   
   * デフォルトだとロケールが POSIX になってしまうため UTF-8 を設定
   
   * ただし ja_JP を直接指定するとエラーになるので en_US を指定

3. DB のコンテナを設定
   
   1. DB のコンテナの bash を起動
      
      ```
      $ podman exec -it db-redmine bash
      ```
   
   2. ja_JP.UTF-8ロケール作成
      
      PostgreSQLで日本語を正しく扱う(`lc_collate`と`lc_ctype`に `ja_JP.UTF-8` を設定する)ために必要
      
      1. ロケールの作成
         
         ```
         # localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
         ```
      
      2. ロケールの設定
         
         ```
         # echo "export LANG=ja_JP.utf8" >> ~/.bashrc
         # echo "export LANGUAGE=ja_JP.utf8" >> ~/.bashrc
         # echo "export LC_ALL=ja_JP.utf8" >> ~/.bashrc
         # source ~/.bashrc
         ```
         
         次のようなエラーが発生するが無視
         
         ```
         bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.utf8): No such file or directory
         ```
      
      3. ロケール追加の確認
         
         ```
         # locale
         ```
         
         次のような結果になるはず
         
         ```
         LANG=ja_JP.utf8
         LANGUAGE=ja_JP.utf8
         LC_CTYPE="ja_JP.utf8"
         LC_NUMERIC="ja_JP.utf8"
         LC_TIME="ja_JP.utf8"
         LC_COLLATE="ja_JP.utf8"
         LC_MONETARY="ja_JP.utf8"
         LC_MESSAGES="ja_JP.utf8"
         LC_PAPER="ja_JP.utf8"
         LC_NAME="ja_JP.utf8"
         LC_ADDRESS="ja_JP.utf8"
         LC_TELEPHONE="ja_JP.utf8"
         LC_MEASUREMENT="ja_JP.utf8"
         LC_IDENTIFICATION="ja_JP.utf8"
         LC_ALL=ja_JP.utf8
         ```
      
      4. DB コンテナの bash を閉じる
         
         ```
         # exit
         ```

4. Redmine のコンテナを作成
   
   ```
   $ podman run --name=redmine -d --pod redmine-pod \
   -e REDMINE_DB_POSTGRES="127.0.0.1" \
   -e REDMINE_DB_USERNAME="redmine" \
   -e REDMINE_DB_PASSWORD="{Password}" redmine:4.2
   ```

5. redmine にアクセスし、Redmine が日本語で動作しているか確認

## 所感

* コンテナを使って構築すると、直接 OS 上に構築するよりも何倍も早くインストールできることがわかった
    * snap を使えるアプリであればより素早く構築できるが、バージョンの固定ができないなどの問題がある
    * コンテナの便利さの一部を体感することができ、初めてコンテナを触った感触としては上々の経験ができた