Raspberry Pi 4 Model B 2GB にRedmineのdockerコンテナを入れる

# 経緯（いきさつ）

* Amazon ブラックフライデー＆サイバーマンデーで4TBのHDDを購入。
* WifiルータにUSB接続してNAS化しようと思っていたら[対応していない](https://tokuhayanet.com/softbank/hikaribbunit-wifi-router/)らしい。
* 秋月電子に行く用がありATTiny85(130円)を買うついでにRaspberry Pi 4を購入^^;
* RaspberryにRasbianを入れ、OpenMediaVaultでHDDをNAS化するところまで完了済。
* Linux サーバが家にあるならやりたいことはいくつかある。
 * （私と妻で共同作業することもあるので）
 * WordPressのサンドボックスがほしい　→　未着手
 * 作成したHTMLをwebサーバ経由してスマホで確認したい　→　未着手
 * 仕事に関する情報をwikiなどに残したいことがある　→　**redmine作ります**

前置きが長いですがw HDDを購入したらredmineを構築することになった話です。
風が吹けば桶屋が儲かる。

# 前提条件

1. [Raspberry Pi 4 Model B(2GB)](https://amzn.to/38lOcRU) ※リンク先は8GB
1. [32GB microSDカード](https://amzn.to/38pDppZ)
1. [Type-CのACアダプタ](https://akizukidenshi.com/catalog/g/gM-14935/)
1. Raspbian 10.7 インストール済
1. ssh接続できること（以下の手順は `pi`ユーザで接続している前提です）

# 手順

## 手順 1: docker-compose のインストール

ググった感じだと`pip3`は何もしなくても実行できるっぽく書いてありました。
ですが私の場合、そんなコマンドないよ！や、なんかおかしいよ！など、エラーにorz
なのでpython3のインストール、pip3のupgradeやwheelインストールは
何も考えずに実行してしまえば良いと思います。

```bash
sudo apt-get update # おまじない　その１
sudo apt-get -y upgrade # おまじない　その２
curl -sSL https://get.docker.com | sh # dockerをインストール
sudo apt-get -y install python3-dev # pip3が使いたいので (注*1)
sudo apt-get -y install python3-pip # pip3が使いたいので (注*1)
sudo pip3 install --upgrade setuptools # pip3がエラーになるかも知れないので (注*1)
sudo pip3 install wheel # pip3がエラーになるかも知れないので (注*1)
sudo pip3 install docker-compose # docker-composeをインストール
```
(注*1) 2021年11月追記：このコマンド実行は不要のようです

## 手順 2: 起動準備（やらなくても良いかも）

ググっていたら以下の設定をする記事があったので一応やりました。
が、これはやらなくても問題なさそう。docker実行はsudoでも良いし。

```bash
sudo vi .bashrc
# 追加した行は以下の内容です（私の場合 ~/.local は存在しなかったので、この設定は必要なさそう）
# export PATH="$PATH:~/.local/bin
source .bashrc # 上記の設定を反映
echo $PATH # 反映できたか確認
sudo usermod -a -G docker pi # dockerコマンドをユーザpiで実行できるように設定
sudo reboot # 念のため再起動
```

## 手順 3: docker-compose の実行

以下の`/path/to/docker-compose` はご自身の環境に合わせて変えてください。
ここまで実行が終われば PCブラウザから`http://{RaspberryPiのIPアドレス}:3000` へ
アクセスすることでredmineの画面が表示されるはずです。

```bash
mkdir /path/to/docker-compose # 作業用ディレクトリを作成
sudo chown root:users /path/to/docker-compose/ # 所有権の設定（ユーザpiはusersグループ）
sudo chmod 775 /path/to/docker-compose/ # アクセス権の設定（ユーザpiはusersグループ）
cd /path/to/docker-compose # 作業用ディレクトリに移動
sudo touch docker-compose.yml # yamlファイルを作成
sudo vi docker-compose.yml # 編集内容は以下を参考にしてください
docker-compose -f docker-compose.yml up -d # 実行
```
作成したyamlファイルは以下の内容です。ポート番号やDB名、パスワードなど
任意に設定してください。

### docker-compose.yml

```yml:docker-compose.yml
version: '3.8'
services:
  redmine:
    image: arm32v7/redmine
    container_name: redmine
    ports:
      - 3000:3000
    volumes:
      - ./files:/usr/src/redmine/files
      - ./log:/usr/src/redmine/log
      - ./plugins:/usr/src/redmine/plugins
      - ./public/themes:/usr/src/redmine/public/themes
    environment:
      REDMINE_DB_POSTGRES: redmine-db
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_PASSWORD: redmine
      REDMINE_DB_ENCODING: utf8
    depends_on:
      - redmine-db
    restart: always
    
  redmine-db:
    image: postgres
    restart: always
    environment:
      POSTGRES_DB: redmine-db
      POSTGRES_USER: redmine
      POSTGRES_PASSWORD: redmine
    volumes:
      - ./dbdata/:/var/lib/postgresql/data
```

## 手順 4: DBがない？

```sh
docker ps -a
```

```:実行結果
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS                          PORTS      NAMES
b7090b0ee0a7   arm32v7/redmine   "/docker-entrypoint.…"   8 minutes ago   Restarting (1) 50 seconds ago              redmine
6e7dca7cd79b   postgres          "docker-entrypoint.s…"   8 minutes ago   Up 8 minutes                    5432/tcp   redmine-db
```

STATUSを確認してください。正常であれば `Up 8 minutes` のような表示ですが
問題があると再起動を繰り返すことがあります。 `Restarting (1) 50 seconds ago`
もしredmineのコンテナが起動を繰り返すようならDBが問題かもしれません。
私の場合、redmineによるDBのmigrationがうまくいきませんでした。
（いま思えばyamlの設定でDBのホスト名が間違っていただけの気がする・・・ホスト不明だからmigrationできない状態）
`ActiveRecord::NoDatabaseError: FATAL:  database "redmine" does not exist`
手動でデータベースを作成します。

```bash
docker logs redmine # ログを確認
docker container exec -it redmine-db /bin/bash # DBのコンテナに入る
createdb redmine --encoding=utf8 -O redmine -U redmine # CREATE DATABASEする
exit # DBのコンテナを抜ける
docker rm redmine # redmineのコンテナを削除して
docker-compose -f docker-compose.yml up -d # もう一度作り直す
```

# 補足（多め）

## dockerおよびdocker-composeがインストールできたかの確認

```bash
docker -v
docker pull hello-world
docker run hello-world
docker ps -a
docker rm hungry_roentgen
docker images
docker rmi hello-world
docker-compose version
```

## よく使うdockerコマンド

```bash
docker ps -a # コンテナの一覧表示
docker stop container_name # コンテナの停止
docker start container_name # コンテナの起動
docker logs container_name # コンテナのログを表示
docker rm container_name # コンテナの削除
docker rename before after # コンテナの名前を変更
docker images # イメージの一覧表示
docker rmi image_name # イメージの削除
```

## podmanはUbuntuで

最初、見つけた記事がラズパイにUbuntuを入れて
podmanでredmineを構築するって内容でした。
raspbianではなくUbuntuだということをちゃんと読んでなくて
「できないなー、なんでかなー」ってなっちゃいました^^;;

結論としては、この方法は私の場合うまくいきませんでした。

* Raspbian10のupdateがうまくいかない　→　公開キーがないって言われる
 * `gpg: keyserver receive failed: No data`
* そもそもpodmanがないっぽい
 * `E: Unable to locate package podman`

とは言え、やったことを一応のせておきます。

```bash
. /etc/os-release
# 以下のxUbuntu_はRaspbian_の間違いですがRaspbian_10だと公開キーがエラーになる。。
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -
sudo apt-get update
```

まずはこのエラー（xUbuntu_はRaspbian_の間違い）

```:エラー内容
Err:15 https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_10  Release
  404  Not Found [IP: 2001:67c:2178:8::13 443]
```
なので、このリストファイルを削除する

```bash
rm /etc/apt/sources.list.d/devel\:kubic\:libcontainers\:stable.list 
```
んで、xUbuntu_をRaspbian_に変更して実行すると以下の結果に。

```:エラー内容
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 4D64390375060AA4
```

こいつを取得しようとしてもエラー。

```bash
gpg --recv-key 4D64390375060AA4
```

```:エラー内容
gpg: keyserver receive failed: No data
```
しょうがないのでもう一度リストを削除、なかったことにして先に進むと・・

```bash
sudo apt-get -y upgrade
sudo apt-get -y install podman
```

```:エラー内容
E: Unable to locate package podman
```

はい、あきらめました。

## MySQLとかMariaDBとか

本来ならPostgreSQLよりMySQL系の方が好ましいんですが（好みの問題）
docker hubみてもimageがよく分からず・・・とりあえず動けば良いんです。
偉い人にはそれがわからんのですよ。

## SDカードの考慮

openmediavaultを環境構築した時は何もしなかったんですが
やっておいた方が良さそうな設定があったので、今回あわせて実施しました。
設定の意味は各自お調べください。
（ちなみにredmine用のディレクトリは外付けHDDに作りました）

```bash
sudo swapoff --all
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile
systemctl status dphys-swapfile
```

## IPアドレスの固定

これも今回あわせてやっておきましたって内容ですけど
DHCPで取得したIPアドレスを固定化するようにしました。
ルータ側ではなくクライアント(RaspberryPi)の設定です。
有線接続なのでifの名称は `eth0`。無線LANの方は`wan0`とかになると思います。
（設定が本当にこれで正解なのかは謎）

```bash
sudo vi /etc/dhcpcd.conf
```

```:/etc/dhcpcd.conf
interface eth0
static ip_address=192.168.111.123/24
static routers=192.168.111.1
static domain_name_servers=192.168.111.1 8.8.8.8 8.8.4.4
```

## ファイアーウォール？

最初、redmineコンテナが再起動を繰り返しているのに気づかず
`http://{raspberrypi}:3000`にアクセスできないので
ネットワークの設定を疑いました。
その時に設定したのが以下の内容。

```bash
sudo apt-get install ufw
sudo ufw allow 22 # ssh用
sudo ufw allow 80 # いまのところopenmediavaultの管理画面用
sudo ufw allow 139 # smb://
sudo ufw allow 445 # smb://
sudo ufw allow 3000 # 今回追加したredmine用
sudo ufw default deny # 既定の設定＝拒否
sudo ufw enable # ufwを有効化
```

いまは`ufw`ってのがメジャーなんですかね？
とりあえず設定してしまったので、そのままにしてあります。
一応、ポートの状況も確認したいので`nmap`もインストールしました。

```bash
sudo apt-get install nmap
nmap localhost
```

```:実行結果
Starting Nmap 7.70 ( https://nmap.org ) at 2020-12-XX XX:23 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00070s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
3000/tcp open  ppp

Nmap done: 1 IP address (1 host up) scanned in 0.27 seconds
```

# まとめ

* Raspberry Pi 4 にredmineを構築するのは簡単です
* [docker-composeをインストール](#手順-1-docker-compose-のインストール)して[ymlファイルを作成](#docker-composeyml)してください
* [docker-composeを実行](#手順-3-docker-compose-の実行)したらredmineが使えるようになります
* でも私は３〜４時間格闘した気がします