<!-- CANARY: REQ=REQ-SERVER-STARTUP-INTEGRATION-001; FEATURE="Server Startup Integration Tests"; ASPECT=EndToEndServerTesting; STATUS=TESTED; OWNER=server; UPDATED=2025-10-05 -->
<h2 id="docker-deployment-guide" class="position-relative d-flex align-items-center group">
<span>Docker Deployment Guide</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="docker-deployment-guide"
aria-haspopup="dialog"
aria-label="Share link: Docker Deployment Guide">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h2><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p>Complete documentation for containerized deployment of Geode graph database using Docker and Docker Compose.</p>
<h3 id="overview" class="position-relative d-flex align-items-center group">
<span>Overview</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="overview"
aria-haspopup="dialog"
aria-label="Share link: Overview">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode offers multiple Docker deployment options:</p>
<ul>
<li><strong>Pre-built images</strong> from <a
href="https://hub.docker.com/r/geodedb/geode"
aria-label="Docker Hub – opens in new window"
target="_blank" rel="noopener noreferrer"
>Docker Hub
<span aria-hidden="true" class="external-icon">↗</span>
</a>
(fastest)</li>
<li><strong>Development environment</strong> with complete toolchain</li>
<li><strong>Production deployment</strong> with multi-stage builds</li>
<li><strong>Distributed clusters</strong> with 3-node Raft consensus</li>
</ul>
<p>All Geode Docker containers use <strong>QUIC+TLS over UDP port 8443</strong> for secure, high-performance communication.</p>
<h3 id="quick-start" class="position-relative d-flex align-items-center group">
<span>Quick Start</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="quick-start"
aria-haspopup="dialog"
aria-label="Share link: Quick Start">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="using-pre-built-images-5-minutes" class="position-relative d-flex align-items-center group">
<span>Using Pre-built Images (5 Minutes)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="using-pre-built-images-5-minutes"
aria-haspopup="dialog"
aria-label="Share link: Using Pre-built Images (5 Minutes)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Pull the latest image from Docker Hub</span>
</span></span><span class="line"><span class="cl">docker pull geodedb/geode:latest
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run the container</span>
</span></span><span class="line"><span class="cl">docker run -d -p 3141:3141/udp --name geode geodedb/geode:latest
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Test connectivity</span>
</span></span><span class="line"><span class="cl">docker <span class="nb">exec</span> geode geode query <span class="s2">"RETURN 1 AS health"</span> --server 127.0.0.1:3141
</span></span></code></pre></div><p><strong>Expected output</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Column: health
</span></span><span class="line"><span class="cl">1
</span></span></code></pre></div>
<h4 id="using-docker-compose" class="position-relative d-flex align-items-center group">
<span>Using Docker Compose</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="using-docker-compose"
aria-haspopup="dialog"
aria-label="Share link: Using Docker Compose">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s1">'3.8'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">geodedb/geode:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">geode-server</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"3141:3141/udp"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"9090:9090"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-data:/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_LOG_LEVEL=info</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">healthcheck</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">test</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"CMD"</span><span class="p">,</span><span class="w"> </span><span class="s2">"geode"</span><span class="p">,</span><span class="w"> </span><span class="s2">"query"</span><span class="p">,</span><span class="w"> </span><span class="s2">"RETURN 1"</span><span class="p">,</span><span class="w"> </span><span class="s2">"--server"</span><span class="p">,</span><span class="w"> </span><span class="s2">"127.0.0.1:3141"</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">interval</span><span class="p">:</span><span class="w"> </span><span class="l">30s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="l">3s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retries</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode-data</span><span class="p">:</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="available-docker-images" class="position-relative d-flex align-items-center group">
<span>Available Docker Images</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="available-docker-images"
aria-haspopup="dialog"
aria-label="Share link: Available Docker Images">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode images are available on <a
href="https://hub.docker.com/r/geodedb/geode"
aria-label="Docker Hub – opens in new window"
target="_blank" rel="noopener noreferrer"
>Docker Hub
<span aria-hidden="true" class="external-icon">↗</span>
</a>
with multiple variants optimized for different use cases:</p>
<table>
<thead>
<tr>
<th>Image Tag</th>
<th>Base</th>
<th>Size</th>
<th>Use Case</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>latest</code></td>
<td>Debian Bookworm</td>
<td>~250MB</td>
<td>General purpose (recommended)</td>
</tr>
<tr>
<td><code>alpine</code></td>
<td>Alpine 3.19</td>
<td>~80MB</td>
<td>Minimal size, musl libc</td>
</tr>
<tr>
<td><code>gpu</code></td>
<td>NVIDIA CUDA 12.6</td>
<td>~1.2GB</td>
<td>GPU acceleration support</td>
</tr>
<tr>
<td><code>prod</code></td>
<td>Distroless</td>
<td>~180MB</td>
<td>Production, minimal attack surface</td>
</tr>
</tbody>
</table>
<h4 id="pull-commands" class="position-relative d-flex align-items-center group">
<span>Pull Commands</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pull-commands"
aria-haspopup="dialog"
aria-label="Share link: Pull Commands">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Standard (recommended for most deployments)</span>
</span></span><span class="line"><span class="cl">docker pull geodedb/geode:latest
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Alpine (minimal size)</span>
</span></span><span class="line"><span class="cl">docker pull geodedb/geode:alpine
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># GPU support (vector operations, graph algorithms)</span>
</span></span><span class="line"><span class="cl">docker pull geodedb/geode:gpu
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Production optimized (distroless base)</span>
</span></span><span class="line"><span class="cl">docker pull geodedb/geode:prod
</span></span></code></pre></div>
<h3 id="development-environment" class="position-relative d-flex align-items-center group">
<span>Development Environment</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="development-environment"
aria-haspopup="dialog"
aria-label="Share link: Development Environment">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>A complete Docker-based development environment replicating the local development stack.</p>
<h4 id="whats-included" class="position-relative d-flex align-items-center group">
<span>What&rsquo;s Included</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="whats-included"
aria-haspopup="dialog"
aria-label="Share link: Whats Included">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li><strong>Zig 0.1.0</strong> - Primary build system</li>
<li><strong>Python 3.12</strong> - Test harness and geodetestlab</li>
<li><strong>OpenSSL 3.3.2 with FIPS</strong> - Enterprise cryptography</li>
<li><strong>MsQUIC v2.5.4</strong> - High-performance QUIC implementation</li>
<li><strong>HashiCorp Vault</strong> - Secrets management</li>
<li><strong>MinIO</strong> - S3-compatible storage</li>
<li><strong>Redis</strong> - Caching layer</li>
<li><strong>Optional</strong>: Prometheus + Grafana monitoring</li>
</ul>
<h4 id="prerequisites" class="position-relative d-flex align-items-center group">
<span>Prerequisites</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="prerequisites"
aria-haspopup="dialog"
aria-label="Share link: Prerequisites">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li>Docker 20.10+</li>
<li>Docker Compose 1.29+</li>
<li>8GB+ RAM</li>
<li>20GB+ disk space</li>
</ul>
<h4 id="setup--usage" class="position-relative d-flex align-items-center group">
<span>Setup &amp; Usage</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="setup--usage"
aria-haspopup="dialog"
aria-label="Share link: Setup &amp; Usage">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Clone repository</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/codeprosorg/geode
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start development environment (first build ~10 minutes)</span>
</span></span><span class="line"><span class="cl">./dev.sh start
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check service health</span>
</span></span><span class="line"><span class="cl">./dev.sh status
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Enter development shell</span>
</span></span><span class="line"><span class="cl">./dev.sh shell
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Build Geode (inside shell)</span>
</span></span><span class="line"><span class="cl">zb <span class="c1"># Debug build</span>
</span></span><span class="line"><span class="cl">zbr <span class="c1"># Release build</span>
</span></span><span class="line"><span class="cl">zbt <span class="c1"># Build with tests</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run tests</span>
</span></span><span class="line"><span class="cl">make <span class="nb">test</span>
</span></span><span class="line"><span class="cl">make geodetestlab
</span></span><span class="line"><span class="cl">make verify-fast
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start Geode server</span>
</span></span><span class="line"><span class="cl">geode serve --listen 127.0.0.1:9999
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># View logs</span>
</span></span><span class="line"><span class="cl">./dev.sh logs -f
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Stop environment</span>
</span></span><span class="line"><span class="cl">./dev.sh stop
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Full cleanup (removes volumes)</span>
</span></span><span class="line"><span class="cl">./dev.sh down
</span></span></code></pre></div>
<h4 id="development-commands-reference" class="position-relative d-flex align-items-center group">
<span>Development Commands Reference</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="development-commands-reference"
aria-haspopup="dialog"
aria-label="Share link: Development Commands Reference">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>./dev.sh start</code></td>
<td>Start development environment</td>
</tr>
<tr>
<td><code>./dev.sh stop</code></td>
<td>Stop development environment</td>
</tr>
<tr>
<td><code>./dev.sh restart</code></td>
<td>Restart development environment</td>
</tr>
<tr>
<td><code>./dev.sh shell</code></td>
<td>Open interactive shell</td>
</tr>
<tr>
<td><code>./dev.sh exec <cmd></code></td>
<td>Execute command in container</td>
</tr>
<tr>
<td><code>./dev.sh build</code></td>
<td>Build geode project</td>
</tr>
<tr>
<td><code>./dev.sh test</code></td>
<td>Run tests</td>
</tr>
<tr>
<td><code>./dev.sh clean</code></td>
<td>Clean build artifacts</td>
</tr>
<tr>
<td><code>./dev.sh logs [-f]</code></td>
<td>View logs (optionally follow)</td>
</tr>
<tr>
<td><code>./dev.sh status</code></td>
<td>Show service status</td>
</tr>
<tr>
<td><code>./dev.sh down</code></td>
<td>Remove containers and volumes</td>
</tr>
<tr>
<td><code>./dev.sh rebuild</code></td>
<td>Rebuild Docker image</td>
</tr>
<tr>
<td><code>./dev.sh monitoring</code></td>
<td>Start with Prometheus + Grafana</td>
</tr>
</tbody>
</table>
<h4 id="service-access" class="position-relative d-flex align-items-center group">
<span>Service Access</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="service-access"
aria-haspopup="dialog"
aria-label="Share link: Service Access">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>When running the development environment, these services are available:</p>
<table>
<thead>
<tr>
<th>Service</th>
<th>Port</th>
<th>Credentials</th>
</tr>
</thead>
<tbody>
<tr>
<td>Vault</td>
<td>8200</td>
<td>Token: <code>geode-dev-token</code></td>
</tr>
<tr>
<td>MinIO Console</td>
<td>9001</td>
<td><code>admin</code> / <code>geode-dev-secret-123</code></td>
</tr>
<tr>
<td>Redis</td>
<td>6379</td>
<td>Password: <code>geode-dev-password</code></td>
</tr>
<tr>
<td>Prometheus</td>
<td>9090</td>
<td>None</td>
</tr>
<tr>
<td>Grafana</td>
<td>3000</td>
<td><code>admin</code> / <code>geode-dev-password</code></td>
</tr>
</tbody>
</table>
<h3 id="production-deployment" class="position-relative d-flex align-items-center group">
<span>Production Deployment</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="production-deployment"
aria-haspopup="dialog"
aria-label="Share link: Production Deployment">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="building-production-images" class="position-relative d-flex align-items-center group">
<span>Building Production Images</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="building-production-images"
aria-haspopup="dialog"
aria-label="Share link: Building Production Images">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Build complete production image</span>
</span></span><span class="line"><span class="cl">./docker-build.sh all geode:latest
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Or build specific stages</span>
</span></span><span class="line"><span class="cl">./docker-build.sh openssl <span class="c1"># OpenSSL FIPS only</span>
</span></span><span class="line"><span class="cl">./docker-build.sh msquic <span class="c1"># MsQUIC only</span>
</span></span><span class="line"><span class="cl">./docker-build.sh builder <span class="c1"># Full Geode build</span>
</span></span><span class="line"><span class="cl">./docker-build.sh runtime <span class="c1"># Production runtime</span>
</span></span></code></pre></div>
<h4 id="multi-stage-build-architecture" class="position-relative d-flex align-items-center group">
<span>Multi-Stage Build Architecture</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="multi-stage-build-architecture"
aria-haspopup="dialog"
aria-label="Share link: Multi-Stage Build Architecture">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode uses a four-stage build process for optimal security and size:</p>
<ol>
<li><strong>Stage 1 - OpenSSL FIPS Builder</strong>: Compiles OpenSSL 3.3.2 with FIPS 140-3 module</li>
<li><strong>Stage 2 - MsQUIC Builder</strong>: Builds Microsoft MsQUIC v2.5.5 for high-performance QUIC</li>
<li><strong>Stage 3 - Geode Builder</strong>: Compiles Geode with all dependencies</li>
<li><strong>Stage 4 - Runtime</strong>: Minimal Debian base with only runtime dependencies</li>
</ol>
<h4 id="single-node-production-deployment" class="position-relative d-flex align-items-center group">
<span>Single-Node Production Deployment</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="single-node-production-deployment"
aria-haspopup="dialog"
aria-label="Share link: Single-Node Production Deployment">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Run with production configuration</span>
</span></span><span class="line"><span class="cl">docker run -d <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --name geode-prod <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --restart<span class="o">=</span>unless-stopped <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -p 8443:8443/udp <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -v /var/lib/geode:/data <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -v /etc/geode/certs:/certs:ro <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -e <span class="nv">LOG_LEVEL</span><span class="o">=</span>warn <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> geode:latest <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --data-dir /data <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --cert /certs/server.crt <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --key /certs/server.key <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --listen 0.0.0.0:8443
</span></span></code></pre></div>
<h4 id="docker-compose-production-configuration" class="position-relative d-flex align-items-center group">
<span>Docker Compose Production Configuration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="docker-compose-production-configuration"
aria-haspopup="dialog"
aria-label="Share link: Docker Compose Production Configuration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s1">'3.8'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">geodedb/geode:prod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">geode-server</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"8443:8443/udp"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"9090:9090"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-data:/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">./certs:/certs:ro</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">./logs:/var/log/geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_LOG_LEVEL=warn</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_MAX_CONNECTIONS=1000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_CACHE_SIZE=2GB</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">FIPS_MODE=enabled</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">read_only</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tmpfs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">/tmp</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">security_opt</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="kc">no</span>-<span class="l">new-privileges:true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cap_drop</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ALL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cap_add</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">NET_BIND_SERVICE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">deploy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">resources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">limits</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cpus</span><span class="p">:</span><span class="w"> </span><span class="s1">'4'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="l">8G</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reservations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cpus</span><span class="p">:</span><span class="w"> </span><span class="s1">'2'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="l">4G</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">healthcheck</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">test</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"CMD"</span><span class="p">,</span><span class="w"> </span><span class="s2">"geode"</span><span class="p">,</span><span class="w"> </span><span class="s2">"query"</span><span class="p">,</span><span class="w"> </span><span class="s2">"RETURN 1"</span><span class="p">,</span><span class="w"> </span><span class="s2">"--server"</span><span class="p">,</span><span class="w"> </span><span class="s2">"127.0.0.1:8443"</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">interval</span><span class="p">:</span><span class="w"> </span><span class="l">30s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="l">3s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retries</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">start_period</span><span class="p">:</span><span class="w"> </span><span class="l">10s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode-data</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l">local</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="with-tls-certificates" class="position-relative d-flex align-items-center group">
<span>With TLS Certificates</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="with-tls-certificates"
aria-haspopup="dialog"
aria-label="Share link: With TLS Certificates">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Generate self-signed certificates</span>
</span></span><span class="line"><span class="cl">docker run --rm -v ./certs:/certs geodedb/geode:latest <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> cert_gen --output-dir /certs
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run with custom certificates</span>
</span></span><span class="line"><span class="cl">docker run -d <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -p 8443:8443/udp <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -v ./certs:/certs:ro <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -v ./data:/data <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> geodedb/geode:latest <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --data-dir /data <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --cert /certs/server.crt <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --key /certs/server.key <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --listen 0.0.0.0:8443
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify certificate</span>
</span></span><span class="line"><span class="cl">openssl x509 -in ./certs/server.crt -text -noout
</span></span></code></pre></div>
<h4 id="with-persistent-data" class="position-relative d-flex align-items-center group">
<span>With Persistent Data</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="with-persistent-data"
aria-haspopup="dialog"
aria-label="Share link: With Persistent Data">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Create data directory</span>
</span></span><span class="line"><span class="cl">mkdir -p ./data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run with persistent storage</span>
</span></span><span class="line"><span class="cl">docker run -d <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --name geode <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -p 8443:8443/udp <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -v <span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span>/data:/data <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> geodedb/geode:latest <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --data-dir /data
</span></span></code></pre></div>
<h3 id="distributed-deployment" class="position-relative d-flex align-items-center group">
<span>Distributed Deployment</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="distributed-deployment"
aria-haspopup="dialog"
aria-label="Share link: Distributed Deployment">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Deploy a 3-node Geode cluster with Raft consensus for high availability.</p>
<h4 id="architecture" class="position-relative d-flex align-items-center group">
<span>Architecture</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="architecture"
aria-haspopup="dialog"
aria-label="Share link: Architecture">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"> ┌──────────────┐
</span></span><span class="line"><span class="cl"> │ HAProxy │
</span></span><span class="line"><span class="cl"> │ LB (7500) │
</span></span><span class="line"><span class="cl"> └──────┬───────┘
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> ┌─────────┴──────────┬──────────┐
</span></span><span class="line"><span class="cl"> │ │ │
</span></span><span class="line"><span class="cl">┌───▼────┐ ┌────▼────┐ ┌───▼────┐
</span></span><span class="line"><span class="cl">│ Leader │◄────────► Follow-1│ │Follow-2│
</span></span><span class="line"><span class="cl">│ 7567 │ Raft │ 7569 │ │ 7571 │
</span></span><span class="line"><span class="cl">└────────┘ └─────────┘ └────────┘
</span></span></code></pre></div>
<h4 id="quick-start-1" class="position-relative d-flex align-items-center group">
<span>Quick Start</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="quick-start-1"
aria-haspopup="dialog"
aria-label="Share link: Quick Start">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Start distributed cluster</span>
</span></span><span class="line"><span class="cl">make docker-up-distributed
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Or manually:</span>
</span></span><span class="line"><span class="cl">docker-compose -f docker-compose.distributed.yml up -d
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check cluster status</span>
</span></span><span class="line"><span class="cl">docker-compose -f docker-compose.distributed.yml ps
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># View logs</span>
</span></span><span class="line"><span class="cl">docker-compose -f docker-compose.distributed.yml logs -f
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Stop cluster</span>
</span></span><span class="line"><span class="cl">docker-compose -f docker-compose.distributed.yml down
</span></span></code></pre></div>
<h4 id="cluster-environment-variables" class="position-relative d-flex align-items-center group">
<span>Cluster Environment Variables</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="cluster-environment-variables"
aria-haspopup="dialog"
aria-label="Share link: Cluster Environment Variables">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">NODE_ID</span><span class="o">=</span>node-1
</span></span><span class="line"><span class="cl"><span class="nv">NODE_ROLE</span><span class="o">=</span>leader<span class="p">|</span>follower
</span></span><span class="line"><span class="cl"><span class="nv">CLUSTER_NAME</span><span class="o">=</span>geode-cluster
</span></span><span class="line"><span class="cl"><span class="nv">GEODE_DISTRIBUTED</span><span class="o">=</span><span class="nb">true</span>
</span></span><span class="line"><span class="cl"><span class="nv">GEODE_SHARD_COUNT</span><span class="o">=</span><span class="m">3</span>
</span></span><span class="line"><span class="cl"><span class="nv">GEODE_REPLICATION_FACTOR</span><span class="o">=</span><span class="m">2</span>
</span></span></code></pre></div>
<h4 id="example-distributed-configuration" class="position-relative d-flex align-items-center group">
<span>Example Distributed Configuration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="example-distributed-configuration"
aria-haspopup="dialog"
aria-label="Share link: Example Distributed Configuration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s1">'3.8'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode-node-1</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">geodedb/geode:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">geode-leader</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"7567:8443/udp"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">NODE_ID=node-1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">NODE_ROLE=leader</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">CLUSTER_NAME=geode-cluster</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_DISTRIBUTED=true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-node-1:/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-cluster</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode-node-2</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">geodedb/geode:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">geode-follower-1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"7569:8443/udp"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">NODE_ID=node-2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">NODE_ROLE=follower</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">CLUSTER_NAME=geode-cluster</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_DISTRIBUTED=true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">LEADER_HOST=geode-node-1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-node-2:/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-cluster</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">depends_on</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-node-1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode-node-3</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">geodedb/geode:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">geode-follower-2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"7571:8443/udp"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">NODE_ID=node-3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">NODE_ROLE=follower</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">CLUSTER_NAME=geode-cluster</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_DISTRIBUTED=true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">LEADER_HOST=geode-node-1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-node-3:/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-cluster</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">depends_on</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-node-1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">haproxy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">haproxy:2.8</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">geode-lb</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"7500:7500"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-cluster</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">depends_on</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-node-1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-node-2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-node-3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">networks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode-cluster</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l">bridge</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode-node-1</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode-node-2</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode-node-3</span><span class="p">:</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="configuration-reference" class="position-relative d-flex align-items-center group">
<span>Configuration Reference</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="configuration-reference"
aria-haspopup="dialog"
aria-label="Share link: Configuration Reference">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="environment-variables" class="position-relative d-flex align-items-center group">
<span>Environment Variables</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="environment-variables"
aria-haspopup="dialog"
aria-label="Share link: Environment Variables">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><table>
<thead>
<tr>
<th>Variable</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>GEODE_LOG_LEVEL</code></td>
<td>Log level (debug, info, warn, error)</td>
<td>info</td>
</tr>
<tr>
<td><code>GEODE_MAX_CONNECTIONS</code></td>
<td>Maximum concurrent connections</td>
<td>1000</td>
</tr>
<tr>
<td><code>GEODE_CACHE_SIZE</code></td>
<td>Query cache size</td>
<td>1GB</td>
</tr>
<tr>
<td><code>GEODE_WAL_SIZE_LIMIT</code></td>
<td>WAL size limit</td>
<td>10GB</td>
</tr>
<tr>
<td><code>LOG_LEVEL</code></td>
<td>Alternative log level env var</td>
<td>error</td>
</tr>
<tr>
<td><code>FIPS_MODE</code></td>
<td>Enable FIPS 140-3 mode</td>
<td>enabled</td>
</tr>
<tr>
<td><code>NODE_ID</code></td>
<td>Cluster node identifier</td>
<td>-</td>
</tr>
<tr>
<td><code>NODE_ROLE</code></td>
<td>Cluster role (leader/follower)</td>
<td>-</td>
</tr>
<tr>
<td><code>CLUSTER_NAME</code></td>
<td>Cluster name for discovery</td>
<td>-</td>
</tr>
<tr>
<td><code>GEODE_DISTRIBUTED</code></td>
<td>Enable distributed mode</td>
<td>false</td>
</tr>
</tbody>
</table>
<h4 id="volume-mounts" class="position-relative d-flex align-items-center group">
<span>Volume Mounts</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="volume-mounts"
aria-haspopup="dialog"
aria-label="Share link: Volume Mounts">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><table>
<thead>
<tr>
<th>Path</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/data</code></td>
<td>Persistent data storage (WAL, pages, indexes)</td>
</tr>
<tr>
<td><code>/certs</code></td>
<td>TLS certificates (read-only recommended)</td>
</tr>
<tr>
<td><code>/var/log/geode</code></td>
<td>Application logs</td>
</tr>
<tr>
<td><code>/config</code></td>
<td>Configuration files</td>
</tr>
</tbody>
</table>
<h4 id="ports" class="position-relative d-flex align-items-center group">
<span>Ports</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="ports"
aria-haspopup="dialog"
aria-label="Share link: Ports">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><table>
<thead>
<tr>
<th>Port</th>
<th>Protocol</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>8443</td>
<td>UDP</td>
<td>QUIC with TLS 1.3 (primary communication)</td>
</tr>
<tr>
<td>9090</td>
<td>TCP</td>
<td>Prometheus metrics endpoint</td>
</tr>
<tr>
<td>3141</td>
<td>UDP</td>
<td>Alternative QUIC port (standard)</td>
</tr>
</tbody>
</table>
<h3 id="security--fips" class="position-relative d-flex align-items-center group">
<span>Security &amp; FIPS</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="security--fips"
aria-haspopup="dialog"
aria-label="Share link: Security &amp; FIPS">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="fips-mode" class="position-relative d-flex align-items-center group">
<span>FIPS Mode</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="fips-mode"
aria-haspopup="dialog"
aria-label="Share link: FIPS Mode">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>OpenSSL FIPS 140-3 module is enabled by default in production images. Verify with:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Check OpenSSL version</span>
</span></span><span class="line"><span class="cl">docker run --rm geodedb/geode:latest openssl version -a
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check FIPS providers</span>
</span></span><span class="line"><span class="cl">docker <span class="nb">exec</span> <container> openssl list -providers
</span></span></code></pre></div><p><strong>Expected output</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">OpenSSL 3.3.2 with FIPS provider
</span></span><span class="line"><span class="cl">Providers:
</span></span><span class="line"><span class="cl"> fips
</span></span><span class="line"><span class="cl"> name: OpenSSL FIPS Provider
</span></span><span class="line"><span class="cl"> version: 3.0.9
</span></span></code></pre></div>
<h4 id="security-best-practices" class="position-relative d-flex align-items-center group">
<span>Security Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="security-best-practices"
aria-haspopup="dialog"
aria-label="Share link: Security Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">geodedb/geode:prod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">read_only</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="c"># Immutable filesystem</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tmpfs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">/tmp </span><span class="w"> </span><span class="c"># Writable temp only</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">security_opt</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="kc">no</span>-<span class="l">new-privileges:true </span><span class="w"> </span><span class="c"># Prevent privilege escalation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cap_drop</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ALL </span><span class="w"> </span><span class="c"># Drop all capabilities</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cap_add</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">NET_BIND_SERVICE </span><span class="w"> </span><span class="c"># Only bind to privileged ports</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">user</span><span class="p">:</span><span class="w"> </span><span class="s2">"1000:1000"</span><span class="w"> </span><span class="c"># Run as non-root</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="tls-certificate-management" class="position-relative d-flex align-items-center group">
<span>TLS Certificate Management</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="tls-certificate-management"
aria-haspopup="dialog"
aria-label="Share link: TLS Certificate Management">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Generate self-signed certificate</span>
</span></span><span class="line"><span class="cl">openssl req -x509 -newkey rsa:4096 -nodes <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -keyout server.key <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -out server.crt <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -days <span class="m">365</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -subj <span class="s2">"/CN=geode.example.com"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Or use Geode's built-in generator</span>
</span></span><span class="line"><span class="cl">docker run --rm -v ./certs:/certs geodedb/geode:latest <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> cert_gen --output-dir /certs --days <span class="m">365</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify certificate</span>
</span></span><span class="line"><span class="cl">openssl x509 -in ./certs/server.crt -text -noout <span class="p">|</span> grep -A <span class="m">2</span> <span class="s2">"Validity"</span>
</span></span></code></pre></div>
<h3 id="gpu-acceleration" class="position-relative d-flex align-items-center group">
<span>GPU Acceleration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="gpu-acceleration"
aria-haspopup="dialog"
aria-label="Share link: GPU Acceleration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>For vector operations and graph algorithms with GPU acceleration:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Pull GPU-enabled image</span>
</span></span><span class="line"><span class="cl">docker pull geodedb/geode:gpu
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run with GPU support</span>
</span></span><span class="line"><span class="cl">docker run -d <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --name geode-gpu <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --gpus all <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -p 8443:8443/udp <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> geodedb/geode:gpu
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify CUDA availability</span>
</span></span><span class="line"><span class="cl">docker <span class="nb">exec</span> geode-gpu nvidia-smi
</span></span></code></pre></div><p><strong>Docker Compose with GPU</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">geode-gpu</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">geodedb/geode:gpu</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">deploy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">resources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reservations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">devices</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l">nvidia</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">count</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">capabilities</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">gpu]</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="performance-tuning" class="position-relative d-flex align-items-center group">
<span>Performance Tuning</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="performance-tuning"
aria-haspopup="dialog"
aria-label="Share link: Performance Tuning">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="udp-buffer-sizes-for-quic" class="position-relative d-flex align-items-center group">
<span>UDP Buffer Sizes for QUIC</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="udp-buffer-sizes-for-quic"
aria-haspopup="dialog"
aria-label="Share link: UDP Buffer Sizes for QUIC">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Increase UDP buffer sizes for high-throughput</span>
</span></span><span class="line"><span class="cl">docker run <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --sysctl net.core.rmem_max<span class="o">=</span><span class="m">26214400</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --sysctl net.core.wmem_max<span class="o">=</span><span class="m">26214400</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --ulimit <span class="nv">nofile</span><span class="o">=</span>65536:65536 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> geodedb/geode:latest
</span></span></code></pre></div>
<h4 id="resource-limits" class="position-relative d-flex align-items-center group">
<span>Resource Limits</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="resource-limits"
aria-haspopup="dialog"
aria-label="Share link: Resource Limits">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">deploy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">resources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">limits</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cpus</span><span class="p">:</span><span class="w"> </span><span class="s1">'8'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="l">16G</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reservations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cpus</span><span class="p">:</span><span class="w"> </span><span class="s1">'4'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="l">8G</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="connection-limits" class="position-relative d-flex align-items-center group">
<span>Connection Limits</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="connection-limits"
aria-haspopup="dialog"
aria-label="Share link: Connection Limits">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Increase connection limits</span>
</span></span><span class="line"><span class="cl">docker run -e <span class="nv">GEODE_MAX_CONNECTIONS</span><span class="o">=</span><span class="m">10000</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -e <span class="nv">GEODE_CACHE_SIZE</span><span class="o">=</span>4GB <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> geodedb/geode:latest
</span></span></code></pre></div>
<h3 id="monitoring--health-checks" class="position-relative d-flex align-items-center group">
<span>Monitoring &amp; Health Checks</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="monitoring--health-checks"
aria-haspopup="dialog"
aria-label="Share link: Monitoring &amp; Health Checks">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="health-check-configuration" class="position-relative d-flex align-items-center group">
<span>Health Check Configuration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="health-check-configuration"
aria-haspopup="dialog"
aria-label="Share link: Health Check Configuration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">healthcheck</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">test</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"CMD"</span><span class="p">,</span><span class="w"> </span><span class="s2">"geode"</span><span class="p">,</span><span class="w"> </span><span class="s2">"query"</span><span class="p">,</span><span class="w"> </span><span class="s2">"RETURN 1"</span><span class="p">,</span><span class="w"> </span><span class="s2">"--server"</span><span class="p">,</span><span class="w"> </span><span class="s2">"127.0.0.1:8443"</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">interval</span><span class="p">:</span><span class="w"> </span><span class="l">30s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="l">3s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retries</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">start_period</span><span class="p">:</span><span class="w"> </span><span class="l">10s</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="prometheus-metrics" class="position-relative d-flex align-items-center group">
<span>Prometheus Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="prometheus-metrics"
aria-haspopup="dialog"
aria-label="Share link: Prometheus Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode exposes Prometheus metrics on port 9090:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Access metrics</span>
</span></span><span class="line"><span class="cl">curl http://localhost:9090/metrics
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Example metrics</span>
</span></span><span class="line"><span class="cl">geode_query_duration_seconds
</span></span><span class="line"><span class="cl">geode_storage_pages_written_total
</span></span><span class="line"><span class="cl">geode_connections_active
</span></span><span class="line"><span class="cl">geode_wal_segments_total
</span></span></code></pre></div>
<h4 id="integration-with-prometheus" class="position-relative d-flex align-items-center group">
<span>Integration with Prometheus</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="integration-with-prometheus"
aria-haspopup="dialog"
aria-label="Share link: Integration with Prometheus">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># prometheus.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">scrape_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">job_name</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">static_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">targets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s1">'geode:9090'</span><span class="p">]</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="troubleshooting" class="position-relative d-flex align-items-center group">
<span>Troubleshooting</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="troubleshooting"
aria-haspopup="dialog"
aria-label="Share link: Troubleshooting">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="container-wont-start" class="position-relative d-flex align-items-center group">
<span>Container Won&rsquo;t Start</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="container-wont-start"
aria-haspopup="dialog"
aria-label="Share link: Container Wont Start">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Check logs</span>
</span></span><span class="line"><span class="cl">docker logs geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># For Docker Compose</span>
</span></span><span class="line"><span class="cl">docker-compose logs geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify port availability (UDP!)</span>
</span></span><span class="line"><span class="cl">netstat -uapn <span class="p">|</span> grep <span class="m">8443</span>
</span></span></code></pre></div>
<h4 id="common-issues" class="position-relative d-flex align-items-center group">
<span>Common Issues</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="common-issues"
aria-haspopup="dialog"
aria-label="Share link: Common Issues">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>1. Port Already in Use</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Error: address already in use</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Solution: Change host port</span>
</span></span><span class="line"><span class="cl">docker run -p 9443:8443/udp geodedb/geode:latest
</span></span></code></pre></div><p><strong>2. Permission Errors</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Fix ownership</span>
</span></span><span class="line"><span class="cl">sudo chown -R <span class="k">$(</span>id -u<span class="k">)</span>:<span class="k">$(</span>id -g<span class="k">)</span> ./data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Or set UID/GID in environment</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"USER_UID=</span><span class="k">$(</span>id -u<span class="k">)</span><span class="s2">"</span> > .env
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"USER_GID=</span><span class="k">$(</span>id -g<span class="k">)</span><span class="s2">"</span> >> .env
</span></span></code></pre></div><p><strong>3. Health Check Failures</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Test manually (note: UDP, not TCP!)</span>
</span></span><span class="line"><span class="cl">docker <span class="nb">exec</span> geode geode query <span class="s2">"RETURN 1"</span> --server 127.0.0.1:8443
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check server is listening on UDP</span>
</span></span><span class="line"><span class="cl">docker <span class="nb">exec</span> geode netstat -uapn <span class="p">|</span> grep <span class="m">8443</span>
</span></span></code></pre></div><p><strong>4. Certificate Errors</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Verify certificate validity</span>
</span></span><span class="line"><span class="cl">openssl x509 -in ./certs/server.crt -noout -dates
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check certificate matches key</span>
</span></span><span class="line"><span class="cl">openssl x509 -in ./certs/server.crt -noout -modulus <span class="p">|</span> md5sum
</span></span><span class="line"><span class="cl">openssl rsa -in ./certs/server.key -noout -modulus <span class="p">|</span> md5sum
</span></span><span class="line"><span class="cl"><span class="c1"># Both MD5 sums should match</span>
</span></span></code></pre></div>
<h4 id="debug-mode" class="position-relative d-flex align-items-center group">
<span>Debug Mode</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="debug-mode"
aria-haspopup="dialog"
aria-label="Share link: Debug Mode">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Enable debug logging</span>
</span></span><span class="line"><span class="cl">docker run -e <span class="nv">GEODE_LOG_LEVEL</span><span class="o">=</span>debug geodedb/geode:latest
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Attach for debugging</span>
</span></span><span class="line"><span class="cl">docker <span class="nb">exec</span> -it geode /bin/bash
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># View real-time logs</span>
</span></span><span class="line"><span class="cl">docker logs -f --tail <span class="m">100</span> geode
</span></span></code></pre></div>
<h4 id="build-failures" class="position-relative d-flex align-items-center group">
<span>Build Failures</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="build-failures"
aria-haspopup="dialog"
aria-label="Share link: Build Failures">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Rebuild from scratch</span>
</span></span><span class="line"><span class="cl">./dev.sh rebuild
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Try simple Dockerfile</span>
</span></span><span class="line"><span class="cl">docker build -f Dockerfile.simple -t geode:latest .
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check Docker daemon logs</span>
</span></span><span class="line"><span class="cl">sudo journalctl -u docker.service -f
</span></span></code></pre></div>
<h3 id="integration-testing" class="position-relative d-flex align-items-center group">
<span>Integration Testing</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="integration-testing"
aria-haspopup="dialog"
aria-label="Share link: Integration Testing">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode includes a comprehensive Docker integration test suite:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Run full integration test suite</span>
</span></span><span class="line"><span class="cl">make docker-integration-test
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># View test results</span>
</span></span><span class="line"><span class="cl">cat docker-integration/results/integration_summary.json
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run specific client tests</span>
</span></span><span class="line"><span class="cl">docker-compose -f docker-integration/docker-compose.integration.yml up client-go
</span></span><span class="line"><span class="cl">docker-compose -f docker-integration/docker-compose.integration.yml up client-python
</span></span><span class="line"><span class="cl">docker-compose -f docker-integration/docker-compose.integration.yml up client-rust
</span></span><span class="line"><span class="cl">docker-compose -f docker-integration/docker-compose.integration.yml up client-zig
</span></span></code></pre></div>
<h4 id="test-architecture" class="position-relative d-flex align-items-center group">
<span>Test Architecture</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="test-architecture"
aria-haspopup="dialog"
aria-label="Share link: Test Architecture">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"> ┌─────────────────┐
</span></span><span class="line"><span class="cl"> │ geode-server │
</span></span><span class="line"><span class="cl"> │ QUIC/TLS UDP:8443│
</span></span><span class="line"><span class="cl"> └────────┬────────┘
</span></span><span class="line"><span class="cl"> │
</span></span><span class="line"><span class="cl"> ┌──────────────────────┼──────────────────────┐
</span></span><span class="line"><span class="cl"> │ │ │
</span></span><span class="line"><span class="cl">┌─────▼──────┐ ┌──────────▼──────────┐ ┌───────▼────────┐
</span></span><span class="line"><span class="cl">│ migration │ │ Client Tests │ │ results- │
</span></span><span class="line"><span class="cl">│ runner │ │ (run in parallel) │ │ collector │
</span></span><span class="line"><span class="cl">│ │ │ │ │ │
</span></span><span class="line"><span class="cl">│ • Executes │ │ • client-go │ │ • Aggregates │
</span></span><span class="line"><span class="cl">│ multi- │ │ • client-python │ │ test results │
</span></span><span class="line"><span class="cl">│ statement│ │ • client-rust │ │ • Generates │
</span></span><span class="line"><span class="cl">│ .gql │ │ • client-zig │ │ summary.json │
</span></span><span class="line"><span class="cl">└────────────┘ └──────────────────────┘ └────────────────┘
</span></span></code></pre></div>
<h3 id="docker-files-reference" class="position-relative d-flex align-items-center group">
<span>Docker Files Reference</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="docker-files-reference"
aria-haspopup="dialog"
aria-label="Share link: Docker Files Reference">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><code>Dockerfile</code> - Multi-stage production build</li>
<li><code>Dockerfile.dev</code> - Development environment with full toolchain</li>
<li><code>Dockerfile.simple</code> - Fallback with inline Zig installation</li>
<li><code>Dockerfile.prod</code> - Distroless production image</li>
<li><code>docker-compose.yml</code> - Standard single-node deployment</li>
<li><code>docker-compose.dev.yml</code> - Development orchestration</li>
<li><code>docker-compose.distributed.yml</code> - 3-node Raft cluster</li>
<li><code>docker-integration/docker-compose.integration.yml</code> - Integration test suite</li>
<li><code>dev.sh</code> - Development helper script</li>
<li><code>docker-build.sh</code> - Build orchestration script</li>
</ul>
<h3 id="best-practices" class="position-relative d-flex align-items-center group">
<span>Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="best-practices"
aria-haspopup="dialog"
aria-label="Share link: Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="development" class="position-relative d-flex align-items-center group">
<span>Development</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="development"
aria-haspopup="dialog"
aria-label="Share link: Development">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li>Use <code>./dev.sh</code> commands for consistent environment</li>
<li>Mount source code for live reloading</li>
<li>Enable debug logging (<code>GEODE_LOG_LEVEL=debug</code>)</li>
<li>Use named volumes for persistent data</li>
</ul>
<h4 id="production" class="position-relative d-flex align-items-center group">
<span>Production</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="production"
aria-haspopup="dialog"
aria-label="Share link: Production">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li>Use <code>prod</code> or <code>latest</code> image tags</li>
<li>Enable read-only filesystem</li>
<li>Set resource limits (CPU, memory)</li>
<li>Use health checks for orchestration</li>
<li>Enable FIPS mode for compliance</li>
<li>Run as non-root user</li>
<li>Use secrets management (Vault, Docker secrets)</li>
<li>Configure proper TLS certificates</li>
<li>Monitor with Prometheus/Grafana</li>
</ul>
<h4 id="security" class="position-relative d-flex align-items-center group">
<span>Security</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="security"
aria-haspopup="dialog"
aria-label="Share link: Security">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li>Always use TLS certificates in production</li>
<li>Enable FIPS mode for cryptographic compliance</li>
<li>Use distroless base images for minimal attack surface</li>
<li>Drop unnecessary capabilities</li>
<li>Run containers as non-root</li>
<li>Use read-only filesystem where possible</li>
<li>Scan images for vulnerabilities</li>
<li>Rotate credentials regularly</li>
</ul>
<h3 id="next-steps" class="position-relative d-flex align-items-center group">
<span>Next Steps</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="next-steps"
aria-haspopup="dialog"
aria-label="Share link: Next Steps">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="/docs/configuration/server-configuration/"
>Server Configuration</a>
- Detailed configuration options</li>
<li><a
href="/docs/ops/observability/"
>Observability</a>
- Monitoring and logging setup</li>
<li><a
href="/docs/guides/multi-datacenter/"
>Multi-Datacenter Deployment</a>
- Advanced distributed deployment</li>
<li><a
href="/docs/guides/backup-automation/"
>Backup Automation</a>
- S3 backup integration</li>
<li><a
href="/docs/security/overview/"
>Security Overview</a>
- Enterprise security features</li>
</ul>
<h3 id="resources" class="position-relative d-flex align-items-center group">
<span>Resources</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="resources"
aria-haspopup="dialog"
aria-label="Share link: Resources">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="https://hub.docker.com/r/geodedb/geode"
aria-label="Geode on Docker Hub – opens in new window"
target="_blank" rel="noopener noreferrer"
>Geode on Docker Hub
<span aria-hidden="true" class="external-icon">↗</span>
</a>
- Official Geode container images</li>
<li><a
href="https://docs.docker.com/compose/"
aria-label="Docker Compose Documentation – opens in new window"
target="_blank" rel="noopener noreferrer"
>Docker Compose Documentation
<span aria-hidden="true" class="external-icon">↗</span>
</a>
</li>
<li><a
href="https://datatracker.ietf.org/doc/html/rfc9000"
aria-label="QUIC Protocol – opens in new window"
target="_blank" rel="noopener noreferrer"
>QUIC Protocol
<span aria-hidden="true" class="external-icon">↗</span>
</a>
</li>
</ul>
<hr>
<p><strong>License</strong>: Apache License 2.0
<strong>Copyright</strong>: 2024-2025 CodePros
<strong>Last Updated</strong>: January 2026</p>
Docker Deployment Guide
Complete guide to deploying Geode graph database with Docker: pre-built images, development environment, production deployment, and distributed clusters