Rocky LinuxにDocker Composeを使ってRedmineを構築 ＋テーマとプラグイン導入

# はじめに
### 今回作るもの

この記事では、Docker Composeを利用してRedmine環境を構築し、テーマやプラグインの導入までを行います。また、データの永続化やバックアップ管理の仕組みも取り入れ、またプラグインやテーマの導入についてまとめます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3905122/673c5127-cb62-bccf-8bae-1c414b0979de.png)


### 背景
弊社[kalytero](https://www.kalytero.ne.jp/)では、プロジェクトの工数管理などのためのツールとしてRedmineを試しに導入してみる事になりました。その際の備忘録としてこちらの記事を残します。

## 準備: 基本の環境構築
必要なもの
- OS: 　Linux（今回はRocky Linux release 9.5 (Blue Onyx)）
- 権限: root権限またはsudo権限

### 基本ディレクトリ構造
`/srv/docker/redmine`などに下記のようなディレクトリー配置で展開します。
```shell
/srv/docker/redmine  # プロジェクトルート
├── backup.sh           # バックアップスクリプト
├── docker-compose.yml  # Docker Composeの設定ファイル
├── backups/            # データのバックアップ用ディレクトリ
│   ├── daily/          # 日次バックアップ
│   └── monthly/        # 月次バックアップ
├── mariadb/            # MariaDBコンテナの永続化データ
├── redmine-logs/       # Redmineコンテナのログ
├── redmine_mariadb/    # Redmine関連のカスタム設定とデータ
    ├── backups/        # バックアップ用
    ├── plugins/        # プラグインの配置ディレクトリ
    ├── themes/         # テーマの配置ディレクトリ
    ├── files/          # アップロードされたファイル
```
## 必要なパッケージをインストール

### Docker / docker-compose のインストール
Rocky Linux 上で Docker Engine と docker-composeをインストール
```bash
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io
sudo dnf install -y docker-compose-plugin
```

### Docker 自動起動設定 & 起動
```bash
sudo systemctl enable docker
sudo systemctl start docker
```

### docker-compose.ymlのセットアップ
MariaDB 11.2 と sameersbn/redmine:6.0.2を使って立ち上げます。
```yml
services:
  database:
    image: mariadb:11.2
    container_name: redmine-mariadb
    environment:
      - MARIADB_USER=redmine
      - MARIADB_PASSWORD=password
      - MARIADB_DATABASE=redmine_production
      - MARIADB_RANDOM_ROOT_PASSWORD=1
      - MARIADB_AUTO_UPGRADE=1
    command:
      - mariadbd
      - --transaction-isolation=READ-COMMITTED
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - /srv/docker/redmine/mariadb:/var/lib/mysql
    restart: unless-stopped

  redmine:
    image: sameersbn/redmine:6.0.2
    container_name: redmine
    depends_on:
      - database
    environment:
      - TZ=Asia/Tokyo
      # DB設定
      - DB_ADAPTER=mysql2
      - DB_ENCODING=utf8mb4
      - DB_HOST=database
      - DB_PORT=3306
      - DB_USER=redmine
      - DB_PASS=password
      - DB_NAME=redmine_production
      - REDMINE_PORT=10083
      - REDMINE_HTTPS=false
      - REDMINE_RELATIVE_URL_ROOT=
    ports:
      - "8081:80"
    volumes:
      - /srv/docker/redmine/redmine_mariadb:/home/redmine/data
      - /srv/docker/redmine/redmine-logs:/var/log/redmine
    restart: unless-stopped
```

上記をプロジェクトのルートに設定し、`docker compose up -d`でDocker Composeを起動すれば、`http://<サーバーIPかドメイン>:8081/`でRedmineの初回セットアップ画面が開きます。

デフォルトの管理者ログイン情報は以下です(初回ログイン時にパスワード変更を求められます)。
- ユーザー名: `admin`
- パスワード: `admin`

## Redmineの基本設定

## Redmineのテーマを導入
RedmineのThemeをホスト側の`edmine_mariadb/themes/`にクローンし、Docker composeを再起動します。今回はfarend bleuclairという和製の日本語と親和性の高いメジャーなテーマを用います。

```bash
# /srv/docker/redmin直下にいると想定
cd redmine_mariadb/themes/
git clone https://github.com/farend/redmine_theme_farend_bleuclair.git
docker compose restart redmine
```


### もしRedmineのCSSが壊れていてたら
Redmineにテーマやプラグインを導入した後、変更内容を反映させるためには静的ファイル（アセット）の再コンパイルが必要です。（Docker imageなら基本再起動でスクリプトが走るはずですが）これを行うために以下のコマンドを実行してください。

```bash
docker exec -it redmine bash -c "cd /home/redmine/redmine && bundle exec rake assets:precompile RAILS_ENV=production"
```


## Redmineのプラグインを導入
RedmineのPluginをホスト側の`edmine_mariadb/plugins/`にクローンし、Docker composeを再起動します。先程のThemeと同じ流れです。

```bash
# /srv/docker/redmin直下にいると想定
cd redmine_mariadb/themes/
git clone https://github.com/redmica/redmica_ui_extension
docker compose restart redmine
```

## おすすめのPlugin
### redmica_ui_extension
添付ファイルのプレビューやテキストで簡単なUMLを記述できる機能が提供されています。Redmine互換のRedMica用に作成されたオープンソースソフトウェアです。

https://github.com/redmica/redmica_ui_extension

### redmine_issues_panel
こちらはRedmineのチケット画面にチケットパネルを追加するプラグインです。Github ProjectのようなUIが使えます。こちらもRedMicaのために作成されたものです。

https://github.com/redmica/redmine_issues_panel


## Redmine環境のバックアップと復元
`sameersbn/redmine`のDocker imageにはバックアップ用のコマンドが用意されていますので、それを利用してバックアップを定期的に作成します。

システム障害やアップデート時に備え、データのバックアップを行います。大分原始的な方法ですが、今回はシェルファイルを作成し、それをcronで実行する方法を用います。下記の内容を`backup.sh`に保存します。

```sh
#!/bin/bash

DAILY_BACKUP_DIR="/srv/docker/redmine/backups/daily"
MONTHLY_BACKUP_DIR="/srv/docker/redmine/backups/monthly"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
MONTHLY_TIMESTAMP=$(date +"%Y%m")

REDMINE_CONTAINER="redmine"

mkdir -p "${DAILY_BACKUP_DIR}"
mkdir -p "${MONTHLY_BACKUP_DIR}"

# --- デイリーバックアップ ---
DAILY_BACKUP_FILE="${DAILY_BACKUP_DIR}/redmine_backup_${TIMESTAMP}.tar.gz"
docker exec -it "${REDMINE_CONTAINER}" redmine-backup-create
tar -czf "${DAILY_BACKUP_FILE}" -C /srv/docker/redmine/redmine_mariadb backups
find "${DAILY_BACKUP_DIR}" -type f -name "redmine_backup_*.tar.gz" -mtime +7 -exec rm -f {} \;

# --- マンスリーバックアップ ---
if [[ $(date +"%d") -eq 01 ]]; then
  MONTHLY_BACKUP_FILE="${MONTHLY_BACKUP_DIR}/redmine_backup_${MONTHLY_TIMESTAMP}.tar.gz"
  tar -czf "${MONTHLY_BACKUP_FILE}" -C /srv/docker/redmine/redmine_mariadb backups
  find "${MONTHLY_BACKUP_DIR}" -type f -name "redmine_backup_*.tar.gz" -mtime +180 -exec rm -f {} \;
fi

# 完了メッセージ
echo "バックアップ完了: デイリーバックアップ(${DAILY_BACKUP_FILE})"
if [[ -n "${MONTHLY_BACKUP_FILE}" ]]; then
  echo "バックアップ完了: マンスリーバックアップ(${MONTHLY_BACKUP_FILE})"
fi
```

上記のシェルファイルが作成できたら、実行権限の付与とcronの設定を行います
```bash
chmod +x /srv/docker/redmine/backup.sh
crontab -e
```
crontabでエディターが開くと思いますので最後の行に下記を追加してください。
毎朝二時にバックアップが走ります。
```bash
0 2 * * * /srv/docker/redmine/backup.sh
```



### 参考サイト
- https://github.com/sameersbn/docker-redmine
- https://hub.docker.com/_/redmine
- https://redmine.jp/tech_note/first-step/admin/
- https://blog.redmine.jp/articles/5_1/install/ubuntu/