Ubuntu18.04 Redmine導入メモ Dokcer編

急にRedmineが使いたくなり、結局オレが環境を構築する羽目に陥った。
構築したシステムは運用場所を動かす可能性があり、Dockerで構築して、イメージを持って行けるようにしようと考えた。





せっかくやるんだし、ユーザー認証はSamba-ad-dcで行いたいし、Keycloakを使ったSSOにもしたい。
ターゲットとなるシステムは既に本番運用中、それらに悪影響しない形でシステムを追加したい。

なんて考えていたら、結局丸3日掛かってしまった。

      

環境

いつも通りテスト環境で構築して手順を確立し、本番環境に適用する。

OSはUbuntu 18.04 LTS、内向きDNSで temp.hogeserver.hogeddns.jp で名前解決ができるようになっている。
本番同様MariaDB(10.1.47)とApache(2.4.29)が動いている。

Samba-ad-dc(2.4.7.6)はaddc.hogeserver.hogeddns.jp、Keycloak(10.0.2)はkeycloak.hogeserver.hogeddns.jpとして稼働中。

Ubuntuに最新版のDockerをインストール

公式のリポジトリを参照する方法でインストールする。
本家の記事はこちら。
docker docks / Install Docker Engine on Ubuntu

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) docker@docker.com
sub   rsa4096 2017-02-22 [S]

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

$ sudo apt install docker-ce docker-ce-cli containerd.io
$ docker -v
Docker version 20.10.6, build 370c289

リポジトリに登録されているパッケージを調べてみる。
ServerFault / list all packages from a repository in ubuntu / debian

$ grep -h -P -o "^Package: \K.*" /var/lib/apt/lists/download.docker.com_linux_ubuntu_dists_bionic_stable_binary-amd64_Packages | sort -u
containerd.io
docker-ce
docker-ce-cli
docker-ce-rootless-extras
docker-scan-plugin

リポジトリにはComposeが含まれていないことが分かったので、公式の手順でインストールする。
この日のバージョンは1.29.1で、公式の手順にも反映されている。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.29.1, build c34c88b2

本日時点で最新のバージョンがインストールできた。

Composeファイルの作成

調べる

RedmineとMariaDBを動作させるためのComposeファイルを作って動かすことにする。
環境を移設するときにはRedmineとMariaDBのイメージを持っていこう。

オフィシャルイメージはこれっぽい。
Redmine (この日のバージョンは 4.2.1)
MariaDB (この日のバージョンは 10.6.0)

作る

Composeファイルをちゃんと書いたことはなく、こちらの記事をほぼそのまま持ってきて、オフィシャルイメージの説明を見ながらちょこちょこ修正。
Qiita / Redmine を Docker 公式イメージで運用する

docker-compose.yml ※ディレクトリはどこでもよい。
version: "3.9"
services:

  redmine:
    image: redmine:latest
    container_name: redmine
    restart: always
    ports:
      - 3000:3000
    depends_on:
      - mariadb
    environment:
      TZ: Asia/Tokyo
      REDMINE_DB_MYSQL: redminedb
      REDMINE_DB_PORT: 3306
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_PASSWORD: redminepassword
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_ENCODING: utf8mb4

  mariadb:
    image: mariadb:latest
    container_name: redminedb
    restart: always
    ports:
      - 13306:3306
    environment:
      TZ: Asia/Tokyo
      MYSQL_DATABASE: redmine
      MYSQL_USER: redmine
      MYSQL_PASSWORD: redminepassword
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"

もしかして外からDBが確認できたらいいな、と、3306を13306にProxyしてみている。
でも、コンテナ同士は個別のIPアドレスを持っていて3306でアクセスしているので、redmine側のポートは3306のまま。

書いたComposeファイルの中身を確かめる

サービスとネットワーク、ボリュームを定義するファイル。
ということなのだが、docker-compose.ymlを作ろうとして、最初っから躓いた。バージョンって何?ってところから。
Docker docs / Compose file version 3 reference

version

公式のマトリックスには3.8までしか記載がないが、どのサンプルも3.9で書かれている。
とりあえず、3.9でやってみる。

services

コンテナに適用される設定で、環境変数を書くこともできる。

それぞれのコンテナにはredmineとmariadbという名前を付けておこうと思う。

image

イメージを指定する。リポジトリ/タグ形式か部分イメージIDで指定するとされている。
RedmineとMariaDBのオフィシャルイメージを見ると、latestというタグがサポートされている模様。

