<!-- CANARY: REQ=REQ-SERVER-STARTUP-INTEGRATION-001; FEATURE="Server Startup Integration Tests"; ASPECT=EndToEndServerTesting; STATUS=TESTED; OWNER=server; UPDATED=2025-10-05 -->
<h2 id="deployment-patterns" class="position-relative d-flex align-items-center group">
<span>Deployment Patterns</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="deployment-patterns"
aria-haspopup="dialog"
aria-label="Share link: Deployment Patterns">
<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>Geode offers flexible deployment patterns to match your infrastructure requirements, from single-node development environments to distributed production clusters with full observability stacks.</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 supports multiple deployment architectures:</p>
<ul>
<li><strong>Single-Node Deployment</strong> - Simple setup for development, testing, or low-traffic production</li>
<li><strong>Distributed Deployment</strong> - Multi-node clusters with sharding and federation for high availability</li>
<li><strong>Cloud Deployment</strong> - Container orchestration with Kubernetes or Docker Swarm</li>
<li><strong>GPU-Accelerated Deployment</strong> - Hardware acceleration for vector operations and graph analytics</li>
<li><strong>Infrastructure Stack</strong> - Complete observability with monitoring, logging, and backup systems</li>
</ul>
<p>This guide covers production-ready deployment patterns with best practices for security, performance, and reliability.</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="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><p><strong>System Requirements</strong>:</p>
<ul>
<li>Docker 20.10+ and Docker Compose 1.29+</li>
<li>8GB RAM minimum (16GB recommended for production)</li>
<li>50GB disk space for data and backups</li>
<li>NVIDIA GPU with drivers + nvidia-docker2 (GPU deployment only)</li>
</ul>
<p><strong>Network Requirements</strong>:</p>
<ul>
<li>Port 3141 (standard) or 8443 (alternative) for Geode QUIC+TLS</li>
<li>Firewall rules configured for inter-node communication (distributed)</li>
<li>Valid TLS certificates (self-signed for development, CA-signed for production)</li>
</ul>
<h4 id="basic-setup" class="position-relative d-flex align-items-center group">
<span>Basic Setup</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="basic-setup"
aria-haspopup="dialog"
aria-label="Share link: Basic Setup">
<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 and setup deployment</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/deployment
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run setup script (generates certificates, passwords, .env)</span>
</span></span><span class="line"><span class="cl">./scripts/setup-deployment.sh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Review and customize environment variables</span>
</span></span><span class="line"><span class="cl">vi .env
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Add local DNS entries (development only)</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"127.0.0.1 geode.local grafana.geode.local prometheus.geode.local minio.geode.local vault.geode.local"</span> <span class="p">|</span> sudo tee -a /etc/hosts
</span></span></code></pre></div>
<h4 id="start-services" class="position-relative d-flex align-items-center group">
<span>Start Services</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="start-services"
aria-haspopup="dialog"
aria-label="Share link: Start Services">
<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>Standard Deployment</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"># Start full stack (Geode + infrastructure)</span>
</span></span><span class="line"><span class="cl">docker-compose up -d
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify all services running</span>
</span></span><span class="line"><span class="cl">docker-compose ps
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check Geode logs</span>
</span></span><span class="line"><span class="cl">docker-compose logs -f geode
</span></span></code></pre></div><p><strong>GPU-Accelerated Deployment</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"># Install NVIDIA Container Toolkit</span>
</span></span><span class="line"><span class="cl"><span class="nv">distribution</span><span class="o">=</span><span class="k">$(</span>. /etc/os-release<span class="p">;</span><span class="nb">echo</span> <span class="nv">$ID$VERSION_ID</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey <span class="p">|</span> sudo apt-key add -
</span></span><span class="line"><span class="cl">curl -s -L https://nvidia.github.io/nvidia-docker/<span class="nv">$distribution</span>/nvidia-docker.list <span class="p">|</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> sudo tee /etc/apt/sources.list.d/nvidia-docker.list
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo apt-get update
</span></span><span class="line"><span class="cl">sudo apt-get install -y nvidia-docker2
</span></span><span class="line"><span class="cl">sudo systemctl restart docker
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify GPU availability</span>
</span></span><span class="line"><span class="cl">docker run --rm --gpus all nvidia/cuda:12.3.0-base-ubuntu22.04 nvidia-smi
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start GPU stack</span>
</span></span><span class="line"><span class="cl">docker-compose -f docker-compose.yml -f docker-compose.gpu.yml up -d
</span></span></code></pre></div>
<h4 id="verify-installation" class="position-relative d-flex align-items-center group">
<span>Verify Installation</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="verify-installation"
aria-haspopup="dialog"
aria-label="Share link: Verify Installation">
<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"># Test Geode connectivity</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> geode geode query <span class="s2">"RETURN 1 AS health"</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"># Access web interfaces</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Grafana: https://grafana.geode.local (admin / check .env)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Prometheus: https://prometheus.geode.local</span>
</span></span><span class="line"><span class="cl"><span class="c1"># MinIO Console: https://minio.geode.local</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Vault UI: https://vault.geode.local</span>
</span></span></code></pre></div>
<h3 id="single-node-deployment" class="position-relative d-flex align-items-center group">
<span>Single-Node 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-deployment"
aria-haspopup="dialog"
aria-label="Share link: Single-Node 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="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><p>Single-node deployment runs Geode with a complete infrastructure stack on one machine:</p>
<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">│ Host Machine │
</span></span><span class="line"><span class="cl">│ │
</span></span><span class="line"><span class="cl">│ ┌──────────────┐ ┌──────────────┐ ┌────────────┐ │
</span></span><span class="line"><span class="cl">│ │ Geode │ │ Vault │ │ Redis │ │
</span></span><span class="line"><span class="cl">│ │ Graph DB │ │ Secrets │ │ Cache │ │
</span></span><span class="line"><span class="cl">│ │ (port 8443) │ │ Management │ │ │ │
</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">│ │ Nginx Reverse Proxy │ │
</span></span><span class="line"><span class="cl">│ │ (TLS termination, routing) │ │
</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">│ │ Prometheus │ │ Grafana │ │ MinIO │ │
</span></span><span class="line"><span class="cl">│ │ Metrics │ │ Dashboards │ │ Backups │ │
</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">│ │ Loki │ │ Promtail │ │
</span></span><span class="line"><span class="cl">│ │ Log Storage │ │ Log Collect │ │
</span></span><span class="line"><span class="cl">│ └──────────────┘ └──────────────┘ │
</span></span><span class="line"><span class="cl">└──────────────────────────────────────────────────────┘
</span></span></code></pre></div>
<h4 id="configuration" class="position-relative d-flex align-items-center group">
<span>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="configuration"
aria-haspopup="dialog"
aria-label="Share link: 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><p><strong>Environment Variables</strong> (<code>.env</code> file):</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"># Geode Configuration</span>
</span></span><span class="line"><span class="cl"><span class="nv">GEODE_LOG_LEVEL</span><span class="o">=</span>info <span class="c1"># Log level: debug, info, warn, error</span>
</span></span><span class="line"><span class="cl"><span class="nv">GEODE_DATA_DIR</span><span class="o">=</span>/data <span class="c1"># Data directory path</span>
</span></span><span class="line"><span class="cl"><span class="nv">GEODE_LISTEN_ADDR</span><span class="o">=</span>0.0.0.0:8443 <span class="c1"># Listen address</span>
</span></span><span class="line"><span class="cl"><span class="nv">GEODE_MAX_CONNECTIONS</span><span class="o">=</span><span class="m">1000</span> <span class="c1"># Maximum concurrent connections</span>
</span></span><span class="line"><span class="cl"><span class="nv">GEODE_QUERY_TIMEOUT</span><span class="o">=</span>30s <span class="c1"># Query execution timeout</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Security</span>
</span></span><span class="line"><span class="cl"><span class="nv">VAULT_ADDR</span><span class="o">=</span>http://vault:8200
</span></span><span class="line"><span class="cl"><span class="nv">VAULT_TOKEN</span><span class="o">=</span><generated-secure-token>
</span></span><span class="line"><span class="cl"><span class="nv">REDIS_PASSWORD</span><span class="o">=</span><generated-secure-password>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Storage & Backup</span>
</span></span><span class="line"><span class="cl"><span class="nv">S3_ENDPOINT</span><span class="o">=</span>http://minio:9000
</span></span><span class="line"><span class="cl"><span class="nv">S3_ACCESS_KEY</span><span class="o">=</span>geode-minio-admin
</span></span><span class="line"><span class="cl"><span class="nv">S3_SECRET_KEY</span><span class="o">=</span><generated-secure-password>
</span></span><span class="line"><span class="cl"><span class="nv">S3_BUCKET</span><span class="o">=</span>geode-backups
</span></span><span class="line"><span class="cl"><span class="nv">S3_REGION</span><span class="o">=</span>us-east-1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Monitoring</span>
</span></span><span class="line"><span class="cl"><span class="nv">GF_SECURITY_ADMIN_USER</span><span class="o">=</span>admin
</span></span><span class="line"><span class="cl"><span class="nv">GF_SECURITY_ADMIN_PASSWORD</span><span class="o">=</span><generated-secure-password>
</span></span><span class="line"><span class="cl"><span class="nv">GF_SERVER_DOMAIN</span><span class="o">=</span>grafana.geode.local
</span></span><span class="line"><span class="cl"><span class="nv">GF_SERVER_ROOT_URL</span><span class="o">=</span>https://grafana.geode.local
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Resource Limits</span>
</span></span><span class="line"><span class="cl"><span class="nv">GEODE_MEMORY_LIMIT</span><span class="o">=</span>8G
</span></span><span class="line"><span class="cl"><span class="nv">GEODE_CPU_LIMIT</span><span class="o">=</span>4.0
</span></span></code></pre></div>
<h4 id="docker-compose-configuration" class="position-relative d-flex align-items-center group">
<span>Docker Compose 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-configuration"
aria-haspopup="dialog"
aria-label="Share link: Docker Compose 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><p><strong>Basic <code>docker-compose.yml</code> excerpt</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">version</span><span class="p">:</span><span class="w"> </span><span class="s1">'3.9'</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">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</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">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"</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=${GEODE_LOG_LEVEL}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_DATA_DIR=${GEODE_DATA_DIR}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">VAULT_ADDR=${VAULT_ADDR}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">VAULT_TOKEN=${VAULT_TOKEN}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S3_ENDPOINT=${S3_ENDPOINT}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S3_ACCESS_KEY=${S3_ACCESS_KEY}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S3_SECRET_KEY=${S3_SECRET_KEY}</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="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-network</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">'${GEODE_CPU_LIMIT}'</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">${GEODE_MEMORY_LIMIT}</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.0'</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">10s</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">40s</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">vault</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">hashicorp/vault: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-vault</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">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">VAULT_DEV_ROOT_TOKEN_ID=${VAULT_TOKEN}</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">IPC_LOCK</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">vault-data:/vault/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">vault-logs:/vault/logs</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-network</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">redis</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">redis:7-alpine</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-redis</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">command</span><span class="p">:</span><span class="w"> </span><span class="l">redis-server --requirepass ${REDIS_PASSWORD}</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">redis-data:/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-network</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">vault-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">vault-logs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">redis-data</span><span class="p">:</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-network</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></code></pre></div>
<h4 id="vault-initialization" class="position-relative d-flex align-items-center group">
<span>Vault Initialization</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="vault-initialization"
aria-haspopup="dialog"
aria-label="Share link: Vault Initialization">
<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>First-time setup</strong> (production):</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"># Initialize Vault (save unseal keys and root token securely!)</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault operator init
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Unseal Vault (required after every restart)</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault operator unseal <unseal-key-1>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault operator unseal <unseal-key-2>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault operator unseal <unseal-key-3>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Login with root token</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault login
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Enable KV secrets engine</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault secrets <span class="nb">enable</span> -path<span class="o">=</span>geode kv-v2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Store encryption keys</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault kv put geode/encryption <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> <span class="nv">master_key</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>openssl rand -base64 32<span class="k">)</span><span class="s2">"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> <span class="nv">data_key</span><span class="o">=</span><span class="s2">"</span><span class="k">$(</span>openssl rand -base64 32<span class="k">)</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Create policy for Geode</span>
</span></span><span class="line"><span class="cl">cat <span class="s"><<EOF | docker-compose exec -T vault vault policy write geode-policy -
</span></span></span><span class="line"><span class="cl"><span class="s">path "geode/*" {
</span></span></span><span class="line"><span class="cl"><span class="s"> capabilities = ["read", "list"]
</span></span></span><span class="line"><span class="cl"><span class="s">}
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Create token for Geode (update .env with this token)</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault token create -policy<span class="o">=</span>geode-policy
</span></span></code></pre></div><p><strong>Development setup</strong> (auto-unseal):</p>
<p>For development, Vault runs in dev mode with auto-unseal. Update <code>.env</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">VAULT_DEV_MODE</span><span class="o">=</span><span class="nb">true</span>
</span></span><span class="line"><span class="cl"><span class="nv">VAULT_TOKEN</span><span class="o">=</span>dev-only-token
</span></span></code></pre></div>
<h4 id="resource-management" class="position-relative d-flex align-items-center group">
<span>Resource 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="resource-management"
aria-haspopup="dialog"
aria-label="Share link: Resource 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><p><strong>Setting Resource Limits</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="c"># docker-compose.yml</span><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">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.0'</span><span class="w"> </span><span class="c"># Maximum 4 CPU cores</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 class="c"># Maximum 8GB RAM</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.0'</span><span class="w"> </span><span class="c"># Reserve 2 CPU cores</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 class="c"># Reserve 4GB RAM</span><span class="w">
</span></span></span></code></pre></div><p><strong>Monitoring Resource Usage</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"># Real-time container stats</span>
</span></span><span class="line"><span class="cl">docker stats
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Geode-specific stats</span>
</span></span><span class="line"><span class="cl">docker stats geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check disk usage</span>
</span></span><span class="line"><span class="cl">docker system df
</span></span><span class="line"><span class="cl">docker volume ls
</span></span><span class="line"><span class="cl">du -sh /var/lib/docker/volumes/geode_geode-data
</span></span></code></pre></div>
<h4 id="backup-and-recovery" class="position-relative d-flex align-items-center group">
<span>Backup and Recovery</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="backup-and-recovery"
aria-haspopup="dialog"
aria-label="Share link: Backup and Recovery">
<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>Automated Backups to MinIO/S3</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"># Configure backup schedule (cron)</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> geode geode backup --dest s3://geode-backups/scheduled-<span class="k">$(</span>date +%Y%m%d-%H%M%S<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># List backups</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> minio mc ls local/geode-backups
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restore from backup</span>
</span></span><span class="line"><span class="cl">docker-compose stop geode
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> geode geode restore --source s3://geode-backups/backup-20260124-120000
</span></span><span class="line"><span class="cl">docker-compose start geode
</span></span></code></pre></div><p><strong>Volume Backups</strong> (full data directory):</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"># Backup volume to tar.gz</span>
</span></span><span class="line"><span class="cl">docker run --rm <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -v geode_geode-data:/data:ro <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>/backups:/backup <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> alpine tar czf /backup/geode-data-<span class="k">$(</span>date +%Y%m%d<span class="k">)</span>.tar.gz -C /data .
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restore volume from tar.gz</span>
</span></span><span class="line"><span class="cl">docker-compose stop geode
</span></span><span class="line"><span class="cl">docker run --rm <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -v geode_geode-data:/data <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>/backups:/backup <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> alpine sh -c <span class="s2">"rm -rf /data/* && tar xzf /backup/geode-data-20260124.tar.gz -C /data"</span>
</span></span><span class="line"><span class="cl">docker-compose start geode
</span></span></code></pre></div>
<h4 id="use-cases" class="position-relative d-flex align-items-center group">
<span>Use Cases</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="use-cases"
aria-haspopup="dialog"
aria-label="Share link: Use Cases">
<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>Development & Testing</strong>:</p>
<ul>
<li>Local development with hot reloading</li>
<li>Integration testing with realistic infrastructure</li>
<li>Feature validation before production</li>
</ul>
<p><strong>Small Production Deployments</strong>:</p>
<ul>
<li>Startups and small teams (< 10,000 queries/day)</li>
<li>Internal tools and dashboards</li>
<li>Proof of concept and prototypes</li>
</ul>
<p><strong>Edge Computing</strong>:</p>
<ul>
<li>On-premises installations with limited resources</li>
<li>IoT gateway aggregation</li>
<li>Offline-capable applications</li>
</ul>
<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>
<h4 id="architecture-1" 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-1"
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><p>Distributed deployment provides high availability, horizontal scaling, and data sharding:</p>
<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">│ Load Balancer │
</span></span><span class="line"><span class="cl">│ (Nginx / HAProxy / Cloud LB) │
</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"> │ Geode │ │ Geode │ │ Geode │
</span></span><span class="line"><span class="cl"> │ Node 1 │ │ Node 2 │ │ Node 3 │
</span></span><span class="line"><span class="cl"> │ (Shard A) │ │ (Shard B) │ │ (Shard C) │
</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"> │ Raft Consensus │
</span></span><span class="line"><span class="cl"> │ Cluster State │
</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"> │ Shared Storage │ │ Shared Vault │
</span></span><span class="line"><span class="cl"> │ (MinIO / S3) │ │ (Multi-node) │
</span></span><span class="line"><span class="cl"> └─────────────────┘ └───────────────────┘
</span></span></code></pre></div>
<h4 id="multi-node-configuration" class="position-relative d-flex align-items-center group">
<span>Multi-Node 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="multi-node-configuration"
aria-haspopup="dialog"
aria-label="Share link: Multi-Node 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><p><strong>Node 1</strong> (<code>docker-compose.node1.yml</code>):</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">version</span><span class="p">:</span><span class="w"> </span><span class="s1">'3.9'</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-node1</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">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-node1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">hostname</span><span class="p">:</span><span class="w"> </span><span class="l">geode-node1</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_NODE_ID=1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_CLUSTER_MODE=true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_RAFT_PEERS=geode-node1:9000,geode-node2:9000,geode-node3:9000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_SHARD_ID=A</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_LISTEN_ADDR=0.0.0.0:8443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_RAFT_ADDR=0.0.0.0:9000</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"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"9000:9000"</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-node1-data:/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">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-node1-data</span><span class="p">:</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">overlay</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">attachable</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></div><p><strong>Node 2 & 3</strong> - Similar configuration with different node IDs and shard assignments.</p>
<h4 id="sharding-strategy" class="position-relative d-flex align-items-center group">
<span>Sharding Strategy</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="sharding-strategy"
aria-haspopup="dialog"
aria-label="Share link: Sharding Strategy">
<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>Consistent Hashing</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"># Configure sharding in Geode</span>
</span></span><span class="line"><span class="cl">geode admin configure-sharding <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --strategy consistent-hash <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --replicas <span class="m">3</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --rebalance-threshold 0.1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Assign shards to nodes</span>
</span></span><span class="line"><span class="cl">geode admin assign-shard --node geode-node1 --shard A
</span></span><span class="line"><span class="cl">geode admin assign-shard --node geode-node2 --shard B
</span></span><span class="line"><span class="cl">geode admin assign-shard --node geode-node3 --shard C
</span></span></code></pre></div><p><strong>Range-Based Sharding</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">sharded</span><span class="w"> </span><span class="py">graph</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="py">social_network</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">PARTITION</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">RANGE</span><span class="w"> </span><span class="p">(</span><span class="py">user_id</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SHARD</span><span class="w"> </span><span class="py">shard_a</span><span class="w"> </span><span class="py">VALUES</span><span class="w"> </span><span class="py">LESS</span><span class="w"> </span><span class="py">THAN</span><span class="w"> </span><span class="p">(</span><span class="py">1000000</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SHARD</span><span class="w"> </span><span class="py">shard_b</span><span class="w"> </span><span class="py">VALUES</span><span class="w"> </span><span class="py">LESS</span><span class="w"> </span><span class="py">THAN</span><span class="w"> </span><span class="p">(</span><span class="py">2000000</span><span class="p">),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SHARD</span><span class="w"> </span><span class="py">shard_c</span><span class="w"> </span><span class="py">VALUES</span><span class="w"> </span><span class="py">LESS</span><span class="w"> </span><span class="py">THAN</span><span class="w"> </span><span class="p">(</span><span class="py">MAXVALUE</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="federation" class="position-relative d-flex align-items-center group">
<span>Federation</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="federation"
aria-haspopup="dialog"
aria-label="Share link: Federation">
<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>Cross-Cluster Queries</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Configure</span><span class="w"> </span><span class="py">federation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USE</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="py">social_network</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">FEDERATION</span><span class="w"> </span><span class="py">global_social</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WITH</span><span class="w"> </span><span class="py">CLUSTERS</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">'</span><span class="py">us</span><span class="err">-</span><span class="py">west</span><span class="err">'</span><span class="w"> </span><span class="py">AT</span><span class="w"> </span><span class="err">'</span><span class="py">geode</span><span class="err">-</span><span class="py">us</span><span class="err">-</span><span class="py">west</span><span class="err">.</span><span class="py">example</span><span class="err">.</span><span class="py">com</span><span class="p">:</span><span class="nc">8443</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">'</span><span class="py">eu</span><span class="err">-</span><span class="py">central</span><span class="err">'</span><span class="w"> </span><span class="py">AT</span><span class="w"> </span><span class="err">'</span><span class="py">geode</span><span class="err">-</span><span class="py">eu</span><span class="err">.</span><span class="py">example</span><span class="err">.</span><span class="py">com</span><span class="p">:</span><span class="nc">8443</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">'</span><span class="py">ap</span><span class="err">-</span><span class="py">southeast</span><span class="err">'</span><span class="w"> </span><span class="py">AT</span><span class="w"> </span><span class="err">'</span><span class="py">geode</span><span class="err">-</span><span class="py">ap</span><span class="err">.</span><span class="py">example</span><span class="err">.</span><span class="py">com</span><span class="p">:</span><span class="nc">8443</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">)</span><span class="err">;</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="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">across</span><span class="w"> </span><span class="py">federated</span><span class="w"> </span><span class="py">clusters</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USE</span><span class="w"> </span><span class="py">FEDERATION</span><span class="w"> </span><span class="py">global_social</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">user</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FRIENDS_WITH</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">friend</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">user</span><span class="err">.</span><span class="py">region</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">us</span><span class="err">-</span><span class="py">west</span><span class="err">'</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">friend</span><span class="err">.</span><span class="py">region</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">eu</span><span class="err">-</span><span class="py">central</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">user</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">friend</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="consensus-and-coordination" class="position-relative d-flex align-items-center group">
<span>Consensus and Coordination</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="consensus-and-coordination"
aria-haspopup="dialog"
aria-label="Share link: Consensus and Coordination">
<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>Raft Configuration</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"># Initialize Raft cluster</span>
</span></span><span class="line"><span class="cl">geode admin raft-init <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --node-id <span class="m">1</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --peers geode-node1:9000,geode-node2:9000,geode-node3:9000
</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">geode admin raft-status
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Example output:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Node ID: 1</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Role: Leader</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Term: 5</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Commit Index: 1234</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Peers: [geode-node2:Follower, geode-node3:Follower]</span>
</span></span></code></pre></div>
<h4 id="load-balancing" class="position-relative d-flex align-items-center group">
<span>Load Balancing</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="load-balancing"
aria-haspopup="dialog"
aria-label="Share link: Load Balancing">
<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>Nginx Configuration</strong> (<code>nginx-lb.conf</code>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nginx" data-lang="nginx"><span class="line"><span class="cl"><span class="k">upstream</span> <span class="s">geode_cluster</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">least_conn</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">server</span> <span class="n">geode-node1</span><span class="p">:</span><span class="mi">8443</span> <span class="s">max_fails=3</span> <span class="s">fail_timeout=30s</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">server</span> <span class="n">geode-node2</span><span class="p">:</span><span class="mi">8443</span> <span class="s">max_fails=3</span> <span class="s">fail_timeout=30s</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">server</span> <span class="n">geode-node3</span><span class="p">:</span><span class="mi">8443</span> <span class="s">max_fails=3</span> <span class="s">fail_timeout=30s</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">server_name</span> <span class="s">geode.example.com</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_certificate</span> <span class="s">/etc/nginx/certs/server.crt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_certificate_key</span> <span class="s">/etc/nginx/certs/server.key</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_protocols</span> <span class="s">TLSv1.3</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_pass</span> <span class="s">https://geode_cluster</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-Proto</span> <span class="nv">$scheme</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># QUIC support
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kn">proxy_http_version</span> <span class="mi">1</span><span class="s">.1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">Upgrade</span> <span class="nv">$http_upgrade</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">Connection</span> <span class="s">"upgrade"</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Health check endpoint
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kn">location</span> <span class="s">/health</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_pass</span> <span class="s">https://geode_cluster</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">access_log</span> <span class="no">off</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
<h4 id="failover-and-high-availability" class="position-relative d-flex align-items-center group">
<span>Failover and High Availability</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="failover-and-high-availability"
aria-haspopup="dialog"
aria-label="Share link: Failover and High Availability">
<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>Automatic Failover</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"># Configure automatic failover</span>
</span></span><span class="line"><span class="cl">geode admin configure-ha <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --min-replicas <span class="m">2</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --auto-promote <span class="nb">true</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --failover-timeout 30s
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Manual failover (if needed)</span>
</span></span><span class="line"><span class="cl">geode admin promote-node --node geode-node2
</span></span></code></pre></div><p><strong>Health Checks</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="c"># docker-compose.yml healthcheck</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">10s</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">5s</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">30s</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="scaling-operations" class="position-relative d-flex align-items-center group">
<span>Scaling Operations</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="scaling-operations"
aria-haspopup="dialog"
aria-label="Share link: Scaling Operations">
<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>Horizontal Scaling</strong> (add nodes):</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"># Scale up cluster</span>
</span></span><span class="line"><span class="cl">docker-compose up -d --scale <span class="nv">geode</span><span class="o">=</span><span class="m">5</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Rebalance shards</span>
</span></span><span class="line"><span class="cl">geode admin rebalance-shards --strategy least-loaded
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify distribution</span>
</span></span><span class="line"><span class="cl">geode admin shard-distribution
</span></span></code></pre></div><p><strong>Vertical Scaling</strong> (increase resources):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Update resource limits</span><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">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.0'</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.0'</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>
<h3 id="cloud-deployment" class="position-relative d-flex align-items-center group">
<span>Cloud 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="cloud-deployment"
aria-haspopup="dialog"
aria-label="Share link: Cloud 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="kubernetes-deployment" class="position-relative d-flex align-items-center group">
<span>Kubernetes 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="kubernetes-deployment"
aria-haspopup="dialog"
aria-label="Share link: Kubernetes 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><p><strong>Namespace and ConfigMap</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="c"># geode-namespace.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Namespace</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geode</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="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># geode-config.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ConfigMap</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geode-config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">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">GEODE_LOG_LEVEL</span><span class="p">:</span><span class="w"> </span><span class="s2">"info"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">GEODE_DATA_DIR</span><span class="p">:</span><span class="w"> </span><span class="s2">"/data"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">GEODE_CLUSTER_MODE</span><span class="p">:</span><span class="w"> </span><span class="s2">"true"</span><span class="w">
</span></span></span></code></pre></div><p><strong>StatefulSet for Geode</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="c"># geode-statefulset.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apps/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">StatefulSet</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">serviceName</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replicas</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">selector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">template</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geode</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">geode:latest</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="nt">containerPort</span><span class="p">:</span><span class="w"> </span><span class="m">8443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">quic</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">containerPort</span><span class="p">:</span><span class="w"> </span><span class="m">9000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">raft</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">env</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">GEODE_NODE_ID</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">valueFrom</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fieldRef</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fieldPath</span><span class="p">:</span><span class="w"> </span><span class="l">metadata.name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">GEODE_CLUSTER_MODE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s2">"true"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">GEODE_RAFT_PEERS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s2">"geode-0.geode:9000,geode-1.geode:9000,geode-2.geode:9000"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">envFrom</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">configMapRef</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geode-config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">secretRef</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geode-secrets</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">volumeMounts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="l">/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">certs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="l">/certs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">readOnly</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">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">requests</span><span class="p">:</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="s2">"4Gi"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">"2000m"</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">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">"8Gi"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">"4000m"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">livenessProbe</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">command</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</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">query</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"RETURN 1"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- --<span class="l">server</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="m">127.0.0.1</span><span class="p">:</span><span class="m">8443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">initialDelaySeconds</span><span class="p">:</span><span class="w"> </span><span class="m">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">periodSeconds</span><span class="p">:</span><span class="w"> </span><span class="m">10</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">readinessProbe</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">command</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</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">query</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">"RETURN 1"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- --<span class="l">server</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="m">127.0.0.1</span><span class="p">:</span><span class="m">8443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">initialDelaySeconds</span><span class="p">:</span><span class="w"> </span><span class="m">10</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">periodSeconds</span><span class="p">:</span><span class="w"> </span><span class="m">5</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="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">certs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">secret</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">secretName</span><span class="p">:</span><span class="w"> </span><span class="l">geode-tls-certs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">volumeClaimTemplates</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">accessModes</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="s2">"ReadWriteOnce"</span><span class="w"> </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">storageClassName</span><span class="p">:</span><span class="w"> </span><span class="l">fast-ssd</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">requests</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="l">100Gi</span><span class="w">
</span></span></span></code></pre></div><p><strong>Service and Ingress</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="c"># geode-service.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Service</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">clusterIP</span><span class="p">:</span><span class="w"> </span><span class="l">None</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">selector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">geode</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="nt">port</span><span class="p">:</span><span class="w"> </span><span class="m">8443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">quic</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="m">9000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">raft</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="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Service</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">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">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">LoadBalancer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">selector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">geode</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="nt">port</span><span class="p">:</span><span class="w"> </span><span class="m">8443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">targetPort</span><span class="p">:</span><span class="w"> </span><span class="m">8443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">quic</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="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># geode-ingress.yml (if using HTTP/3 ingress)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">networking.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Ingress</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geode-ingress</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nginx.ingress.kubernetes.io/backend-protocol</span><span class="p">:</span><span class="w"> </span><span class="s2">"HTTPS"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nginx.ingress.kubernetes.io/ssl-passthrough</span><span class="p">:</span><span class="w"> </span><span class="s2">"true"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ingressClassName</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l">geode.example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">http</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pathType</span><span class="p">:</span><span class="w"> </span><span class="l">Prefix</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">backend</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">service</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">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">port</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">number</span><span class="p">:</span><span class="w"> </span><span class="m">8443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tls</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">hosts</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.example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">secretName</span><span class="p">:</span><span class="w"> </span><span class="l">geode-tls-certs</span><span class="w">
</span></span></span></code></pre></div><p><strong>Secrets Management</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"># Create TLS secret</span>
</span></span><span class="line"><span class="cl">kubectl create secret tls geode-tls-certs <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --cert<span class="o">=</span>server.crt <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --key<span class="o">=</span>server.key <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --namespace<span class="o">=</span>geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Create application secrets</span>
</span></span><span class="line"><span class="cl">kubectl create secret generic geode-secrets <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --from-literal<span class="o">=</span><span class="nv">VAULT_TOKEN</span><span class="o">=</span><vault-token> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --from-literal<span class="o">=</span><span class="nv">S3_ACCESS_KEY</span><span class="o">=</span><s3-key> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --from-literal<span class="o">=</span><span class="nv">S3_SECRET_KEY</span><span class="o">=</span><s3-secret> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --namespace<span class="o">=</span>geode
</span></span></code></pre></div><p><strong>Deploy to Kubernetes</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"># Apply configurations</span>
</span></span><span class="line"><span class="cl">kubectl apply -f geode-namespace.yml
</span></span><span class="line"><span class="cl">kubectl apply -f geode-config.yml
</span></span><span class="line"><span class="cl">kubectl apply -f geode-statefulset.yml
</span></span><span class="line"><span class="cl">kubectl apply -f geode-service.yml
</span></span><span class="line"><span class="cl">kubectl apply -f geode-ingress.yml
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify deployment</span>
</span></span><span class="line"><span class="cl">kubectl get pods -n geode
</span></span><span class="line"><span class="cl">kubectl get svc -n geode
</span></span><span class="line"><span class="cl">kubectl logs -f geode-0 -n geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Scale cluster</span>
</span></span><span class="line"><span class="cl">kubectl scale statefulset geode --replicas<span class="o">=</span><span class="m">5</span> -n geode
</span></span></code></pre></div>
<h4 id="cloud-provider-specifics" class="position-relative d-flex align-items-center group">
<span>Cloud Provider Specifics</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="cloud-provider-specifics"
aria-haspopup="dialog"
aria-label="Share link: Cloud Provider Specifics">
<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>AWS Deployment</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="c"># Use EBS for storage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">storageClassName</span><span class="p">:</span><span class="w"> </span><span class="l">gp3-encrypted</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="c"># Use Application Load Balancer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">service.beta.kubernetes.io/aws-load-balancer-type</span><span class="p">:</span><span class="w"> </span><span class="s2">"nlb"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">service.beta.kubernetes.io/aws-load-balancer-backend-protocol</span><span class="p">:</span><span class="w"> </span><span class="s2">"tcp"</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="c"># Use S3 for backups</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">S3_ENDPOINT</span><span class="p">:</span><span class="w"> </span><span class="l">https://s3.us-west-2.amazonaws.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">S3_BUCKET</span><span class="p">:</span><span class="w"> </span><span class="l">geode-backups-production</span><span class="w">
</span></span></span></code></pre></div><p><strong>Google Cloud Platform</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="c"># Use Persistent Disk</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">storageClassName</span><span class="p">:</span><span class="w"> </span><span class="l">pd-ssd</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="c"># Use Cloud Load Balancer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cloud.google.com/load-balancer-type</span><span class="p">:</span><span class="w"> </span><span class="s2">"Internal"</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="c"># Use Cloud Storage for backups</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">S3_ENDPOINT</span><span class="p">:</span><span class="w"> </span><span class="l">https://storage.googleapis.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">S3_BUCKET</span><span class="p">:</span><span class="w"> </span><span class="l">geode-backups-gcp</span><span class="w">
</span></span></span></code></pre></div><p><strong>Azure Deployment</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="c"># Use Premium SSD</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">storageClassName</span><span class="p">:</span><span class="w"> </span><span class="l">managed-premium</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="c"># Use Azure Load Balancer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">service.beta.kubernetes.io/azure-load-balancer-internal</span><span class="p">:</span><span class="w"> </span><span class="s2">"true"</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="c"># Use Blob Storage for backups</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">S3_ENDPOINT</span><span class="p">:</span><span class="w"> </span><span class="l">https://geodebackups.blob.core.windows.net</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">S3_BUCKET</span><span class="p">:</span><span class="w"> </span><span class="l">geode-backups</span><span class="w">
</span></span></span></code></pre></div><p><strong>Digital Ocean</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="c"># Use DO Block Storage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">storageClassName</span><span class="p">:</span><span class="w"> </span><span class="l">do-block-storage</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="c"># Use DO Load Balancer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">service.beta.kubernetes.io/do-loadbalancer-protocol</span><span class="p">:</span><span class="w"> </span><span class="s2">"tcp"</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="c"># Use DO Spaces for backups</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">S3_ENDPOINT</span><span class="p">:</span><span class="w"> </span><span class="l">https://nyc3.digitaloceanspaces.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">S3_BUCKET</span><span class="p">:</span><span class="w"> </span><span class="l">geode-backups</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">S3_REGION</span><span class="p">:</span><span class="w"> </span><span class="l">nyc3</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="gpu-accelerated-deployment" class="position-relative d-flex align-items-center group">
<span>GPU-Accelerated 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="gpu-accelerated-deployment"
aria-haspopup="dialog"
aria-label="Share link: GPU-Accelerated 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="gpu-architecture" class="position-relative d-flex align-items-center group">
<span>GPU 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="gpu-architecture"
aria-haspopup="dialog"
aria-label="Share link: GPU 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 Container │
</span></span><span class="line"><span class="cl">│ │
</span></span><span class="line"><span class="cl">│ ┌──────────────────────────────────────┐ │
</span></span><span class="line"><span class="cl">│ │ Query Engine │ │
</span></span><span class="line"><span class="cl">│ │ ├─ Parser │ │
</span></span><span class="line"><span class="cl">│ │ ├─ Planner │ │
</span></span><span class="line"><span class="cl">│ │ └─ Executor │ │
</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">│ │ GPU Acceleration Layer │ │
</span></span><span class="line"><span class="cl">│ │ ├─ Vector Operations (HNSW) │ │
</span></span><span class="line"><span class="cl">│ │ ├─ Graph Analytics (PageRank) │ │
</span></span><span class="line"><span class="cl">│ │ └─ ML Embeddings (Node2Vec) │ │
</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">│ │ NVIDIA Runtime (CUDA/Vulkan) │ │
</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"> │ NVIDIA GPU │
</span></span><span class="line"><span class="cl"> │ (Tesla/A100/RTX) │
</span></span><span class="line"><span class="cl"> └───────────────────────┘
</span></span></code></pre></div>
<h4 id="gpu-configuration" class="position-relative d-flex align-items-center group">
<span>GPU 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="gpu-configuration"
aria-haspopup="dialog"
aria-label="Share link: GPU 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><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="c"># docker-compose.gpu.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s1">'3.9'</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-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">geode:latest-gpu</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-gpu</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">runtime</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">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">NVIDIA_VISIBLE_DEVICES=all</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">NVIDIA_DRIVER_CAPABILITIES=compute,utility</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_GPU_ENABLED=true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_GPU_DEVICE=0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">GEODE_GPU_MEMORY_FRACTION=0.8</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><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">dcgm-exporter</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">nvcr.io/nvidia/k8s/dcgm-exporter:3.1.3-3.1.4-ubuntu22.04</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">dcgm-exporter</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">runtime</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">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">NVIDIA_VISIBLE_DEVICES=all</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">"9400:9400"</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">SYS_ADMIN</span><span class="w">
</span></span></span></code></pre></div><p><strong>Kubernetes GPU Deployment</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="c"># geode-gpu-statefulset.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apps/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">StatefulSet</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geode-gpu</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replicas</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">template</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geode</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">geode:latest-gpu</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">nvidia.com/gpu</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="c"># Request 1 GPU per pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">env</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">GEODE_GPU_ENABLED</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s2">"true"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nodeSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">accelerator</span><span class="p">:</span><span class="w"> </span><span class="l">nvidia-tesla-v100 </span><span class="w"> </span><span class="c"># Target GPU nodes</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="gpu-optimization" class="position-relative d-flex align-items-center group">
<span>GPU Optimization</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-optimization"
aria-haspopup="dialog"
aria-label="Share link: GPU Optimization">
<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>Vector Search with GPU</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Enable</span><span class="w"> </span><span class="py">GPU</span><span class="w"> </span><span class="py">acceleration</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">vector</span><span class="w"> </span><span class="py">operations</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">SESSION</span><span class="w"> </span><span class="py">gpu_acceleration</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="err">;</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="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">HNSW</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">GPU</span><span class="w"> </span><span class="py">support</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_embeddings_gpu</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Person</span><span class="p">(</span><span class="py">embedding</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">HNSW</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">WITH</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">metric</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">euclidean</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ef_construction</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">200</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">m</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">16</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">gpu_enabled</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">)</span><span class="err">;</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="err">--</span><span class="w"> </span><span class="py">GPU</span><span class="err">-</span><span class="py">accelerated</span><span class="w"> </span><span class="py">vector</span><span class="w"> </span><span class="py">search</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">user</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">vector_distance</span><span class="p">(</span><span class="py">user</span><span class="err">.</span><span class="py">embedding</span><span class="p">,</span><span class="w"> </span><span class="nv">$query_embedding</span><span class="p">)</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="py">0</span><span class="mf">.5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">user</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">user</span><span class="err">.</span><span class="py">embedding</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">vector_distance</span><span class="p">(</span><span class="py">user</span><span class="err">.</span><span class="py">embedding</span><span class="p">,</span><span class="w"> </span><span class="nv">$query_embedding</span><span class="p">)</span><span class="w"> </span><span class="py">ASC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">100</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Graph Analytics with GPU</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">GPU</span><span class="err">-</span><span class="py">accelerated</span><span class="w"> </span><span class="py">PageRank</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CALL</span><span class="w"> </span><span class="py">graph</span><span class="err">.</span><span class="py">pageRank</span><span class="p">(</span><span class="nv">$graph_name</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">iterations</span><span class="p">:</span><span class="w"> </span><span class="nc">20</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">dampingFactor</span><span class="p">:</span><span class="w"> </span><span class="nc">0</span><span class="mf">.85</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">gpu_enabled</span><span class="p">:</span><span class="w"> </span><span class="nc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="w"> </span><span class="py">YIELD</span><span class="w"> </span><span class="py">nodeId</span><span class="p">,</span><span class="w"> </span><span class="py">score</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">nodeId</span><span class="p">,</span><span class="w"> </span><span class="py">score</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">score</span><span class="w"> </span><span class="py">DESC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">10</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="gpu-monitoring" class="position-relative d-flex align-items-center group">
<span>GPU Monitoring</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-monitoring"
aria-haspopup="dialog"
aria-label="Share link: GPU Monitoring">
<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>Prometheus Metrics</strong> (from DCGM exporter):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-promql" data-lang="promql"><span class="line"><span class="cl"><span class="c1"># GPU utilization</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">DCGM_FI_DEV_GPU_UTIL</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="c1"># GPU memory usage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">DCGM_FI_DEV_FB_USED</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nv">DCGM_FI_DEV_FB_FREE</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="c1"># GPU temperature</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">DCGM_FI_DEV_GPU_TEMP</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="c1"># GPU power draw</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">DCGM_FI_DEV_POWER_USAGE</span><span class="w">
</span></span></span></code></pre></div><p><strong>Grafana Dashboard</strong>:</p>
<ul>
<li>GPU utilization over time</li>
<li>Memory allocation per query</li>
<li>Temperature and throttling events</li>
<li>Power consumption trends</li>
</ul>
<h3 id="infrastructure-stack" class="position-relative d-flex align-items-center group">
<span>Infrastructure Stack</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="infrastructure-stack"
aria-haspopup="dialog"
aria-label="Share link: Infrastructure Stack">
<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="monitoring-with-prometheus--grafana" class="position-relative d-flex align-items-center group">
<span>Monitoring with Prometheus &amp; Grafana</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-with-prometheus--grafana"
aria-haspopup="dialog"
aria-label="Share link: Monitoring with Prometheus &amp; Grafana">
<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>Prometheus Configuration</strong> (<code>prometheus.yml</code>):</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">global</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">scrape_interval</span><span class="p">:</span><span class="w"> </span><span class="l">15s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">evaluation_interval</span><span class="p">:</span><span class="w"> </span><span class="l">15s</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">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><span class="line"><span class="cl"><span class="w"> </span><span class="nt">metrics_path</span><span class="p">:</span><span class="w"> </span><span class="s1">'/metrics'</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">job_name</span><span class="p">:</span><span class="w"> </span><span class="s1">'node-exporter'</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">'node-exporter:9100'</span><span class="p">]</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">job_name</span><span class="p">:</span><span class="w"> </span><span class="s1">'dcgm-exporter'</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">'dcgm-exporter:9400'</span><span class="p">]</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">alerting</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alertmanagers</span><span class="p">:</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">'alertmanager:9093'</span><span class="p">]</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">rule_files</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">'/etc/prometheus/alerts/*.yml'</span><span class="w">
</span></span></span></code></pre></div><p><strong>Alert Rules</strong> (<code>alerts/geode.yml</code>):</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">groups</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geode_alerts</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">rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">GeodeHighMemoryUsage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">geode_memory_usage_percent > 90</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"Geode high memory usage on {{ $labels.instance }}"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">"Memory usage is {{ $value }}%"</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">alert</span><span class="p">:</span><span class="w"> </span><span class="l">GeodeDown</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">up{job="geode"} == 0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">1m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">critical</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"Geode is down on {{ $labels.instance }}"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">"Geode database is not responding"</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">alert</span><span class="p">:</span><span class="w"> </span><span class="l">HighQueryLatency</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">geode_query_duration_seconds{quantile="0.99"} > 5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">10m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"High query latency detected"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">"P99 query latency is {{ $value }}s"</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">alert</span><span class="p">:</span><span class="w"> </span><span class="l">TooManyConnections</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">geode_active_connections > 900</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"Too many active connections"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">"Active connections: {{ $value }}"</span><span class="w">
</span></span></span></code></pre></div><p><strong>Grafana Dashboards</strong>:</p>
<p>Pre-configured dashboards available in <code>config/grafana/dashboards/</code>:</p>
<ol>
<li>
<p><strong>Geode Overview</strong></p>
<ul>
<li>Query throughput (queries/second)</li>
<li>Query latency (P50, P95, P99)</li>
<li>Active connections</li>
<li>Memory and CPU usage</li>
<li>Cache hit rate</li>
</ul>
</li>
<li>
<p><strong>Storage Metrics</strong></p>
<ul>
<li>Disk I/O (read/write ops)</li>
<li>WAL write throughput</li>
<li>Index size and growth</li>
<li>Page cache efficiency</li>
</ul>
</li>
<li>
<p><strong>GPU Metrics</strong> (GPU deployment only)</p>
<ul>
<li>GPU utilization per card</li>
<li>Memory allocation</li>
<li>Temperature and power</li>
<li>Kernel execution time</li>
</ul>
</li>
<li>
<p><strong>System Health</strong></p>
<ul>
<li>Node availability</li>
<li>Raft consensus state</li>
<li>Replication lag</li>
<li>Backup status</li>
</ul>
</li>
</ol>
<h4 id="logging-with-loki--promtail" class="position-relative d-flex align-items-center group">
<span>Logging with Loki &amp; Promtail</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="logging-with-loki--promtail"
aria-haspopup="dialog"
aria-label="Share link: Logging with Loki &amp; Promtail">
<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>Promtail Configuration</strong> (<code>promtail-config.yml</code>):</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">server</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">http_listen_port</span><span class="p">:</span><span class="w"> </span><span class="m">9080</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">grpc_listen_port</span><span class="p">:</span><span class="w"> </span><span class="m">0</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">positions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">filename</span><span class="p">:</span><span class="w"> </span><span class="l">/tmp/positions.yaml</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">clients</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="l">http://loki:3100/loki/api/v1/push</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">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="l">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></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">localhost</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</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</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">__path__</span><span class="p">:</span><span class="w"> </span><span class="l">/var/log/geode/*.log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pipeline_stages</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">json</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expressions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">level</span><span class="p">:</span><span class="w"> </span><span class="l">level</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">timestamp</span><span class="p">:</span><span class="w"> </span><span class="l">timestamp</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">message</span><span class="p">:</span><span class="w"> </span><span class="l">message</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">query</span><span class="p">:</span><span class="w"> </span><span class="l">query</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">level</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">timestamp</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">timestamp</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">RFC3339</span><span class="w">
</span></span></span></code></pre></div><p><strong>Loki Configuration</strong> (<code>loki-config.yml</code>):</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">auth_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</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">server</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">http_listen_port</span><span class="p">:</span><span class="w"> </span><span class="m">3100</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">ingester</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">lifecycler</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ring</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">kvstore</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">store</span><span class="p">:</span><span class="w"> </span><span class="l">inmemory</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replication_factor</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">chunk_idle_period</span><span class="p">:</span><span class="w"> </span><span class="l">15m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">chunk_retain_period</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></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">schema_config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">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">from</span><span class="p">:</span><span class="w"> </span><span class="ld">2024-01-01</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">store</span><span class="p">:</span><span class="w"> </span><span class="l">boltdb-shipper</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">object_store</span><span class="p">:</span><span class="w"> </span><span class="l">filesystem</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">schema</span><span class="p">:</span><span class="w"> </span><span class="l">v11</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">index</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">prefix</span><span class="p">:</span><span class="w"> </span><span class="l">index_</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">period</span><span class="p">:</span><span class="w"> </span><span class="l">24h</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">storage_config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">boltdb_shipper</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">active_index_directory</span><span class="p">:</span><span class="w"> </span><span class="l">/loki/index</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cache_location</span><span class="p">:</span><span class="w"> </span><span class="l">/loki/cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">shared_store</span><span class="p">:</span><span class="w"> </span><span class="l">filesystem</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">filesystem</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">directory</span><span class="p">:</span><span class="w"> </span><span class="l">/loki/chunks</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">limits_config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enforce_metric_name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reject_old_samples</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">reject_old_samples_max_age</span><span class="p">:</span><span class="w"> </span><span class="l">168h</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">chunk_store_config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_look_back_period</span><span class="p">:</span><span class="w"> </span><span class="l">0s</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">table_manager</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retention_deletes_enabled</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">retention_period</span><span class="p">:</span><span class="w"> </span><span class="l">720h </span><span class="w"> </span><span class="c"># 30 days</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="backup-with-minio" class="position-relative d-flex align-items-center group">
<span>Backup with MinIO</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="backup-with-minio"
aria-haspopup="dialog"
aria-label="Share link: Backup with MinIO">
<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>MinIO Configuration</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"># Access MinIO container</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> minio sh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Configure mc (MinIO client)</span>
</span></span><span class="line"><span class="cl">mc <span class="nb">alias</span> <span class="nb">set</span> <span class="nb">local</span> http://localhost:9000 <span class="nv">$MINIO_ROOT_USER</span> <span class="nv">$MINIO_ROOT_PASSWORD</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Create buckets</span>
</span></span><span class="line"><span class="cl">mc mb local/geode-backups
</span></span><span class="line"><span class="cl">mc mb local/geode-wal-archive
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Set retention policy (30 days)</span>
</span></span><span class="line"><span class="cl">mc retention <span class="nb">set</span> --default GOVERNANCE 30d local/geode-backups
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Enable versioning</span>
</span></span><span class="line"><span class="cl">mc version <span class="nb">enable</span> local/geode-backups
</span></span></code></pre></div><p><strong>Lifecycle Policy</strong> (automatic cleanup):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Rules"</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Expiration"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Days"</span><span class="p">:</span> <span class="mi">30</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"ID"</span><span class="p">:</span> <span class="s2">"DeleteOldBackups"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Filter"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Prefix"</span><span class="p">:</span> <span class="s2">"daily/"</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Status"</span><span class="p">:</span> <span class="s2">"Enabled"</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Expiration"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Days"</span><span class="p">:</span> <span class="mi">90</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"ID"</span><span class="p">:</span> <span class="s2">"DeleteOldWeeklyBackups"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Filter"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Prefix"</span><span class="p">:</span> <span class="s2">"weekly/"</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Status"</span><span class="p">:</span> <span class="s2">"Enabled"</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Transition"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Days"</span><span class="p">:</span> <span class="mi">7</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"StorageClass"</span><span class="p">:</span> <span class="s2">"GLACIER"</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"ID"</span><span class="p">:</span> <span class="s2">"ArchiveToGlacier"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Filter"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Prefix"</span><span class="p">:</span> <span class="s2">"daily/"</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"Status"</span><span class="p">:</span> <span class="s2">"Enabled"</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><strong>Apply lifecycle policy</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat lifecycle.json <span class="p">|</span> docker-compose <span class="nb">exec</span> -T minio sh -c <span class="s2">"mc ilm import local/geode-backups"</span>
</span></span></code></pre></div>
<h4 id="nginx-reverse-proxy" class="position-relative d-flex align-items-center group">
<span>Nginx Reverse Proxy</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="nginx-reverse-proxy"
aria-haspopup="dialog"
aria-label="Share link: Nginx Reverse Proxy">
<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>Nginx Configuration</strong> (<code>nginx.conf</code>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nginx" data-lang="nginx"><span class="line"><span class="cl"><span class="k">user</span> <span class="s">nginx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">worker_processes</span> <span class="s">auto</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">error_log</span> <span class="s">/var/log/nginx/error.log</span> <span class="s">warn</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">pid</span> <span class="s">/var/run/nginx.pid</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">events</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">worker_connections</span> <span class="mi">4096</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">use</span> <span class="s">epoll</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">multi_accept</span> <span class="no">on</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">http</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">include</span> <span class="s">/etc/nginx/mime.types</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">default_type</span> <span class="s">application/octet-stream</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">log_format</span> <span class="s">main</span> <span class="s">'</span><span class="nv">$remote_addr</span> <span class="s">-</span> <span class="nv">$remote_user</span> <span class="s">[</span><span class="nv">$time_local]</span> <span class="s">"</span><span class="nv">$request"</span> <span class="s">'</span>
</span></span><span class="line"><span class="cl"> <span class="s">'</span><span class="nv">$status</span> <span class="nv">$body_bytes_sent</span> <span class="s">"</span><span class="nv">$http_referer"</span> <span class="s">'</span>
</span></span><span class="line"><span class="cl"> <span class="s">'"</span><span class="nv">$http_user_agent"</span> <span class="s">"</span><span class="nv">$http_x_forwarded_for"'</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">access_log</span> <span class="s">/var/log/nginx/access.log</span> <span class="s">main</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">sendfile</span> <span class="no">on</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">tcp_nopush</span> <span class="no">on</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">tcp_nodelay</span> <span class="no">on</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">keepalive_timeout</span> <span class="mi">65</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">types_hash_max_size</span> <span class="mi">2048</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># SSL Configuration
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kn">ssl_protocols</span> <span class="s">TLSv1.2</span> <span class="s">TLSv1.3</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_ciphers</span> <span class="s">'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256'</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_prefer_server_ciphers</span> <span class="no">off</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_session_cache</span> <span class="s">shared:SSL:10m</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_session_timeout</span> <span class="mi">10m</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Compression
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kn">gzip</span> <span class="no">on</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">gzip_vary</span> <span class="no">on</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">gzip_proxied</span> <span class="s">any</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">gzip_comp_level</span> <span class="mi">6</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">gzip_types</span> <span class="s">text/plain</span> <span class="s">text/css</span> <span class="s">text/xml</span> <span class="s">text/javascript</span>
</span></span><span class="line"><span class="cl"> <span class="s">application/json</span> <span class="s">application/javascript</span> <span class="s">application/xml+rss</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Rate limiting
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kn">limit_req_zone</span> <span class="nv">$binary_remote_addr</span> <span class="s">zone=geode_limit:10m</span> <span class="s">rate=100r/s</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">limit_conn_zone</span> <span class="nv">$binary_remote_addr</span> <span class="s">zone=geode_conn:10m</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Include virtual hosts
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kn">include</span> <span class="s">/etc/nginx/conf.d/*.conf</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">stream</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># QUIC passthrough for Geode
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kn">upstream</span> <span class="s">geode_quic</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">server</span> <span class="n">geode</span><span class="p">:</span><span class="mi">8443</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">listen</span> <span class="mi">8443</span> <span class="s">udp</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_pass</span> <span class="s">geode_quic</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_timeout</span> <span class="s">30s</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><strong>Virtual Host Configuration</strong> (<code>conf.d/geode.conf</code>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nginx" data-lang="nginx"><span class="line"><span class="cl"><span class="c1"># Geode
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">server_name</span> <span class="s">geode.local</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_certificate</span> <span class="s">/etc/nginx/certs/server.crt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_certificate_key</span> <span class="s">/etc/nginx/certs/server.key</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_pass</span> <span class="s">https://geode:8443</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-Proto</span> <span class="nv">$scheme</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">limit_req</span> <span class="s">zone=geode_limit</span> <span class="s">burst=20</span> <span class="s">nodelay</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">limit_conn</span> <span class="s">geode_conn</span> <span class="mi">10</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Grafana
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">server_name</span> <span class="s">grafana.geode.local</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_certificate</span> <span class="s">/etc/nginx/certs/server.crt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_certificate_key</span> <span class="s">/etc/nginx/certs/server.key</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_pass</span> <span class="s">http://grafana:3000</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Prometheus
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">listen</span> <span class="mi">443</span> <span class="s">ssl</span> <span class="s">http2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">server_name</span> <span class="s">prometheus.geode.local</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_certificate</span> <span class="s">/etc/nginx/certs/server.crt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">ssl_certificate_key</span> <span class="s">/etc/nginx/certs/server.key</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_pass</span> <span class="s">http://prometheus:9090</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
<h3 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>
</h3>
<h4 id="tls-certificates" class="position-relative d-flex align-items-center group">
<span>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="tls-certificates"
aria-haspopup="dialog"
aria-label="Share link: 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><p><strong>Production Certificates</strong> (Let’s Encrypt):</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"># Install certbot</span>
</span></span><span class="line"><span class="cl">apt-get install certbot
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Obtain certificate</span>
</span></span><span class="line"><span class="cl">certbot certonly --standalone <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -d geode.example.com <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --email [email protected] <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --agree-tos
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Copy certificates</span>
</span></span><span class="line"><span class="cl">cp /etc/letsencrypt/live/geode.example.com/fullchain.pem certs/server.crt
</span></span><span class="line"><span class="cl">cp /etc/letsencrypt/live/geode.example.com/privkey.pem certs/server.key
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Set permissions</span>
</span></span><span class="line"><span class="cl">chmod <span class="m">600</span> certs/server.key
</span></span><span class="line"><span class="cl">chmod <span class="m">644</span> certs/server.crt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restart services</span>
</span></span><span class="line"><span class="cl">docker-compose restart geode nginx
</span></span></code></pre></div><p><strong>Auto-renewal</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"># Add cron job for renewal</span>
</span></span><span class="line"><span class="cl">cat <span class="s"><<EOF | sudo tee /etc/cron.d/certbot
</span></span></span><span class="line"><span class="cl"><span class="s">0 3 * * * root certbot renew --quiet --post-hook "docker-compose -f /path/to/docker-compose.yml restart geode nginx"
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span></code></pre></div>
<h4 id="firewall-configuration" class="position-relative d-flex align-items-center group">
<span>Firewall 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="firewall-configuration"
aria-haspopup="dialog"
aria-label="Share link: Firewall 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><p><strong>UFW (Ubuntu)</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"># Allow SSH</span>
</span></span><span class="line"><span class="cl">ufw allow 22/tcp
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Allow Geode QUIC</span>
</span></span><span class="line"><span class="cl">ufw allow 8443/udp
</span></span><span class="line"><span class="cl">ufw allow 8443/tcp
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Allow HTTPS (Nginx)</span>
</span></span><span class="line"><span class="cl">ufw allow 443/tcp
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Allow Raft (internal cluster only)</span>
</span></span><span class="line"><span class="cl">ufw allow from 10.0.0.0/8 to any port <span class="m">9000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Enable firewall</span>
</span></span><span class="line"><span class="cl">ufw <span class="nb">enable</span>
</span></span></code></pre></div><p><strong>iptables</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"># Allow established connections</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Allow SSH</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp --dport <span class="m">22</span> -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Allow Geode QUIC</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -p udp --dport <span class="m">8443</span> -j ACCEPT
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp --dport <span class="m">8443</span> -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Allow HTTPS</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp --dport <span class="m">443</span> -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Allow Raft (internal network only)</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport <span class="m">9000</span> -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Drop everything else</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -j DROP
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Save rules</span>
</span></span><span class="line"><span class="cl">iptables-save > /etc/iptables/rules.v4
</span></span></code></pre></div>
<h4 id="network-segmentation" class="position-relative d-flex align-items-center group">
<span>Network Segmentation</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="network-segmentation"
aria-haspopup="dialog"
aria-label="Share link: Network Segmentation">
<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>Docker Networks</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="c"># docker-compose.yml</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="nt">geode-frontend</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 class="nt">geode-backend</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 class="nt">internal</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="c"># No external access</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">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-frontend</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">geode-backend</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">vault</span><span class="p">:</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-backend </span><span class="w"> </span><span class="c"># Only internal access</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">nginx</span><span class="p">:</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-frontend </span><span class="w"> </span><span class="c"># Only frontend access</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="secrets-management" class="position-relative d-flex align-items-center group">
<span>Secrets 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="secrets-management"
aria-haspopup="dialog"
aria-label="Share link: Secrets 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><p><strong>Best Practices</strong>:</p>
<ol>
<li><strong>Never commit secrets to version control</strong></li>
<li><strong>Use Vault for production secrets</strong></li>
<li><strong>Rotate credentials regularly</strong> (90 days)</li>
<li><strong>Use strong random passwords</strong> (32+ characters)</li>
<li><strong>Enable MFA for admin access</strong></li>
<li><strong>Audit secret access</strong> (Vault audit logs)</li>
</ol>
<p><strong>Automated Rotation</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"># Rotate database encryption keys</span>
</span></span><span class="line"><span class="cl">geode admin rotate-encryption-key <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --old-key-id vault:geode/encryption/master_key <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --new-key-id vault:geode/encryption/master_key_v2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Rotate service tokens</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault token renew -increment<span class="o">=</span>720h
</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="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>Geode Won’t Start</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"># Check logs</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 certificates</span>
</span></span><span class="line"><span class="cl">ls -l certs/
</span></span><span class="line"><span class="cl">openssl x509 -in certs/server.crt -text -noout
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Test connectivity to dependencies</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> geode ping vault
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> geode nc -zv minio <span class="m">9000</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> geode nc -zv redis <span class="m">6379</span>
</span></span></code></pre></div><p><strong>High Memory Usage</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"># Check container stats</span>
</span></span><span class="line"><span class="cl">docker stats geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify memory limits</span>
</span></span><span class="line"><span class="cl">docker inspect geode <span class="p">|</span> grep -A <span class="m">10</span> Memory
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Adjust limits if needed</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Edit docker-compose.yml and restart</span>
</span></span><span class="line"><span class="cl">docker-compose up -d geode
</span></span></code></pre></div><p><strong>Vault Sealed</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"># Check Vault status</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault status
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Unseal Vault</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault operator unseal <unseal-key-1>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault operator unseal <unseal-key-2>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> vault vault operator unseal <unseal-key-3>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Enable auto-unseal (AWS KMS, GCP KMS, Azure Key Vault)</span>
</span></span></code></pre></div><p><strong>MinIO Access Denied</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 credentials in .env</span>
</span></span><span class="line"><span class="cl">cat .env <span class="p">|</span> grep S3_
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Test MinIO access</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> minio mc <span class="nb">alias</span> <span class="nb">set</span> <span class="nb">test</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> http://localhost:9000 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> <span class="nv">$MINIO_ROOT_USER</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> <span class="nv">$MINIO_ROOT_PASSWORD</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># List buckets</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> minio mc ls test/
</span></span></code></pre></div><p><strong>GPU Not Detected</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 NVIDIA runtime</span>
</span></span><span class="line"><span class="cl">docker run --rm --gpus all nvidia/cuda:12.3.0-base-ubuntu22.04 nvidia-smi
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check Docker daemon configuration</span>
</span></span><span class="line"><span class="cl">cat /etc/docker/daemon.json
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Should contain:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># {</span>
</span></span><span class="line"><span class="cl"><span class="c1"># "runtimes": {</span>
</span></span><span class="line"><span class="cl"><span class="c1"># "nvidia": {</span>
</span></span><span class="line"><span class="cl"><span class="c1"># "path": "nvidia-container-runtime",</span>
</span></span><span class="line"><span class="cl"><span class="c1"># "runtimeArgs": []</span>
</span></span><span class="line"><span class="cl"><span class="c1"># }</span>
</span></span><span class="line"><span class="cl"><span class="c1"># },</span>
</span></span><span class="line"><span class="cl"><span class="c1"># "default-runtime": "nvidia"</span>
</span></span><span class="line"><span class="cl"><span class="c1"># }</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restart Docker</span>
</span></span><span class="line"><span class="cl">sudo systemctl restart docker
</span></span></code></pre></div><p><strong>Cluster Split-Brain</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"># Check Raft status on all nodes</span>
</span></span><span class="line"><span class="cl">geode admin raft-status --node geode-node1
</span></span><span class="line"><span class="cl">geode admin raft-status --node geode-node2
</span></span><span class="line"><span class="cl">geode admin raft-status --node geode-node3
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Force leader election</span>
</span></span><span class="line"><span class="cl">geode admin raft-force-election --node geode-node1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Reset Raft state (DANGEROUS - data loss possible)</span>
</span></span><span class="line"><span class="cl">geode admin raft-reset --force
</span></span></code></pre></div>
<h4 id="performance-issues" class="position-relative d-flex align-items-center group">
<span>Performance 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="performance-issues"
aria-haspopup="dialog"
aria-label="Share link: Performance 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>Slow Queries</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"># Enable query logging</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> geode geode admin set-log-level --query-log debug
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Analyze slow queries</span>
</span></span><span class="line"><span class="cl">docker-compose logs geode <span class="p">|</span> grep <span class="s2">"slow_query"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Use EXPLAIN to analyze query plan</span>
</span></span><span class="line"><span class="cl">geode query <span class="s2">"EXPLAIN MATCH (n:Person) RETURN n"</span> --server geode:8443
</span></span></code></pre></div><p><strong>High Latency</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"># Check network latency</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> geode ping -c <span class="m">10</span> geode-node2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify QUIC performance</span>
</span></span><span class="line"><span class="cl">geode admin network-diagnostics --peer geode-node2:8443
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Monitor metrics</span>
</span></span><span class="line"><span class="cl">curl http://localhost:9090/api/v1/query?query<span class="o">=</span>geode_query_duration_seconds
</span></span></code></pre></div><p><strong>Disk I/O Bottleneck</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"># Check disk performance</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> geode iostat -x <span class="m">1</span> <span class="m">10</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Enable I/O optimizations</span>
</span></span><span class="line"><span class="cl">geode admin configure-io <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --async-io <span class="nb">true</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --io-threads <span class="m">8</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --read-ahead 128k
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Consider upgrading to faster storage (NVMe SSD)</span>
</span></span></code></pre></div>
<h4 id="health-checks" class="position-relative d-flex align-items-center group">
<span>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="health-checks"
aria-haspopup="dialog"
aria-label="Share link: 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>
</h4><p><strong>System Health</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"># Check all services</span>
</span></span><span class="line"><span class="cl">docker-compose ps
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify Geode health</span>
</span></span><span class="line"><span class="cl">curl -k https://geode.local/health
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check cluster health</span>
</span></span><span class="line"><span class="cl">geode admin cluster-health
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Example output:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Cluster: healthy</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Nodes: 3/3 online</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Shards: 3/3 balanced</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Replication: current</span>
</span></span></code></pre></div><p><strong>Database Integrity</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"># Run integrity check</span>
</span></span><span class="line"><span class="cl">geode admin check-integrity
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Vacuum database</span>
</span></span><span class="line"><span class="cl">geode admin vacuum
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Analyze statistics</span>
</span></span><span class="line"><span class="cl">geode admin analyze
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Reindex (if needed)</span>
</span></span><span class="line"><span class="cl">geode admin reindex
</span></span></code></pre></div>
<h3 id="maintenance" class="position-relative d-flex align-items-center group">
<span>Maintenance</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="maintenance"
aria-haspopup="dialog"
aria-label="Share link: Maintenance">
<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="regular-maintenance-tasks" class="position-relative d-flex align-items-center group">
<span>Regular Maintenance Tasks</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="regular-maintenance-tasks"
aria-haspopup="dialog"
aria-label="Share link: Regular Maintenance Tasks">
<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>Daily</strong>:</p>
<ul>
<li>Monitor metrics and alerts</li>
<li>Review error logs</li>
<li>Check backup completion</li>
<li>Verify cluster health</li>
</ul>
<p><strong>Weekly</strong>:</p>
<ul>
<li>Review slow query logs</li>
<li>Analyze storage growth</li>
<li>Update statistics</li>
<li>Rotate logs</li>
</ul>
<p><strong>Monthly</strong>:</p>
<ul>
<li>Vacuum database</li>
<li>Update Docker images</li>
<li>Review and update secrets</li>
<li>Test disaster recovery</li>
</ul>
<p><strong>Quarterly</strong>:</p>
<ul>
<li>Security audit</li>
<li>Performance benchmarks</li>
<li>Capacity planning review</li>
<li>Update TLS certificates (if needed)</li>
</ul>
<h4 id="update-procedure" class="position-relative d-flex align-items-center group">
<span>Update Procedure</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="update-procedure"
aria-haspopup="dialog"
aria-label="Share link: Update Procedure">
<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 latest images</span>
</span></span><span class="line"><span class="cl">docker-compose pull
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Backup current state</span>
</span></span><span class="line"><span class="cl">geode backup --dest s3://geode-backups/pre-update-<span class="k">$(</span>date +%Y%m%d<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Stop services</span>
</span></span><span class="line"><span class="cl">docker-compose stop geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Recreate containers</span>
</span></span><span class="line"><span class="cl">docker-compose up -d geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify health</span>
</span></span><span class="line"><span class="cl">docker-compose logs -f geode
</span></span><span class="line"><span class="cl">geode query <span class="s2">"RETURN 1"</span> --server geode:8443
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Clean up old images</span>
</span></span><span class="line"><span class="cl">docker image prune -a
</span></span></code></pre></div>
<h4 id="log-rotation" class="position-relative d-flex align-items-center group">
<span>Log Rotation</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="log-rotation"
aria-haspopup="dialog"
aria-label="Share link: Log Rotation">
<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>Configure logrotate</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"># /etc/logrotate.d/geode</span>
</span></span><span class="line"><span class="cl">/var/lib/docker/volumes/geode_logs/_data/*.log <span class="o">{</span>
</span></span><span class="line"><span class="cl"> daily
</span></span><span class="line"><span class="cl"> rotate <span class="m">30</span>
</span></span><span class="line"><span class="cl"> compress
</span></span><span class="line"><span class="cl"> delaycompress
</span></span><span class="line"><span class="cl"> notifempty
</span></span><span class="line"><span class="cl"> create <span class="m">0640</span> root root
</span></span><span class="line"><span class="cl"> sharedscripts
</span></span><span class="line"><span class="cl"> postrotate
</span></span><span class="line"><span class="cl"> docker-compose <span class="nb">exec</span> geode <span class="nb">kill</span> -USR1 <span class="m">1</span>
</span></span><span class="line"><span class="cl"> endscript
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div>
<h4 id="cleanup" class="position-relative d-flex align-items-center group">
<span>Cleanup</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="cleanup"
aria-haspopup="dialog"
aria-label="Share link: Cleanup">
<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"># Remove old backups (30+ days)</span>
</span></span><span class="line"><span class="cl">docker-compose <span class="nb">exec</span> minio mc find local/geode-backups --older-than 30d --exec <span class="s2">"mc rm {}"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Clean up old Docker volumes</span>
</span></span><span class="line"><span class="cl">docker volume prune
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Clean up old logs</span>
</span></span><span class="line"><span class="cl">find /var/log/geode -name <span class="s2">"*.log"</span> -mtime +30 -delete
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Clean WAL archives (after backup)</span>
</span></span><span class="line"><span class="cl">geode admin clean-wal-archive --before <span class="k">$(</span>date -d <span class="s2">"7 days ago"</span> +%Y%m%d<span class="k">)</span>
</span></span></code></pre></div>
<h3 id="production-checklist" class="position-relative d-flex align-items-center group">
<span>Production Checklist</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-checklist"
aria-haspopup="dialog"
aria-label="Share link: Production Checklist">
<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>Before going to production, verify:</p>
<ul>
<li>
<p><input disabled="" type="checkbox"> <strong>Security</strong></p>
<ul>
<li><input disabled="" type="checkbox"> Production TLS certificates installed</li>
<li><input disabled="" type="checkbox"> All default passwords changed</li>
<li><input disabled="" type="checkbox"> Firewall rules configured</li>
<li><input disabled="" type="checkbox"> Vault initialized and unsealed</li>
<li><input disabled="" type="checkbox"> Secrets rotation policy in place</li>
<li><input disabled="" type="checkbox"> Audit logging enabled</li>
<li><input disabled="" type="checkbox"> Network encryption between services</li>
</ul>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>High Availability</strong></p>
<ul>
<li><input disabled="" type="checkbox"> Minimum 3 nodes for distributed deployment</li>
<li><input disabled="" type="checkbox"> Raft consensus configured</li>
<li><input disabled="" type="checkbox"> Load balancer with health checks</li>
<li><input disabled="" type="checkbox"> Automatic failover tested</li>
<li><input disabled="" type="checkbox"> Replication lag monitoring</li>
</ul>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>Backup & Recovery</strong></p>
<ul>
<li><input disabled="" type="checkbox"> Automated backups scheduled</li>
<li><input disabled="" type="checkbox"> Backup retention policy configured</li>
<li><input disabled="" type="checkbox"> Restore procedure tested</li>
<li><input disabled="" type="checkbox"> Disaster recovery plan documented</li>
<li><input disabled="" type="checkbox"> Off-site backup storage</li>
</ul>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>Monitoring</strong></p>
<ul>
<li><input disabled="" type="checkbox"> Prometheus scraping Geode metrics</li>
<li><input disabled="" type="checkbox"> Grafana dashboards configured</li>
<li><input disabled="" type="checkbox"> Alerting rules defined</li>
<li><input disabled="" type="checkbox"> On-call rotation established</li>
<li><input disabled="" type="checkbox"> Runbook for common issues</li>
</ul>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>Performance</strong></p>
<ul>
<li><input disabled="" type="checkbox"> Load testing completed</li>
<li><input disabled="" type="checkbox"> Resource limits configured</li>
<li><input disabled="" type="checkbox"> Query optimization reviewed</li>
<li><input disabled="" type="checkbox"> Index strategy validated</li>
<li><input disabled="" type="checkbox"> Scaling plan defined</li>
</ul>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>Operations</strong></p>
<ul>
<li><input disabled="" type="checkbox"> Maintenance windows scheduled</li>
<li><input disabled="" type="checkbox"> Update procedure documented</li>
<li><input disabled="" type="checkbox"> Team trained on operations</li>
<li><input disabled="" type="checkbox"> Support escalation path defined</li>
<li><input disabled="" type="checkbox"> SLA/SLO targets documented</li>
</ul>
</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><p>After successful deployment:</p>
<ol>
<li><strong>Configure Monitoring</strong> - Set up dashboards and alerts in Grafana</li>
<li><strong>Test Backups</strong> - Verify backup and restore procedures</li>
<li><strong>Optimize Queries</strong> - Use EXPLAIN and PROFILE to tune performance</li>
<li><strong>Review Security</strong> - Conduct security audit and penetration testing</li>
<li><strong>Document Operations</strong> - Create runbooks for common operational tasks</li>
<li><strong>Train Team</strong> - Ensure operations team is familiar with Geode deployment</li>
</ol>
<p><strong>Related Documentation</strong>:</p>
<ul>
<li><a
href="/docs/tutorials/index-optimization"
>Performance Tuning Guide</a>
- Query optimization with EXPLAIN</li>
<li><a
href="/docs/security/overview/"
>Security Configuration</a>
- Advanced security features</li>
<li><a
href="/docs/ops/observability/"
>Monitoring Setup</a>
- Metrics and alerting</li>
<li><a
href="/docs/guides/backup-automation/"
>Backup Strategies</a>
- Backup and recovery procedures</li>
<li><a
href="/docs/client-libraries/client-comparison"
>Client Libraries</a>
- Client configuration for production</li>
</ul>
<hr>
<p><em>Last Updated: January 2026</em>
<em>Geode Version: <strong>0.2.18</strong>+</em>
<em>Status: Production Ready</em></p>
Deployment Patterns
Production deployment strategies for Geode including single-node, distributed, and cloud deployment patterns with Docker Compose, Kubernetes, and infrastructure stack integration