それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

redmineをdockerで起動してインストールして利用する。

redmineを使ってみたくなった。

ガントチャートが使いたいくなった。代替品に良好な製品もない。Redmineを今更ながら使うことにした。

インストールして使ってみると、わりとキレイで良き。 f:id:takuya_1st:20220311033740p:plain

github のIssueもあるし、gitlabで時間管理もできるのだけど、Redmineはこれはこれでいいね。

redmine の docker イメージについて

Redmine/Dockerhubがあるが、Redmineの「公式リリース」というわけでなく、コミッタはDocker社。docker社とコミュニティが気分でメンテナンスしてるっぽい。 オフィシャルのロゴが付いてるのはDocker社による、Dockerhubオフィシャルのパッケージである。それを示すオフィシャル・ロゴです。

気づかなくて、docker hub 提供のものを使ってしまった。LXCでUbuntuをインストールして構成したほうが楽だったと思う。

redmine docker イメージについて

  • データベースの文字コードを意識しないと駄目( my.cnf を volumeで投入)
  • redmine/configureation.yml は 自分で コピーする必要がある(Dockerfileでbuildが必要)
  • passenger / webrick がある。unicorn は選べない。

LXCでUbuntu起動してAnsibleでインストールしたほうが良かったかも。

dockerhub オフィシャルイメージで,redmineを動くように設定したので、メモを残しておきます。

全体構成

.
├── redmine
│   ├── Dockerfile
│   ├── configuration.yml
│   └── docker-compose.yml
├── start.sh
└── volume
    ├── mysql
    │   ├── data
    │   └── etc
    └── redmine
        ├── data
        ├── plugins
        └── themes

Dockerfile は configuration.yml を突っ込む

docker-compose.ymlはメインの設定

volume/mysq/data は mysql の永続化

volume/mysql/etc は mysql文字コード設定

volume/redmine 以下に、プラグイン・テーマ・アップロードファイルの置き場所を作る。

volumeコンテナを使うと、プラグイン・テーマのインストールが面倒なので使わない。unzip / wget で苦労する

docker-compose.yml

全体を起動する docker-compose.yml を書く。

db はMySQLにした。Debianベース。RedmineDebianベース。

ボリュームとDBパスワードを設定しいる。

redmine に configuration.yml を送り込むためだけのために、build指定がある。

version: '3.1'

networks:
  redmine-network:

services:
  db:
    image: mysql:5.7
    networks:
      - redmine-network
    container_name: redmine-db-mysql
    restart: always
    volumes:
      - ../volume/mysql/data:/var/lib/mysql
      - ../volume/mysql/etc:/etc/mysql/mysql.conf.d/
    environment:
      MYSQL_ROOT_PASSWORD: Iew8ixiz
      MYSQL_DATABASE: redmine

  redmine:
    image: redmine-configured
    build: .
    container_name: redmine-web-rails
    ports:
      - '31256:3000'
    networks:
      - redmine-network
    volumes:
      -  ../volume/redmine/plugins:/usr/src/redmine/plugins
      -  ../volume/redmine/themes:/usr/src/redmine/public/themes
      -  ../volume/redmine/data:/usr/src/redmine/files
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_USERNAME: root
      REDMINE_DB_PASSWORD: Iew8ixiz
      REDMINE_SECRET_KEY_BASE: X_______X
    restart: always
    depends_on:
       - db

redmine/Dockerfile

configuration.yml をイメージに含めるためにビルドをする。Dockerfileではコピーするだけ。

ファイルを持ち込むだけで随分面倒くさいがdocker-composeの仕様なので仕方ない。1ファイルのためにボリュームでマウントしても面倒くさいだけ。(configuration.ymlは、多数ファイルともに設置されているため、もしconf.d形式ならVoume利用を選べた。)

FROM redmine:4-passenger
COPY ./configuration.yml /usr/src/redmine/config/configuration.yml

redmine/configuration.yml

configuration.yml では、メール送信の設定をする。SMTPの設定くらい、Docker ENVで与えたいができません。

redmineイメージのdockerfileentry_point.shをみても環境変数は見当たらないので、突っ込むことにした。もしかしたらRailsRedmineの起動ENVにあったかもしれない。

default:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
     enable_starttls_auto: true
     address: "smtp.gmail.com"
     port: 587
     domain: "smtp.gmail.com" # 'your.domain.com' for GoogleApps
     authentication: :plain
     user_name: "admin@example.com"
     password: "passsssssss"

volume/mysql/etc/mysqld.cnf

DockerのMySQLをutf8mb4にする。

mysqld.cnf を直接書き換えてもいいが、1ファイルを書き換えるために、Dockerビルドが走るのは面倒くさい。mysql は conf.d/ が使えるので、conf.d のディレクトリをボリュームにマウントして設定を流し込む。

このファイルは、ボリュームを通して/etc/mysql/mysql.conf.d/mysqld.cnfとしてmysqlに出現させる。

mysqld.cnf

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
#log-error      = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address   = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

start.sh

起動と終了のコマンドをサクッと書いておく。

#!/usr/bin/env bash
## : vim
PORT_PUBLISH=31256
cd $( dirname $0 )/redmine
NAME=redmine-docker

function stop(){
  docker-compose down
}
function build(){
  docker-compose build
}
function start(){
  docker-compose up -d
}
function status(){
  docker-compose ps
}

function main(){
  echo $1 $NAME
  case $1 in
    status*)
      status;
      ;;
    build*)
      build;
      ;;
    stop*)
      stop;
      ;;
    strat)
      start
      ;;
    restrat)
      stop
      # build
      start
      ;;
  esac

}
main $@

起動確認して

./start.sh start
./start.sh status
./start.sh stop

ブラウザでアクセスする。

初期パスワードは、admin/admin

テーマをインストールしておく。

cd theme
git clone https://github.com/farend/redmine_theme_farend_basic.git farend_basic

プラグインをインストールする

cd volume/redmine/plugins
git clone git://github.com/suer/redmine_absolute_dates.git
docker exec -it  redmine-web-rails bash
cd plugins/redmine_absolute_dates
RAILS_ENV=production bundle exec rake redmine:plugins:migrate 
RAILS_ENV=production bundle install

プラグインの取得は、gitでdocker 外部からボリュームにファイルを突っ込んでる。

その後 docker exec で bundle install と rake migration を動かしている。

初期設定

設定→全般

タイトル、ホスト名とパス、プロトコル、マークダウン、Gzipを設定。ホスト名を指定しないと、メールリンクがlocalhost:3000になる。

f:id:takuya_1st:20220311041444p:plain

設定→メール

メール通知で送信元メールを設定して右下から「テストメール」を送信する。

f:id:takuya_1st:20220311041602p:plain

設定→認証

プロジェクトが外部に丸見えにならないように設定する。

f:id:takuya_1st:20220311041637p:plain

設定→表示

表示で全体テーマを変更する。Themeインストールが正しいときにここに出てくる。

言語もここで設定する。言語設定後に、設定を押し直して全体言語をロードする。MySQLの設定が正しいと先にすすめる。MySQLがマルチバイト文字非対応ならエラーになる。

f:id:takuya_1st:20220311041748p:plain

その他プラグイン

公式にバージョン毎の対応一覧がある。リンク

Gitlab との連携はGitlabに記載がある

最後にNginx経由で公開

nginx 側で robots.txt を吐き出し、検索インデックスを拒否する。

nginxでhttps/http2+tls を処理してredmineへ投げる。

#  vim: ft=nginx ts=2 sw=2 sts=2 sr noet:
#######################################
## vhost を docker へ
#######################################
#
#  SSLの証明書はcloudflare に任せる

server {

  listen 443 ssl http2;
  listen 80;
  server_name redmine.example.com;

  if ($scheme != "https") {
    return 301 https://$host$request_uri;
  }

  # cloudflare
  ssl_certificate /etc/nginx/certs/cloudflare/fullchain.pem;
  ssl_certificate_key /etc/nginx/certs/cloudflare/privkey.pem;

  access_log /var/log/nginx/$server_name.log;
  error_log /var/log/nginx/$server_name.error.log;

  location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; }
  add_header  X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";

  location / {
    ## いつもの設定
    proxy_read_timeout      300;
    proxy_connect_timeout   300;
    proxy_set_header Host              $server_name;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host  $server_name;
    proxy_pass http://docker-host.lxd:31256;
  }
}

参考資料