今度は Redmine を Docker Compose で Raspberry に入れてみた

# はじめに

この記事は、過去に投稿した 2 つの記事をあわせたような内容です。

* [Redmine を Docker で Raspberry に入れてみた](https://qiita.com/juno-nishizaki/items/3a73cf3b6d8217bf707f)
* [Docker Compose を使って自分好みの Redmine 実行環境を作ってみた](https://qiita.com/juno-nishizaki/items/45ff4186feb75d512306)

ざっくり言うと、 [前回作成した docker-compose.yml など](https://github.com/juno-nishizaki/myfav-redmine) を Raspberry Pi Zero W で動くようにごにょごにょするという内容です。

# 本題

ということで、実際に試した結果を記します。

## 前準備

今回は Raspberry Pi Zero W に Raspbian Buster Lite をインストールしました。
（前回は NOOBS を使って Raspbian Stretch Lite をインストールしました）
その後、Docker と Docker Compose をインストールしました。

ここまでの手順は、以下の記事を参考にさせていただきました。執筆者の @KEINOS さまに感謝です！

* [ヘッドレス RaspberryPi Zero W のブートディスク作成（Wi-Fi 設定済み SSH 有効済み）](https://qiita.com/KEINOS/items/43394e4bd3c8fcfb5ee8)
* [ラズパイ Zero W（ARM v6l）Buster Lite に Docker と docker-compose をインストールする手順【2019/09/29 版】](https://qiita.com/KEINOS/items/1ce933a89706d81ebfa3)

## 動作確認したバージョン

Docker と Docker Compose のバージョンはそれぞれ以下のとおりです。

* Docker: 19.03.8
* Docker Compose: 1.21.0

## Dockerfile などを変更

Raspberry Pi Zero W は ARMv6 アーキテクチャです。コンテナイメージのアーキテクチャをあわせる必要があります。

今回もファイル一式を [GitHub](https://github.com/juno-nishizaki/myfav-redmine-raspi-zerow) で公開しています。ディレクトリ構成や細かい内容はそちらで確認してください。


### Redmine の Dockerfile

Redmine は arm32v6 のイメージがないので [arm32v5 のイメージ](https://hub.docker.com/r/arm32v5/redmine/) を使います。Passenger 版もないので、WEBrick 版を使います。

```Dockerfile:redmine/Dockerfile
FROM arm32v5/redmine:4.1

COPY config/configuration.yml config

RUN set -eux; \
        \
        apt-get update && apt-get install -y --no-install-recommends \
                antiword \
                catdoc \
                catdvi \
                djview \
                djview3 \
                gcc \
                gzip \
                libemail-outlook-message-perl \
                libwpd-tools \
                libwps-tools \
                libxapian-dev \
                make \
                poppler-utils \
                ruby-xapian \
                uuid \
                uuid-dev \
                unrtf \
                unzip \
                xapian-omega \
                xpdf \
                xz-utils \
        ; \
        \
# install plugins
        gosu redmine git clone --depth 1 https://github.com/akiko-pusu/redmine_banner.git plugins/redmine_banner; \
        gosu redmine git clone --depth 1 https://github.com/akiko-pusu/redmine_issue_badge.git plugins/redmine_issue_badge; \
        gosu redmine git clone --depth 1 https://github.com/akiko-pusu/redmine_issue_templates.git  plugins/redmine_issue_templates; \ 
#        gosu redmine git clone --depth 1 https://github.com/clear-code/redmine_full_text_search.git plugins/full_text_search; \        
        gosu redmine git clone --depth 1 https://github.com/danmunn/redmine_dmsf.git plugins/redmine_dmsf; \
        gosu redmine git clone --depth 1 https://github.com/jbbarth/redmine_base_deface.git plugins/redmine_base_deface; \
        gosu redmine git clone --depth 1 https://github.com/jbbarth/redmine_drafts.git plugins/redmine_drafts; \
        gosu redmine git clone --depth 1 https://github.com/onozaty/redmine-view-customize.git plugins/view_customize; \
        \
# install themes
        gosu redmine git clone -b redmine4.1 --depth 1 https://github.com/farend/redmine_theme_farend_bleuclair.git public/themes/bleuclair; \
        \
# install gems
        gosu redmine bundle install;
```

redmine_full_text_search をコメントアウトしていますが、それは後ほど…

### PostgreSQL の Dockerfile…？

PostgreSQL は [arm32v6 のイメージ](https://hub.docker.com/r/arm32v6/postgres/) があるのですが Alpine 版だけのようです。PGroonga をインストールするとしたら Alpine は避けたいなあと思って、 [arm32v5 のイメージ](https://hub.docker.com/r/arm32v5/postgres/)  の Debian 版を使おうとしたのですが…なんということでしょう、PGroonga のインストールに失敗します。

原因調査する気力がなかったので、今回は redmine_full_text_search をあきらめました…そもそも Raspberry Pi Zero W 上の Redmine をそこまで使い込むのかってのもあるので。というわけで、今回は Dockerfile 自体が不要となりました。

今後、 Raspberry Pi 4 を入手したときにでも arm64v8 でリベンジしてみようと思います。

### docker-compose.yml

結局、docker-compose.yml は下記のようになりました。

* Docker Compose のバージョンがやや古いので version は 3 にしました
* Nginx を挟むのも面倒だったのでホスト側ポート 80 番に直接バインドしました
* PostgreSQL は arm32v6 の Alpine 版をそのまま使うことにしました

```yml:docker-compose.yml
version: "3"

services:

  redmine:
    build: ./redmine
    container_name: myfav-redmine
    restart: always
    depends_on:
      - db
    ports:
      - "80:3000"
    environment:
      TZ: Asia/Tokyo
      REDMINE_DB_POSTGRES: db
      REDMINE_DB_DATABASE: redminedb
      REDMINE_DB_USERNAME: redmineuser
      REDMINE_DB_PASSWORD: redminepassword
      REDMINE_PLUGINS_MIGRATE: "true"
    volumes:
      - "/srv/redmine/files:/usr/src/redmine/files:z"
      - "/var/log/redmine:/usr/src/redmine/log:z"

  db:
    image: arm32v6/postgres:12-alpine
    container_name: myfav-redmine-db
    restart: always
    environment:
      TZ: Asia/Tokyo
      POSTGRES_DB: redminedb
      POSTGRES_USER: redmineuser
      POSTGRES_PASSWORD: redminepassword
    volumes:
      - "dbdata:/var/lib/postgresql/data"

volumes:
  dbdata:
```

## ビルドから起動まで

さて、準備が整ったのでさあビルドしてみるか、と `docker-compose build` を叩いてみたところ…めっちゃ遅い！超時間かかる！！（そりゃあ当たり前なのですが…） ビルドが終わって `docker-compose up -d` で起動させるのにもめっちゃ時間かかります。

どちらも時間を測っておらず別のことしていたので、結局どのくらい時間がかかったのかわからないのですが、よほど暇を持て余してない限りは黒い画面とにらめっこするのだけはお勧めしません。

## 起動して Redmine にアクセスしてみると…

前回、素の Redmine を動かしたときはそこそこ軽快に動いてくれていましたが、果たしてどうなるか…という心配をよそに今回もそれなりに動いてくれました。

![アタイのまいんちゃん](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295482/e3ea959f-4351-71b5-63fe-227ba34ca8f9.png)


さすがにキビキビとまではいかないですが、それでも許容できる範囲だと思います。 `htop` でリソース使用状況を眺めながら操作してみましたが、そこまでカツカツでもなさそうです。（ちょっと驚きました）

![htop のキャプチャ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295482/ae6c6ebc-9b37-4666-b3cf-d0fab376c321.png)


これなら、前回は割と冗談ぽく言ってた「日々の電気代などランニングコストを抑えつつ、機微な情報をインターネットに晒す危険もない Redmine 環境」の実現ができたと言っても過言ではないかもしれません。もう少し手を加えたらバックアップも簡単に取れる（定期的に pg_dump を実行しておき、データベースのダンプと添付ファイルを別 PC に吸い上げておく、など）ので、万一の場合にも安心できると思っています。

# おわりに

前回からおよそ 1 年越しになっちゃいましたが、ようやくやりたかったことが部分的に実現できました。

近頃は世界中が危機的状況に陥っている中で、リモートワークなどを急ピッチで進めないといけない組織も多くなってきているのではないかと思いますが、そのような状況下において本記事で紹介したような安価で手軽に構築できる Redmine 環境がどなたかのお役に立てれば幸いです。