---
title: Netgrimoire
description: 
published: true
date: 2026-02-25T21:48:26.231Z
tags: 
editor: markdown
dateCreated: 2026-01-21T13:19:48.685Z
---

<!-- ============================================================
     NETGRIMOIRE — Library Landing Page Hero Block
     Inject via Wiki.js page using HTML block / raw HTML
     Paste this into a page as a "Code Block (HTML)" 
     ============================================================ -->

<div id="ng-hero" style="
  position: relative;
  width: 100%;
  min-height: 220px;
  background: linear-gradient(135deg, #060a0d 0%, #0a0f14 50%, #060a0d 100%);
  border: 1px solid rgba(0, 229, 204, 0.2);
  border-radius: 10px;
  overflow: hidden;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 0 2em 0;
  box-shadow: 0 0 40px rgba(0, 0, 0, 0.6), inset 0 0 60px rgba(0, 229, 204, 0.03);
">
  <canvas id="ng-canvas" style="position:absolute;top:0;left:0;width:100%;height:100%;"></canvas>
  <div style="position:relative;z-index:2;text-align:center;padding:2em;">
    <div style="
      font-family:'Cinzel',serif;
      font-size:2rem;
      font-weight:700;
      color:#00e5cc;
      text-shadow:0 0 20px rgba(0,229,204,0.5),0 0 40px rgba(0,229,204,0.2);
      letter-spacing:0.12em;
      margin-bottom:0.4em;
    ">DOCUMENT LIBRARY</div>
    <div style="
      font-family:'Share Tech Mono',monospace;
      font-size:0.8rem;
      color:rgba(0,229,204,0.5);
      letter-spacing:0.25em;
      text-transform:uppercase;
    ">Netgrimoire Knowledge Vault</div>
  </div>
</div>

<script>
(function() {
  var canvas = document.getElementById('ng-canvas');
  var hero   = document.getElementById('ng-hero');
  if (!canvas) return;

  var ctx = canvas.getContext('2d');
  var W, H, nodes = [], edges = [];
  var NODE_COUNT = 55;
  var TEAL = 'rgba(0,229,204,';

  function resize() {
    W = canvas.width  = hero.offsetWidth;
    H = canvas.height = hero.offsetHeight;
  }

  function initNodes() {
    nodes = [];
    for (var i = 0; i < NODE_COUNT; i++) {
      nodes.push({
        x:   Math.random() * W,
        y:   Math.random() * H,
        vx:  (Math.random() - 0.5) * 0.3,
        vy:  (Math.random() - 0.5) * 0.3,
        r:   Math.random() * 1.8 + 0.6,
        pulse: Math.random() * Math.PI * 2
      });
    }
  }

  function draw() {
    ctx.clearRect(0, 0, W, H);

    var now = Date.now() / 1000;

    // Draw edges
    for (var i = 0; i < nodes.length; i++) {
      for (var j = i + 1; j < nodes.length; j++) {
        var dx = nodes[i].x - nodes[j].x;
        var dy = nodes[i].y - nodes[j].y;
        var dist = Math.sqrt(dx*dx + dy*dy);
        if (dist < 110) {
          var alpha = (1 - dist / 110) * 0.25;
          ctx.beginPath();
          ctx.moveTo(nodes[i].x, nodes[i].y);
          ctx.lineTo(nodes[j].x, nodes[j].y);
          ctx.strokeStyle = TEAL + alpha + ')';
          ctx.lineWidth = 0.5;
          ctx.stroke();
        }
      }
    }

    // Draw nodes
    for (var i = 0; i < nodes.length; i++) {
      var n = nodes[i];
      var flicker = 0.5 + 0.5 * Math.sin(now * 1.5 + n.pulse);
      var alpha = 0.4 + 0.5 * flicker;
      var glow = 0.08 + 0.12 * flicker;

      // Glow halo
      var grad = ctx.createRadialGradient(n.x, n.y, 0, n.x, n.y, n.r * 6);
      grad.addColorStop(0, TEAL + glow + ')');
      grad.addColorStop(1, TEAL + '0)');
      ctx.beginPath();
      ctx.arc(n.x, n.y, n.r * 6, 0, Math.PI * 2);
      ctx.fillStyle = grad;
      ctx.fill();

      // Core dot
      ctx.beginPath();
      ctx.arc(n.x, n.y, n.r, 0, Math.PI * 2);
      ctx.fillStyle = TEAL + alpha + ')';
      ctx.fill();

      // Move
      n.x += n.vx;
      n.y += n.vy;
      if (n.x < 0 || n.x > W) n.vx *= -1;
      if (n.y < 0 || n.y > H) n.vy *= -1;
    }

    requestAnimationFrame(draw);
  }

  resize();
  initNodes();
  draw();

  window.addEventListener('resize', function() {
    resize();
    initNodes();
  });
})();
</script>



# NETGRIMOIRE
## Homelab Grimoire

> *Runbooks, topology, services, and “why it’s like that” — all in one place.*

---

## 🔮 Quick Navigation

| Section | Purpose |
|-------|---------|
| 📜 **[Runbooks](/Runbooks/00-Index)** | Break-glass procedures, recovery, standards |
| 🧰 **[Services](/Services)** | Docker stacks, configs, CI/CD notes |
| 🖧 **[Infrastructure / Hosts](/Infrastructure/Hosts)** | Nodes, labels, hardware, rebuilds |
| 🌐 **[Network](/Network)** | VLANs, trunks, STP, switch configs |
| 💾 **[Storage](/Storage)** | ZFS, NFS, SMB, migrations |
| 🗺 **[Diagrams](/Diagrams/DrawIO)** | Draw.io topology and flow diagrams |


---

## ⚙️ Operations Console

- **Monitoring:**  
  [Infrastructure/Monitoring](/Infrastructure/Monitoring)  
  *Uptime Kuma, alerting, service health*

- **Backups:**  
  [Infrastructure/Backups](/Infrastructure/Backups)  
  *ZFS snapshots, restore procedures*

- **Identity / Access:**  
  [Runbooks/Identity-LDAP](/Runbooks/Identity-LDAP)  
  *LLDAP, SSSD, SSH access*

- **Storage Core:**  
  [Storage/ZFS](/Storage/ZFS)  
  *vault datasets, exports, permissions*
  
- **Pocket Grimoire:**
  [Overview](/Pocket/Pocket)
  [Hardware](/Pocket/Hardware), [Software](/Pocket/Software)

---

## 🧪 Most-Used Runbooks

### 🚑 Core Recovery
- [SSH access & S]()
