Redmine

QNAPのNASにRedmineをセットアップする

QNAP TS-231Pを買いました!
このTS-231PにRedmineを設定していきます。

NASの管理画面のContainer StationからDocker Hubのイメージを取得して色々なアプリ/サービスを動かせます。自分で作ったイメージでコンテナを作ることも可能です。
Cotainer Stationはアプリストアから別途インストールが必要です。

Container Station → 作成 → Docker Hub → 「Redmine」を検索。
Redmine公式のイメージがあります。

イメージ名のリンクからDocker Hubのイメージ解説ページに飛ぶと…Docker Composeの設定例が載ってますね。

で、これをこうして… こうじゃ!

イメージをダウンロード済みなので速いです、3分で新しいRedmineが起動しました。
終わりです。

Container StationでDocker Compose

速すぎてよく分からないですね。
要はDocker Composeの設定を書いて、データベースコンテナとRedmineコンテナの二つのコンテナを連携させてます。

RedmineはPostgreSQL/MySQL/SQLiteの3種類のデータベースに対応しています。なのでPostgreSQLかMySQLのコンテナも作成します。SQLite3ならDBコンテナはいらないと思います。

私の買ったTS-231PのCPUはARMアーキテクチャです。Amazonに買収されたイスラエルのCPUメーカー Annapurna labsの設計で、AWSで使われてるらしいです。

MySQLのコンテナは「ARM CPUのLinux向けイメージがない」というエラーで、作成できません。Intel CPUのモデルだと問題なく使えると思います。

PostgreSQLはARM/Linux向けイメージがありますので、DBはPostgreSQLにします。確か昔のRedmineはPostpreSQL/SQLite3しか対応してなかったように記憶してます。

下準備

テーマやjQueryを格納しているpublicフォルダ用の共有フォルダを作成しておきます。

後ほどDocker Composeの設定で、Redmineコンテナがこの共有フォルダを同期するように設定します。フォルダ作成と同期設定をして永続化しておかないと、コンテナが再起動する度にpublicフォルダが空になってしまい、テーマが消えます。

適当なところに共有フォルダを作って、Redmineのリリースファイル内にあるpublic以下のファイルを入れておきます。

redmine-publicを作成してpublic内のファイルをアップロード

この場合、QNAP TS-231Pでのフルパスは /share/redmine-publicです。

また、自分はminimalflat2テーマを使っているので、併せて入れておきます。

必要に応じて、同じ要領でプラグインを格納するplugins用の共有フォルダも作成しておいてください。これも設定していないとコンテナ再起動時に消えます。

Docker Composeを設定する

作成 → アプリケーションの作成に進みます。

Docker Composeを書くためのモーダルウィンドウになります。

アプリケーション名を入れます。ハイフン不可。
yml形式で Docker Composeの設定を書きます。

version: '3'

services:
  redmine:
    image: redmine
    restart: always
    ports:
      - 32790:3000
    environment:
      REDMINE_DB_POSTGRES: db
      REDMINE_DB_PASSWORD: secret
    volumes:
      - /share/redmine-public:/usr/src/redmine/public

    
  db:
    image: postgres
    restart: always
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DATABASE: redmine

サービスが二つ、RedmineとPostgresSQLです。
それぞれ、設定します。

サービス名 redmine:でRedmineの設定をします。

  • 使用イメージ:redmine、バージョン指定をしてないのでLatestを取得します。
  • 再起動ポリシー:コンテナがダウンしたら常に再起動
  • ポート番号:左側がブラウザでアクセスするポート、右側がコンテナが使用するポート
  • 環境変数
    • REDMINE_DB_POSTGRES: 後述するデータベースのサービス名
    • REDMINE_DB_PASSWORD: DBへの接続パスワード、ユーザー名は無指定の場合root
  • マウントするボリューム
    • NASの/share/redmine-publicをコンテナ内の/usr/src/redmine/publicにマウント

次に、db:でPostgreSQLの設定をします。

  • 使用イメージ: PostgreSQL
  • 再起動ポリシー
  • 環境変数
    • POSTGRES_PASSWORD: Redmineが使うパスワード、先に設定したのと同じもの
    • POSTGRES_DATABASE: Redmineが使用するデータベース名

最低限、これでいけます。

Yamlチェッカーもあるので文法が間違いないか確認しておきます。

コンテナ起動

「作成」を押すとバックグラウンドタスクにコンテナの作成と起動が追加されます。イメージが未取得だとdocker pull(ダウンロード)もやってくれると思います。

右上のアイコンにタスクが1個あると表示される。
「概要」タブから実行中のコンテナが確認できます。コンテナごとの状態も確認できます。
redmineコンテナではデータベースのマイグレーション処理が走ってます。
最後にWebサーバが起動したら、URLが表示されます。