どうやら、ローカルにあるイメージも指定できそうだが、これは別の機会の学習課題(docker runで走らせたKeycloakを扱いやすくしたいし、引っ越しの時にも使えそうだし)。

container_name

Dockerは docker run でイメージを作ると適当な名前が付けられた記憶。
多分、これを自分で定義するってことだと思われる。

そして、コンテナ同士はこの名前でやりとりできる、いわゆるホスト名として扱える。
Redmineのイメージにはaptが含まれており、hostコマンドをインストールできて、MariaDBが参照できることが実験できた。

restart

再起動のポリシーを決めておく。

ports

ports: host:container という書き方の模様。

ホストにMariaDBが入っているのでポートがぶつかるため、ホストのポートを変えた。
Redmineもそのポートを指すようにする必要があった。

depends_on

先に起動しておいて欲しいサービスを書く。RedmineはMariaDBが先に起動しておかないと具合が悪い。

environment

環境変数を指定しておくと、コンテナーに渡される。

RedmineとMariaDBはオフィシャルイメージのところに利用可能な環境変数を書いてくれていた。
それぞれよく見て設定値を決める。

MariaDBはrootのパスワードを空にしているが、そのホストにアクセスできるユーザーを考えるとこれでいい、と判断してのこと。
そうでない場合はパスワードを設定しておくのがよさそう。

Redmineを起動

docker-composeコマンドについて

docker-composeというコマンドを使い、docker-compose.yml に定義したイメージを構築し、コンテナを起動したり落としたりする。

docker-compose up について、まとまった資料はこちら。
Qiita / `docker-compose up`って何?

  • まだイメージが作成されていなければ、イメージを作成して、さらにコンテナを作成・起動する
  • すでにコンテナが存在すれば、イメージ・コンテナの再作成は行わず、(停止中の)コンテナを起動するだけ

`docker-compose up`って何? から引用

設定変更が上手く反映できないときは、–no-cache パラメーターを追加してbuildすると良いらしい。
HACKNOTE / docker をキャッシュを使わないでビルドする

完全にクリーンな環境に戻したくなったら、downするらしい。
Qiita / 《滅びの呪文》Docker Composeで作ったコンテナ、イメージ、ボリューム、ネットワークを一括完全消去する便利コマンド

記事を書いている途中、まっさら環境に戻そうとしたが、この場合はコンテナを全部削除していた。
Imageを残しておけば、再度動かすときにイメージをプルする時間が短縮できるね、と。

起動する

docker-composeについてなんとなく分かったところで、作ったComposeファイルをupしてみる。

$ sudo docker-compose up -d
Creating network "docker_default" with the default driver
Pulling redmine (mariadb:latest)...
latest: Pulling from library/mariadb
345e3491a907: Pull complete
…
Status: Downloaded newer image for redmine:latest
Creating redmine ... done
Creating mariadb ... done

起動したらしい。

$ sudo docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED              STATUS          PORTS                                       NAMES
060ea0dc3551   redmine:latest   "/docker-entrypoint.…"   About a minute ago   Up 30 seconds   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   redmine
ed94b7bda847   mariadb:latest   "docker-entrypoint.s…"   About a minute ago   Up 31 seconds   3306/tcp                                    redminedb

MariaDBを確認してみる。最初つながらなくて???となったが、こちらで接続方法を教えてくれた。
ジムには乗りたい / MySQL、localhostだとポート指定オプション効かないってマジですか。。

$ sudo mysql -h 127.0.0.1 -P 13306

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| redmine            |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> use redmine;

MariaDB [redmine]> show tables;
+-------------------------------------+
| Tables_in_redmine                   |
+-------------------------------------+
| ar_internal_metadata                |
| attachments                         |
| auth_sources                        |
…
| wikis                               |
| workflows                           |
+-------------------------------------+
56 rows in set (0.00 sec)

MariaDB [(none)]> quit
Bye

テーブルも問題なく作られたようだ。

アクセスしてみる

ポート3000を開けて、http://temp.hogeserver.hogeddns.jp:3000 にアクセスしてみると、画面が表示された。
user:admin / password:admin でログインし、パスワードを変更して利用開始。

アクセステストはブラウザをシークレットモードにしておいた方がよさそう。
ログインした情報がキャッシュされていると、httpsでアクセスできるように設定した後で、ログイン時にCSRF問題が発生するので。
(ブラウザを完全に落として起動し直したところ、問題は解消したが、念のため)

コンテナの中に入って色々見てみる

