2025-07-08 09:18:14 -06:00

2905 lines
82 KiB
HTML
Raw 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" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Build Power. Not Rent It. Own your digital infrastructure.">
<meta name="author" content="Bunker Operations">
<link rel="canonical" href="https://cmlite.org/config/map/">
<link rel="prev" href="../coder/">
<link rel="next" href="../../adv/">
<link rel="icon" href="../../assets/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.15">
<title>Map - Changemaker Lite</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.342714a4.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Inter";--md-code-font:"JetBrains Mono"}</style>
<link rel="stylesheet" href="../../stylesheets/extra.css">
<link rel="stylesheet" href="../../stylesheets/home.css">
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__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>
<meta property="og:type" content="website" >
<meta property="og:title" content="Map - Changemaker Lite" >
<meta property="og:description" content="Build Power. Not Rent It. Own your digital infrastructure." >
<meta property="og:image" content="https://cmlite.org/assets/images/social/config/map.png" >
<meta property="og:image:type" content="image/png" >
<meta property="og:image:width" content="1200" >
<meta property="og:image:height" content="630" >
<meta property="og:url" content="https://cmlite.org/config/map/" >
<meta name="twitter:card" content="summary_large_image" >
<meta name="twitter:title" content="Map - Changemaker Lite" >
<meta name="twitter:description" content="Build Power. Not Rent It. Own your digital infrastructure." >
<meta name="twitter:image" content="https://cmlite.org/assets/images/social/config/map.png" >
<!-- Custom meta tags or head content can go here -->
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber">
<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="#map-configuration" 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">
<button class="md-banner__button md-icon" aria-label="Don't show this again">
<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 12z"/></svg>
</button>
<a href="https://homepage.cmlite.org" class="login-button">Login</a>
Changemaker Archive. <a href="https://docs.bnkops.com">Learn more</a>
</div>
<script>var el=document.querySelector("[data-md-component=announce]");if(el){var content=el.querySelector(".md-typeset");__md_hash(content.innerHTML)===__md_get("__announce")&&(el.hidden=!0)}</script>
</aside>
</div>
<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="Changemaker Lite" class="md-header__button md-logo" aria-label="Changemaker Lite" 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 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></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">
Changemaker Lite
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Map
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<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.52 6.52 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 5"/></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.52 6.52 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 5"/></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 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" 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 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" 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" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://gitea.bnkops.com/admin/changemaker.lite" 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.7.2 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 2024 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.81"/></svg>
</div>
<div class="md-source__repository">
changemaker.lite
</div>
</a>
</div>
</nav>
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../phil/" class="md-tabs__link">
Philosophy
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../build/" class="md-tabs__link">
Getting Started
</a>
</li>
<li class="md-tabs__item">
<a href="../../blog/" class="md-tabs__link">
Blog
</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" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Changemaker Lite" class="md-nav__button md-logo" aria-label="Changemaker Lite" data-md-component="logo">
<img src="../../assets/logo.png" alt="logo">
</a>
Changemaker Lite
</label>
<div class="md-nav__source">
<a href="https://gitea.bnkops.com/admin/changemaker.lite" 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.7.2 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 2024 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.81"/></svg>
</div>
<div class="md-source__repository">
changemaker.lite
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../phil/" class="md-nav__link">
<span class="md-ellipsis">
Philosophy
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
<div class="md-nav__link md-nav__container">
<a href="../../build/" class="md-nav__link ">
<span class="md-ellipsis">
Getting Started
</span>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Getting Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../build/server/" class="md-nav__link">
<span class="md-ellipsis">
Build Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../build/map/" class="md-nav__link">
<span class="md-ellipsis">
Build Map
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../build/site/" class="md-nav__link">
<span class="md-ellipsis">
Build Site
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_5" >
<div class="md-nav__link md-nav__container">
<a href="../../services/" class="md-nav__link ">
<span class="md-ellipsis">
Services
</span>
</a>
<label class="md-nav__link " for="__nav_3_5" id="__nav_3_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_5">
<span class="md-nav__icon md-icon"></span>
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../services/homepage/" class="md-nav__link">
<span class="md-ellipsis">
Homepage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/code-server/" class="md-nav__link">
<span class="md-ellipsis">
Code Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/mkdocs/" class="md-nav__link">
<span class="md-ellipsis">
MKDocs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/static-server/" class="md-nav__link">
<span class="md-ellipsis">
Static Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/listmonk/" class="md-nav__link">
<span class="md-ellipsis">
Listmonk
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/postgresql/" class="md-nav__link">
<span class="md-ellipsis">
PostgreSQL
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/n8n/" class="md-nav__link">
<span class="md-ellipsis">
n8n
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/nocodb/" class="md-nav__link">
<span class="md-ellipsis">
NocoDB
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/gitea/" class="md-nav__link">
<span class="md-ellipsis">
Gitea
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/map/" class="md-nav__link">
<span class="md-ellipsis">
Map
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/mini-qr/" class="md-nav__link">
<span class="md-ellipsis">
Mini QR
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_6" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Configuration
</span>
</a>
<label class="md-nav__link " for="__nav_3_6" id="__nav_3_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3_6">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../cloudflare-config/" class="md-nav__link">
<span class="md-ellipsis">
Cloudflare
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../mkdocs/" class="md-nav__link">
<span class="md-ellipsis">
MKdocs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../coder/" class="md-nav__link">
<span class="md-ellipsis">
Code Server
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Map
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Map
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="On this page">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
On this page
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#features" class="md-nav__link">
<span class="md-ellipsis">
Features
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#setup-process-overview" class="md-nav__link">
<span class="md-ellipsis">
Setup Process Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#prerequisites" class="md-nav__link">
<span class="md-ellipsis">
Prerequisites
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#step-1-get-nocodb-api-token" class="md-nav__link">
<span class="md-ellipsis">
Step 1: Get NocoDB API Token
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#step-2-configure-environment" class="md-nav__link">
<span class="md-ellipsis">
Step 2: Configure Environment
</span>
</a>
<nav class="md-nav" aria-label="Step 2: Configure Environment">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#required-configuration" class="md-nav__link">
<span class="md-ellipsis">
Required Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#optional-configuration" class="md-nav__link">
<span class="md-ellipsis">
Optional Configuration
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#step-3-auto-create-database-structure" class="md-nav__link">
<span class="md-ellipsis">
Step 3: Auto-Create Database Structure
</span>
</a>
<nav class="md-nav" aria-label="Step 3: Auto-Create Database Structure">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-the-script-creates" class="md-nav__link">
<span class="md-ellipsis">
What the Script Creates
</span>
</a>
<nav class="md-nav" aria-label="What the Script Creates">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#1-locations-table" class="md-nav__link">
<span class="md-ellipsis">
1. Locations Table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-login-table" class="md-nav__link">
<span class="md-ellipsis">
2. Login Table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3-settings-table" class="md-nav__link">
<span class="md-ellipsis">
3. Settings Table
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#default-data" class="md-nav__link">
<span class="md-ellipsis">
Default Data
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#step-4-get-table-urls" class="md-nav__link">
<span class="md-ellipsis">
Step 4: Get Table URLs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#step-5-update-environment-with-urls" class="md-nav__link">
<span class="md-ellipsis">
Step 5: Update Environment with URLs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#step-6-build-and-deploy" class="md-nav__link">
<span class="md-ellipsis">
Step 6: Build and Deploy
</span>
</a>
<nav class="md-nav" aria-label="Step 6: Build and Deploy">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#verify-deployment" class="md-nav__link">
<span class="md-ellipsis">
Verify Deployment
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#using-the-map-system" class="md-nav__link">
<span class="md-ellipsis">
Using the Map System
</span>
</a>
<nav class="md-nav" aria-label="Using the Map System">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#user-interface" class="md-nav__link">
<span class="md-ellipsis">
User Interface
</span>
</a>
<nav class="md-nav" aria-label="User Interface">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#main-map-view" class="md-nav__link">
<span class="md-ellipsis">
Main Map View
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#location-markers" class="md-nav__link">
<span class="md-ellipsis">
Location Markers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#adding-locations" class="md-nav__link">
<span class="md-ellipsis">
Adding Locations
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#authentication" class="md-nav__link">
<span class="md-ellipsis">
Authentication
</span>
</a>
<nav class="md-nav" aria-label="Authentication">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#user-login" class="md-nav__link">
<span class="md-ellipsis">
User Login
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#admin-access" class="md-nav__link">
<span class="md-ellipsis">
Admin Access
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#admin-panel-features" class="md-nav__link">
<span class="md-ellipsis">
Admin Panel Features
</span>
</a>
<nav class="md-nav" aria-label="Admin Panel Features">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#start-location-configuration" class="md-nav__link">
<span class="md-ellipsis">
Start Location Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#walk-sheet-generator" class="md-nav__link">
<span class="md-ellipsis">
Walk Sheet Generator
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#api-endpoints" class="md-nav__link">
<span class="md-ellipsis">
API Endpoints
</span>
</a>
<nav class="md-nav" aria-label="API Endpoints">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#public-endpoints" class="md-nav__link">
<span class="md-ellipsis">
Public Endpoints
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#authentication-endpoints" class="md-nav__link">
<span class="md-ellipsis">
Authentication Endpoints
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#admin-endpoints-requires-admin-privileges" class="md-nav__link">
<span class="md-ellipsis">
Admin Endpoints (requires admin privileges)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
<nav class="md-nav" aria-label="Troubleshooting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#common-issues" class="md-nav__link">
<span class="md-ellipsis">
Common Issues
</span>
</a>
<nav class="md-nav" aria-label="Common Issues">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#locations-not-showing" class="md-nav__link">
<span class="md-ellipsis">
Locations not showing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cannot-add-locations" class="md-nav__link">
<span class="md-ellipsis">
Cannot add locations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#authentication-issues" class="md-nav__link">
<span class="md-ellipsis">
Authentication issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#build-script-failures" class="md-nav__link">
<span class="md-ellipsis">
Build script failures
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#development-mode" class="md-nav__link">
<span class="md-ellipsis">
Development Mode
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#logs-and-monitoring" class="md-nav__link">
<span class="md-ellipsis">
Logs and Monitoring
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#security-considerations" class="md-nav__link">
<span class="md-ellipsis">
Security Considerations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#maintenance" class="md-nav__link">
<span class="md-ellipsis">
Maintenance
</span>
</a>
<nav class="md-nav" aria-label="Maintenance">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#regular-updates" class="md-nav__link">
<span class="md-ellipsis">
Regular Updates
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#backup-considerations" class="md-nav__link">
<span class="md-ellipsis">
Backup Considerations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#performance-tips" class="md-nav__link">
<span class="md-ellipsis">
Performance Tips
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#support" class="md-nav__link">
<span class="md-ellipsis">
Support
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3_7" >
<div class="md-nav__link md-nav__container">
<a href="../../adv/" class="md-nav__link ">
<span class="md-ellipsis">
Advanced Configuration
</span>
</a>
<label class="md-nav__link " for="__nav_3_7" id="__nav_3_7_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_7">
<span class="md-nav__icon md-icon"></span>
Advanced Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../adv/ansible/" class="md-nav__link">
<span class="md-ellipsis">
SSH + Tailscale + Ansible
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../adv/vscode-ssh/" class="md-nav__link">
<span class="md-ellipsis">
SSH + VScode
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../blog/" class="md-nav__link">
<span class="md-ellipsis">
Blog
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="On this page">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
On this page
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#features" class="md-nav__link">
<span class="md-ellipsis">
Features
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#setup-process-overview" class="md-nav__link">
<span class="md-ellipsis">
Setup Process Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#prerequisites" class="md-nav__link">
<span class="md-ellipsis">
Prerequisites
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#step-1-get-nocodb-api-token" class="md-nav__link">
<span class="md-ellipsis">
Step 1: Get NocoDB API Token
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#step-2-configure-environment" class="md-nav__link">
<span class="md-ellipsis">
Step 2: Configure Environment
</span>
</a>
<nav class="md-nav" aria-label="Step 2: Configure Environment">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#required-configuration" class="md-nav__link">
<span class="md-ellipsis">
Required Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#optional-configuration" class="md-nav__link">
<span class="md-ellipsis">
Optional Configuration
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#step-3-auto-create-database-structure" class="md-nav__link">
<span class="md-ellipsis">
Step 3: Auto-Create Database Structure
</span>
</a>
<nav class="md-nav" aria-label="Step 3: Auto-Create Database Structure">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-the-script-creates" class="md-nav__link">
<span class="md-ellipsis">
What the Script Creates
</span>
</a>
<nav class="md-nav" aria-label="What the Script Creates">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#1-locations-table" class="md-nav__link">
<span class="md-ellipsis">
1. Locations Table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-login-table" class="md-nav__link">
<span class="md-ellipsis">
2. Login Table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3-settings-table" class="md-nav__link">
<span class="md-ellipsis">
3. Settings Table
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#default-data" class="md-nav__link">
<span class="md-ellipsis">
Default Data
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#step-4-get-table-urls" class="md-nav__link">
<span class="md-ellipsis">
Step 4: Get Table URLs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#step-5-update-environment-with-urls" class="md-nav__link">
<span class="md-ellipsis">
Step 5: Update Environment with URLs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#step-6-build-and-deploy" class="md-nav__link">
<span class="md-ellipsis">
Step 6: Build and Deploy
</span>
</a>
<nav class="md-nav" aria-label="Step 6: Build and Deploy">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#verify-deployment" class="md-nav__link">
<span class="md-ellipsis">
Verify Deployment
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#using-the-map-system" class="md-nav__link">
<span class="md-ellipsis">
Using the Map System
</span>
</a>
<nav class="md-nav" aria-label="Using the Map System">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#user-interface" class="md-nav__link">
<span class="md-ellipsis">
User Interface
</span>
</a>
<nav class="md-nav" aria-label="User Interface">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#main-map-view" class="md-nav__link">
<span class="md-ellipsis">
Main Map View
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#location-markers" class="md-nav__link">
<span class="md-ellipsis">
Location Markers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#adding-locations" class="md-nav__link">
<span class="md-ellipsis">
Adding Locations
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#authentication" class="md-nav__link">
<span class="md-ellipsis">
Authentication
</span>
</a>
<nav class="md-nav" aria-label="Authentication">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#user-login" class="md-nav__link">
<span class="md-ellipsis">
User Login
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#admin-access" class="md-nav__link">
<span class="md-ellipsis">
Admin Access
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#admin-panel-features" class="md-nav__link">
<span class="md-ellipsis">
Admin Panel Features
</span>
</a>
<nav class="md-nav" aria-label="Admin Panel Features">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#start-location-configuration" class="md-nav__link">
<span class="md-ellipsis">
Start Location Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#walk-sheet-generator" class="md-nav__link">
<span class="md-ellipsis">
Walk Sheet Generator
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#api-endpoints" class="md-nav__link">
<span class="md-ellipsis">
API Endpoints
</span>
</a>
<nav class="md-nav" aria-label="API Endpoints">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#public-endpoints" class="md-nav__link">
<span class="md-ellipsis">
Public Endpoints
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#authentication-endpoints" class="md-nav__link">
<span class="md-ellipsis">
Authentication Endpoints
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#admin-endpoints-requires-admin-privileges" class="md-nav__link">
<span class="md-ellipsis">
Admin Endpoints (requires admin privileges)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
<nav class="md-nav" aria-label="Troubleshooting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#common-issues" class="md-nav__link">
<span class="md-ellipsis">
Common Issues
</span>
</a>
<nav class="md-nav" aria-label="Common Issues">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#locations-not-showing" class="md-nav__link">
<span class="md-ellipsis">
Locations not showing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cannot-add-locations" class="md-nav__link">
<span class="md-ellipsis">
Cannot add locations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#authentication-issues" class="md-nav__link">
<span class="md-ellipsis">
Authentication issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#build-script-failures" class="md-nav__link">
<span class="md-ellipsis">
Build script failures
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#development-mode" class="md-nav__link">
<span class="md-ellipsis">
Development Mode
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#logs-and-monitoring" class="md-nav__link">
<span class="md-ellipsis">
Logs and Monitoring
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#security-considerations" class="md-nav__link">
<span class="md-ellipsis">
Security Considerations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#maintenance" class="md-nav__link">
<span class="md-ellipsis">
Maintenance
</span>
</a>
<nav class="md-nav" aria-label="Maintenance">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#regular-updates" class="md-nav__link">
<span class="md-ellipsis">
Regular Updates
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#backup-considerations" class="md-nav__link">
<span class="md-ellipsis">
Backup Considerations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#performance-tips" class="md-nav__link">
<span class="md-ellipsis">
Performance Tips
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#support" class="md-nav__link">
<span class="md-ellipsis">
Support
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="map-configuration">Map Configuration<a class="headerlink" href="#map-configuration" title="Permanent link">&para;</a></h1>
<p>The Map system is a containerized web application that visualizes geographic data from NocoDB on an interactive map using Leaflet.js. It's designed for canvassing applications and community organizing.</p>
<h2 id="features">Features<a class="headerlink" href="#features" title="Permanent link">&para;</a></h2>
<ul>
<li>🗺️ Interactive map visualization with OpenStreetMap</li>
<li>📍 Real-time geolocation support for adding locations</li>
<li> Add new locations directly from the map interface</li>
<li>🔄 Auto-refresh every 30 seconds</li>
<li>📱 Responsive design for mobile devices</li>
<li>🔒 Secure API proxy to protect NocoDB credentials</li>
<li>👤 User authentication with login system</li>
<li>⚙️ Admin panel for system configuration</li>
<li>🎯 Configurable map start location</li>
<li>📄 Walk Sheet generator for door-to-door canvassing</li>
<li>🔗 QR code integration for digital resources</li>
<li>🐳 Docker containerization for easy deployment</li>
<li>🆓 100% open source (no proprietary dependencies)</li>
</ul>
<h2 id="setup-process-overview">Setup Process Overview<a class="headerlink" href="#setup-process-overview" title="Permanent link">&para;</a></h2>
<p>The setup process involves several steps that must be completed in order:</p>
<ol>
<li><strong>Get NocoDB API Token</strong> - Create an API token in your NocoDB instance</li>
<li><strong>Configure Environment</strong> - Update the <code>.env</code> file with your NocoDB details</li>
<li><strong>Auto-Create Database Structure</strong> - Run the build script to create required tables</li>
<li><strong>Get Table URLs</strong> - Find and copy the URLs for the newly created tables</li>
<li><strong>Update Environment with URLs</strong> - Add the table URLs to your <code>.env</code> file</li>
<li><strong>Build and Deploy</strong> - Build the Docker image and start the application</li>
</ol>
<h2 id="prerequisites">Prerequisites<a class="headerlink" href="#prerequisites" title="Permanent link">&para;</a></h2>
<ul>
<li>Docker and Docker Compose installed</li>
<li>NocoDB instance with API access</li>
<li>Domain name (optional but recommended for production)</li>
</ul>
<h2 id="step-1-get-nocodb-api-token">Step 1: Get NocoDB API Token<a class="headerlink" href="#step-1-get-nocodb-api-token" title="Permanent link">&para;</a></h2>
<ol>
<li>Login to your NocoDB instance</li>
<li>Click your user icon → <strong>Account Settings</strong></li>
<li>Go to the <strong>API Tokens</strong> tab</li>
<li>Click <strong>Create new token</strong></li>
<li>Set the following permissions:</li>
<li><strong>Read</strong>: Yes</li>
<li><strong>Write</strong>: Yes</li>
<li><strong>Delete</strong>: Yes (optional, for admin functions)</li>
<li>Copy the generated token - you'll need it for the next step</li>
</ol>
<div class="admonition warning">
<p class="admonition-title">Token Security</p>
<p>Keep your API token secure and never commit it to version control. The token provides full access to your NocoDB data.</p>
</div>
<h2 id="step-2-configure-environment">Step 2: Configure Environment<a class="headerlink" href="#step-2-configure-environment" title="Permanent link">&para;</a></h2>
<p>Edit the <code>.env</code> file in the <code>map/</code> directory:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a># NocoDB API Configuration
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>NOCODB_API_URL=https://your-nocodb-instance.com/api/v1
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>NOCODB_API_TOKEN=your-api-token-here
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a># These URLs will be populated after running build-nocodb.sh
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>NOCODB_VIEW_URL=
</span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>NOCODB_LOGIN_SHEET=
</span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a>NOCODB_SETTINGS_SHEET=
</span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a>
</span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a># Server Configuration
</span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a>PORT=3000
</span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a>NODE_ENV=production
</span><span id="__span-0-13"><a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a>
</span><span id="__span-0-14"><a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a># Session Secret (generate with: openssl rand -hex 32)
</span><span id="__span-0-15"><a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a>SESSION_SECRET=your-secure-random-string
</span><span id="__span-0-16"><a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a>
</span><span id="__span-0-17"><a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a># Map Defaults (Edmonton, Alberta, Canada)
</span><span id="__span-0-18"><a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a>DEFAULT_LAT=53.5461
</span><span id="__span-0-19"><a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a>DEFAULT_LNG=-113.4938
</span><span id="__span-0-20"><a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a>DEFAULT_ZOOM=11
</span><span id="__span-0-21"><a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a>
</span><span id="__span-0-22"><a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a># Optional: Map Boundaries (prevents users from adding points outside area)
</span><span id="__span-0-23"><a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a># BOUND_NORTH=53.7
</span><span id="__span-0-24"><a id="__codelineno-0-24" name="__codelineno-0-24" href="#__codelineno-0-24"></a># BOUND_SOUTH=53.4
</span><span id="__span-0-25"><a id="__codelineno-0-25" name="__codelineno-0-25" href="#__codelineno-0-25"></a># BOUND_EAST=-113.3
</span><span id="__span-0-26"><a id="__codelineno-0-26" name="__codelineno-0-26" href="#__codelineno-0-26"></a># BOUND_WEST=-113.7
</span><span id="__span-0-27"><a id="__codelineno-0-27" name="__codelineno-0-27" href="#__codelineno-0-27"></a>
</span><span id="__span-0-28"><a id="__codelineno-0-28" name="__codelineno-0-28" href="#__codelineno-0-28"></a># Production Settings
</span><span id="__span-0-29"><a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a>TRUST_PROXY=true
</span><span id="__span-0-30"><a id="__codelineno-0-30" name="__codelineno-0-30" href="#__codelineno-0-30"></a>COOKIE_DOMAIN=.yourdomain.com
</span><span id="__span-0-31"><a id="__codelineno-0-31" name="__codelineno-0-31" href="#__codelineno-0-31"></a>ALLOWED_ORIGINS=https://map.yourdomain.com,http://localhost:3000
</span></code></pre></div>
<h3 id="required-configuration">Required Configuration<a class="headerlink" href="#required-configuration" title="Permanent link">&para;</a></h3>
<ul>
<li><code>NOCODB_API_URL</code>: Your NocoDB instance API URL (usually ends with <code>/api/v1</code>)</li>
<li><code>NOCODB_API_TOKEN</code>: The token you created in Step 1</li>
<li><code>SESSION_SECRET</code>: Generate a secure random string for session encryption</li>
</ul>
<h3 id="optional-configuration">Optional Configuration<a class="headerlink" href="#optional-configuration" title="Permanent link">&para;</a></h3>
<ul>
<li><code>DEFAULT_LAT/LNG/ZOOM</code>: Default map center and zoom level</li>
<li><code>BOUND_*</code>: Map boundaries to restrict where users can add points</li>
<li><code>COOKIE_DOMAIN</code>: Your domain for cookie security</li>
<li><code>ALLOWED_ORIGINS</code>: Comma-separated list of allowed origins for CORS</li>
</ul>
<h2 id="step-3-auto-create-database-structure">Step 3: Auto-Create Database Structure<a class="headerlink" href="#step-3-auto-create-database-structure" title="Permanent link">&para;</a></h2>
<p>The <code>build-nocodb.sh</code> script will automatically create the required tables in your NocoDB instance.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="nb">cd</span><span class="w"> </span>map
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>chmod<span class="w"> </span>+x<span class="w"> </span>build-nocodb.sh
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>./build-nocodb.sh
</span></code></pre></div>
<h3 id="what-the-script-creates">What the Script Creates<a class="headerlink" href="#what-the-script-creates" title="Permanent link">&para;</a></h3>
<p>The script creates three tables with the following structure:</p>
<h4 id="1-locations-table">1. Locations Table<a class="headerlink" href="#1-locations-table" title="Permanent link">&para;</a></h4>
<p>Main table for storing map data:</p>
<ul>
<li><code>Geo-Location</code> (Geo-Data): Format "latitude;longitude"</li>
<li><code>latitude</code> (Decimal): Precision 10, Scale 8</li>
<li><code>longitude</code> (Decimal): Precision 11, Scale 8</li>
<li><code>First Name</code> (Single Line Text): Person's first name</li>
<li><code>Last Name</code> (Single Line Text): Person's last name</li>
<li><code>Email</code> (Email): Email address</li>
<li><code>Phone</code> (Single Line Text): Phone number</li>
<li><code>Unit Number</code> (Single Line Text): Unit or apartment number</li>
<li><code>Address</code> (Single Line Text): Street address</li>
<li><code>Support Level</code> (Single Select): Options: "1", "2", "3", "4"</li>
<li>1 = Strong Support (Green)</li>
<li>2 = Moderate Support (Yellow)</li>
<li>3 = Low Support (Orange)</li>
<li>4 = No Support (Red)</li>
<li><code>Sign</code> (Checkbox): Has campaign sign</li>
<li><code>Sign Size</code> (Single Select): Options: "Small", "Medium", "Large"</li>
<li><code>Notes</code> (Long Text): Additional details and comments</li>
</ul>
<h4 id="2-login-table">2. Login Table<a class="headerlink" href="#2-login-table" title="Permanent link">&para;</a></h4>
<p>User authentication table:</p>
<ul>
<li><code>Email</code> (Email): User email address (Primary)</li>
<li><code>Name</code> (Single Line Text): User display name</li>
<li><code>Admin</code> (Checkbox): Admin privileges</li>
</ul>
<h4 id="3-settings-table">3. Settings Table<a class="headerlink" href="#3-settings-table" title="Permanent link">&para;</a></h4>
<p>Admin configuration table:</p>
<ul>
<li><code>key</code> (Single Line Text): Setting identifier</li>
<li><code>title</code> (Single Line Text): Display name</li>
<li><code>value</code> (Long Text): Setting value</li>
<li><code>Geo-Location</code> (Text): Format "latitude;longitude"</li>
<li><code>latitude</code> (Decimal): Precision 10, Scale 8</li>
<li><code>longitude</code> (Decimal): Precision 11, Scale 8</li>
<li><code>zoom</code> (Number): Map zoom level</li>
<li><code>category</code> (Single Select): Setting category</li>
<li><code>updated_by</code> (Single Line Text): Last updater email</li>
<li><code>updated_at</code> (DateTime): Last update time</li>
<li><code>qr_code_1_image</code> (Attachment): QR code 1 image</li>
<li><code>qr_code_2_image</code> (Attachment): QR code 2 image</li>
<li><code>qr_code_3_image</code> (Attachment): QR code 3 image</li>
</ul>
<h3 id="default-data">Default Data<a class="headerlink" href="#default-data" title="Permanent link">&para;</a></h3>
<p>The script also creates:
- A default admin user (admin@example.com)
- A default start location setting</p>
<h2 id="step-4-get-table-urls">Step 4: Get Table URLs<a class="headerlink" href="#step-4-get-table-urls" title="Permanent link">&para;</a></h2>
<p>After the script completes successfully:</p>
<ol>
<li>Login to your NocoDB instance</li>
<li>Navigate to your project (should be named "Map Viewer Project")</li>
<li>For each table, get the view URL:</li>
<li>Click on the table name</li>
<li>Copy the URL from your browser's address bar</li>
<li>The URL should look like: <code>https://your-nocodb.com/dashboard/#/nc/project-id/table-id</code></li>
</ol>
<p>You need URLs for:
- <strong>Locations table</strong><code>NOCODB_VIEW_URL</code>
- <strong>Login table</strong><code>NOCODB_LOGIN_SHEET</code>
- <strong>Settings table</strong><code>NOCODB_SETTINGS_SHEET</code></p>
<h2 id="step-5-update-environment-with-urls">Step 5: Update Environment with URLs<a class="headerlink" href="#step-5-update-environment-with-urls" title="Permanent link">&para;</a></h2>
<p>Edit your <code>.env</code> file and add the table URLs:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a># Update these with the actual URLs from your NocoDB instance
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>NOCODB_VIEW_URL=https://your-nocodb.com/dashboard/#/nc/project-id/locations-table-id
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>NOCODB_LOGIN_SHEET=https://your-nocodb.com/dashboard/#/nc/project-id/login-table-id
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>NOCODB_SETTINGS_SHEET=https://your-nocodb.com/dashboard/#/nc/project-id/settings-table-id
</span></code></pre></div>
<div class="admonition warning">
<p class="admonition-title">URL Format</p>
<p>Make sure to use the complete dashboard URLs, not the API URLs. The application will automatically extract the project and table IDs from these URLs.</p>
</div>
<h2 id="step-6-build-and-deploy">Step 6: Build and Deploy<a class="headerlink" href="#step-6-build-and-deploy" title="Permanent link">&para;</a></h2>
<p>Build the Docker image and start the application:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="c1"># Build the Docker image</span>
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>docker-compose<span class="w"> </span>build
</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>
</span><span id="__span-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="c1"># Start the application</span>
</span><span id="__span-3-5"><a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>docker-compose<span class="w"> </span>up<span class="w"> </span>-d
</span></code></pre></div>
<h3 id="verify-deployment">Verify Deployment<a class="headerlink" href="#verify-deployment" title="Permanent link">&para;</a></h3>
<ol>
<li>
<p>Check that the container is running:
<div class="language-bash highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>docker-compose<span class="w"> </span>ps
</span></code></pre></div></p>
</li>
<li>
<p>Check the logs:
<div class="language-bash highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>docker-compose<span class="w"> </span>logs<span class="w"> </span>-f<span class="w"> </span>map-viewer
</span></code></pre></div></p>
</li>
<li>
<p>Access the application at <code>http://localhost:3000</code> (or your configured domain)</p>
</li>
</ol>
<h2 id="using-the-map-system">Using the Map System<a class="headerlink" href="#using-the-map-system" title="Permanent link">&para;</a></h2>
<h3 id="user-interface">User Interface<a class="headerlink" href="#user-interface" title="Permanent link">&para;</a></h3>
<h4 id="main-map-view">Main Map View<a class="headerlink" href="#main-map-view" title="Permanent link">&para;</a></h4>
<ul>
<li><strong>Interactive Map</strong>: Click and drag to navigate</li>
<li><strong>Add Location</strong>: Click on the map to add a new location</li>
<li><strong>Search</strong>: Use the search bar to find addresses</li>
<li><strong>Refresh</strong>: Data refreshes automatically every 30 seconds</li>
</ul>
<h4 id="location-markers">Location Markers<a class="headerlink" href="#location-markers" title="Permanent link">&para;</a></h4>
<ul>
<li><strong>Green</strong>: Strong Support (Level 1)</li>
<li><strong>Yellow</strong>: Moderate Support (Level 2)</li>
<li><strong>Orange</strong>: Low Support (Level 3)</li>
<li><strong>Red</strong>: No Support (Level 4)</li>
</ul>
<h4 id="adding-locations">Adding Locations<a class="headerlink" href="#adding-locations" title="Permanent link">&para;</a></h4>
<ol>
<li>Click on the map where you want to add a location</li>
<li>Fill out the form with contact information</li>
<li>Select support level and sign information</li>
<li>Add any relevant notes</li>
<li>Click "Save Location"</li>
</ol>
<h3 id="authentication">Authentication<a class="headerlink" href="#authentication" title="Permanent link">&para;</a></h3>
<h4 id="user-login">User Login<a class="headerlink" href="#user-login" title="Permanent link">&para;</a></h4>
<ul>
<li>Users must be added to the Login table in NocoDB</li>
<li>Login with email address (no password required for simplified setup)</li>
<li>Admin users have additional privileges</li>
</ul>
<h4 id="admin-access">Admin Access<a class="headerlink" href="#admin-access" title="Permanent link">&para;</a></h4>
<ul>
<li>Admin users can access <code>/admin.html</code></li>
<li>Configure map start location</li>
<li>Set up walk sheet generator</li>
<li>Manage QR codes and settings</li>
</ul>
<h3 id="admin-panel-features">Admin Panel Features<a class="headerlink" href="#admin-panel-features" title="Permanent link">&para;</a></h3>
<h4 id="start-location-configuration">Start Location Configuration<a class="headerlink" href="#start-location-configuration" title="Permanent link">&para;</a></h4>
<ul>
<li><strong>Interactive Map</strong>: Visual interface for selecting coordinates</li>
<li><strong>Real-time Preview</strong>: See changes immediately</li>
<li><strong>Validation</strong>: Built-in coordinate and zoom level validation</li>
</ul>
<h4 id="walk-sheet-generator">Walk Sheet Generator<a class="headerlink" href="#walk-sheet-generator" title="Permanent link">&para;</a></h4>
<ul>
<li><strong>Printable Forms</strong>: Generate 8.5x11 walk sheets for door-to-door canvassing</li>
<li><strong>QR Code Integration</strong>: Add up to 3 QR codes with custom URLs and labels</li>
<li><strong>Form Field Matching</strong>: Automatically matches fields from the main location form</li>
<li><strong>Live Preview</strong>: See changes as you type</li>
<li><strong>Print Optimization</strong>: Proper formatting for printing or PDF export</li>
</ul>
<h2 id="api-endpoints">API Endpoints<a class="headerlink" href="#api-endpoints" title="Permanent link">&para;</a></h2>
<h3 id="public-endpoints">Public Endpoints<a class="headerlink" href="#public-endpoints" title="Permanent link">&para;</a></h3>
<ul>
<li><code>GET /api/locations</code> - Fetch all locations (requires auth)</li>
<li><code>POST /api/locations</code> - Create new location (requires auth)</li>
<li><code>GET /api/locations/:id</code> - Get single location (requires auth)</li>
<li><code>PUT /api/locations/:id</code> - Update location (requires auth)</li>
<li><code>DELETE /api/locations/:id</code> - Delete location (requires auth)</li>
<li><code>GET /api/config/start-location</code> - Get map start location</li>
<li><code>GET /health</code> - Health check</li>
</ul>
<h3 id="authentication-endpoints">Authentication Endpoints<a class="headerlink" href="#authentication-endpoints" title="Permanent link">&para;</a></h3>
<ul>
<li><code>POST /api/auth/login</code> - User login</li>
<li><code>GET /api/auth/check</code> - Check authentication status</li>
<li><code>POST /api/auth/logout</code> - User logout</li>
</ul>
<h3 id="admin-endpoints-requires-admin-privileges">Admin Endpoints (requires admin privileges)<a class="headerlink" href="#admin-endpoints-requires-admin-privileges" title="Permanent link">&para;</a></h3>
<ul>
<li><code>GET /api/admin/start-location</code> - Get start location with source info</li>
<li><code>POST /api/admin/start-location</code> - Update map start location</li>
<li><code>GET /api/admin/walk-sheet-config</code> - Get walk sheet configuration</li>
<li><code>POST /api/admin/walk-sheet-config</code> - Save walk sheet configuration</li>
</ul>
<h2 id="troubleshooting">Troubleshooting<a class="headerlink" href="#troubleshooting" title="Permanent link">&para;</a></h2>
<h3 id="common-issues">Common Issues<a class="headerlink" href="#common-issues" title="Permanent link">&para;</a></h3>
<h4 id="locations-not-showing">Locations not showing<a class="headerlink" href="#locations-not-showing" title="Permanent link">&para;</a></h4>
<ul>
<li>Verify table has required columns (<code>Geo-Location</code>, <code>latitude</code>, <code>longitude</code>)</li>
<li>Check that coordinates are valid numbers</li>
<li>Ensure API token has read permissions</li>
<li>Verify <code>NOCODB_VIEW_URL</code> is correct</li>
</ul>
<h4 id="cannot-add-locations">Cannot add locations<a class="headerlink" href="#cannot-add-locations" title="Permanent link">&para;</a></h4>
<ul>
<li>Verify API token has write permissions</li>
<li>Check browser console for errors</li>
<li>Ensure coordinates are within valid ranges</li>
<li>Verify user is authenticated</li>
</ul>
<h4 id="authentication-issues">Authentication issues<a class="headerlink" href="#authentication-issues" title="Permanent link">&para;</a></h4>
<ul>
<li>Verify login table is properly configured</li>
<li>Check that user email exists in Login table</li>
<li>Ensure <code>NOCODB_LOGIN_SHEET</code> URL is correct</li>
</ul>
<h4 id="build-script-failures">Build script failures<a class="headerlink" href="#build-script-failures" title="Permanent link">&para;</a></h4>
<ul>
<li>Check that <code>NOCODB_API_URL</code> and <code>NOCODB_API_TOKEN</code> are correct</li>
<li>Verify NocoDB instance is accessible</li>
<li>Check network connectivity</li>
<li>Review script output for specific error messages</li>
</ul>
<h3 id="development-mode">Development Mode<a class="headerlink" href="#development-mode" title="Permanent link">&para;</a></h3>
<p>For development and debugging:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="nb">cd</span><span class="w"> </span>map/app
</span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>npm<span class="w"> </span>install
</span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>npm<span class="w"> </span>run<span class="w"> </span>dev
</span></code></pre></div>
<p>This will start the application with hot reload and detailed logging.</p>
<h3 id="logs-and-monitoring">Logs and Monitoring<a class="headerlink" href="#logs-and-monitoring" title="Permanent link">&para;</a></h3>
<p>View application logs:
<div class="language-bash highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>docker-compose<span class="w"> </span>logs<span class="w"> </span>-f<span class="w"> </span>map-viewer
</span></code></pre></div></p>
<p>Check health status:
<div class="language-bash highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>curl<span class="w"> </span>http://localhost:3000/health
</span></code></pre></div></p>
<h2 id="security-considerations">Security Considerations<a class="headerlink" href="#security-considerations" title="Permanent link">&para;</a></h2>
<ol>
<li><strong>API Token Security</strong>: Keep tokens secure and rotate regularly</li>
<li><strong>HTTPS</strong>: Use HTTPS in production</li>
<li><strong>CORS Configuration</strong>: Set appropriate <code>ALLOWED_ORIGINS</code></li>
<li><strong>Cookie Security</strong>: Configure <code>COOKIE_DOMAIN</code> properly</li>
<li><strong>Input Validation</strong>: All inputs are validated server-side</li>
<li><strong>Rate Limiting</strong>: API endpoints have rate limiting</li>
<li><strong>Session Security</strong>: Use a strong <code>SESSION_SECRET</code></li>
</ol>
<h2 id="maintenance">Maintenance<a class="headerlink" href="#maintenance" title="Permanent link">&para;</a></h2>
<h3 id="regular-updates">Regular Updates<a class="headerlink" href="#regular-updates" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="c1"># Stop the application</span>
</span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a>docker-compose<span class="w"> </span>down
</span><span id="__span-9-3"><a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a>
</span><span id="__span-9-4"><a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a><span class="c1"># Pull updates (if using git)</span>
</span><span id="__span-9-5"><a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a>git<span class="w"> </span>pull<span class="w"> </span>origin<span class="w"> </span>main
</span><span id="__span-9-6"><a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a>
</span><span id="__span-9-7"><a id="__codelineno-9-7" name="__codelineno-9-7" href="#__codelineno-9-7"></a><span class="c1"># Rebuild and restart</span>
</span><span id="__span-9-8"><a id="__codelineno-9-8" name="__codelineno-9-8" href="#__codelineno-9-8"></a>docker-compose<span class="w"> </span>build
</span><span id="__span-9-9"><a id="__codelineno-9-9" name="__codelineno-9-9" href="#__codelineno-9-9"></a>docker-compose<span class="w"> </span>up<span class="w"> </span>-d
</span></code></pre></div>
<h3 id="backup-considerations">Backup Considerations<a class="headerlink" href="#backup-considerations" title="Permanent link">&para;</a></h3>
<ul>
<li>NocoDB data is stored in your NocoDB instance</li>
<li>Back up your <code>.env</code> file securely</li>
<li>Consider backing up QR code images from the Settings table</li>
</ul>
<h3 id="performance-tips">Performance Tips<a class="headerlink" href="#performance-tips" title="Permanent link">&para;</a></h3>
<ul>
<li>Monitor NocoDB performance and scaling</li>
<li>Consider enabling caching for high-traffic deployments</li>
<li>Use CDN for static assets if needed</li>
<li>Monitor Docker container resource usage</li>
</ul>
<h2 id="support">Support<a class="headerlink" href="#support" title="Permanent link">&para;</a></h2>
<p>For issues or questions:
1. Check the troubleshooting section above
2. Review NocoDB documentation
3. Check Docker and Docker Compose documentation
4. Open an issue on GitHub</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../coder/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Code Server">
<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 11z"/></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
Previous
</span>
<div class="md-ellipsis">
Code Server
</div>
</div>
</a>
<a href="../../adv/" class="md-footer__link md-footer__link--next" aria-label="Next: Advanced Configurations">
<div class="md-footer__title">
<span class="md-footer__direction">
Next
</span>
<div class="md-ellipsis">
Advanced Configurations
</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 11z"/></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 &copy; 2024 The Bunker Operations <a href="#__consent">Change cookie settings</a>
</div>
</div>
<div class="md-social">
<a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.2 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 2024 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.6m-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.3m44.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.9M244.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 8M97.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-1m-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.7m32.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-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>
<a href="https://listmonk.bnkops.com/subscription/form" target="_blank" rel="noopener" title="Newsletter" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 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 2024 Fonticons, Inc.--><path d="M498.1 5.6c10.1 7 15.4 19.1 13.5 31.2l-64 416c-1.5 9.7-7.4 18.2-16 23s-18.9 5.4-28 1.6L284 427.7l-68.5 74.1c-8.9 9.7-22.9 12.9-35.2 8.1S160 493.2 160 480v-83.6c0-4 1.5-7.8 4.2-10.8l167.6-182.8c5.8-6.3 5.6-16-.4-22s-15.7-6.4-22-.7L106 360.8l-88.3-44.2C7.1 311.3.3 300.7 0 288.9s5.9-22.8 16.1-28.7l448-256c10.7-6.1 23.9-5.5 34 1.4"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<script id="__config" type="application/json">{"base": "../..", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.tooltips", "navigation.expand", "navigation.footer", "navigation.indexes", "navigation.instant", "navigation.instant.prefetch", "navigation.instant.progress", "navigation.path", "navigation.prune", "navigation.sections", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.56ea9cef.min.js"></script>
<script src="../../javascripts/home.js"></script>
<script src="../../javascripts/github-widget.js"></script>
<script src="../../javascripts/gitea-widget.js"></script>
</body>
</html>