正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

PlantUML

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab Self-Managed、GitLab Dedicated

スニペット、Wiki、リポジトリでダイアグラムを作成するにはPlantUMLインテグレーションを使用します。すべてのユーザー向けにGitLab.comはPlantUMLと統合されており、追加の設定は不要です。

GitLab Self-Managedインスタンスでインテグレーションをセットアップするには、PlantUMLサーバーを設定する必要があります。

インテグレーションが完了すると、PlantUMLは、plantumlブロックをHTML画像タグに変換します。このとき、ソースはPlantUMLインスタンスを指しています。PlantUMLダイアグラムの区切り文字@startuml/@endumlplantumlブロックに置き換えられるため、これらの区切り文字は不要です:

  • 拡張子.mdが付いたMarkdownファイル:

    ```plantuml
    Bob -> Alice : hello
    Alice -> Bob : hi
    ```

    その他の使用可能な拡張子については、languages.yamlファイルを参照してください。

  • 拡張子.asciidoc.adoc、または.ascが付いたAsciiDocファイル:

    [plantuml, format="png", id="myDiagram", width="200px"]
    ----
    Bob->Alice : hello
    Alice -> Bob : hi
    ----
  • reStructuredText:

    .. plantuml::
       :caption: Caption with **bold** and *italic*
    
       Bob -> Alice: hello
       Alice -> Bob: hi

    sphinxcontrib-plantumlとの互換性を保つためにuml::ディレクティブを使用できますが、GitLabはcaptionオプションのみをサポートします。

PlantUMLサーバーが正しく設定されている場合、これらの例では、コードブロックではなく、ダイアグラムがレンダリングされます:

Bob -> Alice : hello
Alice -> Bob : hi

ブロック内には、PlantUMLがサポートする次のようなダイアグラムを追加します:

ブロック定義にパラメータを追加します:

  • id: ダイアグラムHTMLタグに追加されたCSS ID。
  • width: 画像タグに追加された幅属性。
  • height: 画像タグに追加された高さ属性。

Markdownはパラメータをサポートしておらず、常にPNG形式を使用します。

ダイアグラムファイルをインクルードする

リポジトリ内の別のファイルからPlantUMLダイアグラムをインクルードするかまたは埋め込むには、includeディレクティブを使用します。これを使用して、専用ファイルで複雑なダイアグラムを管理したり、ダイアグラムを再利用したりします。次に例を示します:

  • Markdown:

    ```plantuml
    ::include{file=diagram.puml}
    ```
  • AsciiDoc:

    [plantuml, format="png", id="myDiagram", width="200px"]
    ----
    include::diagram.puml[]
    ----

PlantUMLサーバーを設定する

GitLabでPlantUMLを有効にする前に、ダイアグラムを生成するために、独自のPlantUMLサーバーを設定します:

Docker

DockerでPlantUMLコンテナを実行するには、次のコマンドを実行します:

docker run -d --name plantuml -p 8005:8080 plantuml/plantuml-server:tomcat

PlantUML URLは、コンテナを実行しているサーバーのホスト名です。

DockerでGitLabを実行する場合、PlantUMLコンテナにアクセスできる必要があります。アクセスできるようにするには、Docker Composeを使用します。この基本的なdocker-compose.ymlファイルで、GitLabはURL http://plantuml:8005/でPlantUMLにアクセスできます:

version: "3"
services:
  gitlab:
    image: 'gitlab/gitlab-ee:17.9.1-ee.0'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n    rewrite ^/-/plantuml/(.*) /$1 break;\n proxy_cache off; \n    proxy_pass  http://plantuml:8005/; \n}\n"

  plantuml:
    image: 'plantuml/plantuml-server:tomcat'
    container_name: plantuml
    ports:
     - "8005:8080"

その後、次のことができるようになります:

  1. ローカルPlantUMLアクセスを設定する
  2. PlantUMLのインストールが成功したことを確認する

Debian/Ubuntu

TomcatまたはJettyを使用して、Debian/UbuntuディストリビューションにPlantUMLサーバーをインストールして設定できます。以下の手順はTomcat用です。