色々いじるのだろうから、コンテナの中に入る方法を思い出さなければ
ついでに簡単に情報をさらっておこう。

$ sudo docker exec -u 0 -it redmine /bin/bash --login

# pwd
/usr/src/redmine

# getent password
…
redmine:x:999:999::/home/redmine:/bin/sh

# apt update
# apt install vi

中に入ってみたところ、redmineの基本となるディレクトリは /usr/src/redmine にあるらしい。
また、ユーザーとしてredmineが定義されていて、IDは999であった。

試しに、apt updateしてみたところ動いたので、vimをインストールして中身をちょこっといじれるようにした。

サブディレクトリで動くようにする

サブディレクトリ /redmine で動かすのはなかなか大変だった。

他のシステムと共存させるつもり。本格的に動かすようになったら専用のサーバーでもいいかもしれないが、それ程忙しく動くとは思えないので、いったんは共存。
サブドメインだったら何の問題もなく動くと思うが、サブディレクトリではなかなか動作しない…。

やっていることは間違っていなさそうだと気付かせてくれたのがこちら。
Qiita / docker+nginx+redmine+postgresql+サブディレクトリ
redmine/Dockerfileの中でやっていることが、それまでに調べていたことだったので、これだなと。

また、これらの情報を総合すると、幾つかのファイルで設定を変更すれば、サブディレクトリで動きそうなことが分かってきた。
Redmine / issues / Redmine 4.0 can not be installed in a sub-URI any more
Redmine / issues / Hosting redmine at a suburl doesn’t work anymore in 4.0

 

まず、編集したいファイルを持ってくる。
ついでにファイルの持ち主を 999:999 にしておく。書き戻すときに楽チン。

$ sudo docker cp redmine:/usr/src/redmine/config.ru .
$ sudo docker cp redmine:/usr/src/redmine/config/environment.rb .
$ sudo chown 999:999 config.ru
$ sudo chown 999:999 environment.rb

サブディレクトリで動作させるための設定を入れていく。

/usr/src/redmine/config.ru
# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
#run Rails.application
map ENV['RAILS_RELATIVE_URL_ROOT'] || '/' do
  run Rails.application
end

 

/usr/src/redmine/config/environment.rb
…
# Initialize the Rails application
Rails.application.initialize!

ActionController::Base.relative_url_root = RedmineApp::Application.routes.default_scope
Redmine::Utils::relative_url_root = RedmineApp::Application.routes.default_scope

ENV['RAILS_RELATIVE_URL_ROOT'] = "/redmine"
Redmine::Utils::relative_url_root = ENV['RAILS_RELATIVE_URL_ROOT']

編集結果を書き戻して反映させる。

$ sudo docker cp -a config.ru redmine:/usr/src/redmine
$ sudo docker cp -a environment.rb redmine:/usr/src/redmine/config
$ sudo docker-compose restart redmine

 

これでサブディレクトリで動くようになった。

ApacheでProxyする

他のWebシステムが動いているので、ApacheでProxyさせてみようと思う。
ポート3000を指定する形で運用することもできるといえばできるが、HTTPで動いているシステムもSSL証明書で守れるし、Proxyの方が楽チンだろうと思った。

既存のconfファイルを編集する。

<VirtualHost *:443>
     ServerName temp.hogeserver.hogeddns.jp
…
    SSLProxyEngine on
    ProxyPreserveHost on
    ProxyPass /redmine/ http://localhost:3000/redmine/
    ProxyPassReverse /redmine/ http://localhost:3000/redmine/
…
</VirtualHost>

必要に応じてSSL Proxyのモジュールを有効化させたりして、設定を反映させる。
こんな適当な感じでもちゃんと動いたので良かった。

SSO設定(SAML認証)

Keycloakを使ったSSO、ログイン認証にはSAMLを使う。

Keycloak側の設定

レルム追加

本番環境では稼働中のレルムを使うが、テスト環境はまともに動くレルムがなかったので新たに作った。
レルムの名前表記は{RealmName}とマスクしているが、よしなに。

一般 → エンドポイント → SAML 2.0アイデンティティー・プロバイダー・メタデータを開いておいて、後で使う。

項目設定値備考
ログイン状態の保存オンブラウザを閉じたらログインし直すのも悪くないが、ローカルからのアクセスのみなので、ログイン状態を保存する。
セッションの有効期間であれば有効にするチェックボックスが出るようになるらしい。
Eメールでログインオフドメインに参加したPCと同じように、アカウントでログインできるようにしたい。

