{"type": "body", "content": "", "style": "font-family: sans-serif; line-height: 1.5; padding: 0; margin: 0; display: grid; grid-template-areas: \"nav content\" \"nav footer\"; grid-template-columns: 20em auto; grid-template-rows: auto min-content; height: 100vh; align-items: stretch", "bbox": [0, 0, 1280, 720], "children": [{"type": "div", "content": "", "style": "background-color: #efefef; grid-area: nav", "bbox": [0, 0, 320, 1265], "children": [{"type": "h1", "content": "OliveTin", "style": "font-size: 1.4em; font-weight: lighter; background-color: black; padding: 0.6em; margin: 0; color: white", "bbox": [0, 0, 320, 60], "children": []}, {"type": "div", "content": "", "style": "padding: 1em", "bbox": [0, 60, 320, 740], "children": [{"type": "div", "content": "Table of Contents", "style": "font-weight: bold; color: black", "bbox": [16, 76, 288, 24], "children": []}, {"type": "p", "content": "", "style": null, "bbox": [16, 116, 288, 24], "children": [{"type": "span", "content": "", "style": "font-family: \"Open Sans\", \"DejaVu Sans\", sans-serif; font-size: 0.9em", "bbox": [16, 120, 171, 16], "children": [{"type": "a", "content": "OliveTin documentation", "style": "text-decoration: none; color: black", "bbox": [16, 120, 171, 16], "children": []}]}]}, {"type": "ul", "content": "", "style": "list-style: none; margin: 0; padding: 0", "bbox": [16, 156, 288, 628], "children": [{"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [16, 156, 288, 33], "children": [{"type": "a", "content": "1. Installation", "style": "text-decoration: none; color: black", "bbox": [16, 159, 94, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [16, 190, 288, 33], "children": [{"type": "a", "content": "2. Configuration", "style": "text-decoration: none; color: black", "bbox": [16, 193, 112, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [16, 223, 288, 33], "children": [{"type": "a", "content": "3. Reverse Proxies", "style": "text-decoration: none; color: black", "bbox": [16, 226, 135, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [16, 257, 288, 33], "children": [{"type": "a", "content": "4. Actions", "style": "text-decoration: none; color: black", "bbox": [16, 260, 69, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [16, 290, 288, 33], "children": [{"type": "a", "content": "5. Action customisation", "style": "text-decoration: none; color: black", "bbox": [16, 293, 163, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [16, 324, 288, 33], "children": [{"type": "a", "content": "6. Action examples", "style": "text-decoration: none; color: black", "bbox": [16, 327, 134, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [16, 358, 288, 33], "children": [{"type": "a", "content": "7. Arguments", "style": "text-decoration: none; color: black", "bbox": [16, 361, 94, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [16, 391, 288, 33], "children": [{"type": "a", "content": "8. Authentication & Authorization", "style": "text-decoration: none; color: black", "bbox": [16, 394, 230, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [16, 425, 288, 292], "children": [{"type": "a", "content": "9. Reference", "style": "text-decoration: none; color: black", "bbox": [16, 428, 91, 17], "children": []}, {"type": "ul", "content": "", "style": "list-style: none; margin: 0; padding: 0; padding-left: 1.4em", "bbox": [16, 449, 288, 259], "children": [{"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [38, 449, 265, 33], "children": [{"type": "a", "content": "", "style": "text-decoration: none; color: black", "bbox": [38, 452, 138, 17], "children": [{"type": "span", "content": "9.1. Network ports", "style": "font-weight: bold", "bbox": [38, 452, 138, 17], "children": []}]}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [38, 482, 265, 33], "children": [{"type": "a", "content": "9.2. Security", "style": "text-decoration: none; color: black", "bbox": [38, 485, 88, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [38, 516, 265, 33], "children": [{"type": "a", "content": "9.3. Understanding exit codes", "style": "text-decoration: none; color: black", "bbox": [38, 519, 211, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [38, 550, 265, 33], "children": [{"type": "a", "content": "9.4. Update Checks (and tracking)", "style": "text-decoration: none; color: black", "bbox": [38, 553, 242, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [38, 583, 265, 57], "children": [{"type": "a", "content": "9.5. Installing extra container packages", "style": "text-decoration: none; color: black", "bbox": [38, 586, 204, 41], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [38, 641, 265, 33], "children": [{"type": "a", "content": "9.6. Multiple instances on a server", "style": "text-decoration: none; color: black", "bbox": [38, 644, 242, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [38, 674, 265, 33], "children": [{"type": "a", "content": "9.7. Snapshot builds", "style": "text-decoration: none; color: black", "bbox": [38, 677, 145, 17], "children": []}]}]}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [16, 717, 288, 33], "children": [{"type": "a", "content": "10. Support & Troubleshooting", "style": "text-decoration: none; color: black", "bbox": [16, 720, 216, 17], "children": []}]}, {"type": "li", "content": "", "style": "padding-bottom: 0.6em", "bbox": [16, 751, 288, 33], "children": [{"type": "a", "content": "11. API", "style": "text-decoration: none; color: black", "bbox": [16, 754, 51, 17], "children": []}]}]}]}]}, {"type": "div", "content": "", "style": "background-color: white; grid-area: content; max-width: 1000px; padding: 1em; justify-self: center; display: flex; flex-direction: column; flex: 1 1 auto", "bbox": [320, 0, 960, 1209], "children": [{"type": "div", "content": "", "style": null, "bbox": [336, 16, 928, 1121], "children": [{"type": "h3", "content": "", "style": null, "bbox": [336, 34, 928, 28], "children": [{"type": "a", "content": "9.1. Network ports", "style": "text-decoration: none", "bbox": [336, 37, 162, 21], "children": []}]}, {"type": "div", "content": "", "style": null, "bbox": [336, 81, 928, 48], "children": [{"type": "p", "content": "OliveTin might suprise some people when they see it is listening on several\nports when it starts up. Most of these ports are internal and localhost-only by\ndefault. It keeps the architecture of OliveTin clean and simple, and allows for\na lot of flexibility if needed.", "style": null, "bbox": [336, 81, 928, 48], "children": []}]}, {"type": "div", "content": "", "style": null, "bbox": [336, 145, 928, 24], "children": [{"type": "p", "content": "Here is the default flow of traffic in OliveTin without any config changes.", "style": null, "bbox": [336, 145, 928, 24], "children": []}]}, {"type": "div", "content": "", "style": null, "bbox": [336, 185, 928, 48], "children": [{"type": "div", "content": "", "style": null, "bbox": [336, 185, 928, 24], "children": []}, {"type": "div", "content": "Figure 5. Flow of an inbound network request", "style": null, "bbox": [336, 209, 928, 24], "children": []}]}, {"type": "div", "content": "", "style": null, "bbox": [336, 249, 928, 168], "children": [{"type": "ol", "content": "", "style": null, "bbox": [336, 249, 928, 168], "children": [{"type": "li", "content": "", "style": null, "bbox": [376, 249, 888, 48], "children": [{"type": "p", "content": "Traffic comes into OliveTin over your network and hits the only port\nlistening - 1337, which listens on all interfaces. This is a micro HTTP reverse\nproxy.", "style": null, "bbox": [376, 249, 888, 48], "children": []}]}, {"type": "li", "content": "", "style": null, "bbox": [376, 313, 888, 24], "children": [{"type": "p", "content": "", "style": null, "bbox": [376, 313, 888, 24], "children": [{"type": "code", "content": "/", "style": null, "bbox": [447, 319, 7, 15], "children": []}, {"type": "code", "content": "localhost:1340", "style": null, "bbox": [568, 319, 109, 15], "children": []}]}]}, {"type": "li", "content": "", "style": null, "bbox": [376, 353, 888, 24], "children": [{"type": "p", "content": "", "style": null, "bbox": [376, 353, 888, 24], "children": [{"type": "code", "content": "/api/", "style": null, "bbox": [447, 359, 39, 15], "children": []}, {"type": "code", "content": "localhost:1338", "style": null, "bbox": [599, 359, 109, 15], "children": []}]}]}, {"type": "li", "content": "", "style": null, "bbox": [376, 393, 888, 24], "children": [{"type": "p", "content": "", "style": null, "bbox": [376, 393, 888, 24], "children": [{"type": "code", "content": "localhost:1339", "style": null, "bbox": [828, 399, 109, 15], "children": []}]}]}]}]}, {"type": "div", "content": "", "style": null, "bbox": [336, 433, 928, 24], "children": [{"type": "p", "content": "Below is a detailed reference table.", "style": null, "bbox": [336, 433, 928, 24], "children": []}]}, {"type": "table", "content": "", "style": "border-collapse: collapse", "bbox": [336, 473, 928, 557], "children": [{"type": "caption", "content": "Table 3. Port reference table", "style": null, "bbox": [336, 473, 928, 24], "children": []}, {"type": "colgroup", "content": "", "style": null, "bbox": [336, 498, 927, 532], "children": [{"type": "col", "content": "", "style": "width: 33.3333%;", "bbox": [336, 498, 318, 532], "children": []}, {"type": "col", "content": "", "style": "width: 66.6667%;", "bbox": [654, 498, 608, 532], "children": []}]}, {"type": "thead", "content": "", "style": null, "bbox": [336, 498, 927, 61], "children": [{"type": "tr", "content": "", "style": null, "bbox": [336, 498, 927, 61], "children": [{"type": "th", "content": "Config file reference (and Default Address:Port)", "style": "border: 1px solid gray; padding: 0.4em; background-color: #f9f9f9; text-align: left", "bbox": [336, 498, 318, 61], "children": []}, {"type": "th", "content": "Purpose", "style": "border: 1px solid gray; padding: 0.4em; background-color: #f9f9f9; text-align: left", "bbox": [654, 498, 608, 61], "children": []}]}]}, {"type": "tbody", "content": "", "style": null, "bbox": [336, 559, 927, 471], "children": [{"type": "tr", "content": "", "style": null, "bbox": [336, 559, 927, 189], "children": [{"type": "td", "content": "", "style": "border: 1px solid gray; padding: 0.4em", "bbox": [336, 559, 318, 189], "children": [{"type": "p", "content": "", "style": null, "bbox": [343, 618, 304, 72], "children": [{"type": "code", "content": "listenAddressSingleHTTPFrontend: 0.0.0.0:1337", "style": null, "bbox": [343, 624, 249, 39], "children": []}]}]}, {"type": "td", "content": "", "style": "border: 1px solid gray; padding: 0.4em", "bbox": [654, 559, 608, 189], "children": [{"type": "p", "content": "This is a \"micro reverse proxy\" built into OliveTin. It\u2019s only purpose is to serve /ui and / (the web interface) from a single endpoint. This means that problems like CORSs and setting \"external addresses\" is not necessary. It does not do any caching or anything else. It can be disabled, but it makes life a lot easier for you. It\u2019s common to put your own reverse proxy like haproxy, traefik, etc in front of this single micro reverse proxy.", "style": null, "bbox": [661, 582, 595, 144], "children": []}]}]}, {"type": "tr", "content": "", "style": null, "bbox": [336, 749, 927, 93], "children": [{"type": "td", "content": "", "style": "border: 1px solid gray; padding: 0.4em", "bbox": [336, 749, 318, 93], "children": [{"type": "p", "content": "", "style": null, "bbox": [343, 772, 304, 48], "children": [{"type": "code", "content": "listenAddressRestActions: localhost:1338", "style": null, "bbox": [343, 778, 195, 39], "children": []}]}]}, {"type": "td", "content": "", "style": "border: 1px solid gray; padding: 0.4em", "bbox": [654, 749, 608, 93], "children": [{"type": "p", "content": "REST - the protocol used by web pages to talk to web APIs. In the case of OliveTin, the API is used to get actions, and start actions.", "style": null, "bbox": [661, 772, 595, 48], "children": []}]}]}, {"type": "tr", "content": "", "style": null, "bbox": [336, 843, 927, 93], "children": [{"type": "td", "content": "", "style": "border: 1px solid gray; padding: 0.4em", "bbox": [336, 843, 318, 93], "children": [{"type": "p", "content": "", "style": null, "bbox": [343, 878, 304, 24], "children": [{"type": "code", "content": "listenAddressGrpcActions:localhost:1339", "style": null, "bbox": [343, 884, 304, 15], "children": []}]}]}, {"type": "td", "content": "", "style": "border: 1px solid gray; padding: 0.4em", "bbox": [654, 843, 608, 93], "children": [{"type": "p", "content": "gRPC - a very popular method of service-to-service API communication. This provides the \"real\" API for OliveTin.", "style": null, "bbox": [661, 866, 595, 48], "children": []}]}]}, {"type": "tr", "content": "", "style": null, "bbox": [336, 937, 927, 93], "children": [{"type": "td", "content": "", "style": "border: 1px solid gray; padding: 0.4em", "bbox": [336, 937, 318, 93], "children": [{"type": "p", "content": "", "style": null, "bbox": [343, 972, 304, 24], "children": [{"type": "code", "content": "listenAddressWebUI: localhost:1340", "style": null, "bbox": [343, 978, 265, 15], "children": []}]}]}, {"type": "td", "content": "", "style": "border: 1px solid gray; padding: 0.4em", "bbox": [654, 937, 608, 93], "children": [{"type": "p", "content": "Hosts a simple static web server with some HTML, stylesheets, Javascript etc for the web interface.", "style": null, "bbox": [661, 960, 595, 48], "children": []}]}]}]}]}, {"type": "div", "content": "", "style": null, "bbox": [336, 1052, 928, 69], "children": [{"type": "h4", "content": "", "style": null, "bbox": [336, 1052, 928, 24], "children": [{"type": "a", "content": "9.1.1. See also", "style": "text-decoration: none", "bbox": [336, 1055, 109, 17], "children": []}]}, {"type": "div", "content": "", "style": null, "bbox": [336, 1097, 928, 24], "children": [{"type": "ul", "content": "", "style": null, "bbox": [336, 1097, 928, 24], "children": [{"type": "li", "content": "", "style": null, "bbox": [376, 1097, 888, 24], "children": [{"type": "p", "content": "", "style": null, "bbox": [376, 1097, 888, 24], "children": [{"type": "a", "content": "Running Multiple instances of OliveTin on the same server", "style": "text-decoration: none", "bbox": [376, 1100, 412, 17], "children": []}]}]}]}]}]}]}, {"type": "div", "content": "", "style": "text-align: center; margin-top: auto", "bbox": [336, 1137, 928, 56], "children": [{"type": "p", "content": "", "style": null, "bbox": [336, 1153, 928, 24], "children": [{"type": "a", "content": "Reference", "style": "text-decoration: none; white-space: nowrap", "bbox": [594, 1156, 73, 17], "children": []}, {"type": "a", "content": "OliveTin documentation", "style": "text-decoration: none; white-space: nowrap", "bbox": [746, 1156, 167, 17], "children": []}, {"type": "a", "content": "Security", "style": "text-decoration: none; white-space: nowrap", "bbox": [969, 1156, 57, 17], "children": []}]}]}]}, {"type": "div", "content": "", "style": "grid-area: footer; justify-self: center; align-self: end; padding: 1em", "bbox": [642, 1209, 314, 56], "children": [{"type": "div", "content": "Last updated 2023-11-12 22:55:25 UTC", "style": null, "bbox": [658, 1225, 282, 24], "children": []}]}]}
<!DOCTYPE html>

<html><head><title>OliveTin documentation</title></head><body class="book toc2 toc-left" id="network-ports"><div id="header"><h1>OliveTin</h1><div class="toc2" id="toc"><div id="toctitle">Table of Contents</div><p><span class="toc-root"><a>OliveTin documentation</a></span></p><ul class="sectlevel1"><li><a>1. Installation</a></li><li><a>2. Configuration</a></li><li><a>3. Reverse Proxies</a></li><li><a>4. Actions</a></li><li><a>5. Action customisation</a></li><li><a>6. Action examples</a></li><li><a>7. Arguments</a></li><li><a>8. Authentication &amp; Authorization</a></li><li><a>9. Reference</a><ul class="sectlevel2"><li><a><span class="toc-current">9.1. Network ports</span></a></li><li><a>9.2. Security</a></li><li><a>9.3. Understanding exit codes</a></li><li><a>9.4. Update Checks (and tracking)</a></li><li><a>9.5. Installing extra container packages</a></li><li><a>9.6. Multiple instances on a server</a></li><li><a>9.7. Snapshot builds</a></li></ul></li><li><a>10. Support &amp; Troubleshooting</a></li><li><a>11. API</a></li></ul></div></div><div id="content"><div class="sect2"><h3 id="network-ports"><a class="anchor"></a><a class="link">9.1. Network ports</a></h3><div class="paragraph"><p>OliveTin might suprise some people when they see it is listening on several
ports when it starts up. Most of these ports are internal and localhost-only by
default. It keeps the architecture of OliveTin clean and simple, and allows for
a lot of flexibility if needed.</p></div><div class="paragraph"><p>Here is the default flow of traffic in OliveTin without any config changes.</p></div><div class="imageblock"><div class="content"><img src="images/portDiagram.png"/></div><div class="title">Figure 5. Flow of an inbound network request</div></div><div class="olist arabic"><ol class="arabic"><li><p>Traffic comes into OliveTin over your network and hits the only port
listening - 1337, which listens on all interfaces. This is a micro HTTP reverse
proxy.</p></li><li><p>Traffic for <code>/</code> gets proxied to <code>localhost:1340</code> for the static web
server.</p></li><li><p>Traffic for <code>/api/</code> gets proxied to <code>localhost:1338</code> for REST actions.</p></li><li><p>The REST API actually makes gRPC API calls internally, to port
<code>localhost:1339</code>.</p></li></ol></div><div class="paragraph"><p>Below is a detailed reference table.</p></div><table class="tableblock frame-all grid-all stretch"><caption class="title">Table 3. Port reference table</caption><colgroup><col style="width: 33.3333%;"/><col style="width: 66.6667%;"/></colgroup><thead><tr><th class="tableblock halign-left valign-top">Config file reference (and Default Address:Port)</th><th class="tableblock halign-left valign-top">Purpose</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>listenAddressSingleHTTPFrontend: 0.0.0.0:1337</code> (listen on all available addresses)</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">This is a "micro reverse proxy" built into OliveTin. It’s only purpose is to serve /ui and / (the web interface) from a single endpoint. This means that problems like CORSs and setting "external addresses" is not necessary. It does not do any caching or anything else. It can be disabled, but it makes life a lot easier for you. It’s common to put your own reverse proxy like haproxy, traefik, etc in front of this single micro reverse proxy.</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>listenAddressRestActions: localhost:1338</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">REST - the protocol used by web pages to talk to web APIs. In the case of OliveTin, the API is used to get actions, and start actions.</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>listenAddressGrpcActions:localhost:1339</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">gRPC - a very popular method of service-to-service API communication. This provides the "real" API for OliveTin.</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock"><code>listenAddressWebUI: localhost:1340</code></p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Hosts a simple static web server with some HTML, stylesheets, Javascript etc for the web interface.</p></td></tr></tbody></table><div class="sect3"><h4 id="_see_also"><a class="anchor"></a><a class="link">9.1.1. See also</a></h4><div class="ulist"><ul><li><p><a>Running Multiple instances of OliveTin on the same server</a></p></li></ul></div></div></div><div class="paragraph nav-footer"><p>↑ Up: <a>Reference</a> | ⌂ Home: <a>OliveTin documentation</a> | Next: <a>Security</a> →</p></div></div><div id="footer"><div id="footer-text">
Last updated 2023-11-12 22:55:25 UTC
</div></div><style>body {
    font-family: sans-serif;
    line-height: 1.5;
    padding: 0;
    margin: 0;
    display: grid;
    grid-template-areas: "nav content" "nav footer";
    grid-template-columns: 20em auto;
    grid-template-rows: auto min-content;
    height: 100vh;
    align-items: stretch
    }
a {
    text-decoration: none
    }
#header {
    background-color: #efefef;
    grid-area: nav
    }
#footer {
    grid-area: footer;
    justify-self: center;
    align-self: end;
    padding: 1em
    }
#toc {
    padding: 1em
    }
#toc a {
    color: black
    }
#toc li {
    padding-bottom: 0.6em
    }
#toc ul {
    list-style: none;
    margin: 0;
    padding: 0
    }
#toc ul ul {
    padding-left: 1.4em
    }
#toctitle {
    font-weight: bold;
    color: black
    }
h1 {
    font-size: 1.4em;
    font-weight: lighter;
    background-color: black;
    padding: 0.6em;
    margin: 0;
    color: white
    }
#content {
    background-color: white;
    grid-area: content;
    max-width: 1000px;
    padding: 1em;
    justify-self: center
    }
#content img {
    max-width: 100%;
    vertical-align: middle
    }
table {
    border-collapse: collapse
    }
td, th {
    border: 1px solid gray;
    padding: 0.4em
    }
th {
    background-color: #f9f9f9;
    text-align: left
    }
.toc-current {
    font-weight: bold
    }
.toc-root {
    font-family: "Open Sans", "DejaVu Sans", sans-serif;
    font-size: 0.9em
    }
#content {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto
    }
.nav-footer {
    text-align: center;
    margin-top: auto
    }
.nav-footer > p > a {
    white-space: nowrap
    }</style></body></html>