RedmineコンテナのWebサーバが起動したら、ports:で指定したポートにブラウザでアクセスします。今回は32790番ですね。

初期状態のRedmine

これでもうRedmineを使い始めることができます。

Redmineコンテナ-ホストのファイル共有

デフォルトの設定だとRedmineでアップロードしたファイルの入るfilesだけ、共有フォルダに同期されます。

ContainerStationのボリュームタブを開きます。アクション列のメガネアイコンで使用中のコンテナを表示、「プルーン」を実行すると使われていないボリュームを全て削除です。マウントポイントがTS-231P内でのフォルダ位置です。

FileStationで表示するとここです。

/Container/container-station-data/lib/docker/volumes
/538955fb672279d5a9d753406318b2d82707b0fb458c1cb6d50ac9b6cb628061
/_data

階層がとても深いです。_dataディレクトリの上はコンテナの識別子がそのままディレクトリ名になってます。特にコンテナの名前を決めてないので、ハッシュですね。

GitリポジトリをRedmineと連携させたいので、コンテナとの共有フォルダもう一つ指定しておきます。

volumes:
  - /share/git:/usr/src/redmine/git_repositories

ローカルの/share/gitをマウントします。 /share/gitにはリモートリポジトリが入っています。
Redmineでリポジトリの設定をすると、こういう具合にgitの履歴を見ることができます。

TS-231PにGitを入れるにも若干、手間がありますが割愛。 SSHで接続して別途入れたパッケージ管理ソフトを使います。

ちょっと…な点

ちょっと微妙な気配があるのは、Docker HubのRedmine公式イメージはWEBサーバがWebrickなところです。公式のインストールガイドによるとWebrickは開発用なので、本番では使わないようにとのことです。

Passengerで動くイメージを使うとなると、Webサーバのコンテナも要りそうなので、ちょっと設定が分からない。

それとGitを入れようとしたところ公式のヘルプによると

Git の使用に替わるものとして、Container Station の GitLab を使用することができます。

qnap.com QNAP NAS で Git を使用する方法

必要なのはGitであってGitHubクローンじゃないですけども…コンテナのGitLabで代用になるのかな。

余談

Redmineイメージ単体でデータベースはSQLite3を使うなら、実はデータベース用のコンテナの設定は要りません。Docker Composeもなしで、設定も全部デフォルトでもContainer Stationが上手いことやってくれます。

ここから「作成」でも一応はRedmineが起動する

ただし、DBもテーマフォルダもコンテナ再起動の度に消えてしまいます。

コンテナが再起動かかると、こんな具合にHTMLだけで表示される
左が再起動後のRedmineコンテナの内部ファイル、右が正しい状態

Redmineをちょっと触ってみたいとか、お試しぐらいなら使えるのかな。
ボリュームマウントしてpublicとdbフォルダを永続化してやれば、実用にも耐えるかもしれません。

コンテナに入るには、コンテナのリストから「端末」でbashを実行します。イメージによってはシェルがBashではないので注意。

HerokuにRedmineを立てる

Redmineで小規模ながらチケット駆動でやっていると、もう一つRedmineが欲しくなった。
自宅サーバでRedmineが走っているのだが、WAN公開はセキュリティ対策に自信が持てないのでしていない。
しかし、無料のホスティングサービスやレンタルサーバで簡単に動かす方法がない…………
いや、ありました。
Ruby on RailならHerokuHerokuRedmineをインストールするのです、我々は賢いので。
手順はこのようになります。

  1. Redmineを一旦ローカルに保存して設定ファイルを変更する。
  2. Heroku側でアプリケーションURLを用意。
  3. 設定をmasterブランチへ取り込んで、Herokuへプッシュ。
  4. HerokuでRuby on Railsのコマンドを実行してセットアップ。

作業するローカルPCにRuby実行環境が必要ですが、Railsの実行環境・インストールは一切必要ありません。Herokuのアカウント取得、Heroku CLIのインストール・使用方法は省略します。
また、2017年4月現在のHerokuのRuby,Rails環境設定については確認してません。
制限もあります。

  1. リポジトリがHeroku側に置けないのでチケットとコードの関係性を表示できない。
  2. 画像をアップロードできない。
  3. 30分ぐらいアクセスがないと、サーバー側はRuby環境の立ち上げからやり直すので重い。

ただ、かなり簡単にプロジェクト管理が立ち上げられるので、便利かも知れません。

Redmineをローカルで設定

HerokuにはGitHubのリポジトリから直接デプロイできる機能があります。
CrowiというWikiエンジンを、同じくHerokuで使ってます。こちらはGitHubから一発デプロイ可能です。
しかしながら、RedmineはGitHub->Herokuの一発デプロイに対応してません。
そこで、一旦ローカルにクローンを取得して、設定ファイルを編集します。

$ git clone https://github.com/redmine/redmine.git
$ cd redmine
$ git checkout -b for-heroku refs/tags/3.3.2

