plantuml-serverはdocker imageが既にあるので簡単に公開する事ができます。
外部サーバに立てると、誰でもアクセスできてしまうため、Basic認証を付けたいことがあります。WebのUIから使うだけならIDP連携でOAuth認証を入れてしまえば良いのですが、Visual Studio Codeのプラグインと連携させる場合は、OAuthは対応していないため、Basic認証にするしかありません。
docker-composeを利用して、nginxでbasic認証をかけてplantumlにproxyするのが簡単です。
そして、nginxのbasic認証に特化したイメージがあります ⇒ quay.io/dtan4/nginx-basic-auth-proxy
しかし、普通に設定すると、PlantUMLの画面でホスト名がplantuml:8080
というホスト名になってしまいます。
これは、例えば、http://example.com
にデプロイしたとして、User
⇒ http://example.com
⇒ nginx
⇒ http://plantuml:8080/
⇒ PlantUMLのApplicationサーバ(Jetty or Tomcat)
となり、PlantUML(Jetty)から見ると、plantuml:8080
というホスト名でアクセスに来ているからです。
PlantUMLのコード
PlantUMLのコードでは、JSPのTagLibで次のように記述されています。
<c:set var="contextroot" value="${pageContext.request.contextPath}" /> |
pageContext.request.serverName
がplantuml:8080
になります。
一方、nginx-basic-auth-proxy
では、X-Forwarded-Host
を設定しています。(参考)
つまり、Jetty側でこのヘッダをHostとして扱えば良いわけです。
Jettyでは、X-Forwarded-xxの処理を良い感じに処理してくれるモジュールとしてhttp-forwarded
があります。
PlantUMLのJetty版の元のイメージはこちらを利用しており、
http-forwardedはデフォルトでは有効になっていませんが、/usr/local/jetty/etc/jetty-http-forwarded.xml
にあります。
そして、有効にするためには、--module=http-forwarded
の引数を付ければ有効になります。
PlantUMLのDockerfileの定義は、Entrypointが/docker-entrypoint.sh
。Commandがjava -jar /usr/local/jetty/start.jar
です。
ここに引数を追加するには、command: java -jar /usr/local/jetty/start.jar --module=http-forwarded
とすれば良いです。
docker-compose.yaml
こんな感じで。ALLOW_PLANTUML_INCLUDE
は、!includeで綺麗にするスタイルを外部ファイル化しており、毎回当てるので有効にしています。
version: "3.3" |
VS Codeのプラグインの設定
利用しているPlantUMLのPluginはこちら。
名前: PlantUML |
次のように、RenderをLocal
からPlantUMLServer
にします。
そして、Server
にdocker-composeで起動したURLを設定します。Basic認証の情報はURLに入れる事ができるので、http://test-user:test-password@example.com/
のように設定します。
参考
- 検証用にDockerでBasic認証をかけたWebサーバーを作ってみた
- Basic 認証かけるだけのプロキシサーバ Docker image 作った
- ENTRYPOINTは「必ず実行」、CMDは「(デフォルトの)引数」
- Github: jetty.docker
- Github: nginx-basic-auth-proxy
- Github Issue: Use PlantUML behind a reverse proxy #79
- Github Issue: frontpage redirect #64
- Github Issue: Reverse proxy issue due to absolute http urls used for image #163