クライアント追加

Redmine用のクライアントを作る。

設定タブでこちらを設定。

項目設定値備考
クライアント IDredmine
名前Redmine
有効オン
クライアントプロトコルsaml
ドキュメントを署名するオンデフォルトでオンだが、次の設定項目に影響するので、念のため記載。
署名アルゴリズムRSA_SHA1これでないと動かない。
SAML署名鍵名KEY_ID
正規化方式EXCLUSIVEこれでないと動かない。
Name ID フォーマットを強制オンテストの過程で何度もオンオフしたが、今回は効果がないかもしれない。
Name ID フォーマットusername
有効なリダイレクト URLhttps://temp.hogeserver.hogeddns.jp/redmine/*
ベースURLhttps://temp.hogeserver.hogeddns.jp/redmine/
SAML を処理するマスター URLhttps://temp.hogeserver.hogeddns.jp/redmine/auth/saml/callback
IDP Initiated SSO の URL Nameredmine

クライアントスコープタブで、role_listを割り当てから外す。
今回利用するSAMLプラグインでは利用しないため。

マッパータブは以下の4つを用意。
Redmine側にはSAML Attribute Nameで見えていて、これは後で saml.rb でマッピングする。

項目マッパータイププロパティFriendly NameSAML Attribute NameSAML Attribute Name Format備考
firstnameUser PropertyfirstName<無指定>firstnameBasic
lastnameUser PropertylastName<無指定>lastnameBasic
name_idUser Propertyusername<無指定>name_idBasicRedmine側にはname_idで見える。
emailUser Propertyemail<無指定>emailBasic

ユーザーフェデレーション追加

Samba-ad-dcでユーザー管理をしているので、それに合わせた設定をしている。
大まかには以下。

項目設定値備考
有効オン
編集モードオフAD DCの情報を書き換えたくない(過去に痛い目を見た)。
ベンダーActive Directory
ユーザー名の LDAP 属性sAMAccountName
RDN LDAP 属性cn
UUID LDAP 属性objectGUID
ユーザーオブジェクトクラperson, organizationalPerson, user
接続 URLldap://addc.hogeserver.hogeddns.jpldapsでもいけるはずだが、Keycloakコンテナの中で証明書をいじるのが面倒で…
ユーザー DNCN=Users,DC=hogeserver,DC=hogeddns,DC=jpここは完全にSamba-ad-dc向け。ActiveDirectoryの場合はよしなに。
バインドタイプsimple準備しているLDAPサーバーの状態によってよしなに。
StartTLS の有効オフ 〃
Bind DNssoauth@hogeserver.hogeddns.jpssoauthというユーザーを作ったのでこれを使う。
Bind のクレデンシャル<ssoauthのパスワード>
カスタムユーザー LDAP フィルター<未指定>今回使うプラグインの場合は、ここでフィルタしないと利用者を限定できないが、他のクライアントに影響が出そう。
利用者を限定するときはSSOを諦めれば、標準のLDAP認証を使うのが簡単そう。

Redmine側の設定

Keycloakの設定を反映したSAML認証の為の設定をしていく。

SAML認証

SAMLを使ったSSOを考えた。プラグインが必要らしいが、できないと書いているサイトもあるが、どうなんだろう?
※調べた中で、Redmineはもう主流ではなくなっていると薄々感じていたが、ここら辺でしみてきはじめた。

Redmineのプラグインを探してみたところ、Redmine OmniAuth SAML pluginというのがあり、4.0Fixというのが2年前にリリースされているみたい。
4.0Fixの中身を見てみたら、userテーブルに列created_by_omniauth_samlを追加することで、上の手順で実行されていた。
書かれている手順通りにインストールする。

$ sudo docker exec -u 999 -it redmine /bin/bash --login

$ cd plugins
$ git clone git://github.com/chrodriguez/redmine_omniauth_saml.git
$ bundle install

$ cd ../
$ RAILS_ENV=production bundle exec rake redmine:plugins
$ exit

$ sudo docker-compose restart redmine

※過去に tmp/restart.txt を配置して再起動する方法を使っていたが、このバージョンでは上手く再起動しなかった。

管理画面に行ってみるとプラグインが登録されていた。
Create users automatically? というチェック項目があったので、チェックしておいた。

さて、Keycloakとの連携は rb ファイルで定義するらしい。中からファイルを取り出して、編集後に書き戻す。

$ sudo docker cp redmine:/usr/src/redmine/plugins/redmine_omniauth_saml/sample-saml-initializers.rb ./saml.rb
$ sudo chown 999:999 saml.rb

