2020-07-30 08:09:33 -04:00
---
stage: Create
group: Source Code
2020-11-26 01:09:20 -05:00
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
2020-07-30 08:09:33 -04:00
type: reference, howto
---
2021-02-18 13:10:41 -05:00
# PlantUML and GitLab **(FREE)**
2016-11-28 12:41:29 -05:00
2020-03-25 11:07:47 -04:00
When [PlantUML ](https://plantuml.com ) integration is enabled and configured in
2021-02-18 13:10:41 -05:00
GitLab, you can create diagrams in snippets, wikis, and repositories. To set up
the integration, you must:
1. [Configure your PlantUML server ](#configure-your-plantuml-server ).
1. [Configure local PlantUML access ](#configure-local-plantuml-access ).
1. [Configure PlantUML security ](#configure-plantuml-security ).
1. [Enable the integration ](#enable-plantuml-integration ).
After completing the integration, PlantUML converts `plantuml`
blocks to an HTML image tag, with the source pointing to the PlantUML instance. The PlantUML
diagram delimiters `@startuml` /`@enduml` aren't required, as these are replaced
by the `plantuml` block:
2022-03-07 10:22:51 -05:00
- **Markdown** files with the extension `.md` :
2021-02-18 13:10:41 -05:00
````markdown
```plantuml
Bob -> Alice : hello
Alice -> Bob : hi
```
````
2022-03-07 10:22:51 -05:00
For additional acceptable extensions, review the
[`languages.yaml` ](https://gitlab.com/gitlab-org/gitlab/-/blob/master/vendor/languages.yml#L3174 ) file.
- **AsciiDoc** files with the extension `.asciidoc` , `.adoc` , or `.asc` :
2021-02-18 13:10:41 -05:00
```plaintext
[plantuml, format="png", id="myDiagram", width="200px"]
----
Bob->Alice : hello
Alice -> Bob : hi
----
```
- **reStructuredText**
2016-11-28 12:41:29 -05:00
2021-02-18 13:10:41 -05:00
```plaintext
.. plantuml::
:caption: Caption with **bold** and *italic*
Bob -> Alice: hello
Alice -> Bob: hi
```
2016-11-28 12:41:29 -05:00
2021-02-18 13:10:41 -05:00
Although you can use the `uml::` directive for compatibility with
[`sphinxcontrib-plantuml` ](https://pypi.org/project/sphinxcontrib-plantuml/ ),
GitLab supports only the `caption` option.
If the PlantUML server is correctly configured, these examples should render a
diagram instead of the code block:
```plantuml
Bob -> Alice : hello
Alice -> Bob : hi
```
Inside the block you can add any of the diagrams PlantUML supports, such as:
- [Activity ](https://plantuml.com/activity-diagram-legacy )
- [Class ](https://plantuml.com/class-diagram )
- [Component ](https://plantuml.com/component-diagram )
- [Object ](https://plantuml.com/object-diagram )
- [Sequence ](https://plantuml.com/sequence-diagram )
- [State ](https://plantuml.com/state-diagram )
- [Use Case ](https://plantuml.com/use-case-diagram )
You can add parameters to block definitions:
- `format` : Can be either `png` (default) or `svg` . Use `svg` with care, as it's
not supported by all browsers, and isn't supported by Markdown.
- `id` : A CSS ID added to the diagram HTML tag.
- `width` : Width attribute added to the image tag.
- `height` : Height attribute added to the image tag.
Markdown does not support any parameters, and always uses PNG format.
## Configure your PlantUML server
Before you can enable PlantUML in GitLab, set up your own PlantUML
server to generate the diagrams:
- [In Docker ](#docker ).
- [In Debian/Ubuntu ](#debianubuntu ).
2018-02-02 05:47:33 -05:00
### Docker
2021-02-18 13:10:41 -05:00
To run a PlantUML container in Docker, run this command:
2018-02-02 05:47:33 -05:00
2020-01-30 10:09:15 -05:00
```shell
2019-07-12 04:00:24 -04:00
docker run -d --name plantuml -p 8080:8080 plantuml/plantuml-server:tomcat
```
2018-02-02 05:47:33 -05:00
2021-01-27 19:09:33 -05:00
The **PlantUML URL** is the hostname of the server running the container.
2018-02-02 05:47:33 -05:00
2021-01-27 19:09:33 -05:00
When running GitLab in Docker, it must have access to the PlantUML container.
2021-02-18 13:10:41 -05:00
To achieve that, use [Docker Compose ](https://docs.docker.com/compose/ ).
In this basic `docker-compose.yml` file, PlantUML is accessible to GitLab at the URL
`http://plantuml:8080/` :
2019-10-15 02:07:25 -04:00
```yaml
version: "3"
services:
gitlab:
2020-12-29 13:10:10 -05:00
image: 'gitlab/gitlab-ee:12.2.5-ee.0'
2019-10-15 02:07:25 -04:00
environment:
GITLAB_OMNIBUS_CONFIG: |
nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n proxy_cache off; \n proxy_pass http://plantuml:8080/; \n}\n"
plantuml:
image: 'plantuml/plantuml-server:tomcat'
container_name: plantuml
```
2018-02-02 05:47:33 -05:00
### Debian/Ubuntu
2021-02-18 13:10:41 -05:00
You can install and configure a PlantUML server in Debian/Ubuntu distributions
using Tomcat:
2016-11-28 12:41:29 -05:00
2021-02-18 13:10:41 -05:00
1. Run these commands to create a `plantuml.war` file from the source code:
2016-11-28 12:41:29 -05:00
2021-02-18 13:10:41 -05:00
```shell
sudo apt-get install graphviz openjdk-8-jdk git-core maven
git clone https://github.com/plantuml/plantuml-server.git
cd plantuml-server
mvn package
```
2016-11-28 12:41:29 -05:00
2021-02-18 13:10:41 -05:00
1. Deploy the `.war` file from the previous step with these commands:
2016-11-28 12:41:29 -05:00
2021-02-18 13:10:41 -05:00
```shell
sudo apt-get install tomcat8
sudo cp target/plantuml.war /var/lib/tomcat8/webapps/plantuml.war
sudo chown tomcat8:tomcat8 /var/lib/tomcat8/webapps/plantuml.war
sudo service tomcat8 restart
```
2016-11-28 12:41:29 -05:00
2021-02-18 13:10:41 -05:00
The Tomcat service should restart. After the restart is complete, the
PlantUML service is ready and listening for requests on port 8080:
`http://localhost:8080/plantuml`
2016-11-28 12:41:29 -05:00
2021-01-27 19:09:33 -05:00
To change these defaults, edit the `/etc/tomcat8/server.xml` file.
2016-11-28 12:41:29 -05:00
2021-01-27 19:09:33 -05:00
NOTE:
The default URL is different when using this approach. The Docker-based image
makes the service available at the root URL, with no relative path. Adjust
2019-10-15 02:07:25 -04:00
the configuration below accordingly.
2021-02-18 13:10:41 -05:00
## Configure local PlantUML access
2019-09-08 19:28:07 -04:00
2021-02-18 13:10:41 -05:00
The PlantUML server runs locally on your server, so it can't be accessed
externally by default. Your server must catch external PlantUML
calls to `https://gitlab.example.com/-/plantuml/` and redirect them to the
local PlantUML server. Depending on your setup, the URL is either of the
following:
2019-09-08 19:28:07 -04:00
2021-02-18 13:10:41 -05:00
- `http://plantuml:8080/`
- `http://localhost:8080/plantuml/`
2019-09-08 19:28:07 -04:00
2021-02-18 13:10:41 -05:00
If you're running [GitLab with TLS ](https://docs.gitlab.com/omnibus/settings/ssl.html )
you must configure this redirection, because PlantUML uses the insecure HTTP protocol.
Newer browsers such as [Google Chrome 86+ ](https://www.chromestatus.com/feature/4926989725073408 )
don't load insecure HTTP resources on pages served over HTTPS.
2019-09-08 19:28:07 -04:00
2021-02-18 13:10:41 -05:00
To enable this redirection:
2019-10-15 02:07:25 -04:00
2021-02-18 13:10:41 -05:00
1. Add the following line in `/etc/gitlab/gitlab.rb` , depending on your setup method:
2019-09-26 02:06:27 -04:00
2021-02-18 13:10:41 -05:00
```ruby
# Docker deployment
nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n proxy_cache off; \n proxy_pass http://plantuml:8080/; \n}\n"
2019-09-26 02:06:27 -04:00
2021-02-18 13:10:41 -05:00
# Built from source
nginx['custom_gitlab_server_config'] = "location /-/plantuml { \n rewrite ^/-/(plantuml.*) /$1 break;\n proxy_cache off; \n proxy_pass http://localhost:8080/plantuml; \n}\n"
```
2019-09-08 19:28:07 -04:00
2021-02-18 13:10:41 -05:00
1. To activate the changes, run the following command:
2021-01-13 04:10:52 -05:00
2021-02-18 13:10:41 -05:00
```shell
sudo gitlab-ctl reconfigure
```
2020-06-10 08:08:58 -04:00
2021-02-18 13:10:41 -05:00
### Configure PlantUML security
PlantUML has features that allow fetching network resources. If you self-host the
PlantUML server, put network controls in place to isolate it.
2020-06-10 08:08:58 -04:00
```plaintext
@startuml
start
' ...
!include http://localhost/
stop;
@enduml
```
2021-02-18 13:10:41 -05:00
## Enable PlantUML integration
2016-11-28 12:41:29 -05:00
2021-02-18 13:10:41 -05:00
After configuring your local PlantUML server, you're ready to enable the PlantUML integration:
2016-11-28 12:41:29 -05:00
2021-02-18 13:10:41 -05:00
1. Sign in to GitLab as an [Administrator ](../../user/permissions.md ) user.
2021-08-25 20:09:31 -04:00
1. On the top bar, select **Menu > Admin** .
2021-09-08 14:11:23 -04:00
1. On the left sidebar, go to **Settings > General** and expand the **PlantUML** section.
2021-08-12 20:09:14 -04:00
1. Select the **Enable PlantUML** checkbox.
2021-02-18 13:10:41 -05:00
1. Set the PlantUML instance as `https://gitlab.example.com/-/plantuml/` ,
2022-04-14 14:08:29 -04:00
and select **Save changes** .
2017-11-01 06:56:06 -04:00
2021-02-18 13:10:41 -05:00
Depending on your PlantUML and GitLab version numbers, you may also need to take
these steps:
2017-08-29 10:04:32 -04:00
2021-02-18 13:10:41 -05:00
- For PlantUML servers running v1.2020.9 and above, such as [plantuml.com ](https://plantuml.com ),
you must set the `PLANTUML_ENCODING` environment variable to enable the `deflate`
compression. In Omnibus GitLab, you can set this value in `/etc/gitlab.rb` with
this command:
2016-11-28 12:41:29 -05:00
2021-02-18 13:10:41 -05:00
```ruby
gitlab_rails['env'] = { 'PLANTUML_ENCODING' => 'deflate' }
```
2016-11-28 12:41:29 -05:00
2022-03-15 08:07:44 -04:00
In GitLab Helm chart, you can set it by adding a variable to the
[global.extraEnv ](https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/charts/globals.md#extraenv )
section, like this:
```yaml
global:
extraEnv:
PLANTUML_ENCODING: deflate
```
2021-02-18 13:10:41 -05:00
- For GitLab versions 13.1 and later, PlantUML integration now
[requires a header prefix in the URL ](https://github.com/plantuml/plantuml/issues/117#issuecomment-6235450160 )
to distinguish different encoding types.