Files
2026-06-25 19:32:06 +02:00

297 lines
26 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en-us" dir="ltr" itemscope itemtype="http://schema.org/Article" data-r-output-format="html">
<head>
<meta charset="utf-8">
<meta name="viewport" content="height=device-height, width=device-width, initial-scale=1.0, minimum-scale=1.0">
<meta name="generator" content="Hugo 0.161.1">
<meta name="generator" content="Relearn 8.2.0+220806ce3ced8264fbdd693f77f28216a8a1b6ae">
<meta name="description" content="Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go.
To install caddy, first add the caddy program to your gokrazy instance:
gok add github.com/caddyserver/caddy/v2/cmd/caddy Then, open your instances config.json in your editor:
gok edit And make the following changes:
Change the HTTP port from 80 (default) to 1080 (for example) to move gokrazys web interface listening port out of the way and let caddy serve on TCP port 80. If you want to run caddy on a different port, you can skip this step. Configure Package config: Command-line flags and Package config: Extra files to make caddy run its webserver on startup (run) and to make caddy locate its config file (--config). { &#34;Hostname&#34;: &#34;webserver&#34;, &#34;Update&#34;: { &#34;HTTPPort&#34;: &#34;1080&#34; }, &#34;Packages&#34;: [ &#34;github.com/gokrazy/fbstatus&#34;, &#34;github.com/gokrazy/hello&#34;, &#34;github.com/gokrazy/serial-busybox&#34;, &#34;github.com/gokrazy/breakglass&#34;, &#34;github.com/caddyserver/caddy/v2/cmd/caddy&#34; ], &#34;PackageConfig&#34;: { &#34;github.com/caddyserver/caddy/v2/cmd/caddy&#34;: { &#34;CommandLineFlags&#34;: [ &#34;run&#34;, &#34;--config&#34;, &#34;/etc/caddy/Caddyfile&#34; ], &#34;ExtraFilePaths&#34;: { &#34;/etc/caddy/Caddyfile&#34;: &#34;Caddyfile&#34; } } } } Then, create the referenced Caddyfile extra file and modify it to your liking. In this example, we explicitly configure an HTTP listener to disable Caddys automatic HTTPS setup, so that your server will work without a publically reachable address.">
<meta name="author" content="">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Caddy HTTP server :: gokrazy">
<meta name="twitter:description" content="Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go.
To install caddy, first add the caddy program to your gokrazy instance:
gok add github.com/caddyserver/caddy/v2/cmd/caddy Then, open your instances config.json in your editor:
gok edit And make the following changes:
Change the HTTP port from 80 (default) to 1080 (for example) to move gokrazys web interface listening port out of the way and let caddy serve on TCP port 80. If you want to run caddy on a different port, you can skip this step. Configure Package config: Command-line flags and Package config: Extra files to make caddy run its webserver on startup (run) and to make caddy locate its config file (--config). { &#34;Hostname&#34;: &#34;webserver&#34;, &#34;Update&#34;: { &#34;HTTPPort&#34;: &#34;1080&#34; }, &#34;Packages&#34;: [ &#34;github.com/gokrazy/fbstatus&#34;, &#34;github.com/gokrazy/hello&#34;, &#34;github.com/gokrazy/serial-busybox&#34;, &#34;github.com/gokrazy/breakglass&#34;, &#34;github.com/caddyserver/caddy/v2/cmd/caddy&#34; ], &#34;PackageConfig&#34;: { &#34;github.com/caddyserver/caddy/v2/cmd/caddy&#34;: { &#34;CommandLineFlags&#34;: [ &#34;run&#34;, &#34;--config&#34;, &#34;/etc/caddy/Caddyfile&#34; ], &#34;ExtraFilePaths&#34;: { &#34;/etc/caddy/Caddyfile&#34;: &#34;Caddyfile&#34; } } } } Then, create the referenced Caddyfile extra file and modify it to your liking. In this example, we explicitly configure an HTTP listener to disable Caddys automatic HTTPS setup, so that your server will work without a publically reachable address.">
<meta property="og:url" content="https://gokrazy.org/packages/caddy-http-server/index.html">
<meta property="og:site_name" content="gokrazy">
<meta property="og:title" content="Caddy HTTP server :: gokrazy">
<meta property="og:description" content="Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go.
To install caddy, first add the caddy program to your gokrazy instance:
gok add github.com/caddyserver/caddy/v2/cmd/caddy Then, open your instances config.json in your editor:
gok edit And make the following changes:
Change the HTTP port from 80 (default) to 1080 (for example) to move gokrazys web interface listening port out of the way and let caddy serve on TCP port 80. If you want to run caddy on a different port, you can skip this step. Configure Package config: Command-line flags and Package config: Extra files to make caddy run its webserver on startup (run) and to make caddy locate its config file (--config). { &#34;Hostname&#34;: &#34;webserver&#34;, &#34;Update&#34;: { &#34;HTTPPort&#34;: &#34;1080&#34; }, &#34;Packages&#34;: [ &#34;github.com/gokrazy/fbstatus&#34;, &#34;github.com/gokrazy/hello&#34;, &#34;github.com/gokrazy/serial-busybox&#34;, &#34;github.com/gokrazy/breakglass&#34;, &#34;github.com/caddyserver/caddy/v2/cmd/caddy&#34; ], &#34;PackageConfig&#34;: { &#34;github.com/caddyserver/caddy/v2/cmd/caddy&#34;: { &#34;CommandLineFlags&#34;: [ &#34;run&#34;, &#34;--config&#34;, &#34;/etc/caddy/Caddyfile&#34; ], &#34;ExtraFilePaths&#34;: { &#34;/etc/caddy/Caddyfile&#34;: &#34;Caddyfile&#34; } } } } Then, create the referenced Caddyfile extra file and modify it to your liking. In this example, we explicitly configure an HTTP listener to disable Caddys automatic HTTPS setup, so that your server will work without a publically reachable address.">
<meta property="og:locale" content="en_us">
<meta property="og:type" content="article">
<meta property="article:section" content="Available packages">
<meta itemprop="name" content="Caddy HTTP server :: gokrazy">
<meta itemprop="description" content="Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go.
To install caddy, first add the caddy program to your gokrazy instance:
gok add github.com/caddyserver/caddy/v2/cmd/caddy Then, open your instances config.json in your editor:
gok edit And make the following changes:
Change the HTTP port from 80 (default) to 1080 (for example) to move gokrazys web interface listening port out of the way and let caddy serve on TCP port 80. If you want to run caddy on a different port, you can skip this step. Configure Package config: Command-line flags and Package config: Extra files to make caddy run its webserver on startup (run) and to make caddy locate its config file (--config). { &#34;Hostname&#34;: &#34;webserver&#34;, &#34;Update&#34;: { &#34;HTTPPort&#34;: &#34;1080&#34; }, &#34;Packages&#34;: [ &#34;github.com/gokrazy/fbstatus&#34;, &#34;github.com/gokrazy/hello&#34;, &#34;github.com/gokrazy/serial-busybox&#34;, &#34;github.com/gokrazy/breakglass&#34;, &#34;github.com/caddyserver/caddy/v2/cmd/caddy&#34; ], &#34;PackageConfig&#34;: { &#34;github.com/caddyserver/caddy/v2/cmd/caddy&#34;: { &#34;CommandLineFlags&#34;: [ &#34;run&#34;, &#34;--config&#34;, &#34;/etc/caddy/Caddyfile&#34; ], &#34;ExtraFilePaths&#34;: { &#34;/etc/caddy/Caddyfile&#34;: &#34;Caddyfile&#34; } } } } Then, create the referenced Caddyfile extra file and modify it to your liking. In this example, we explicitly configure an HTTP listener to disable Caddys automatic HTTPS setup, so that your server will work without a publically reachable address.">
<meta itemprop="wordCount" content="222">
<title>Caddy HTTP server :: gokrazy</title>
<link href="/images/favicon.png?1782408721" rel="icon" type="image/png">
<link href="/css/auto-complete/auto-complete.min.css?1782408721" rel="stylesheet">
<script src="/js/auto-complete/auto-complete.min.js?1782408721" defer></script>
<script src="/js/search-lunr.min.js?1782408721" defer></script>
<script src="/js/search.min.js?1782408721" defer></script>
<script>
window.relearn = window.relearn || {};
window.relearn.index_js_url="/searchindex.en.js?1782408721";
</script>
<script src="/js/lunr/lunr.min.js?1782408721" defer></script>
<script src="/js/lunr/lunr.stemmer.support.min.js?1782408721" defer></script>
<script src="/js/lunr/lunr.multi.min.js?1782408721" defer></script>
<script src="/js/lunr/lunr.en.min.js?1782408721" defer></script>
<script>
window.relearn = window.relearn || {};
window.relearn.contentLangs=['en'];
</script>
<link href="/fonts/fontawesome/css/fontawesome-all.min.css?1782408721" rel="stylesheet" media="print" onload="this.media='all';this.onload=null;"><noscript><link href="/fonts/fontawesome/css/fontawesome-all.min.css?1782408721" rel="stylesheet"></noscript>
<link href="/css/perfect-scrollbar/perfect-scrollbar.min.css?1782408721" rel="stylesheet">
<link href="/css/theme.min.css?1782408721" rel="stylesheet">
<link href="/css/format-html.min.css?1782408721" rel="stylesheet" id="R-format-style">
<script>
window.relearn = window.relearn || {};
// configuration
window.relearn.min = `.min`;
window.relearn.path='\/packages\/caddy-http-server\/index.html';
window.relearn.relBasePath='..\/..';
window.relearn.relBaseUri='..\/..';
window.relearn.absBaseUri='https:\/\/gokrazy.org';
window.relearn.disableInlineCopyToClipboard=true;
window.relearn.enableBlockCodeWrap=true;
// legal
window.relearn.getItem = (s,n) => {return s.getItem(n)};
window.relearn.setItem = (s,n,v) => {return s.setItem(n,v)};
window.relearn.removeItem = (s,n) => {return s.removeItem(n)};
// translations
window.T_Copy_to_clipboard = `Copy text to clipboard`;
window.T_Copied_to_clipboard = `Text copied to clipboard!`;
window.T_Link_copied_to_clipboard = `Link copied to clipboard!`;
window.T_Reset_view = `Reset view`;
window.T_View_reset = `View reset!`;
window.T_No_results_found = `No results found for "{0}"`;
window.T_N_results_found = `{1} results found for "{0}"`;
window.T_Browser_unsupported_feature = `This browser doesn't support this feature`;
// variant stuff
window.relearn.themevariants = [ 'auto' ];
window.relearn.customvariantname = "my-custom-variant";
window.relearn.changeVariant = function(variant) {
var oldVariant = document.documentElement.dataset.rThemeVariant;
window.relearn.setItem(window.localStorage, window.relearn.absBaseUri + "/variant", variant);
document.documentElement.dataset.rThemeVariant = variant;
if (oldVariant != variant) {
document.dispatchEvent( new CustomEvent('themeVariantLoaded', { detail: { variant, oldVariant } }) );
window.relearn.markVariant();
}
}
window.relearn.markVariant = function() {
var variant = window.relearn.getItem(window.localStorage, window.relearn.absBaseUri + "/variant");
document.querySelectorAll(".R-variantswitcher select").forEach((select) => {select.value = variant;});
}
window.relearn.initVariant = function() {
var variant = window.relearn.getItem(window.localStorage, window.relearn.absBaseUri + "/variant") ?? "";
if( variant == window.relearn.customvariantname ){
}else if( !variant || !window.relearn.themevariants.includes(variant) ){
variant = window.relearn.themevariants[0];
window.relearn.setItem(window.localStorage, window.relearn.absBaseUri + "/variant", variant);
}
document.documentElement.dataset.rThemeVariant = variant;
}
window.relearn.initVariant();
window.relearn.markVariant();
</script>
</head>
<body class="mobile-support html" data-url="/packages/caddy-http-server/index.html">
<div id="R-body" class="default-animation">
<div id="R-body-overlay"></div>
<nav id="R-topbar">
<div class="topbar-wrapper">
<div class="topbar-sidebar-divider"></div>
<div class="topbar-area topbar-area-start" data-area="start">
<div class="topbar-button topbar-button-sidebar" data-content-empty="disable" data-width-s="show" data-width-m="hide" data-width-l="hide">
<span class="btn cstyle button link noborder notitle interactive"><button onclick="toggleNav()" type="button" title="Menu (CTRL&#43;ALT&#43;n)"><i class="fa-fw fas fa-bars"></i></button></span>
</div>
<div class="topbar-button topbar-button-toc" data-content-empty="hide" data-width-s="show" data-width-m="show" data-width-l="show">
<span class="btn cstyle button link noborder notitle interactive"><button onclick="toggleTopbarFlyout(this)" type="button" title="Table of Contents (CTRL&#43;ALT&#43;t)"><i class="fa-fw fas fa-list-alt"></i></button></span>
<div class="topbar-content">
<div class="topbar-content-wrapper">
</div>
</div>
</div>
</div>
<ol class="topbar-breadcrumbs breadcrumbs highlightable" itemscope itemtype="http://schema.org/BreadcrumbList"><li itemscope itemtype="https://schema.org/ListItem" itemprop="itemListElement" class=""><a itemprop="item" href="/index.html"><span itemprop="name">gokrazy Go appliances</span></a><meta itemprop="position" content="1">&nbsp;>&nbsp;</li><li itemscope itemtype="https://schema.org/ListItem" itemprop="itemListElement" class=""><a itemprop="item" href="/packages/index.html"><span itemprop="name">Available packages</span></a><meta itemprop="position" content="2">&nbsp;>&nbsp;</li><li itemscope itemtype="https://schema.org/ListItem" itemprop="itemListElement" class=""><span itemprop="name">Caddy HTTP server</span><meta itemprop="position" content="3"></li>
</ol>
<div class="topbar-area topbar-area-end" data-area="end">
<div class="topbar-button topbar-button-edit" data-content-empty="disable" data-width-s="area-more" data-width-m="show" data-width-l="show">
<span class="btn cstyle button link noborder notitle interactive"><a href="https://github.com/gokrazy/gokrazy/tree/master/website/content/packages/caddy-http-server.md" rel="external" title="Edit (CTRL+ALT+w)"><i class="fa-fw fas fa-pen"></i></a></span>
</div>
<div class="topbar-button topbar-button-more" data-content-empty="hide" data-width-s="show" data-width-m="show" data-width-l="show">
<span class="btn cstyle button link noborder notitle interactive"><button onclick="toggleTopbarFlyout(this)" type="button" title="More"><i class="fa-fw fas fa-ellipsis-v"></i></button></span>
<div class="topbar-content">
<div class="topbar-content-wrapper">
<div class="topbar-area topbar-area-more" data-area="more">
</div>
</div>
</div>
</div>
</div>
</div>
</nav>
<div id="R-main-overlay"></div>
<main id="R-body-inner" class="highlightable packages" tabindex="-1">
<div class="flex-block-wrapper">
<article class="default">
<header class="headline">
</header>
<h1 id="caddy-http-server">Caddy HTTP server</h1>
<p><a href="https://caddyserver.com/" rel="external">Caddy</a> is a powerful, enterprise-ready, open source
web server with automatic HTTPS written in Go.</p>
<p>To install caddy, first add the <code>caddy</code> program to your gokrazy instance:</p>
<div class="highlight actionbar-wrapper wrap-code" dir="auto"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gok add github.com/caddyserver/caddy/v2/cmd/caddy</span></span></code></pre></div>
<p>Then, open your instances <code>config.json</code> in your editor:</p>
<div class="highlight actionbar-wrapper wrap-code" dir="auto"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gok edit</span></span></code></pre></div>
<p>And make the following changes:</p>
<ol>
<li>Change the HTTP port from 80 (default) to 1080 (for example) to move
gokrazys web interface listening port out of the way and let caddy serve on
TCP port 80. If you want to run caddy on a different port, you can skip this
step.</li>
<li>Configure <a href="/userguide/package-config/index.html#flags">Package config: Command-line
flags</a> and <a href="/userguide/package-config/index.html#extrafiles">Package config: Extra
files</a> to make caddy run its webserver
on startup (<code>run</code>) and to make caddy locate its config file (<code>--config</code>).</li>
</ol>
<div class="highlight actionbar-wrapper wrap-code" dir="auto"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;display:grid;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span> <span style="color:#f92672">&#34;Hostname&#34;</span>: <span style="color:#e6db74">&#34;webserver&#34;</span>,
</span></span><span style="display:flex; background-color:#3c3d38"><span> <span style="color:#f92672">&#34;Update&#34;</span>: {
</span></span><span style="display:flex; background-color:#3c3d38"><span> <span style="color:#f92672">&#34;HTTPPort&#34;</span>: <span style="color:#e6db74">&#34;1080&#34;</span>
</span></span><span style="display:flex; background-color:#3c3d38"><span> },
</span></span><span style="display:flex;"><span> <span style="color:#f92672">&#34;Packages&#34;</span>: [
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;github.com/gokrazy/fbstatus&#34;</span>,
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;github.com/gokrazy/hello&#34;</span>,
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;github.com/gokrazy/serial-busybox&#34;</span>,
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;github.com/gokrazy/breakglass&#34;</span>,
</span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;github.com/caddyserver/caddy/v2/cmd/caddy&#34;</span>
</span></span><span style="display:flex;"><span> ],
</span></span><span style="display:flex; background-color:#3c3d38"><span> <span style="color:#f92672">&#34;PackageConfig&#34;</span>: {
</span></span><span style="display:flex; background-color:#3c3d38"><span> <span style="color:#f92672">&#34;github.com/caddyserver/caddy/v2/cmd/caddy&#34;</span>: {
</span></span><span style="display:flex; background-color:#3c3d38"><span> <span style="color:#f92672">&#34;CommandLineFlags&#34;</span>: [
</span></span><span style="display:flex; background-color:#3c3d38"><span> <span style="color:#e6db74">&#34;run&#34;</span>,
</span></span><span style="display:flex; background-color:#3c3d38"><span> <span style="color:#e6db74">&#34;--config&#34;</span>,
</span></span><span style="display:flex; background-color:#3c3d38"><span> <span style="color:#e6db74">&#34;/etc/caddy/Caddyfile&#34;</span>
</span></span><span style="display:flex; background-color:#3c3d38"><span> ],
</span></span><span style="display:flex; background-color:#3c3d38"><span> <span style="color:#f92672">&#34;ExtraFilePaths&#34;</span>: {
</span></span><span style="display:flex; background-color:#3c3d38"><span> <span style="color:#f92672">&#34;/etc/caddy/Caddyfile&#34;</span>: <span style="color:#e6db74">&#34;Caddyfile&#34;</span>
</span></span><span style="display:flex; background-color:#3c3d38"><span> }
</span></span><span style="display:flex; background-color:#3c3d38"><span> }
</span></span><span style="display:flex; background-color:#3c3d38"><span> }
</span></span><span style="display:flex;"><span>}</span></span></code></pre></div>
<p>Then, create the referenced <code>Caddyfile</code> extra file and modify it to your
liking. In this example, we explicitly configure an HTTP listener to disable
Caddys automatic HTTPS setup, so that your server will work without a
publically reachable address.</p>
<div class="highlight actionbar-wrapper wrap-code" dir="auto"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cat &gt; ~/gokrazy/webserver/Caddyfile <span style="color:#e6db74">&lt;&lt;&#39;EOT&#39;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">http://:80 {
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> root * /tmp
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> file_server browse
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">}
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">EOT</span></span></span></code></pre></div>
<p>Then, deploy as usual:</p>
<div class="highlight actionbar-wrapper wrap-code" dir="auto"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gok update</span></span></code></pre></div>
<!-- TODO: remove the tip below once breakglass respects instance-centric configuration -->
<p><strong>Tip:</strong> When using <code>breakglass</code>, use the <code>-gokrazy_url=:1080</code> flag to overwrite
the port.</p>
<footer class="footline">
</footer>
</article>
</div>
</main>
</div>
<aside id="R-sidebar" class="default-animation">
<div id="R-header-topbar" class="default-animation"></div>
<div id="R-header-wrapper" class="default-animation">
<div id="R-header" class="default-animation">
<img src="/logo.svg" width="100%" alt="gokrazy logo" title="gokrazy logo">
</div>
<search><form action="/search/index.html" method="get">
<div class="searchbox default-animation">
<button class="search-detail" type="submit" title="Search (CTRL+ALT+f)"><i class="fas fa-search"></i></button>
<label class="a11y-only" for="R-search-by">Search</label>
<input data-search-input id="R-search-by" name="search-by" class="search-by" type="search" placeholder="Search...">
<button class="search-clear" type="button" data-search-clear="" title="Clear search"><i class="fas fa-times" title="Clear search"></i></button>
</div>
</form></search>
</div>
<div id="R-homelinks" class="default-animation homelinks">
<div class="R-menu-divider default-animation">
<hr class="padding">
</div>
<div class="R-sidebarmenu R-shortcutmenu-homelinks">
<ul class="space collapsible-menu">
<li class="" data-nav-url="/index.html"><a class="padding" href="/index.html"><i class="fa-fw fas fa-home"></i> Home</a></li>
</ul>
</div>
<div class="R-menu-divider default-animation">
<hr class="padding">
</div>
<div class="R-sidebarmenu R-shortcutmenu-headercontrols">
<ul class="">
</ul>
</div>
<div class="R-menu-divider default-animation">
<hr class="padding">
</div>
</div>
<div id="R-content-wrapper" class="highlightable">
<div class="R-sidebarmenu R-shortcutmenu-main">
<ul class="enlarge morespace collapsible-menu">
<li class="" data-nav-url="/quickstart/index.html"><a class="padding" href="/quickstart/index.html"><b>1. </b>Quickstart</a></li>
<li class="" data-nav-url="/platforms/index.html"><a class="padding" href="/platforms/index.html"><b>2. </b>Supported platforms</a></li>
<li class="" data-nav-url="/userguide/index.html"><a class="padding" href="/userguide/index.html"><b>3. </b>Configuration</a><ul id="R-subsections-74b4df3a3d9365853f09e9f1dfe7bbba" class="collapsible-menu"></ul></li>
<li class="parent " data-nav-url="/packages/index.html"><a class="padding" href="/packages/index.html"><b>4. </b>Available packages</a><ul id="R-subsections-bdf1e8ce92aa8ff6883c617f10480430" class="collapsible-menu">
<li class="" data-nav-url="/packages/showcase/index.html"><a class="padding" href="/packages/showcase/index.html">Showcase</a></li>
<li class="" data-nav-url="/packages/tailscale/index.html"><a class="padding" href="/packages/tailscale/index.html">Tailscale VPN</a></li>
<li class="active " data-nav-url="/packages/caddy-http-server/index.html"><a class="padding" href="/packages/caddy-http-server/index.html">Caddy HTTP server</a></li>
<li class="" data-nav-url="/packages/minio/index.html"><a class="padding" href="/packages/minio/index.html">MinIO object storage</a></li>
<li class="" data-nav-url="/packages/docker-containers/index.html"><a class="padding" href="/packages/docker-containers/index.html">Docker containers</a></li>
<li class="" data-nav-url="/packages/prometheus/index.html"><a class="padding" href="/packages/prometheus/index.html">Prometheus</a></li></ul></li>
<li class="" data-nav-url="/development/index.html"><a class="padding" href="/development/index.html"><b>5. </b>Package development</a><ul id="R-subsections-54b0ce3c97b111c8cd4d107325fd580c" class="collapsible-menu"></ul></li>
</ul>
</div>
<div class="R-sidebarmenu R-shortcutmenu-shortcuts">
<div class="nav-title padding">More</div>
<ul class="space collapsible-menu">
<li class="" data-nav-url="https://github.com/gokrazy/gokrazy"><a class="padding" href="https://github.com/gokrazy/gokrazy" rel="external"><i class='fab fa-github'></i> GitHub repo</a></li>
</ul>
</div>
<div id="R-footer-margin"></div>
<div class="R-menu-divider default-animation">
<hr class="padding">
</div>
<div class="R-sidebarmenu R-shortcutmenu-footercontrols">
<ul class="">
</ul>
</div>
<div id="R-footer"><p>Built with <a href="https://github.com/McShelby/hugo-theme-relearn" title="love"><i class="fas fa-heart"></i></a> by <a href="https://gohugo.io/">Hugo</a></p></div>
</div>
</aside>
<script src="/js/perfect-scrollbar/perfect-scrollbar.min.js?1782408721" defer></script>
<script src="/js/theme.min.js?1782408721" defer></script>
<div id="toast-container" role="status" aria-live="polite" aria-atomic="false"></div>
</body>
</html>