saml.rbは割と柔軟に書くことができるが、設定を間違えると全然動かない。
Keycloak側の設定と上手く合わせていく。

なお、サインアウトの設定は結局成功していなくて、こちらで教えてもらったRedmineからのログアウト先を指定している。
Qiita / RedmineをG SuiteでSAML SSOしてみた

saml.rb
Redmine::OmniAuthSAML::Base.configure do |config|
  config.saml = {
    # OmniAuth callback URL 多分決めておいてKeycloakに反映させるもの
    :assertion_consumer_service_url => "https://temp.hogeserver.hogeddns.jp/redmine/auth/saml/callback",

    # Keycloakで設定したクライアントIDをここに設定
    :issuer                         => "redmine",

    # The SLS (logout) callback URL
    # どこで使われているのか分からない
    # Redmineからだけはログアウトできる
    #:single_logout_service_url      => "https://temp.hogeserver.hogeddns.jp/redmine/auth/saml/sls",

    # SSO login endpoint
    :idp_sso_target_url             => "https://keycloak.hogeserver.hogeddns.jp/auth/realms/{RealmName}/protocol/saml/clients/redmine",

    # 下の証明書から取り出したfingerprintを設定
    :idp_cert_fingerprint           => "XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX",

    # Keycloak SAML2.0 IdP メタデータにある証明書情報を\n\nの間に書き入れる
    :idp_cert                       => "-----BEGIN CERTIFICATE-----\nMIICp<省略>B+tKO\n-----END CERTIFICATE-----",

    # Keycloak SAML2.0 IdP メタデータにあるかどうか確認
    :name_identifier_format         => "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",

    # Optional signout URL, not supported by all identity providers
    # どこで使われているのか分からない
    # Redmineからだけはログアウトできる
    #:signout_url                    => "https://temp.hogeserver.hogeddns.jp/redmine/auth/saml/sls",

    # サインアウトで呼び出されるURL
    # Redmineからだけはログアウトできる
    :idp_slo_target_url             => "https://temp.hogeserver.hogeddns.jp/redmine/auth/saml/sls",

    # Which redmine field is used as name_identifier_value for SAML logout
    # どこで使われているのか分からないが、指定しておかないとRedmineが起動しない
    :name_identifier_value          => "mail",

    # Keycloakでマッパーで設定した値をここでマッピングする(extra.raw_info.の部分は取り外して使われる模様)
    :attribute_mapping              => {
      :firstname  => 'extra.raw_info.firstname',
      :lastname   => 'extra.raw_info.lastname',
      :login      => 'extra.raw_info.name_id',
      :mail       => 'extra.raw_info.email'
    }
  }

  config.on_login do |omniauth_hash, user|
    # Implement any hook you want here
  end
end

ファイルの編集が終わったら、イメージの中にファイルを放り込み、設定を反映させるためコンテナを再起動する。

$ sudo docker cp -a saml.rb redmine:/usr/src/redmine/config/initializers/
$ sudo docker-compose restart redmine

※書き戻している先が変わっていることに注意。

GUIによる設定

Redmineにadminでログインして、プラグインの設定を開く。
Create users automatically? にチェックを入れて保存する。いちいちユーザー登録するのは面倒すぎるので。

試す

ログイン画面に Login with SAML ボタンがあるので、それをクリックする。
表示されたKeycloakのログイン画面でSamba-ad-dcに登録済みのユーザー情報を入力してログインしてみる…

ユーザーが作られ、ログインできるようになっていた。

アクセスできる人を限定

試したところで…完成!と思ったけれど、よくよく考えると1つやることがあった。
アクセスできる人を限定する必要があり、これも設定していったが、これは別ページに切り出した。

今回はこれまで。

やったこと

Redmineの設定あれこれ

ログレベル

これを設定すると、細かなログが出る。

/usr/src/redmine/config/environments/production.rb
…
  # Print deprecation notices to the Rails logger.
  config.active_support.deprecation = :log

  # Log level. add 2021/05/03
  # :error, :info, :debug
  config.log_level = :debug

end

 

SAML認証でSAML response missing ‘name_id’

SAML認証の動作確認の過程で、どうしても先に進めずに悩んでいたところがname_idをチェックする問題。

ここからの流れで削除された模様。
Github / omniauth / omniauth-saml / Why do we need to validate the @name_id is present? #106
Github / omniauth / omniauth-saml / Chore: Increase Coverage #137

