Redmine を Docker で Raspberry に入れてみた

この記事は [redmine.tokyo 第16回勉強会](https://redmine.tokyo/projects/shinared/wiki/%E7%AC%AC16%E5%9B%9E%E5%8B%89%E5%BC%B7%E4%BC%9A) の LT で発表した内容を元に書いています。
（LT で喋っていない内容や、振り返って感じたことも含んでいます）

なんで今更？と思われるかもしれませんが、書きかけの記事を下書きに置いてたのをすっかり忘れていました…どうやら写真のアップロードをする途中で力尽きてたようです。
本日、 [redmine.tokyo 第17回勉強会](https://redmine.tokyo/projects/shinared/wiki/%E7%AC%AC17%E5%9B%9E%E5%8B%89%E5%BC%B7%E4%BC%9A) が開催され、その熱気に感動したので、勇気を振り絞って投稿してみようかなと思った次第です。

# 雑な導入部

皆さんは、プロジェクト管理ツールの Redmine を使っていますでしょうか？ 使っているうちにその便利さの虜になって、ビジネス用途だけでなくプライベートでも活用されている方もいらっしゃると思います。
しかし、インターネット上で、たとえばホスティングサービスなどで Redmine を立てて運用していて、うっかり設定を間違えて公開してしまったりしたら、（扱っている情報の種類にもよりますが）プライベートでの込み入った恥ずかしい情報が駄々洩れになっちゃう恐れがあります。とは言え、プライベートネットワーク内でサーバーを用意して、そこに Redmine を立てて運用するとなると、構築の手間や電気代などのランニングコストも馬鹿にならないと思います。
そこで、ふと思いついたのが、「Raspberry Pi で Redmine を立てたら電気代も抑えられるし、Docker なら構築も楽ではないか」というアイディアです。

と、ここまでいかにもそれっぽい理由を書いてみましたが、本音を言えば、単に思いついたから試してみたかっただけだったりもします。

# 本題

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

## 今回使用した Raspberry Pi

今回は Raspberry Pi Zero W を使用しました。スペック的にギリギリっぽそうで試し甲斐がありそうに感じたのが主な選定理由ですが、もし万一飽きても出費的に痛くないものにしておこうかなという若干後ろ向きな理由もありました。

僕は秋葉原で実物を見て購入しました。今もそうなのかは調べていないのですが、当時（記憶では 2019 年 2 月頃）は単体では売っておらず、スターターキットで購入しました。同じものは [Amazon](https://www.amazon.co.jp/Raspberry-Pi-Zero-Starter-Kit/dp/B0746H9881) でも入手できるようです。

## セットアップ

まず最初におことわりです。セットアップしたのも購入してから間もない時期で、その時は断片的にしか記録をとっていなかった（後で改めて整理しようと思いつつ結局放置していた）ため、記憶を頼りに記述しています。一部、不正確な情報や最新でない情報もあるかと思いますが、ご容赦願います。

ざっくり以下の順に作業しました。とにかく動かすことを優先していたため、本当に必要最小限の手順になっています。

1. OS のインストール
    * スターターキット付属の SD カードに入っていたインストーラを使用
    * Raspbian Stretch Lite（CUI 環境）をインストール
    * 無線 LAN の設定をしてアップデートをかけた程度
1. Docker 本体のインストール
    * 当時は、下記の Issue に引っかかって最初はうまくインストールできなかった。古いバージョンの本体をインストールして問題を回避した記憶あり。
        * [docker-ce segmentation fault on Raspbian (v18.09.03) #38175](https://github.com/moby/moby/issues/38175)
1. Redmine の Docker イメージを取得、起動
   * Raspberry Pi Zero W では arm32v5/redmine のイメージを使用する
       * 実験のため arm32v7 のイメージも試してみたが（案の定）動かなかった 
   * 今回は、最も単純な手順でセットアップした
       * Listen するポートだけ 80 番に変えた
       * データベースコンテナもボリュームも使用していない

以下は参考にしたサイトです。

* OS、Docker 本体のインストールまで
    * [Docker on Raspberry Pi Zero W Tutorial](https://github.com/bignay2000/helloworldarm/wiki/Docker-on-Raspberry-Pi-Zero-W)
* Redmine Docker イメージの起動
    * [Docker Hub の Redmine 公式イメージ](https://hub.docker.com/_/redmine/) 

これまで Docker も Raspberry も話には聞いたことはあっても実際に触るのは初めてだったので苦戦するかと思っていましたが、Docker 本体のバグを踏んで原因調査に時間がかかったこと以外は割とあっさりできたのが驚きでした。（Linux はそこそこ触っているので、その経験に助けられている面もありますが）

※ そういえば LT も実際にやるのは初めてでした…

## LT で実演したやーつ

### 現物

![現物](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295482/9baa123a-13f7-91cf-2a0a-a2bfbcdb4830.jpeg)

モバイルバッテリーで十分動きます。実演時もこれで動かしていました。数時間程度なら全然余裕のようです。
フリスクのケースはサイズ比較用です。本当は、基盤をケースに収納して一笑い取りたかったのですがそこまでネタを仕込む余裕は全然なかったです。一応、現場にもケースを持っていってて、わざと見せようと思ってたりもしたのですが、発表時間削ろうと思ったので割愛しました。（時間押してたのでスベり芸を見せるのもどうかと思って…）

* 参考： [フリスクでRaspberry Pi Zeroのケースを作る](https://akkisino02.hatenablog.com/entry/2016/10/05/212127)

### Redmine 画面

![Redmine 画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295482/9a9bc15e-d66f-50ef-622c-c920ef1d2b93.jpeg)

LT 時は、Redmine 本体に「アタイのまいんちゃん」という名前をつけていました。これは、とある方面で昔お世話になった方から「Juno さんって家でもパソコンばっかイジってそうですね。愛しの Redmine ちゃんとイチャイチャしてるんでしょ？」みたいな感じで軽くディスられた（？）のが僕のツボにハマって、それ以来、自宅で Redmine をセットアップするたびにこの名前をつけています。LT でも「これでいつでもどこでもまいんちゃんと一緒にいられますね！」的なノリで喋ろうかとも思ってたのですが、ドン引きが加速しそうだったので控えておきました…

ちなみに、LT では Raspberry のコンソール画面も映しましたが、`ip a` と `docker ps -a` の実行結果を出していただけでした。ちゃんと Raspberry 上の Redmine にアクセスしてますよーというのを示したかっただけでした。

## 今後とりたいアクション

* データベースコンテナもあわせて動かしたい
* それなりにまとまった量のチケットなどを作成して性能・リソース使用状況を計測したい
* Dockerfile を作成して公開したい

## LT を振り返って

最初はダダスベりかなとも思っていたのですが、それなりにウケてたようでホッとしています。

以下、Twitter のコメントで気になった話題をピックアップして、僕の見解を書いておきます。

* SD での運用はデータ消失のリスクがあるから外部ストレージの方がよいというご意見は、まったくもってその通りだなあと思いました。別の案として、データベースコンテナから定期的にデータをダンプをしておいて、クライアント PC 等に転送してバックアップするのでも十分かなとも思いました。そうしておくと、Raspberry 自体に接続する外部装置がなくなり、持ち運びも便利なのかな（そもそも持ち運ぶのかって話はありますが）と思いました。また、データベースのダンプを取っておくと、データベースコンテナ自身のバージョンアップ時に楽じゃないかなとも思いました。いったんデータを消してデータベースコンテナをバージョンアップしてから、ダンプしたファイルでリストアをかけたらうまくいくだろうと楽観的に考えています。
* 個人用や小規模向けに Raspberry での運用も選択肢に入りうるというのも、十分に考えられます。さらに条件を追加するなら「インターネット上のサービスに機微な情報を置くことに抵抗がある個人または小規模組織」に対しての有力な選択肢になるのかなとも思っています。

# おまけ：One more thing 的な話

Unofficial Redmine Cooking の [QA #237：Redmineカスタムフィールド表示改善(CF1列表示、項目見出し、表示調整)](https://redmine.tokyo/issues/237) へのアンサーとなるプラグインを作って OSS で公開したいとお伝えしました。
[Redmine view customize plugin](https://github.com/onozaty/redmine-view-customize) （神プラグイン）を使って JavaScript やスタイルシートを埋め込めば実現できることも知っている（というか実際にやっている）のですが、システム管理者じゃないとメンテできないとか、利用者からの要望が増えるにつれてソースコードの管理が煩雑になってきたりとか、いろいろな不都合が予想されます。
それならばいっそのこと独立した機能として切り出して、システム管理者じゃなくても管理者ロールがあればプロジェクト毎に自由にレイアウトをカスタマイズできるようにしてあげるのが良いのではないかと考えています。

と、偉そうに語ってみたのですが、2019 年 11 月現在いまだに何もしていません…本当に申し訳ないです。第17回勉強会で受けたあのものすごい熱量を忘れないうちに今一度やる気を出してがんばりたいと思います。

# おわりに

初 LT でとても緊張していたのですが（そうは見えなかったかもですが）、皆さんが生暖かく見守ってくれたおかげでとても楽しむことができました。本当にありがとうございました！
引きこもりに戻りますが、また勇気を振り絞って出てきた際は、お手柔らかにお願いします。