digraph G {

  node [style=filled, shape=box, fillcolor="#ffffcc", fontname="Sans"];
  edge [fontname="Sans"];

  browser [label="Browser", shape=Mdiamond];
  rp      [label="Reverse Proxy", href="https://docs.searxng.org/utils/filtron.sh.html#public-reverse-proxy"];
  filtron [label="Filtron",       href="https://docs.searxng.org/utils/filtron.sh.html"];
  morty   [label="Morty",         href="https://docs.searxng.org/utils/morty.sh.html"];
  static  [label="Static files",  href="url to configure static files"];
  uwsgi   [label="uwsgi",         href="https://docs.searxng.org/utils/searx.sh.html"]
  searx1  [label="Searx #1"];
  searx2  [label="Searx #2"];
  searx3  [label="Searx #3"];
  searx4  [label="Searx #4"];

  browser -> rp [label="HTTPS"]

  subgraph cluster_searx {
      label = "Searx instance" fontname="Sans";
      bgcolor="#fafafa";
      { rank=same; static rp };
      rp -> morty      [label="optional: images and HTML pages proxy"];
      rp -> static     [label="optional: reverse proxy serves directly static files"];
      rp -> filtron    [label="HTTP"];
      filtron -> uwsgi [label="HTTP"];
      uwsgi -> searx1;
      uwsgi -> searx2;
      uwsgi -> searx3;
      uwsgi -> searx4;
  }

}
