plantuml-server/examples/nginx-contextpath
Florian Heinrich 638724925e Refactoring relative paths PR#209.
- use html `base` tag containing the context path once instead inside
every single URL/link.
- update and enhance `nginx-contextpath` example
- export javascript code into separated file
- Add TODO note to javascript clipboard check (from PR#250) since
Firefox and Safari do not support the current implementation
2023-03-21 14:14:09 +01:00
..
README.md Refactoring relative paths PR#209. 2023-03-21 14:14:09 +01:00
docker-compose.yml Use relative paths as far as possible. 2023-02-24 09:26:48 +01:00
nginx.conf Refactoring relative paths PR#209. 2023-03-21 14:14:09 +01:00

README.md

Nginx reverse proxy example with defined location directive

In this example, the reverse proxy is defined only under the /plantuml context path. All other context paths (locations) are not affected and are freely available. This allows the server to be used for more than "just" PlantUML.

References:

Quick start

Be sure to have docker-compose.yml and nginx.conf inside your current working directory.

# start nginx and plantuml server
docker-compose up -d

# stop nginx and plantuml server
docker-compose down

Check with docker ps if both container are up and running:

$ docker ps
CONTAINER ID   IMAGE                            COMMAND                  CREATED         STATUS         PORTS                               NAMES
217e753a0dcf   plantuml/plantuml-server:jetty   "/entrypoint.sh"         4 seconds ago   Up 3 seconds   8080/tcp                            plantuml-server
9b1290c100f5   nginx:alpine                     "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx

Open http://localhost/plantuml inside your browser. YEAH! You are now using PlantUML behind a simple Nginx reverse proxy.

Nginx configuration

...

# PlantUML
location /plantuml/ {
    proxy_pass http://plantuml-server:8080/plantuml/;
}

...
  • location /plantuml/ to reverse only the context path /plantuml
  • proxy_pass http://plantuml-server:8080/plantuml/ to set reverse proxy path to plantuml server. Use the docker container name plantuml-server instead of ip addresses. Also, use the same context path (BASE_URL) as PlantUML, which is configurable as an environment variable in the docker-compose file.

NOTE: BASE_URL, location and therefore the proxy_pass should have the some context path! If that is not possible it may be possible to solve the problem by using NGINX sub_filter:

# PlantUML
location /plantuml/ {
    sub_filter '<base href="/" />' '<base href="/plantuml/" />';
    sub_filter_types text/html;

    proxy_pass http://plantuml-server:8080/;
}

NOTE: Since PR#256 it is possible to use deep base URLs. So with e.g. BASE_URL=foo/bar the following is possible:

# PlantUML
location /foo/bar/ {
    proxy_pass http://plantuml-server:8080/foo/bar/;
}

Nginx and PlantUML server

version: "3"

services:
  plantuml-server:
    image: plantuml/plantuml-server:jetty
    container_name: plantuml-server
    environment:
      - TZ=Europe/Berlin
      - BASE_URL=plantuml

  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - "80:80"
    environment:
      - TZ=Europe/Berlin
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
  • Set container_name to use them instead of e.g. ip addresses
  • Set the environment TZ the ensure the same timezone. For example to server timezone (cat /etc/timezone)?
  • plantuml-server
    • plantuml-server already exposes port 8080 to it's own local network (but not outside). Since plantuml-server and nginx are sharing a network, nginx can reach plantuml-server without further settings.
    • Set the environment BASE_URL to the preferred context path
  • nginx
    • open/link port 80 to the outside
    • ./nginx.conf:/etc/nginx/nginx.conf:ro to use your own Nginx configuration (readonly)

Useful commands

# see whats going on inside your docker containers
docker logs --tail 50 --follow --timestamps nginx
docker logs --tail 50 --follow --timestamps plantuml-server