急に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用のクライアントを作る。
設定タブでこちらを設定。
項目 | 設定値 | 備考 |
---|---|---|
クライアント ID | redmine | |
名前 | Redmine | |
有効 | オン | |
クライアントプロトコル | saml | |
ドキュメントを署名する | オン | デフォルトでオンだが、次の設定項目に影響するので、念のため記載。 |
署名アルゴリズム | RSA_SHA1 | これでないと動かない。 |
SAML署名鍵名 | KEY_ID | |
正規化方式 | EXCLUSIVE | これでないと動かない。 |
Name ID フォーマットを強制 | オン | テストの過程で何度もオンオフしたが、今回は効果がないかもしれない。 |
Name ID フォーマット | username | |
有効なリダイレクト URL | https://temp.hogeserver.hogeddns.jp/redmine/* | |
ベースURL | https://temp.hogeserver.hogeddns.jp/redmine/ | |
SAML を処理するマスター URL | https://temp.hogeserver.hogeddns.jp/redmine/auth/saml/callback | |
IDP Initiated SSO の URL Name | redmine |
クライアントスコープタブで、role_listを割り当てから外す。
今回利用するSAMLプラグインでは利用しないため。
マッパータブは以下の4つを用意。
Redmine側にはSAML Attribute Nameで見えていて、これは後で saml.rb でマッピングする。
項目 | マッパータイプ | プロパティ | Friendly Name | SAML Attribute Name | SAML Attribute Name Format | 備考 |
---|---|---|---|---|---|---|
firstname | User Property | firstName | <無指定> | firstname | Basic | |
lastname | User Property | lastName | <無指定> | lastname | Basic | |
name_id | User Property | username | <無指定> | name_id | Basic | Redmine側にはname_idで見える。 |
User Property | <無指定> | Basic |
ユーザーフェデレーション追加
Samba-ad-dcでユーザー管理をしているので、それに合わせた設定をしている。
大まかには以下。
項目 | 設定値 | 備考 |
---|---|---|
有効 | オン | |
編集モード | オフ | AD DCの情報を書き換えたくない(過去に痛い目を見た)。 |
ベンダー | Active Directory | |
ユーザー名の LDAP 属性 | sAMAccountName | |
RDN LDAP 属性 | cn | |
UUID LDAP 属性 | objectGUID | |
ユーザーオブジェクトクラ | person, organizationalPerson, user | |
接続 URL | ldap://addc.hogeserver.hogeddns.jp | ldapsでもいけるはずだが、Keycloakコンテナの中で証明書をいじるのが面倒で… |
ユーザー DN | CN=Users,DC=hogeserver,DC=hogeddns,DC=jp | ここは完全にSamba-ad-dc向け。ActiveDirectoryの場合はよしなに。 |
バインドタイプ | simple | 準備しているLDAPサーバーの状態によってよしなに。 |
StartTLS の有効 | オフ | 〃 |
Bind DN | ssoauth@hogeserver.hogeddns.jp | ssoauthというユーザーを作ったのでこれを使う。 |
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に変わった。
さいごに
何でこんなに時間が掛かってしまったのか、とても不思議。
振り返って考えてみると、情報があるようで、でも背景知識が足らなくて分からず、色々やってみてこれだったのか!と思ったこともあった。
まだまだ学習あるのみだなー。
コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他