kotememo

【Synology NAS】DockerでRedmineを起動しローカルgit連携

はじめに

DS220+(Synology NAS)を購入したので、DockerでRedmineを起動し、NAS内のbareリポジトリと連携しました。

これでNASを起動するだけでチケットと対応するcommit情報の確認が出来るようになります。あくまで個人向けですが。

元々はDockerでgitlabを使用しようとは思ったのですが、メモリ関係でNASが悲鳴を上げていたため断念しました。

Synology NASの初期設定、Container Manager(Dockerに利用)のインストール、Docker用ユーザ設定、Git Serverのインストールは実施済みとします。

概要

まず、RedmineをDockerで起動できることを確認し、その後git連携を行います。

  1. フォルダ作成
  2. docker-compose.ymlの作成
  3. Redmine起動
  4. Redmine初期設定
  5. bareリポジトリ設定
  6. redmineプロジェクトにリポジトリ設定
  7. (備考)所有者情報変更のバッチ化
  8. (備考)コミットメッセージの参照キーワード

環境

  • Windows 11 pro
  • DS220+(Synology NAS)

1. フォルダ作成

最終的なフォルダ構成は以下となります。

NAS:.
└─volume1
   └─docker
      └─redmine ← 今回使用するまとめフォルダ
          ├─git_repositories
          │  └─testrepository.git ← bareリポジトリ
          ├─postgres ← dockerマウント用フォルダ
          │  └─db-data
          ├─redmine ← dockerマウント用フォルダ
          │  ├─files
          │  ├─log
          │  ├─plugins
          │  └─public
          │     └─themes
          ├─docker-compose.yml
          ├─Dockerfile_postgres
          └─Dockerfile_redmine

まず、docker-compose.ymlの格納フォルダ、マウント用フォルダを作成します。

PowerShellでNASにSSH接続し、フォルダを作成します。

Docker用ユーザ名、IPアドレス、ポート番号は自身のものに置き換えてください。

ポート番号は[NASログイン]-[コントロールパネル]-[端末とSNMP]で設定している値です。

ssh [email protected] -p XXXXX
cd /volume1/docker
mkdir ./redmine
mkdir ./redmine/redmine
mkdir ./redmine/redmine/files
mkdir ./redmine/redmine/log
mkdir ./redmine/redmine/plugins
mkdir ./redmine/redmine/public
mkdir ./redmine/redmine/public/themes
mkdir ./redmine/postgresql
mkdir ./redmine/postgresql/data
mkdir ./redmine/git_repositories

2. docker-compose.ymlの作成

データベースにはPostgreSQLを使用しています。

作成したdocker-compose.yml/volume1/docker/redmineに格納します。

version: '3'
services:
    redmine:
        build:
            context: .
            dockerfile: Dockerfile_redmine
        container_name: redmine_main
        ports:
            - '33000:3000'
        expose:
            - '3000'
        volumes:
            - type: bind
              source: ./redmine/files
              target: /usr/src/redmine/files
            - type: bind
              source: ./redmine/log
              target: /usr/src/redmine/log
            - type: bind
              source: ./redmine/plugins
              target: /usr/src/redmine/plugins
            - type: bind
              source: ./redmine/public/themes
              target: /usr/src/redmine/public/themes
            - type: bind
              source: ./git_repositories
              target: /var/redmine/git_repositories
        restart: unless-stopped
        environment:
            REDMINE_DB_POSTGRES: postgres
            REDMINE_DB_DATABASE: redmine
            REDMINE_DB_USERNAME: redmine
            REDMINE_DB_PASSWORD: redmine
            REDMINE_PLUGINS_MIGRATE: "true"
            TZ: Asia/Tokyo
        links:
            - postgres

    postgres:
        build:
            context: .
            dockerfile: Dockerfile_postgres
        container_name: redmine_postgres
        volumes:
            - type: bind
              source: ./postgresql/data
              target: /var/lib/postgresql/data
        ports:
            - "54320:5432"
        restart: unless-stopped
        environment:
            POSTGRES_ROOT_PASSWORD: postgres
            POSTGRES_USER: redmine
            POSTGRES_PASSWORD: redmine
            POSTGRES_DATABASE: redmine
            TZ: Asia/Tokyo

volumes:
    redmine:
    postgres:

Dockerfile_redmineは作成する必要はありませんが、統一させたいので作成しています。

FROM redmine:5.0.5

Dockerfile_postgresも作成し、docker-compose.ymlと同フォルダに格納します。

FROM postgres:15.2
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8

3. Redmine起動

Synology NASにログインし、Container Managerを起動します。

[プロジェクト]-[作成]を選択し、全般設定のプロジェクト名(任意)、パスを入力します。

パス項目に/docker/redmineを選択すると、格納済みのdocker-compose.ymlを読み込んでくれます。

コンテナ設定

Webポータル設定については特に利用しないためセットアップ無しにしています。

完了ボタンを押してターミナルにExit Code: 0が表示されればRedmine起動成功です。

4. Redmine初期設定

Chrome等PCでhttp://XXX.XXX.XXX.XXX:33000/に接続し、Redmineにログインします。

初期設定だとログインIDとパスワードが共にadminだと思います。

新規パスワードを設定後、真っ先に左上タブの管理をクリックし、「デフォルト設定をロード」ボタンをクリックします。

この処理をすることでデフォルト設定をロードし、すぐにRedmineを扱う上で必要な設定が追加されます。

注意ですが、何か登録などしてしまうと「デフォルト設定をロード」ボタンは表示されなくなってしまうため、一番始めに実行しなければいけません。

