はじめに
今回作るもの
この記事では、Docker Composeを利用してRedmine環境を構築し、テーマやプラグインの導入までを行います。また、データの永続化やバックアップ管理の仕組みも取り入れ、またプラグインやテーマの導入についてまとめます。
背景
弊社kalyteroでは、プロジェクトの工数管理などのためのツールとしてRedmineを試しに導入してみる事になりました。その際の備忘録としてこちらの記事を残します。
準備: 基本の環境構築
必要なもの
- OS: Linux(今回はRocky Linux release 9.5 (Blue Onyx))
- 権限: root権限またはsudo権限
基本ディレクトリ構造
/srv/docker/redmineなどに下記のようなディレクトリー配置で展開します。
/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をインストール
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 自動起動設定 & 起動
sudo systemctl enable docker
sudo systemctl start docker
docker-compose.ymlのセットアップ
MariaDB 11.2 と sameersbn/redmine:6.0.2を使って立ち上げます。
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という和製の日本語と親和性の高いメジャーなテーマを用います。
# /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なら基本再起動でスクリプトが走るはずですが)これを行うために以下のコマンドを実行してください。
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と同じ流れです。
# /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用に作成されたオープンソースソフトウェアです。
redmine_issues_panel
こちらはRedmineのチケット画面にチケットパネルを追加するプラグインです。Github ProjectのようなUIが使えます。こちらもRedMicaのために作成されたものです。
Redmine環境のバックアップと復元
sameersbn/redmineのDocker imageにはバックアップ用のコマンドが用意されていますので、それを利用してバックアップを定期的に作成します。
システム障害やアップデート時に備え、データのバックアップを行います。大分原始的な方法ですが、今回はシェルファイルを作成し、それをcronで実行する方法を用います。下記の内容をbackup.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の設定を行います
chmod +x /srv/docker/redmine/backup.sh
crontab -e
crontabでエディターが開くと思いますので最後の行に下記を追加してください。
毎朝二時にバックアップが走ります。
0 2 * * * /srv/docker/redmine/backup.sh