前提要件:

  • JRE/JDKバージョン11以降。
  • (推奨)Jettyバージョン11以降。
  • (推奨)Tomcatバージョン10以降。

インストール

PlantUMLでは、Tomcat 10.1以降をインストールすることをお勧めします。このページでは、基本的なTomcatサーバーのセットアップのみを扱います。本番環境により適合した設定については、Tomcatのドキュメントを参照してください。

  1. JDK/JRE 11をインストールします:

    sudo apt update
    sudo apt install default-jre-headless graphviz git
  2. Tomcatのユーザーを追加します:

    sudo useradd -m -d /opt/tomcat -U -s /bin/false tomcat
  3. Tomcat 10.1をインストールして設定します:

    wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.33/bin/apache-tomcat-10.1.33.tar.gz -P /tmp
    sudo tar xzvf /tmp/apache-tomcat-10*tar.gz -C /opt/tomcat --strip-components=1
    sudo chown -R tomcat:tomcat /opt/tomcat/
    sudo chmod -R u+x /opt/tomcat/bin
  4. systemdサービスを作成します。/etc/systemd/system/tomcat.serviceファイルを編集して追加します:

    [Unit]
    Description=Tomcat
    After=network.target
    
    [Service]
    Type=forking
    
    User=tomcat
    Group=tomcat
    
    Environment="JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64"
    Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"
    Environment="CATALINA_BASE=/opt/tomcat"
    Environment="CATALINA_HOME=/opt/tomcat"
    Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
    Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
    
    ExecStart=/opt/tomcat/bin/startup.sh
    ExecStop=/opt/tomcat/bin/shutdown.sh
    
    RestartSec=10
    Restart=always
    
    [Install]
    WantedBy=multi-user.target

    JAVA_HOMEは、sudo update-java-alternatives -lに表示されるパスと同じである必要があります。

  5. ポートを設定するには、/opt/tomcat/conf/server.xmlを編集してポートを選択します。次の操作を行うことをおすすめします:

    • Tomcatシャットダウンポートを8005から8006に変更します。
    • Tomcat HTTPエンドポイントにポート8005を使用します。Pumaがポート8080でメトリクスをリッスンするため、デフォルトのポート8080は避ける必要があります。
    - <Server port="8006" shutdown="SHUTDOWN">
    + <Server port="8005" shutdown="SHUTDOWN">
    
    - <Connector port="8005" protocol="HTTP/1.1"
    + <Connector port="8080" protocol="HTTP/1.1"
    
  6. Tomcatを再読み込みして起動します:

    sudo systemctl daemon-reload
    sudo systemctl start tomcat
    sudo systemctl status tomcat
    sudo systemctl enable tomcat

    Javaプロセスはこれらのポートでリッスンする必要があります:

    root@gitlab-omnibus:/plantuml-server# ❯ ss -plnt | grep java
    LISTEN   0        1          [::ffff:127.0.0.1]:8006                   *:*       users:(("java",pid=27338,fd=52))
    LISTEN   0        100                         *:8005                   *:*       users:(("java",pid=27338,fd=43))
  7. PlantUMLをインストールし、.warファイルをコピーします:

    plantuml-jsp最新リリース(例: plantuml-jsp-v1.2024.8.war)を使用します。詳細については、イシュー265を参照してください。

    wget -P /tmp https://github.com/plantuml/plantuml-server/releases/download/v1.2024.8/plantuml-jsp-v1.2024.8.war
    sudo cp /tmp/plantuml-jsp-v1.2024.8.war /opt/tomcat/webapps/plantuml.war
    sudo chown tomcat:tomcat /opt/tomcat/webapps/plantuml.war
    sudo systemctl restart tomcat

Tomcatサービスを再起動する必要があります。再起動が完了すると、PlantUMLインテグレーションがポート8005: http://localhost:8005/plantumlでリクエストをリッスンする準備が整います。

Tomcatのデフォルトを変更するには、/opt/tomcat/conf/server.xmlファイルを編集します。

このアプローチを使用する場合、デフォルトのURLは異なります。Dockerベースのイメージでは、相対パスなしで、ルートURLでサービスを利用できます。必要に応じて、以下の設定を調整します。