redmineデフォルト設定

最後にテストプロジェクトとチケットを登録します。

  • プロジェクト名:testproject
  • チケット1:初期チケット(#1)
  • チケット2:修正チケット(#2)

5. bareリポジトリ設定

Redmineの中に複数のプロジェクトを登録して運用するため、git_repositoriesフォルダに各プロジェクトのbareリポジトリを格納するようにします。

その後、git_repositoriesフォルダ内にbareリポジトリを作成します。

今回はtestrepository.gitとします。

ssh [email protected] -p XXXXX
cd /volume1/docker/redmine/git_repositories
git init --bare --shared testrepository.git

次に、bareリポジトリにpushしていきます。

PC側でローカルリポジトリを作成します。

# ファイル生成
cd D:/
mkdir ./testrepository
cd ./testrepository

# git初期設定
git init
git config --local user.name "kotememo"
git config --local user.email "[email protected]"

Redmine側で表示できるか確認するために、テキストファイルをbareリポジトリにpushします。

# 1回目テキストファイル helloworld.txt
# hello world
# redmine
# postgres

# 1回目コミット
git add .
git commit -m "初期コミット refs #1"
git remote add origin ssh://[email protected]:XXXXX/volume1/docker/redmine/git_repositories/testrepository.git
git push -u origin master

コミットのコメントのrefs #1はredmineのチケット番号との紐づけになります。

差分を参照できるかを確認するためにもう一度pushします。

# 2回目テキストファイル helloworld.txt(2行目を修正)
# hello world
# redmine_docker
# postgres

# 2回目コミット
git add .
git commit -m "修正コミット refs #2"
git push -u origin master

コンテナ内のtestrepository.gitリポジトリをredmineが参照できるように所有者を変更します。

親フォルダgit_repositoriesの所有者を変更してもRedmineからは参照できず、個々のbareリポジトリに必要でした。

ssh [email protected] -p XXXXX
docker exec -it redmine_main bash
cd /var/redmine/git_repositories
chown redmine:redmine -R testrepository.git
exit

ただし、再コミットしようとすると権限エラーになってしまうため、一時的に権限を戻す必要がありました。

chownで指定する所有者情報が分からない場合は、新規ファイルを配置しコンテナ内でls -lコマンドを実行することで確認できます。

ssh [email protected] -p XXXXX
docker exec -it redmine_main bash
cd /var/redmine/git_repositories
chown 1026:users -R testrepository.git
exit

最終的なフォルダは以下に記載しています。

Dockerコンテナ内にbareリポジトリをマウントするため、gitのbareリポジトリはdockerフォルダ内に生成します。

NAS:.
└─volume1
   └─docker
      └─redmine ← 今回使用するまとめフォルダ
          ├─git_repositories
          │  └─testrepository.git ← bareリポジトリ
          ├─postgres ← dockerマウント用フォルダ
          │  └─db-data
          ├─redmine ← dockerマウント用フォルダ
          │  ├─files
          │  ├─log
          │  ├─plugins
          │  └─public
          │     └─themes
          ├─docker-compose.yml
          ├─Dockerfile_postgres
          └─Dockerfile_redmine

6. redmineプロジェクトにリポジトリ設定

先ほど作成したtestprojectプロジェクトを開き、[設定]-[リポジトリ]-[新しいリポジトリ]よりbareリポジトリのパスを設定します。

  • バージョン管理システム:Git
  • リポジトリのパス:/var/redmine/git_repositories/testrepository.git

redmineリポジトリ設定

設定すると[testproject]-[リポジトリ]を開くとコミット情報を参照できます。

redmineリビジョン

#欄のリビジョンIDを選択すると関連チケットやファイル内の差分を表示できます。

redmineリビジョン差分

これでコミットした内容の差分をredmineチケットと紐づけて確認できるようになりました。

bareリポジトリの所有者情報には手こずりましたが無事に設定できました。

7. (備考)所有者情報変更のバッチ化

bareリポジトリにpushする度に所有者情報を変更するのは面倒なため、所有者変更とpushをまとめてバッチ化するのもいいかもしれません。

ただし、バッチを用いてssh接続する場合は公開鍵の設定等を実施してパスワードレス状態でssh接続できるようにする必要があります。

  • command.bat
SET COMMITMESSAGE="test commit refs #1"

SET USERNAME=user-docker
SET IP=XXX.XXX.XXX.XXX
SET PORT=XXXXX

git add .
git commit -m %COMMITMESSAGE%

rem dockerコンテナ内のbareリポジトリの所有者をユーザに変更
ssh -tt %USERNAME%@%IP% -p %PORT% < command_ssh_start.sh

git push -u origin master

rem dockerコンテナ内のbareリポジトリの所有者をredmineに変更
ssh -tt %USERNAME%@%IP% -p %PORT% < command_ssh_end.sh

pause
  • command_ssh_start.sh
cd /volume1/docker/redmine/git_repositories
docker exec -w /var/redmine/git_repositories redmine_main chown 1026:users -R testrepository.git;exit
  • command_ssh_end.sh
cd /volume1/docker/redmine/git_repositories
docker exec -w /var/redmine/git_repositories redmine_main chown redmine:redmine -R testrepository.git;exit

8. (備考)コミットメッセージの参照キーワード

commitする際にrefs #1のキーワードでチケット番号を紐づけていました。

このrefsについてはredmineの[管理]-[設定]-[リポジトリ]の参照用キーワードで設定できます。

commit参照キーワード