/usr/local/bundle/gems/omniauth-saml-cespi-1.3.1/lib/omniauth/strategies/saml.rb
        &name_id = response.name_id
        &attributes = response.attributes

        #if &name_id.nil? || &name_id.empty?
        #  raise OmniAuth::Strategies::SAML::ValidationError.new("SAML response missing 'name_id'")
        #end

        response.validate!

※チェックをコメントアウト。

ここを通過した後、証明書関連のエラーが出て、原因が他にあることが判明。
「ドキュメントを署名する」をオンにした後、「正規化方式」を色々いじっていたことを思い出し、「Exclusive」に戻したところ、動作し始めた。

正規化方式で必要な情報が正規化されて、プラグインの側で正しく情報を読み取れなかったのが原因らしい。

サブディレクトリで動かすために調べたこと

サブディレクトリで動作させることについては、公式のWikiにも書かれていたりする。
Redmine / HowTo Install Redmine on subdirectory (sub-URI) on Apache
Redmine / HowTo Install Redmine in a sub-URI

後から読み直してみれば、これが答えの1つ。
Composeファイルで環境変数を使ってサブディレクトリを指定し、config.ruに設定を加えているのだが、最初に読んだ時点では分からなかった。
delete from hateblo.jp where 1=1; / Redmineをdockerで動かそう+サブディレクトリ

Dockerではなく、OSに普通にインストールした場合にはこの方法でいけるらしい。
これも答えの1つで、全体がサブディレクトリでアクセスできるように /redmine と言う名前でインストールディレクトリのシンボリックリンクを作っていた。
Redmine.JP Blog / Redmine 4.1をUbuntu Server 18.04.3 LTSにインストールする手順

公式イメージではなく、sameersbnさん提供のイメージを使えば、環境変数1つで動作するディレクトリを変えられるらしい。
ぐらついたし、試しもしたけれど、何かの設定がうまくできず(単に分かっていないだけだが)、損切りできない悪い癖が出て、公式で何とかしようとして本編の結果となった。
Qiita / gitlabとredmineをサブディレクトリ運用する(サブドメイン運用からサブディレクトリ運用へ)
Github / docker-redmine
DockerHub / sameersbn/redmine

動いていたはずのKeycloakが動かない

色々とサーバーの設定をした結果、利用しているポートがバッティングした?せいなのか??Keycloakが動いていなかった。

ログの確認

ログを見ると何が起きているのかが分かる。何も起きていないかもしれないことも含めて。

$ sudo docker logs -f --tail 10 keycloak

 

ポートの確認

ポートをちゃんとProxyできているのか確認するのに、以下のコマンドを使った。

$ sudo ss -p -A -n tcp,udp,raw state listening state unconnected

userがdocker-proxyという形で表示される。

Docker Proxy ポートの変更

docker run で始めたので、ポートの変更とかが非常に厄介。

いままでは、/var/lib/docker/containers/{container-id}/config.v2.json で変えられると思っていたのだが、実際には上手く動作せず。
環境変数はこれで変えられたと思っていたのだが…。

調べてみるとここに有力情報。
stackoverflow / How do I assign a port mapping to an existing Docker container?

確かに、/var/lib/docker/containers/{container-id}/hostconfig.json で変更することができた。

サービスポートの変更

前にもはまって、今回もはまって…
Keycloakの動きを変えるときは standalone-ha.xml であって、standalone.xml ではない。
viもなく、外に持ち出して編集してコピーしてって手間も掛かるわけだけれども、とにかく名前に注意。haって何だ?とは思うけど。

また、コピーしてファイルを戻したとき、書き入れた人がrootになっていて履歴を撮ることができなくなったりする。
なので、書き入れた後に持ち主とパーミッションを変える必要がある。

ファイルのありかはここ。
/opt/jboss/keycloak/standalone/configuration

Keycloakのタイムゾーンを変更

/var/lib/docker/containers/{container-id}/config.v2.json に

…”Env”:[“PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin”,”container=oci”,”TZ=Asia/Tokyo”,”JDBC_POSTGRES_VERSION=42.2.5″,…

を追加したら、タイムゾーンがJSTに変わった。

さいごに

何でこんなに時間が掛かってしまったのか、とても不思議。

振り返って考えてみると、情報があるようで、でも背景知識が足らなくて分からず、色々やってみてこれだったのか!と思ったこともあった。
まだまだ学習あるのみだなー。

お気軽にどうぞ ~ 投稿に関するご意見・感想・他

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です