1382 lines
88 KiB
HTML
1382 lines
88 KiB
HTML
|
|
<!doctype html>
|
|
<html lang="en" class="no-js">
|
|
<head>
|
|
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
|
|
<meta name="description" content="Make your web services secure by default.">
|
|
|
|
|
|
|
|
<link rel="canonical" href="https://docs.bunkerweb.io/dev/integrations/">
|
|
|
|
<link rel="icon" href="../assets/favicon.png">
|
|
<meta name="generator" content="mkdocs-1.2.3, mkdocs-material-8.2.5">
|
|
|
|
|
|
|
|
<title>Integrations - BunkerWeb</title>
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../assets/stylesheets/main.2d9f7617.min.css">
|
|
|
|
|
|
<link rel="stylesheet" href="../assets/stylesheets/palette.e6a45f82.min.css">
|
|
|
|
|
|
|
|
|
|
<script
|
|
async
|
|
defer
|
|
data-domain="docs.bunkerweb.io"
|
|
src="https://data.bunkerity.com/js/script.js"
|
|
></script>
|
|
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../assets/extra.css">
|
|
|
|
<script>__md_scope=new URL("..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
|
|
|
|
|
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="none" data-md-color-accent="none">
|
|
|
|
|
|
|
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
|
<label class="md-overlay" for="__drawer"></label>
|
|
<div data-md-component="skip">
|
|
|
|
|
|
<a href="#integrations" class="md-skip">
|
|
Skip to content
|
|
</a>
|
|
|
|
</div>
|
|
<div data-md-component="announce">
|
|
|
|
<aside class="md-banner">
|
|
<div class="md-banner__inner md-grid md-typeset">
|
|
📢 Looking for tailored support, consulting or
|
|
development for BunkerWeb ? Contact us at
|
|
<a
|
|
href="mailto:contact@bunkerity.com"
|
|
style="color: #3f6ec6; text-decoration: underline"
|
|
>contact@bunkerity.com</a
|
|
>
|
|
for enterprise offers !
|
|
</div>
|
|
</aside>
|
|
|
|
</div>
|
|
|
|
<div data-md-component="outdated" hidden>
|
|
<aside class="md-banner md-banner--warning">
|
|
|
|
<div class="md-banner__inner md-grid md-typeset">
|
|
You're not viewing the
|
|
documentation for the current version.
|
|
<a href="../.."><strong>Click here to change.</strong></a>
|
|
</div>
|
|
<script>var el=document.querySelector("[data-md-component=outdated]"),outdated=__md_get("__outdated",sessionStorage);!0===outdated&&el&&(el.hidden=!1)</script>
|
|
|
|
</aside>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<header class="md-header md-header--lifted" data-md-component="header">
|
|
<nav class="md-header__inner md-grid" aria-label="Header">
|
|
<a href=".." title="BunkerWeb" class="md-header__button md-logo" aria-label="BunkerWeb" data-md-component="logo">
|
|
|
|
<img src="../assets/logo.png" alt="logo">
|
|
|
|
</a>
|
|
<label class="md-header__button md-icon" for="__drawer">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
|
|
</label>
|
|
<div class="md-header__title" data-md-component="header-title">
|
|
<div class="md-header__ellipsis">
|
|
<div class="md-header__topic">
|
|
<span class="md-ellipsis">
|
|
BunkerWeb
|
|
</span>
|
|
</div>
|
|
<div class="md-header__topic" data-md-component="header-topic">
|
|
<span class="md-ellipsis">
|
|
|
|
Integrations
|
|
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<label class="md-header__button md-icon" for="__search">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
|
|
</label>
|
|
<div class="md-search" data-md-component="search" role="dialog">
|
|
<label class="md-search__overlay" for="__search"></label>
|
|
<div class="md-search__inner" role="search">
|
|
<form class="md-search__form" name="search">
|
|
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
|
<label class="md-search__icon md-icon" for="__search">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</label>
|
|
<nav class="md-search__options" aria-label="Search">
|
|
|
|
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
|
|
</button>
|
|
</nav>
|
|
|
|
</form>
|
|
<div class="md-search__output">
|
|
<div class="md-search__scrollwrap" data-md-scrollfix>
|
|
<div class="md-search-result" data-md-component="search-result">
|
|
<div class="md-search-result__meta">
|
|
Initializing search
|
|
</div>
|
|
<ol class="md-search-result__list"></ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="md-header__source">
|
|
<a href="https://github.com/bunkerity/bunkerweb/" title="Go to repository" class="md-source" data-md-component="source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
GitHub
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
</nav>
|
|
|
|
|
|
|
|
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
|
|
<div class="md-tabs__inner md-grid">
|
|
<ul class="md-tabs__list">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
<a href=".." class="md-tabs__link">
|
|
Introduction
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
<a href="../migrating/" class="md-tabs__link">
|
|
Migrating from bunkerized
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
<a href="../concepts/" class="md-tabs__link">
|
|
Concepts
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
<a href="./" class="md-tabs__link md-tabs__link--active">
|
|
Integrations
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
<a href="../quickstart-guide/" class="md-tabs__link">
|
|
Quickstart guide
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
<a href="../security-tuning/" class="md-tabs__link">
|
|
Security tuning
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
<a href="../settings/" class="md-tabs__link">
|
|
Settings
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
<a href="../web-ui/" class="md-tabs__link">
|
|
Web UI
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
<a href="../troubleshooting/" class="md-tabs__link">
|
|
Troubleshooting
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
<a href="../plugins/" class="md-tabs__link">
|
|
Plugins
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-tabs__item">
|
|
<a href="../about/" class="md-tabs__link">
|
|
About
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</div>
|
|
</nav>
|
|
|
|
|
|
</header>
|
|
|
|
<div class="md-container" data-md-component="container">
|
|
|
|
|
|
|
|
|
|
<main class="md-main" data-md-component="main">
|
|
<div class="md-main__inner md-grid">
|
|
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<nav class="md-nav md-nav--primary md-nav--lifted md-nav--integrated" aria-label="Navigation" data-md-level="0">
|
|
<label class="md-nav__title" for="__drawer">
|
|
<a href=".." title="BunkerWeb" class="md-nav__button md-logo" aria-label="BunkerWeb" data-md-component="logo">
|
|
|
|
<img src="../assets/logo.png" alt="logo">
|
|
|
|
</a>
|
|
BunkerWeb
|
|
</label>
|
|
|
|
<div class="md-nav__source">
|
|
<a href="https://github.com/bunkerity/bunkerweb/" title="Go to repository" class="md-source" data-md-component="source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
GitHub
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href=".." class="md-nav__link">
|
|
Introduction
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../migrating/" class="md-nav__link">
|
|
Migrating from bunkerized
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../concepts/" class="md-nav__link">
|
|
Concepts
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--active">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__link md-nav__link--active" for="__toc">
|
|
Integrations
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<a href="./" class="md-nav__link md-nav__link--active">
|
|
Integrations
|
|
</a>
|
|
|
|
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#docker" class="md-nav__link">
|
|
Docker
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Docker">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#environment-variables" class="md-nav__link">
|
|
Environment variables
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#volume" class="md-nav__link">
|
|
Volume
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#networks" class="md-nav__link">
|
|
Networks
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#docker-autoconf" class="md-nav__link">
|
|
Docker autoconf
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#swarm" class="md-nav__link">
|
|
Swarm
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#kubernetes" class="md-nav__link">
|
|
Kubernetes
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#linux" class="md-nav__link">
|
|
Linux
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../quickstart-guide/" class="md-nav__link">
|
|
Quickstart guide
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../security-tuning/" class="md-nav__link">
|
|
Security tuning
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../settings/" class="md-nav__link">
|
|
Settings
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../web-ui/" class="md-nav__link">
|
|
Web UI
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../troubleshooting/" class="md-nav__link">
|
|
Troubleshooting
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../plugins/" class="md-nav__link">
|
|
Plugins
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../about/" class="md-nav__link">
|
|
About
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-content" data-md-component="content">
|
|
<article class="md-content__inner md-typeset">
|
|
|
|
|
|
<a href="https://github.com/bunkerity/bunkerweb/edit/master/docs/integrations.md" title="Edit this page" class="md-content__button md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg>
|
|
</a>
|
|
|
|
|
|
|
|
<h1 id="integrations">Integrations</h1>
|
|
<h2 id="docker">Docker</h2>
|
|
<figure>
|
|
<p><img align="center" alt="Overwiew" src="../assets/img/integration-docker.svg" />
|
|
</p>
|
|
<figcaption>Docker integration</figcaption>
|
|
</figure>
|
|
<p>Using BunkerWeb as a <a href="https://www.docker.com/">Docker</a> container is a quick and easy way to test and use it as long as you are familiar with the Docker technology.</p>
|
|
<p>We provide ready to use prebuilt images for x64, x86, armv7 and arm64 platforms on <a href="https://hub.docker.com/r/bunkerity/bunkerweb">Docker Hub</a> :</p>
|
|
<div class="highlight"><pre><span></span><code>docker pull bunkerity/bunkerweb:1.4.0
|
|
</code></pre></div>
|
|
<p>Alternatively, you can build the Docker images directly from the <a href="https://github.com/bunkerity/bunkerweb">source</a> (and take a coffee ☕ because it may be long depending on your hardware) :</p>
|
|
<div class="highlight"><pre><span></span><code>git clone https://github.com/bunkerity/bunkerweb.git <span class="o">&&</span> <span class="se">\</span>
|
|
<span class="nb">cd</span> bunkerweb <span class="o">&&</span> <span class="se">\</span>
|
|
docker build -t my-bunkerweb .
|
|
</code></pre></div>
|
|
<p>Usage and configuration of the BunkerWeb container are based on :</p>
|
|
<ul>
|
|
<li><strong>Environment variables</strong> to configure BunkerWeb and meet your use cases</li>
|
|
<li><strong>Volume</strong> to cache important data and mount custom configuration files</li>
|
|
<li><strong>Networks</strong> to expose ports for clients and connect to upstream web services</li>
|
|
</ul>
|
|
<h3 id="environment-variables">Environment variables</h3>
|
|
<p>Settings are passed to BunkerWeb using Docker environment variables. You can use the <code>-e</code> flag :</p>
|
|
<div class="highlight"><pre><span></span><code>docker run <span class="se">\</span>
|
|
...
|
|
-e <span class="nv">MY_SETTING</span><span class="o">=</span>value <span class="se">\</span>
|
|
-e <span class="s2">"MY_OTHER_SETTING=value with spaces"</span> <span class="se">\</span>
|
|
...
|
|
bunkerity/bunkerweb:1.4.0
|
|
</code></pre></div>
|
|
<p>Here is the docker-compose equivalent :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nn">...</span><span class="w"></span>
|
|
<span class="nt">services</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">mybunker</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerity/bunkerweb:1.4.0</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">MY_SETTING=value</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<div class="admonition info">
|
|
<p class="admonition-title">Full list</p>
|
|
<p>For the complete list of environment variables, see the <a href="/settings">settings section</a> of the documentation.</p>
|
|
</div>
|
|
<h3 id="volume">Volume</h3>
|
|
<p>A volume is used to share data with BunkerWeb and store persistent data like certificates, cached files, ...</p>
|
|
<p>The easiest way of managing the volume is by using a named one. You will first need to create it :</p>
|
|
<div class="highlight"><pre><span></span><code>docker volume create bw-data
|
|
</code></pre></div>
|
|
<p>Once it's created, you can mount it on <code>/data</code> when running the container :</p>
|
|
<div class="highlight"><pre><span></span><code>docker run <span class="se">\</span>
|
|
...
|
|
-v <span class="s2">"</span><span class="si">${</span><span class="nv">PWD</span><span class="si">}</span><span class="s2">/bw-data:/data"</span> <span class="se">\</span>
|
|
...
|
|
bunkerity/bunkerweb:1.4.0
|
|
</code></pre></div>
|
|
<p>Here is the docker-compose equivalent :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nn">...</span><span class="w"></span>
|
|
<span class="nt">services</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">mybunker</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerity/bunkerweb:1.4.0</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-data:/data</span><span class="w"></span>
|
|
<span class="nn">...</span><span class="w"></span>
|
|
<span class="nt">volumes</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bw-data</span><span class="p">:</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<div class="admonition warning">
|
|
<p class="admonition-title">Warning</p>
|
|
<p>BunkerWeb runs as an <strong>unprivileged user with UID 101 and GID 101</strong> inside the container. The reason behind this is the security : in case a vulnerability is exploited, the attacker won't have full root (UID/GID 0) privileges.
|
|
But there is a downside : if you use a <strong>local folder for the persistent data</strong>, you will need to <strong>set the correct permissions</strong> so the unprivileged user can write data to it. Something like that should do the trick :
|
|
<code>shell mkdir bw-data && \ chown root:101 bw-data && \ chmod 770 bw-data</code></p>
|
|
</div>
|
|
<p>Alternatively, if the folder already exists :</p>
|
|
<div class="highlight"><pre><span></span><code>chown -R root:101 bw-data <span class="o">&&</span> <span class="se">\</span>
|
|
chmod -R <span class="m">770</span> bw-data
|
|
</code></pre></div>
|
|
<p>Mounting the folder :</p>
|
|
<div class="highlight"><pre><span></span><code>docker run <span class="se">\</span>
|
|
...
|
|
-v ./bw-data:/data <span class="se">\</span>
|
|
...
|
|
bunkerity/bunkerweb:1.4.0
|
|
</code></pre></div>
|
|
<p>Here is the docker-compose equivalent :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nn">...</span><span class="w"></span>
|
|
<span class="nt">services</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">mybunker</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerity/bunkerweb:1.4.0</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./bw-data:/data</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<h3 id="networks">Networks</h3>
|
|
<p>The easiest way to connect BunkerWeb to web applications is by using Docker networks.</p>
|
|
<p>First of all, you will need to create a network :</p>
|
|
<div class="highlight"><pre><span></span><code>docker network create mynetwork
|
|
</code></pre></div>
|
|
<p>Once it's created, you will need to connect the container to that network :</p>
|
|
<div class="highlight"><pre><span></span><code>docker run <span class="se">\</span>
|
|
...
|
|
--network mynetwork <span class="se">\</span>
|
|
...
|
|
bunkerity/bunkerweb:1.4.0
|
|
</code></pre></div>
|
|
<p>You will also need to do the same with your web application(s). Please note that the other containers are accessible using their name as the hostname.</p>
|
|
<p>Here is the docker-compose equivalent :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nn">...</span><span class="w"></span>
|
|
<span class="nt">services</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">mybunker</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerity/bunkerweb:1.4.0</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-net</span><span class="w"></span>
|
|
<span class="nn">...</span><span class="w"></span>
|
|
<span class="nt">networks</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bw-net</span><span class="p">:</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<h2 id="docker-autoconf">Docker autoconf</h2>
|
|
<figure>
|
|
<p><img align="center" alt="Overwiew" src="../assets/img/integration-autoconf.svg" />
|
|
</p>
|
|
<figcaption>Docker autoconf integration</figcaption>
|
|
</figure>
|
|
<div class="admonition info">
|
|
<p class="admonition-title">Docker integration</p>
|
|
<p>The Docker autoconf integration is an "evolution" of the Docker one. Please read the <a href="#docker">Docker integration section</a> first if needed.</p>
|
|
</div>
|
|
<p>The downside of using environment variables is that the container needs to be recreated each time there is an update which is not very convenient. To counter that issue, you can use another image called <strong>autoconf</strong> which will listen for Docker events and automatically reconfigure BunkerWeb in real-time without recreating the container.</p>
|
|
<p>Instead of defining environment variables for the BunkerWeb container, you simply add <strong>labels</strong> to your web applications containers and the <strong>autoconf</strong> will "automagically" take care of the rest.</p>
|
|
<div class="admonition info">
|
|
<p class="admonition-title">Multisite mode</p>
|
|
<p>The Docker autoconf integration implies the use of <strong>multisite mode</strong>. Please refer to the <a href="/concepts/#multisite-mode">multisite section</a> of the documentation for more information.</p>
|
|
</div>
|
|
<p>First of all, you will need to create the data volume :</p>
|
|
<div class="highlight"><pre><span></span><code>docker volume create bw-data
|
|
</code></pre></div>
|
|
<ul>
|
|
<li>One for sharing the persistent data, mounted on <strong>/data</strong></li>
|
|
<li>Another one for sharing the generated Nginx configurations, mounted on <strong>/etc/nginx</strong></li>
|
|
</ul>
|
|
<p>Then, you can create two networks (replace 10.20.30.0/24 with an unused subnet of your choice) :</p>
|
|
<div class="highlight"><pre><span></span><code>docker network create --subnet <span class="m">10</span>.20.30.0/24 bw-autoconf <span class="o">&&</span> <span class="se">\</span>
|
|
docker network create bw-services
|
|
</code></pre></div>
|
|
<ul>
|
|
<li>One for communication between <strong>BunkerWeb</strong> and <strong>autoconf</strong></li>
|
|
<li>Another one for communication between <strong>BunkerWeb</strong> and <strong>web applications</strong></li>
|
|
</ul>
|
|
<p>You can now create the BunkerWeb container with the <code>AUTOCONF_MODE=yes</code> setting and the <code>bunkerweb.AUTOCONF</code> label (replace 10.20.30.0/24 with the subnet specified before) :</p>
|
|
<div class="highlight"><pre><span></span><code>docker run <span class="se">\</span>
|
|
-d <span class="se">\</span>
|
|
--name mybunker <span class="se">\</span>
|
|
--network bw-autoconf <span class="se">\</span>
|
|
-p <span class="m">80</span>:8080 <span class="se">\</span>
|
|
-p <span class="m">443</span>:8443 <span class="se">\</span>
|
|
-e <span class="nv">AUTOCONF_MODE</span><span class="o">=</span>yes <span class="se">\</span>
|
|
-e <span class="nv">MULTISITE</span><span class="o">=</span>yes <span class="se">\</span>
|
|
-e <span class="nv">SERVER_NAME</span><span class="o">=</span> <span class="se">\</span>
|
|
-e <span class="s2">"API_WHITELIST_IP=127.0.0.0/8 10.20.30.0/24"</span> <span class="se">\</span>
|
|
-l bunkerweb.AUTOCONF <span class="se">\</span>
|
|
bunkerity/bunkerweb:1.4.0 <span class="o">&&</span> <span class="se">\</span>
|
|
|
|
docker network connect bw-services mybunker
|
|
</code></pre></div>
|
|
<p>And the autoconf one :</p>
|
|
<div class="highlight"><pre><span></span><code>docker run <span class="se">\</span>
|
|
-d <span class="se">\</span>
|
|
--name myautoconf <span class="se">\</span>
|
|
--network bw-autoconf <span class="se">\</span>
|
|
-v bw-data:/data <span class="se">\</span>
|
|
-v /var/run/docker.sock:/var/run/docker.sock:ro <span class="se">\</span>
|
|
bunkerity/bunkerweb-autoconf:1.4.0
|
|
</code></pre></div>
|
|
<p>Here is the docker-compose equivalent for the BunkerWeb autoconf stack :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s">'3'</span><span class="w"></span>
|
|
|
|
<span class="nt">services</span><span class="p">:</span><span class="w"></span>
|
|
|
|
<span class="w"> </span><span class="nt">mybunker</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerity/bunkerweb:1.4.0</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">ports</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">80:8080</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">443:8443</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-data:/data</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">MULTISITE=yes</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">SERVER_NAME=</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">API_WHITELIST_IP=127.0.0.0/8 10.20.30.0/24</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"bunkerweb.AUTOCONF"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-autoconf</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-services</span><span class="w"></span>
|
|
|
|
<span class="w"> </span><span class="nt">myautoconf</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerity/bunkerweb-autoconf:1.4.0</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-data:/data</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/var/run/docker.sock:/var/run/docker.sock:ro</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-autoconf</span><span class="w"></span>
|
|
|
|
<span class="nt">volumes</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bw-data</span><span class="p">:</span><span class="w"></span>
|
|
|
|
<span class="nt">networks</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bw-autoconf</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">ipam</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">default</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">config</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">subnet</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10.20.30.0/24</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bw-services</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-services</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<p>Once the stack is setup, you can now create the web application container and add the settings as labels using the "bunkerweb." prefix in order to automatically setup BunkerWeb :</p>
|
|
<div class="highlight"><pre><span></span><code>docker run <span class="se">\</span>
|
|
-d <span class="se">\</span>
|
|
--name myapp <span class="se">\</span>
|
|
--network bw-services <span class="se">\</span>
|
|
-l bunkerweb.MY_SETTING_1<span class="o">=</span>value1 <span class="se">\</span>
|
|
-l bunkerweb.MY_SETTING_2<span class="o">=</span>value2 <span class="se">\</span>
|
|
...
|
|
mywebapp:4.2
|
|
</code></pre></div>
|
|
<p>Here is the docker-compose equivalent :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nn">...</span><span class="w"></span>
|
|
|
|
<span class="nt">services</span><span class="p">:</span><span class="w"></span>
|
|
|
|
<span class="w"> </span><span class="nt">myapp</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mywebapp:4.2</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bw-services</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">aliases</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">myapp</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"bunkerweb.MY_SETTING_1=value1"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"bunkerweb.MY_SETTING_2=value2"</span><span class="w"></span>
|
|
|
|
<span class="nn">...</span><span class="w"></span>
|
|
|
|
<span class="nt">networks</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bw-services</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">external</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-services</span><span class="w"></span>
|
|
|
|
<span class="nn">...</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<h2 id="swarm">Swarm</h2>
|
|
<figure>
|
|
<p><img align="center" alt="Overwiew" src="../assets/img/integration-swarm.svg" />
|
|
</p>
|
|
<figcaption>Docker Swarm integration</figcaption>
|
|
</figure>
|
|
<div class="admonition info">
|
|
<p class="admonition-title">Docker autoconf</p>
|
|
<p>The Docker autoconf integration is similar of the Docker autoconf one (but with services instead of containers). Please read the <a href="#docker-autoconf">Docker autoconf integration section</a> first if needed.</p>
|
|
</div>
|
|
<p>To automatically configure BunkerWeb instances, a special service, called <strong>autoconf</strong>, will be scheduled on a manager node. That service will listen for Docker Swarm events like service creation or deletion and automatically configure the <strong>BunkerWeb instances</strong> in real-time without downtime.</p>
|
|
<p>Like the <a href="#docker-autoconf">Docker autoconf integration</a>, configuration for web services is defined using labels starting with the special <strong>bunkerweb.</strong> prefix.</p>
|
|
<p>The recommended setup is to schedule the <strong>BunkerWeb service</strong> as a <strong>global service</strong> on all worker nodes and the <strong>autoconf service</strong> as a <strong>single replicated service</strong> on a manager node.</p>
|
|
<p>First of all, you will need to create two networks (replace 10.20.30.0/24 with an unused subnet of your choice) :</p>
|
|
<div class="highlight"><pre><span></span><code>docker network create -d overlay --attachable --subnet <span class="m">10</span>.20.30.0/24 bw-autoconf <span class="o">&&</span> <span class="se">\</span>
|
|
docker network create -d overlay --attachable bw-services
|
|
</code></pre></div>
|
|
<ul>
|
|
<li>One for communication between <strong>BunkerWeb</strong> and <strong>autoconf</strong></li>
|
|
<li>Another one for communication between <strong>BunkerWeb</strong> and <strong>web applications</strong></li>
|
|
</ul>
|
|
<p>You can now create the BunkerWeb service (replace 10.20.30.0/24 with the subnet specified before) :</p>
|
|
<div class="highlight"><pre><span></span><code>docker service create <span class="se">\</span>
|
|
--name mybunker <span class="se">\</span>
|
|
--mode global <span class="se">\</span>
|
|
--constraint node.role<span class="o">==</span>worker <span class="se">\</span>
|
|
--network bw-autoconf <span class="se">\</span>
|
|
--network bw-services <span class="se">\</span>
|
|
-p <span class="nv">published</span><span class="o">=</span><span class="m">80</span>,target<span class="o">=</span><span class="m">8080</span>,mode<span class="o">=</span>host <span class="se">\</span>
|
|
-p <span class="nv">published</span><span class="o">=</span><span class="m">443</span>,target<span class="o">=</span><span class="m">8443</span>,mode<span class="o">=</span>host <span class="se">\</span>
|
|
-e <span class="nv">SWARM_MODE</span><span class="o">=</span>yes <span class="se">\</span>
|
|
-e <span class="nv">SERVER_NAME</span><span class="o">=</span> <span class="se">\</span>
|
|
-e <span class="nv">MULTISITE</span><span class="o">=</span>yes <span class="se">\</span>
|
|
-e <span class="s2">"API_WHITELIST_IP=127.0.0.0/8 10.20.30.0/24"</span> <span class="se">\</span>
|
|
-l bunkerweb.AUTOCONF <span class="se">\</span>
|
|
bunkerity/bunkerweb:1.4.0
|
|
</code></pre></div>
|
|
<p>And the autoconf one :</p>
|
|
<div class="highlight"><pre><span></span><code>docker service <span class="se">\</span>
|
|
create <span class="se">\</span>
|
|
--name myautoconf <span class="se">\</span>
|
|
--constraint node.role<span class="o">==</span>manager <span class="se">\</span>
|
|
--network bw-autoconf <span class="se">\</span>
|
|
--mount <span class="nv">type</span><span class="o">=</span>bind,source<span class="o">=</span>/var/run/docker.sock,destination<span class="o">=</span>/var/run/docker.sock,ro <span class="se">\</span>
|
|
--mount <span class="nv">type</span><span class="o">=</span>volume,source<span class="o">=</span>bw-data,destination<span class="o">=</span>/data <span class="se">\</span>
|
|
-e <span class="nv">SWARM_MODE</span><span class="o">=</span>yes <span class="se">\</span>
|
|
bunkerity/bunkerweb-autoconf:1.4.0
|
|
</code></pre></div>
|
|
<p>Here is the docker-compose equivalent (using <code>docker stack deploy</code>) :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s">'3.5'</span><span class="w"></span>
|
|
|
|
<span class="nt">services</span><span class="p">:</span><span class="w"></span>
|
|
|
|
<span class="w"> </span><span class="nt">mybunker</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerity/bunkerweb:1.4.0</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">ports</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">published</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">80</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">8080</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">host</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">protocol</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">tcp</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">published</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">443</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">8443</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">host</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">protocol</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">tcp</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">SWARM_MODE=yes</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">SERVER_NAME=</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">MULTISITE=yes</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">API_WHITELIST_IP=127.0.0.0/8 10.20.30.0/24</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-autoconf</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-services</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">deploy</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">global</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">placement</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">constraints</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"node.role==worker"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"bunkerweb.AUTOCONF"</span><span class="w"></span>
|
|
|
|
<span class="w"> </span><span class="nt">myautoconf</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerity/bunkerweb-autoconf:1.4.0</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">SWARM_MODE=yes</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-data:/data</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/var/run/docker.sock:/var/run/docker.sock:ro</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-autoconf</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">deploy</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">replicas</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">placement</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">constraints</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"node.role==manager"</span><span class="w"></span>
|
|
|
|
<span class="nt">networks</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bw-autoconf</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">overlay</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">attachable</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-autoconf</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">ipam</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">config</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">subnet</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10.20.30.0/24</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bw-services</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">overlay</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">attachable</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-services</span><span class="w"></span>
|
|
|
|
<span class="nt">volumes</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bw-data</span><span class="p">:</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<p>Once the BunkerWeb Swarm stack is set up and running (see autoconf logs for more information), you can now deploy web applications in the cluster and use labels to dynamically configure BunkerWeb :</p>
|
|
<div class="highlight"><pre><span></span><code>docker service <span class="se">\</span>
|
|
create <span class="se">\</span>
|
|
--name myapp <span class="se">\</span>
|
|
--network bw-services <span class="se">\</span>
|
|
-l bunkerweb.MY_SETTING_1<span class="o">=</span>value1 <span class="se">\</span>
|
|
-l bunkerweb.MY_SETTING_2<span class="o">=</span>value2 <span class="se">\</span>
|
|
...
|
|
mywebapp:4.2
|
|
</code></pre></div>
|
|
<p>Here is the docker-compose equivalent (using <code>docker stack deploy</code>) :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nn">...</span><span class="w"></span>
|
|
<span class="nt">services</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">myapp</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mywebapp:4.2</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-services</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">deploy</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">placement</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">constraints</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"node.role==worker"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"bunkerweb.MY_SETTING_1=value1"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"bunkerweb.MY_SETTING_2=value2"</span><span class="w"></span>
|
|
<span class="nn">...</span><span class="w"></span>
|
|
<span class="nt">networks</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bw-services</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">external</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bw-services</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<h2 id="kubernetes">Kubernetes</h2>
|
|
<figure>
|
|
<p><img align="center" alt="Overwiew" src="../assets/img/integration-kubernetes.svg" />
|
|
</p>
|
|
<figcaption>Kubernetes integration</figcaption>
|
|
</figure>
|
|
<p>The autoconf acts as an <a href="https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/">Ingress controller</a> and will configure the BunkerWeb instances according to the <a href="https://kubernetes.io/docs/concepts/services-networking/ingress/">Ingress resources</a>. It also monitors other Kubernetes objects like <a href="https://kubernetes.io/docs/concepts/configuration/configmap/">ConfigMap</a> for custom configurations.</p>
|
|
<p>The first step to install BunkerWeb on a Kubernetes cluster is to add a role and permissions on the cluster for the autoconf :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">rbac.authorization.k8s.io/v1</span><span class="w"></span>
|
|
<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ClusterRole</span><span class="w"></span>
|
|
<span class="nt">metadata</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">cr-bunkerweb</span><span class="w"></span>
|
|
<span class="nt">rules</span><span class="p">:</span><span class="w"></span>
|
|
<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">apiGroups</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">""</span><span class="p p-Indicator">]</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">resources</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">"services"</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">"pods"</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">"configmaps"</span><span class="p p-Indicator">]</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">verbs</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">"get"</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">"watch"</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">"list"</span><span class="p p-Indicator">]</span><span class="w"></span>
|
|
<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">apiGroups</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">"networking.k8s.io"</span><span class="p p-Indicator">]</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">resources</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">"ingresses"</span><span class="p p-Indicator">]</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">verbs</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">"get"</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">"watch"</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">"list"</span><span class="p p-Indicator">]</span><span class="w"></span>
|
|
<span class="nn">---</span><span class="w"></span>
|
|
<span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">v1</span><span class="w"></span>
|
|
<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ServiceAccount</span><span class="w"></span>
|
|
<span class="nt">metadata</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">sa-bunkerweb</span><span class="w"></span>
|
|
<span class="nn">---</span><span class="w"></span>
|
|
<span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">rbac.authorization.k8s.io/v1</span><span class="w"></span>
|
|
<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ClusterRoleBinding</span><span class="w"></span>
|
|
<span class="nt">metadata</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">crb-bunkerweb</span><span class="w"></span>
|
|
<span class="nt">subjects</span><span class="p">:</span><span class="w"></span>
|
|
<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ServiceAccount</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">sa-bunkerweb</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">default</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">apiGroup</span><span class="p">:</span><span class="w"> </span><span class="s">""</span><span class="w"></span>
|
|
<span class="nt">roleRef</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ClusterRole</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">cr-bunkerweb</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">apiGroup</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">rbac.authorization.k8s.io</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<p>The recommended way of deploying BunkerWeb is using a <a href="https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/">DaemonSet</a> which means each node in the cluster will run an instance of BunkerWeb :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">apps/v1</span><span class="w"></span>
|
|
<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">DaemonSet</span><span class="w"></span>
|
|
<span class="nt">metadata</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerweb</span><span class="w"></span>
|
|
<span class="nt">spec</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">selector</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerweb</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">template</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">metadata</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerweb</span><span class="w"></span>
|
|
<span class="w"> </span><span class="c1"># mandatory annotation</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bunkerweb.io/AUTOCONF</span><span class="p">:</span><span class="w"> </span><span class="s">"yes"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">spec</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">containers</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerweb</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerity/bunkerweb</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">securityContext</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">runAsUser</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">101</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">runAsGroup</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">101</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">allowPrivilegeEscalation</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">capabilities</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">drop</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ALL</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">ports</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">containerPort</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">8080</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">hostPort</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">80</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">containerPort</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">8443</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">hostPort</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">443</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">env</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">KUBERNETES_MODE</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s">"yes"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="c1"># replace with your DNS resolvers</span><span class="w"></span>
|
|
<span class="w"> </span><span class="c1"># e.g. : kube-dns.kube-system.svc.cluster.local</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">DNS_RESOLVERS</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s">"coredns.kube-system.svc.cluster.local"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">USE_API</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s">"yes"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="c1"># 10.0.0.0/8 is the cluster internal subnet</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">API_WHITELIST_IP</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s">"127.0.0.0/8</span><span class="nv"> </span><span class="s">10.0.0.0/8"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">SERVER_NAME</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s">""</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">MULTISITE</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s">"yes"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">livenessProbe</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">exec</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">command</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/opt/bunkerweb/helpers/healthcheck.sh</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">initialDelaySeconds</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">30</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">periodSeconds</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">timeoutSeconds</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">failureThreshold</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">readinessProbe</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">exec</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">command</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/opt/bunkerweb/helpers/healthcheck.sh</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">initialDelaySeconds</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">30</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">periodSeconds</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">timeoutSeconds</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">failureThreshold</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3</span><span class="w"></span>
|
|
<span class="nn">---</span><span class="w"></span>
|
|
<span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">v1</span><span class="w"></span>
|
|
<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Service</span><span class="w"></span>
|
|
<span class="nt">metadata</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">svc-bunkerweb</span><span class="w"></span>
|
|
<span class="nt">spec</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">clusterIP</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">None</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">selector</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerweb</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<p>In order to store persistent data, you will need a <a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/">PersistentVolumeClaim</a> :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">v1</span><span class="w"></span>
|
|
<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">PersistentVolumeClaim</span><span class="w"></span>
|
|
<span class="nt">metadata</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">pvc-bunkerweb</span><span class="w"></span>
|
|
<span class="nt">spec</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">accessModes</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ReadWriteOnce</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">resources</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">requests</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5Gi</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<p>Now, you can start the autoconf as a single replica <a href="https://kubernetes.io/docs/concepts/workloads/controllers/deployment/">Deployment</a> :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">apps/v1</span><span class="w"></span>
|
|
<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Deployment</span><span class="w"></span>
|
|
<span class="nt">metadata</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerweb-controller</span><span class="w"></span>
|
|
<span class="nt">spec</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">replicas</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">strategy</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Recreate</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">selector</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerweb-controller</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">template</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">metadata</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerweb-controller</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">spec</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">serviceAccountName</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">sa-bunkerweb</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">vol-bunkerweb</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">persistentVolumeClaim</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">claimName</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">pvc-bunkerweb</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">containers</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerweb-controller</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">bunkerity/bunkerweb-autoconf</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">imagePullPolicy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Always</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">env</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">KUBERNETES_MODE</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s">"yes"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">volumeMounts</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">vol-bunkerweb</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/data</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<p>Once the BunkerWeb Kubernetes stack is setup and running (see autoconf logs for more information), you can now deploy web applications in the cluster and declare your Ingress resource. Please note that <a href="/settings">settings</a> need to be set as annotations for the Ingress resource with the special value <strong>bunkerweb.io</strong> for the domain part :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">networking.k8s.io/v1</span><span class="w"></span>
|
|
<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Ingress</span><span class="w"></span>
|
|
<span class="nt">metadata</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ingress</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bunkerweb.io/MY_SETTING_1</span><span class="p">:</span><span class="w"> </span><span class="s">"value1"</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">bunkerweb.io/MY_SETTING_2</span><span class="p">:</span><span class="w"> </span><span class="s">"value2"</span><span class="w"></span>
|
|
<span class="nt">spec</span><span class="p">:</span><span class="w"></span>
|
|
<span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"></span>
|
|
<span class="nn">...</span><span class="w"></span>
|
|
</code></pre></div>
|
|
<h2 id="linux">Linux</h2>
|
|
<figure>
|
|
<p><img align="center" alt="Overwiew" src="../assets/img/integration-linux.svg" />
|
|
</p>
|
|
<figcaption>Linux integration</figcaption>
|
|
</figure>
|
|
<p>List of supported Linux distros :</p>
|
|
<ul>
|
|
<li>Debian 11 "Bullseye"</li>
|
|
<li>Ubuntu 22.04 "Jammy"</li>
|
|
<li>Fedora 36</li>
|
|
<li>CentOS Stream 8</li>
|
|
</ul>
|
|
<p>Please note that you will need to <strong>install NGINX 1.20.2 before BunkerWeb</strong>. The installation is not covered in this documentation but you need to use prebuilt packages from the NGINX official repository as described <a href="https://nginx.org/en/linux_packages.html">here</a>. If you are on Fedora, you can use the prebuilt packages from the Fedora repository.</p>
|
|
<p>Repositories of Linux packages for BunkerWeb are available on <a href="https://packagecloud.io/bunkerity/bunkerweb">PackageCloud</a>, they provide a bash script to automatically add and trust the repository (but you can also follow the <a href="https://packagecloud.io/bunkerity/bunkerweb/install">manual installation</a> instructions if you prefer) :</p>
|
|
<div class="tabbed-set tabbed-alternate" data-tabs="1:4"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Debian</label><label for="__tabbed_1_2">Ubuntu</label><label for="__tabbed_1_3">Fedora</label><label for="__tabbed_1_4">CentOS Stream</label></div>
|
|
<div class="tabbed-content">
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>curl -s https://packagecloud.io/install/repositories/bunkerity/bunkerweb/script.deb.sh <span class="p">|</span> sudo bash <span class="o">&&</span> <span class="se">\</span>
|
|
apt update <span class="o">&&</span> <span class="se">\</span>
|
|
apt install -y bunkerweb
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>curl -s https://packagecloud.io/install/repositories/bunkerity/bunkerweb/script.deb.sh <span class="p">|</span> sudo bash <span class="o">&&</span> <span class="se">\</span>
|
|
apt update <span class="o">&&</span> <span class="se">\</span>
|
|
apt install -y bunkerweb
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>curl -s https://packagecloud.io/install/repositories/bunkerity/bunkerweb/script.rpm.sh <span class="p">|</span> sudo bash <span class="o">&&</span> <span class="se">\</span>
|
|
dnf check-update <span class="o">&&</span> <span class="se">\</span>
|
|
dnf install -y bunkerweb
|
|
</code></pre></div>
|
|
</div>
|
|
<div class="tabbed-block">
|
|
<div class="highlight"><pre><span></span><code>dnf install -y epel-release <span class="o">&&</span> <span class="se">\</span>
|
|
curl -s https://packagecloud.io/install/repositories/bunkerity/bunkerweb/script.rpm.sh <span class="p">|</span> sudo bash <span class="o">&&</span> <span class="se">\</span>
|
|
dnf check-update <span class="o">&&</span> <span class="se">\</span>
|
|
dnf install -y bunkerweb
|
|
</code></pre></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p>Configuration of BunkerWeb is done by editing the <code>/opt/bunkerweb/variables.env</code> file :</p>
|
|
<div class="highlight"><pre><span></span><code>MY_SETTING_1=value1
|
|
MY_SETTING_2=value2
|
|
...
|
|
</code></pre></div>
|
|
<p>BunkerWeb is managed using systemctl :</p>
|
|
<ul>
|
|
<li>Check BunkerWeb status : <code>systemctl status bunkerweb</code></li>
|
|
<li>Reload the configuration : <code>systemctl reload bunkerweb</code></li>
|
|
<li>Start it if it's stopped : <code>systemctl start bunkerweb</code></li>
|
|
<li>Stop it if it's started : <code>systemctl stop bunkerweb</code></li>
|
|
<li>And restart : <code>systemctl restart bunkerweb</code></li>
|
|
</ul>
|
|
|
|
|
|
</article>
|
|
</div>
|
|
</div>
|
|
|
|
</main>
|
|
|
|
<footer class="md-footer">
|
|
|
|
<nav class="md-footer__inner md-grid" aria-label="Footer">
|
|
|
|
|
|
<a href="../concepts/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Concepts" rel="prev">
|
|
<div class="md-footer__button md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</div>
|
|
<div class="md-footer__title">
|
|
<div class="md-ellipsis">
|
|
<span class="md-footer__direction">
|
|
Previous
|
|
</span>
|
|
Concepts
|
|
</div>
|
|
</div>
|
|
</a>
|
|
|
|
|
|
|
|
<a href="../quickstart-guide/" class="md-footer__link md-footer__link--next" aria-label="Next: Quickstart guide" rel="next">
|
|
<div class="md-footer__title">
|
|
<div class="md-ellipsis">
|
|
<span class="md-footer__direction">
|
|
Next
|
|
</span>
|
|
Quickstart guide
|
|
</div>
|
|
</div>
|
|
<div class="md-footer__button md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg>
|
|
</div>
|
|
</a>
|
|
|
|
</nav>
|
|
|
|
<div class="md-footer-meta md-typeset">
|
|
<div class="md-footer-meta__inner md-grid">
|
|
<div class="md-copyright">
|
|
|
|
<div class="md-copyright__highlight">
|
|
Copyright © 2022 Bunkerity
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
<div class="md-social">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a href="https://discord.com/invite/fTf46FmtyD" target="_blank" rel="noopener" title="discord.com" class="md-social__link">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M524.531 69.836a1.5 1.5 0 0 0-.764-.7A485.065 485.065 0 0 0 404.081 32.03a1.816 1.816 0 0 0-1.923.91 337.461 337.461 0 0 0-14.9 30.6 447.848 447.848 0 0 0-134.426 0 309.541 309.541 0 0 0-15.135-30.6 1.89 1.89 0 0 0-1.924-.91 483.689 483.689 0 0 0-119.688 37.107 1.712 1.712 0 0 0-.788.676C39.068 183.651 18.186 294.69 28.43 404.354a2.016 2.016 0 0 0 .765 1.375 487.666 487.666 0 0 0 146.825 74.189 1.9 1.9 0 0 0 2.063-.676A348.2 348.2 0 0 0 208.12 430.4a1.86 1.86 0 0 0-1.019-2.588 321.173 321.173 0 0 1-45.868-21.853 1.885 1.885 0 0 1-.185-3.126 251.047 251.047 0 0 0 9.109-7.137 1.819 1.819 0 0 1 1.9-.256c96.229 43.917 200.41 43.917 295.5 0a1.812 1.812 0 0 1 1.924.233 234.533 234.533 0 0 0 9.132 7.16 1.884 1.884 0 0 1-.162 3.126 301.407 301.407 0 0 1-45.89 21.83 1.875 1.875 0 0 0-1 2.611 391.055 391.055 0 0 0 30.014 48.815 1.864 1.864 0 0 0 2.063.7A486.048 486.048 0 0 0 610.7 405.729a1.882 1.882 0 0 0 .765-1.352c12.264-126.783-20.532-236.912-86.934-334.541zM222.491 337.58c-28.972 0-52.844-26.587-52.844-59.239s23.409-59.241 52.844-59.241c29.665 0 53.306 26.82 52.843 59.239 0 32.654-23.41 59.241-52.843 59.241zm195.38 0c-28.971 0-52.843-26.587-52.843-59.239s23.409-59.241 52.843-59.241c29.667 0 53.307 26.82 52.844 59.239 0 32.654-23.177 59.241-52.844 59.241z"/></svg>
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a href="https://github.com/bunkerity" target="_blank" rel="noopener" title="github.com" class="md-social__link">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a href="https://www.linkedin.com/company/bunkerity/" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/></svg>
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a href="https://twitter.com/bunkerity" target="_blank" rel="noopener" title="twitter.com" class="md-social__link">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg>
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
</div>
|
|
<div class="md-dialog" data-md-component="dialog">
|
|
<div class="md-dialog__inner md-typeset"></div>
|
|
</div>
|
|
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.tracking", "navigation.tabs", "navigation.tabs.sticky", "toc.integrate"], "translations": {"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing", "select.version.title": "Select version"}, "search": "../assets/javascripts/workers/search.bd0b6b67.min.js", "version": {"provider": "mike", "version": "latest"}}</script>
|
|
|
|
|
|
<script src="../assets/javascripts/bundle.467223ff.min.js"></script>
|
|
|
|
|
|
</body>
|
|
</html> |