Cloneしたそのままで作業すると、開発版をHerokuへ上げてしまうことになるので、安定版のタグを指定しfor-herokuブランチとしてチェックアウトします。
はい、うっかりしていてDevelopをHerokuでホスティングしてしまったのは私です。
最終的にブランチはこうなります。
Herokuへプッシュするブランチ構成
まず、.gitignoreを書き換えます。
git pushでHerokuへアップロードする関係で、追跡するファイルが増えます。
.gitignore から削除してgitで追跡するファイル

/config/configuration.yml
/config/database.yml
/config/email.yml
/config/secrets.yml
/config/initializers/session_store.rb
/config/initializers/secret_token.rb
/Gemfile.lock
/Gemfile.local

編集したら、Redmineで必要なパッケージをインストールします。
gemfilesはデフォルトのままでいいかと思います。

$ bundle install

ただ、相変わらずrmagickのインストールに失敗します。私だけ?何故かCentOSでも転けました。

# Optional gem for exporting the gantt to a PNG file, not supported with jruby
group :rmagick do
gem "rmagick", ">= 2.14.0"
end

オプション機能なので、なくても構わないでしょう。Redmineのガントチャートを画像ファイルとしてダウンロードするためのGemです。
コメントアウトするか削除してbundle installを通してしまいます。
続けて、Herokuで動かすための設定をymlファイルに書いていきます。
config/database.yml
データベース関係の設定ですね。

production:
adapter: postgresql
database: redmine
host: 127.0.0.1

config/secrets.yml
シークレットトークンを格納するために作成。RedmineがDBに接続する際に使う設定です。
環境変数を使うように設定を記述します。

production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

confug/application.rb
また、Herokuでのビルド時にエラーで止まるため、application.rbに下記設定を追記します。
Rails3.2関係のビルド設定のようです。

Heroku and Rails 3.2 asset:precompile error

config.assets.initialize_on_precompile = false

設定が済んだら、現在作業しているブランチをmasterに名前だけ変えてしまいます。
というのも、Herokuサーバがmasterというブランチ名でないとデプロイを受け付けてくれないためです。Redmineの開発を行っているリポジトリへプッシュするものではありません、Herokuへアップロードするためのmasterとします。
設定を書いた作業ブランチ ツリー表示
この状態から
Herokuへプッシュするブランチ構成
この状態にブランチを変更します。私は単にmasterブランチを削除して、for-herokuブランチからmasterブランチを作成してチェックアウトしました。
以上で、ローカルでのRedmineの準備は完了です。

Heroku側の準備

Heroku CLIでHerokuのアプリケーション設定をします。
新規のアプリケーションを作成

$ heroku create

createすると自動でRedmine用のURLも生成してくれます。
今回は、frozen-plateau-25566 というURLを生成してくれました。
「凍った高原」だそうです。URLは後からHerokuのダッシュボードで変更できます。
(今回の説明用に立てたアプリなので、このURLは既にありません)
次に、HerokuアプリケーションにPostgresqlデータベースを用意します。

$ heroku addons:create heroku-postgresql

heroku create スクリーンショット

Herokuへプッシュ

createでアプリケーションを作成した時点で、ローカル・リポジトリのリモートにfrozen-plateau-25566 のgitリポジトリが追加されていますので、そこへプッシュ。

$ git push heroku

アップが完了すると、HerokuでRuby on RailsとRedmineのビルドが始まります。
Herokuでのデプロイ スクリーンショット
ダメならHeroku側で綺麗に消えます!
Errorとかで止まった場合でも設定を書き直してコミット・プッシュすれば、再度まっさらの環境でデプロイが始まります。
Herokuは仮想化のコンテナ技術を使ってるらしいですね。
デプロイが終わったら、Ruby on Railsで初期設定をします。
Herokuへrakeコマンドを発行。

$ heroku run rake db:migrate
$ heroku run rake redmine:load_default_data

二つ目のrakeでデフォルトデータを入れる際に、使用言語の選択があります。
jaと打てば日本語を選べます。
heroku run rake スクリーンショット

Redmineへアクセス

$ heroku open

デフォルトのブラウザで、デプロイしたRedmineのアドレスが開きます。
ユーザー:admin パスワード:adminでログインします。
パスワードを再設定したら、使えるようになります。
Redmineスタート画面
参考

HerokuにRedmineをデプロイする方法 ― Qiita
HowTo Install Redmine (> 2.5.x) on Heroku – Redmine公式

余録

HerokuにGemfile.lockがないとコンパイルできないので、含めて下さいと言われる。
Heroku require gemfile.locl スクリーンショット
だが、Gemfile.lockを含めていても…
remove gemfile.lock スクリーンショット
Windowsで生成したGemfile.lockだと警告されて削除、Heroku側でパッケージをインストールし直している、諸行無常。