その後、次のことができるようになります:

  1. ローカルPlantUMLアクセスを設定します。リンクで設定されたproxy_passポートがserver.xmlのコネクタポートと一致していることを確認します。
  2. PlantUMLのインストールが成功したことを確認します

ローカルPlantUMLアクセスを設定する

PlantUMLサーバーはサーバーでローカルに実行されます。そのため、デフォルトでは外部からアクセスできません。サーバーは、https://gitlab.example.com/-/plantuml/への外部PlantUML呼び出しをキャッチして、ローカルPlantUMLサーバーにリダイレクトする必要があります。セットアップに応じて、URLは次のいずれかになります:

  • http://plantuml:8080/
  • http://localhost:8080/plantuml/
  • http://plantuml:8005/
  • http://localhost:8005/plantuml/

TLSを使用してGitLabを実行している場合は、PlantUMLが脆弱なHTTPプロトコルを使用します。したがって、このリダイレクトを設定する必要があります。Google Chrome 86以降などの新しいブラウザでは、HTTPSを介して提供されるページ上で脆弱なHTTPリソースは読み込まれません。

バンドルされているGitLab NGINXを使用する

/etc/gitlab/gitlab.rbを変更できる場合は、リダイレクトを処理するようにバンドルされているNGINXを設定します:

  1. セットアップ方法に応じて、/etc/gitlab/gitlab.rbに次の行を追加します:

    # Docker install
    nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n  rewrite ^/-/plantuml/(.*) /$1 break;\n  proxy_cache off; \n    proxy_pass  http://plantuml:8005/; \n}\n"
    
    # Debian/Ubuntu install
    nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n  rewrite ^/-/plantuml/(.*) /$1 break;\n  proxy_cache off; \n    proxy_pass  http://localhost:8005/plantuml; \n}\n"
  2. 変更を有効にするには、次のコマンドを実行します:

    sudo gitlab-ctl reconfigure

HTTPS PlantUMLサーバーを使用する

gitlab.rbファイルを変更できない場合は、HTTPSを直接使用するようにPlantUMLサーバーを設定してください。この方法は、GitLab Dedicatedインスタンスにおすすめです。

この設定では、NGINXを使用してSSLターミネーションを処理し、PlantUMLコンテナへのリクエストをプロキシします。SSLターミネーションには、AWS Applicationロードバランサー (ALB)のようなクラウドベースのロードバランサーも使用できます。

  1. nginx.confファイルを作成します:

    events {
        worker_connections 1024;
    }
    
    http {
        server {
            listen 443 ssl;
            server_name _;
            ssl_certificate /etc/nginx/ssl/plantuml.crt;
            ssl_certificate_key /etc/nginx/ssl/plantuml.key;
            location / {
                proxy_pass http://plantuml:8080;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
            }
        }
    }
  2. plantuml.crtファイルとplantuml.keyファイルをsslディレクトリに追加します。

  3. docker-compose.ymlファイルを設定します:

    version: '3.8'
    
    services:
      plantuml:
        image: plantuml/plantuml-server:tomcat
        container_name: plantuml
        networks:
          - plantuml-net
    
      plantuml-ssl:
        image: nginx
        container_name: plantuml-ssl
        ports:
          - "8443:443"
        volumes:
          - ./nginx.conf:/etc/nginx/nginx.conf:ro
          - ./ssl:/etc/nginx/ssl:ro
        depends_on:
          - plantuml
        networks:
          - plantuml-net
    
    networks:
      plantuml-net:
        driver: bridge
  4. docker-compose upを使用してPlantUMLサーバーを起動します。

  5. URL https://your-server:8443PlantUMLインテグレーションを有効にします

PlantUMLのインストールを確認する

インストールが成功したことを確認するには、次の手順に従います:

  1. PlantUMLサーバーを直接テストします:

    # Docker install
    curl --location --verbose "http://localhost:8005/svg/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000"
    
    # Debian/Ubuntu install
    curl --location --verbose "http://localhost:8005/plantuml/svg/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000"

    テキストhelloが含まれるSVG出力を受け取るはずです。

  2. 次の場所にアクセスして、GitLabがNGINXを介してPlantUMLにアクセスできることをテストします:

    http://gitlab.example.com/-/plantuml/svg/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000

    gitlab.example.comをGitLabインスタンスのURLに置き換えます。helloを表示するレンダリングされたPlantUMLダイアグラムが表示されるはずです。

    Bob -> Alice : hello

