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