PlantUMLのセキュリティを設定する

PlantUMLには、ネットワークリソースのフェッチを許可する機能があります。PlantUMLサーバーをセルフホストする場合は、ネットワークコントロールを配置して、PlantUMLサーバーを分離します。たとえば、PlantUMLのセキュリティプロファイルを利用します。

@startuml
start
    ' ...
    !include http://localhost/
stop;
@enduml

PlantUML SVGダイアグラム出力を保護する

PlantUMLダイアグラムをSVG形式で生成する際は、サーバーを設定してセキュリティを強化します。発生のおそれがあるセキュリティ上の問題を回避するために、NGINX設定でSVG出力ルートを無効にします。

SVG出力ルートを無効にするには、PlantUMLサービスをホストしているNGINXサーバーにこの設定を追加します:

location ~ ^/-/plantuml/svg/ {
    return 403;
}

この設定により、悪意のある可能性があるダイアグラムコードがブラウザで実行されることを防げます。

PlantUMLインテグレーションを有効にする

ローカルPlantUMLサーバーを設定したら、PlantUMLインテグレーションを有効にする準備が整います:

  1. 管理者ユーザーとしてGitLabにサインインします。
  2. 左側のサイドバーの下部で、管理者を選択します。新しいナビゲーションをオンにした場合は、右上隅でアバターを選択し、次に管理者を選択します。
  3. 左側のサイドバーで、設定 > 一般に移動し、PlantUMLセクションを展開する。
  4. PlantUMLを有効化チェックボックスをオンにします。
  5. PlantUMLインスタンスをhttps://gitlab.example.com/-/plantuml/として設定し、変更を保存を選択します。

PlantUMLとGitLabのバージョン番号によっては、次の手順も実行する必要がある場合があります:

  • plantuml.comなど、v1.2020.9以降を実行しているPlantUMLサーバーの場合、PLANTUML_ENCODING環境変数を設定して、deflate圧縮を有効にする必要があります。Linuxパッケージインストールでは、次のコマンドを使用して、この値を/etc/gitlab/gitlab.rbに設定できます:

    gitlab_rails['env'] = { 'PLANTUML_ENCODING' => 'deflate' }

    GitLab Helmチャートでは、次のように、変数をglobal.extraEnvセクションに追加して値を設定できます:

    global:
    extraEnv:
      PLANTUML_ENCODING: deflate
  • deflateは、PlantUMLのデフォルトのエンコードタイプです。別のエンコードタイプを使用する場合、PlantUMLインテグレーションでは、URLのヘッダープレフィックスで異なるエンコードタイプを区別する必要があります。

トラブルシューティング

更新後もレンダリングされたダイアグラムのURLが同じままである

レンダリングされたダイアグラムはキャッシュされます。更新を表示するには、次の手順を試してください:

  • ダイアグラムがMarkdownファイルにある場合は、Markdownファイルに小さな変更を加えてコミットします。これにより、再レンダリングがトリガーされます。
  • Markdownキャッシュを無効にして、データベースまたはRedisにキャッシュされたMarkdownを強制的にクリアします。

更新されたURLがまだ表示されない場合は、以下を確認してください:

  • PlantUMLサーバーがGitLabインスタンスからアクセスできることを確認します。
  • PlantUMLインテグレーションがGitLabの設定で有効になっていることを確認します。
  • PlantUMLレンダリングに関連するエラーについてGitLabログを確認します。
  • GitLab Redisキャッシュをクリアします

ブラウザでPlantUMLページを開くと404エラーが発生する

PlantUMLサーバーがDebianまたはUbuntuでセットアップされている場合、https://gitlab.example.com/-/plantuml/にアクセスすると404エラーが発生することがあります。

このエラーは、インテグレーションが機能している場合でも発生する可能性があります。これは、PlantUMLサーバーまたは設定に関する問題を必ずしも示すものではありません。

PlantUMLが正しく動作しているか確認するには、PlantUMLのインストールを確認してください。