<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Deevnet Infrastructure Platform</title><link>https://deevnet.github.io/deevnet-docs/</link><description>Recent content on Deevnet Infrastructure Platform</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deevnet.github.io/deevnet-docs/index.xml" rel="self" type="application/rss+xml"/><item><title>Builder</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/builder/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/builder/</guid><description>&lt;h1 id="builder">
 Builder
 &lt;a class="anchor" href="#builder">#&lt;/a>
&lt;/h1>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>The &lt;strong>builder&lt;/strong> is responsible for provisioning and configuring all substrate infrastructure.&lt;/p>
&lt;p>Every Deevnet Infrastructure Platform site needs a way to be created from scratch:&lt;/p>
&lt;blockquote>
&lt;p>&lt;em>How do you provision infrastructure when no infrastructure exists yet?&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;p>The builder answers this by providing:&lt;/p>
&lt;ul>
&lt;li>A self-contained provisioning role&lt;/li>
&lt;li>All artifacts needed for deployment&lt;/li>
&lt;li>Automation to configure every substrate component&lt;/li>
&lt;li>Authority transition from bootstrap to production&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="design-principles">
 Design Principles
 &lt;a class="anchor" href="#design-principles">#&lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Self-Contained&lt;/strong> — The builder carries everything needed to stand up a substrate: IaC/CaC definitions, OS images, network boot infrastructure, and Git repositories.&lt;/p></description></item><item><title>Builder &amp; Core Services</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvnt/builder/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvnt/builder/</guid><description>&lt;h1 id="builder--core-services">
 Builder &amp;amp; Core Services
 &lt;a class="anchor" href="#builder--core-services">#&lt;/a>
&lt;/h1>
&lt;p>Builder infrastructure, network automation, and core services required to provision and rebuild the dvnt (home) site from bare metal.&lt;/p>
&lt;p>The dvnt site is a permanent, always-on installation using the AOOSTAR N1 PRO as a dedicated provisioning node. It uses the same automation as dvntm with site-specific inventory (10.10.x.0/24 addressing).&lt;/p>

&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Achieve fully automated, repeatable provisioning of the dvnt (home) site from bare metal to running core services, reusing the automation built for dvntm with dvnt-specific inventory.&lt;/p></description></item><item><title>Builder &amp; Core Services</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvntm/builder/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvntm/builder/</guid><description>&lt;h1 id="builder--core-services-">
 Builder &amp;amp; Core Services ✅
 &lt;a class="anchor" href="#builder--core-services-">#&lt;/a>
&lt;/h1>
&lt;p>Builder infrastructure, network automation, and core services required to provision and rebuild the dvntm (mobile) site from bare metal.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>GitHub:&lt;/strong> &lt;a href="https://github.com/deevnet">https://github.com/deevnet&lt;/a>&lt;/li>
&lt;li>&lt;strong>Documentation:&lt;/strong> &lt;a href="https://deevnet.github.io/deevnet-docs/">https://deevnet.github.io/deevnet-docs/&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="progress-container">
 &lt;div class="progress-bar">&lt;div class="progress-segment-completed" style="width: 100%;" title="30 completed">&lt;/div>&lt;/div>
 &lt;div class="progress-legend">
 &lt;span class="progress-legend-completed">&amp;#x2713; 30&lt;/span> |
 &lt;span class="progress-legend-in-progress">&amp;#x21bb; 0&lt;/span> |
 &lt;span class="progress-legend-planned">&amp;#x23f3; 0&lt;/span>
 (30 total)
 &lt;/div>
&lt;/div>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Achieve fully automated, repeatable provisioning of the dvntm (mobile) site from bare metal to running core services, with complete air-gap recovery capability.&lt;/p></description></item><item><title>CaribouLite SDR</title><link>https://deevnet.github.io/deevnet-docs/docs/platforms/tenant-compute/pi-production/cariboulite-sdr/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/platforms/tenant-compute/pi-production/cariboulite-sdr/</guid><description>&lt;h1 id="cariboulite-sdr">
 CaribouLite SDR
 &lt;a class="anchor" href="#cariboulite-sdr">#&lt;/a>
&lt;/h1>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>Software-defined radio (SDR) receiver for RF signal monitoring and experimentation. The CaribouLite HAT provides dual-channel SDR capability directly on the Pi&amp;rsquo;s GPIO header.&lt;/p>
&lt;hr>
&lt;h2 id="hardware">
 Hardware
 &lt;a class="anchor" href="#hardware">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Component&lt;/th>
 &lt;th>Specification&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Compute&lt;/strong>&lt;/td>
 &lt;td>Raspberry Pi 4 Model B, 8GB&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>SDR HAT&lt;/strong>&lt;/td>
 &lt;td>CaribouLite SDR&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Storage&lt;/strong>&lt;/td>
 &lt;td>32GB SD card (minimum)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Antenna&lt;/strong>&lt;/td>
 &lt;td>SMA connector, antenna per use case&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="cariboulite-specifications">
 CaribouLite Specifications
 &lt;a class="anchor" href="#cariboulite-specifications">#&lt;/a>
&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Attribute&lt;/th>
 &lt;th>Value&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Frequency range&lt;/strong>&lt;/td>
 &lt;td>30 MHz – 6 GHz (with gaps)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Channels&lt;/strong>&lt;/td>
 &lt;td>2 (S1000: sub-1GHz, HiF: 30MHz-6GHz)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>ADC&lt;/strong>&lt;/td>
 &lt;td>13-bit&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Bandwidth&lt;/strong>&lt;/td>
 &lt;td>Up to 2.5 MHz per channel&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Interface&lt;/strong>&lt;/td>
 &lt;td>GPIO header (directly mounted)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="network-position">
 Network Position
 &lt;a class="anchor" href="#network-position">#&lt;/a>
&lt;/h2>


&lt;script src="https://deevnet.github.io/deevnet-docs/deevnet-docs/mermaid.min.js">&lt;/script>

 &lt;script>mermaid.initialize({
 "flowchart": {
 "useMaxWidth":true
 },
 "theme": "default"
}
)&lt;/script>




&lt;pre class="mermaid">
graph LR
 A[Core Router] &lt;--> B[Access Switch&lt;br>IoT VLAN] &lt;--> C[CaribouLite SDR&lt;br>Pi4 + SDR HAT]
&lt;/pre>

&lt;p>Deployed on the IoT VLAN for isolation from management traffic.&lt;/p></description></item><item><title>Correctness</title><link>https://deevnet.github.io/deevnet-docs/docs/standards/correctness/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/standards/correctness/</guid><description>&lt;h1 id="deevnet-infrastructure-correctness">
 Deevnet Infrastructure Correctness
 &lt;a class="anchor" href="#deevnet-infrastructure-correctness">#&lt;/a>
&lt;/h1>
&lt;h3 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h3>
&lt;p>This document defines what it means for &lt;strong>Deevnet infrastructure to be correct&lt;/strong>.&lt;/p>
&lt;p>Correctness is not defined by whether something “works once,” but whether it:&lt;/p>
&lt;ul>
&lt;li>is deterministic,&lt;/li>
&lt;li>is reproducible,&lt;/li>
&lt;li>respects separation of concerns,&lt;/li>
&lt;li>and remains understandable months later.&lt;/li>
&lt;/ul>
&lt;p>This document captures the &lt;strong>intent, principles, and invariants&lt;/strong> of Deevnet infrastructure design.&lt;/p>
&lt;hr>
&lt;h2 id="1-foundational-principles">
 1. Foundational Principles
 &lt;a class="anchor" href="#1-foundational-principles">#&lt;/a>
&lt;/h2>
&lt;h3 id="11-determinism-over-convenience">
 1.1 Determinism Over Convenience
 &lt;a class="anchor" href="#11-determinism-over-convenience">#&lt;/a>
&lt;/h3>
&lt;p>Infrastructure behavior MUST be deterministic.&lt;/p></description></item><item><title>Embedded Hardware</title><link>https://deevnet.github.io/deevnet-docs/docs/standards/project-workflows/embedded-hardware/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/standards/project-workflows/embedded-hardware/</guid><description>&lt;h1 id="embedded-hardware-workflow">
 Embedded Hardware Workflow
 &lt;a class="anchor" href="#embedded-hardware-workflow">#&lt;/a>
&lt;/h1>
&lt;p>Template for hardware projects involving microcontrollers, custom PCBs, firmware, and physical enclosures. Follows the EVT/DVT/PVT hardware development lifecycle.&lt;/p>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Define what the project aims to achieve and establish boundaries.&lt;/p>
&lt;p>&lt;strong>In Scope&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Core functionality and features&lt;/li>
&lt;li>Target hardware platform&lt;/li>
&lt;li>Key interfaces and protocols&lt;/li>
&lt;li>Physical form factor requirements&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Out of Scope&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Features explicitly excluded&lt;/li>
&lt;li>Integration points deferred to future phases&lt;/li>
&lt;li>Capabilities beyond project goals&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="milestone-requirements--constraints-">
 Milestone: Requirements &amp;amp; Constraints ⏳
 &lt;a class="anchor" href="#milestone-requirements--constraints-">#&lt;/a>
&lt;/h2>
&lt;p>Define what success means before building.&lt;/p></description></item><item><title>Networking</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/networking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/networking/</guid><description>&lt;h1 id="substrate-networking-services">
 Substrate Networking Services
 &lt;a class="anchor" href="#substrate-networking-services">#&lt;/a>
&lt;/h1>
&lt;p>The substrate networking layer provides foundational network services for each site. The core router serves as the segment router, firewall, and service gateway for all segments within a substrate.&lt;/p>
&lt;p>For the segment model (nine segment types, trust hierarchy, and routing policy), see &lt;a href="https://deevnet.github.io/deevnet-docs/docs/architecture/network-segmentation/">Network Segmentation&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="core-router-role">
 Core Router Role
 &lt;a class="anchor" href="#core-router-role">#&lt;/a>
&lt;/h2>
&lt;p>Each substrate has a single core router that provides all networking services:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Function&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Segment routing&lt;/td>
 &lt;td>Inter-segment routing via VLAN interfaces&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Firewall&lt;/td>
 &lt;td>Zone-based policy enforcement per segment&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DNS&lt;/td>
 &lt;td>Authoritative for substrate zone, forwarding for external&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>DHCP&lt;/td>
 &lt;td>Static mappings for known hosts, dynamic pools per segment&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>NAT&lt;/td>
 &lt;td>Outbound gateway for all segments&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Switching integration&lt;/td>
 &lt;td>VLAN trunking to access switch&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Wireless integration&lt;/td>
 &lt;td>SSID-to-VLAN mapping via wireless AP&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="vlan-routing">
 VLAN Routing
 &lt;a class="anchor" href="#vlan-routing">#&lt;/a>
&lt;/h2>
&lt;p>The core router maintains one interface per segment, each on its own VLAN:&lt;/p></description></item><item><title>Networking</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/tenant/networking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/tenant/networking/</guid><description>&lt;h1 id="tenant-networking">
 Tenant Networking
 &lt;a class="anchor" href="#tenant-networking">#&lt;/a>
&lt;/h1>
&lt;p>Defines the network isolation model for tenant workloads.&lt;/p>
&lt;hr>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>Tenant networking provides:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Isolation&lt;/strong> — Tenants cannot see each other&amp;rsquo;s traffic&lt;/li>
&lt;li>&lt;strong>Controlled access&lt;/strong> — Explicit rules for shared services&lt;/li>
&lt;li>&lt;strong>Scalability&lt;/strong> — New tenants get dedicated network segments&lt;/li>
&lt;li>&lt;strong>Security boundaries&lt;/strong> — Limit blast radius of compromised workloads&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="vlan-isolation-model">
 VLAN Isolation Model
 &lt;a class="anchor" href="#vlan-isolation-model">#&lt;/a>
&lt;/h2>
&lt;p>Each tenant receives a dedicated VLAN:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Tenant&lt;/th>
 &lt;th>VLAN ID&lt;/th>
 &lt;th>Subnet&lt;/th>
 &lt;th>Purpose&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>grooveiq&lt;/code>&lt;/td>
 &lt;td>100&lt;/td>
 &lt;td>10.100.0.0/24&lt;/td>
 &lt;td>IoT backend services&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>vintronics&lt;/code>&lt;/td>
 &lt;td>101&lt;/td>
 &lt;td>10.101.0.0/24&lt;/td>
 &lt;td>Electronics projects&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>moneyrouter&lt;/code>&lt;/td>
 &lt;td>102&lt;/td>
 &lt;td>10.102.0.0/24&lt;/td>
 &lt;td>Financial tracking&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>VLAN IDs and subnets are assigned from a reserved range to avoid conflicts
with substrate segments (Management, Trusted, Storage, IoT, Guest).&lt;/p></description></item><item><title>Prerequisites &amp; Preflight</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/prerequisites/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/prerequisites/</guid><description>&lt;h1 id="prerequisites--preflight">
 Prerequisites &amp;amp; Preflight
 &lt;a class="anchor" href="#prerequisites--preflight">#&lt;/a>
&lt;/h1>
&lt;h2 id="vault">
 Vault
 &lt;a class="anchor" href="#vault">#&lt;/a>
&lt;/h2>
&lt;p>All secrets are encrypted with Ansible Vault in the inventory. Decrypt before starting the migration and re-encrypt when done:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ansible-inventory-deevnet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make unvault &lt;span style="color:#75715e"># decrypt — run once before starting&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># ... run migration steps ...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make vault &lt;span style="color:#75715e"># re-encrypt when migration is complete&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="migration-artifact-capture">
 Migration Artifact Capture
 &lt;a class="anchor" href="#migration-artifact-capture">#&lt;/a>
&lt;/h2>
&lt;p>Migration logs (preflight, each migration step, postcheck) are automatically captured in &lt;code>ansible-collection-deevnet.net/migration-logs/&lt;/code> with timestamps. Each &lt;code>make&lt;/code> target produces a log file named &lt;code>YYYYMMDD-HHMMSS-&amp;lt;target&amp;gt;.log&lt;/code>. No additional setup is required.&lt;/p></description></item><item><title>Stage Artifacts</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/online-preparation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/online-preparation/</guid><description>&lt;h1 id="stage-artifacts">
 Stage Artifacts
 &lt;a class="anchor" href="#stage-artifacts">#&lt;/a>
&lt;/h1>
&lt;p>The builder node (with internet access) stages artifacts to the artifact server before any recovery is needed.&lt;/p>
&lt;hr>
&lt;h2 id="what-gets-staged">
 What Gets Staged
 &lt;a class="anchor" href="#what-gets-staged">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Artifact&lt;/th>
 &lt;th>Source&lt;/th>
 &lt;th>Role/Task&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Fedora install tree&lt;/td>
 &lt;td>rsync from Fedora mirrors&lt;/td>
 &lt;td>&lt;code>artifacts&lt;/code> role&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Fedora Server ISO&lt;/td>
 &lt;td>download.fedoraproject.org&lt;/td>
 &lt;td>&lt;code>artifacts&lt;/code> role&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Proxmox VE ISO&lt;/td>
 &lt;td>enterprise.proxmox.com&lt;/td>
 &lt;td>&lt;code>artifacts&lt;/code> role&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>SSH public keys&lt;/td>
 &lt;td>Generated locally&lt;/td>
 &lt;td>&lt;code>artifacts&lt;/code> role&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Container images&lt;/td>
 &lt;td>docker.io, etc.&lt;/td>
 &lt;td>&lt;code>artifacts&lt;/code> role&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="commands">
 Commands
 &lt;a class="anchor" href="#commands">#&lt;/a>
&lt;/h2>
&lt;p>From builder node with internet:&lt;/p></description></item><item><title>Workstation Role</title><link>https://deevnet.github.io/deevnet-docs/docs/platforms/management-plane/bootstrap-node/workstation-role/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/platforms/management-plane/bootstrap-node/workstation-role/</guid><description>&lt;h1 id="workstation-role">
 Workstation Role
 &lt;a class="anchor" href="#workstation-role">#&lt;/a>
&lt;/h1>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>The &lt;code>workstation&lt;/code> role configures a host as a &lt;strong>developer/admin workstation&lt;/strong> with users, development tools, and infrastructure automation tooling.&lt;/p>
&lt;hr>
&lt;h2 id="capabilities">
 Capabilities
 &lt;a class="anchor" href="#capabilities">#&lt;/a>
&lt;/h2>
&lt;h3 id="user-management">
 User Management
 &lt;a class="anchor" href="#user-management">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>Creates dev users with configurable primary/extra groups&lt;/li>
&lt;li>Fetches SSH public keys from GitHub&lt;/li>
&lt;li>Sets up home directories and shell preferences&lt;/li>
&lt;/ul>
&lt;h3 id="development-tools">
 Development Tools
 &lt;a class="anchor" href="#development-tools">#&lt;/a>
&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Category&lt;/th>
 &lt;th>Packages&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Core&lt;/strong>&lt;/td>
 &lt;td>git, vim, tmux, golang&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>ISO/Image&lt;/strong>&lt;/td>
 &lt;td>Tools for working with disk images&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>X11&lt;/strong>&lt;/td>
 &lt;td>Display support for GUI tools&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="hashicorp-tools">
 HashiCorp Tools
 &lt;a class="anchor" href="#hashicorp-tools">#&lt;/a>
&lt;/h3>
&lt;p>Configures the HashiCorp RPM repository and installs:&lt;/p></description></item><item><title>Artifacts Role</title><link>https://deevnet.github.io/deevnet-docs/docs/platforms/management-plane/bootstrap-node/artifacts-role/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/platforms/management-plane/bootstrap-node/artifacts-role/</guid><description>&lt;h1 id="artifacts-role">
 Artifacts Role
 &lt;a class="anchor" href="#artifacts-role">#&lt;/a>
&lt;/h1>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>The artifacts server enables &lt;strong>air-gapped provisioning&lt;/strong> for substrate hosts. Target machines fetch all installation artifacts from the local server—no internet connectivity required during provisioning.&lt;/p>
&lt;p>Goals:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Air-gap capability&lt;/strong> — Substrate hosts install without upstream dependencies&lt;/li>
&lt;li>&lt;strong>Single source of truth&lt;/strong> — All provisioning artifacts in one location&lt;/li>
&lt;li>&lt;strong>Reproducibility&lt;/strong> — Known artifacts yield known outcomes&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="current-capabilities">
 Current Capabilities
 &lt;a class="anchor" href="#current-capabilities">#&lt;/a>
&lt;/h2>
&lt;p>The artifacts server provides:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Artifact Type&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Kickstart files&lt;/strong>&lt;/td>
 &lt;td>OS installation automation scripts&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>PXE boot artifacts&lt;/strong>&lt;/td>
 &lt;td>Kernel, initrd, boot configuration&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Custom scripts&lt;/strong>&lt;/td>
 &lt;td>Post-install automation payloads&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>OS images&lt;/strong>&lt;/td>
 &lt;td>ISO images or extracted install trees&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Artifacts are served via HTTP at &lt;code>artifacts.&amp;lt;site&amp;gt;.deevnet.net&lt;/code>.&lt;/p></description></item><item><title>Authority Transition</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/authority-transition/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/authority-transition/</guid><description>&lt;h1 id="authority-transition-runbook">
 Authority Transition Runbook
 &lt;a class="anchor" href="#authority-transition-runbook">#&lt;/a>
&lt;/h1>
&lt;p>Procedures for transitioning DNS/DHCP authority between the builder and production network infrastructure.&lt;/p>
&lt;p>For the architectural model, see &lt;a href="https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/management-plane/core-services/">Core Services Architecture&lt;/a>.&lt;/p>
&lt;blockquote class="book-hint info">
 
**Build context:** During a greenfield build, these transitions happen as part of the [Building Infrastructure](/docs/runbook/building-recovery/) sequence — [Configure PXE](/docs/runbook/building-recovery/build-sequence/) enters bootstrap-authoritative mode, and [Build Network](/docs/runbook/building-recovery/build-network/) transitions to core-authoritative mode. This page is the standalone reference for both directions.

&lt;/blockquote>

&lt;hr>
&lt;h2 id="overview">
 Overview
 &lt;a class="anchor" href="#overview">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Transition&lt;/th>
 &lt;th>From&lt;/th>
 &lt;th>To&lt;/th>
 &lt;th>When&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Promote to production&lt;/strong>&lt;/td>
 &lt;td>Builder-authoritative&lt;/td>
 &lt;td>Router-authoritative&lt;/td>
 &lt;td>After network infrastructure is configured and validated&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Revert to bootstrap&lt;/strong>&lt;/td>
 &lt;td>Router-authoritative&lt;/td>
 &lt;td>Builder-authoritative&lt;/td>
 &lt;td>Before substrate rebuild or recovery&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Both transitions are automated via playbooks in &lt;code>deevnet.builder&lt;/code> and &lt;code>deevnet.net&lt;/code>. The IP swap is the final step in each playbook and drops the SSH connection — reconnect at the new IP to verify.&lt;/p></description></item><item><title>Compute</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/compute/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/compute/</guid><description>&lt;h1 id="substrate-compute">
 Substrate Compute
 &lt;a class="anchor" href="#substrate-compute">#&lt;/a>
&lt;/h1>
&lt;p>Defines the virtualization and compute model for Deevnet sites.&lt;/p>
&lt;hr>
&lt;h2 id="overview">
 Overview
 &lt;a class="anchor" href="#overview">#&lt;/a>
&lt;/h2>
&lt;p>Compute infrastructure provides virtualization hosts for management-plane and tenant workloads. Hypervisors run within the substrate and host:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Extended services&lt;/strong> — Observability, automation, and access tooling VMs&lt;/li>
&lt;li>&lt;strong>Tenant application VMs&lt;/strong> — Workloads deployed by tenants&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="compute-hosts">
 Compute Hosts
 &lt;a class="anchor" href="#compute-hosts">#&lt;/a>
&lt;/h2>
&lt;p>Each site includes one or more hypervisors that provide the virtualization layer. Compute hosts are provisioned through the builder and managed via the management plane.&lt;/p></description></item><item><title>Core Services</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/management-plane/core-services/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/management-plane/core-services/</guid><description>&lt;h1 id="core-services-architecture">
 Core Services Architecture
 &lt;a class="anchor" href="#core-services-architecture">#&lt;/a>
&lt;/h1>
&lt;h3 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h3>
&lt;p>This document defines the &lt;strong>foundational platform services&lt;/strong> of the management plane—DNS, DHCP, NAT, routing, firewall, and the naming/authority model that underpins all substrate operations.&lt;/p>
&lt;p>These services must remain operational even if all extended services are lost.&lt;/p>
&lt;p>For the builder that provisions these services, see &lt;a href="https://deevnet.github.io/deevnet-docs/docs/architecture/builder/">Builder&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="1-core-services">
 1. Core Services
 &lt;a class="anchor" href="#1-core-services">#&lt;/a>
&lt;/h2>
&lt;p>The Core Services provides foundational management services:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Service&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>DNS&lt;/strong>&lt;/td>
 &lt;td>Authoritative for substrate zones, forwarding for external&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>DHCP&lt;/strong>&lt;/td>
 &lt;td>Static mappings for known hosts, dynamic pools&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>NAT&lt;/strong>&lt;/td>
 &lt;td>Outbound gateway for all segments&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Routing&lt;/strong>&lt;/td>
 &lt;td>Inter-segment and gateway routing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Firewall&lt;/strong>&lt;/td>
 &lt;td>Inter-segment and egress rules&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>In production, these services are provided by dedicated network infrastructure. The &lt;a href="https://deevnet.github.io/deevnet-docs/docs/architecture/builder/">Builder&lt;/a> complements with provisioning, artifact hosting, and PXE/TFTP services.&lt;/p></description></item><item><title>Management</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/tenant/management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/tenant/management/</guid><description>&lt;h1 id="tenant-management">
 Tenant Management
 &lt;a class="anchor" href="#tenant-management">#&lt;/a>
&lt;/h1>
&lt;p>Defines the lifecycle and operational model for tenant workloads.&lt;/p>
&lt;hr>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>Tenant management provides:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Lifecycle control&lt;/strong> — Create, update, and destroy tenant environments&lt;/li>
&lt;li>&lt;strong>Observability&lt;/strong> — Logs, metrics, and alerting scoped to tenants&lt;/li>
&lt;li>&lt;strong>Access control&lt;/strong> — Who can manage which tenants&lt;/li>
&lt;li>&lt;strong>Operational clarity&lt;/strong> — Clear boundaries between tenants&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="tenant-lifecycle">
 Tenant Lifecycle
 &lt;a class="anchor" href="#tenant-lifecycle">#&lt;/a>
&lt;/h2>
&lt;h3 id="create">
 Create
 &lt;a class="anchor" href="#create">#&lt;/a>
&lt;/h3>
&lt;p>Creating a new tenant involves:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Reserve VLAN and subnet&lt;/strong> — Allocate from tenant IP range&lt;/li>
&lt;li>&lt;strong>Configure network infrastructure&lt;/strong> — Add VLAN interface, DHCP scope, firewall zone&lt;/li>
&lt;li>&lt;strong>Provision tenant&lt;/strong> — Deploy VMs and DNS records via Terraform&lt;/li>
&lt;li>&lt;strong>Configure observability&lt;/strong> — Set up log/metric collection for tenant&lt;/li>
&lt;/ol>
&lt;h3 id="update">
 Update
 &lt;a class="anchor" href="#update">#&lt;/a>
&lt;/h3>
&lt;p>Updating a tenant may include:&lt;/p></description></item><item><title>Naming</title><link>https://deevnet.github.io/deevnet-docs/docs/standards/naming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/standards/naming/</guid><description>&lt;h1 id="deevnet-naming-standard">
 Deevnet Naming Standard
 &lt;a class="anchor" href="#deevnet-naming-standard">#&lt;/a>
&lt;/h1>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>This document defines the canonical naming conventions for the Deevnet ecosystem. The goal is to ensure that names are:&lt;/p>
&lt;ul>
&lt;li>Deterministic (predictable, repeatable)&lt;/li>
&lt;li>Scalable (works as the lab grows)&lt;/li>
&lt;li>Readable (humans can understand intent quickly)&lt;/li>
&lt;li>Environment-safe (dvnt vs dvntm is always explicit)&lt;/li>
&lt;li>Service-oriented (service names are stable even if hosts move)&lt;/li>
&lt;/ul>
&lt;p>This naming standard applies to:&lt;/p>
&lt;ul>
&lt;li>DNS zones and hostnames&lt;/li>
&lt;li>Service endpoints (artifacts, PXE, DNS, etc.)&lt;/li>
&lt;li>Tenants (logical workload namespaces)&lt;/li>
&lt;li>Inventory naming (host identifiers)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="1-definitions">
 1. Definitions
 &lt;a class="anchor" href="#1-definitions">#&lt;/a>
&lt;/h2>
&lt;h3 id="site">
 Site
 &lt;a class="anchor" href="#site">#&lt;/a>
&lt;/h3>
&lt;p>A site is a self-contained infrastructure boundary that hosts systems and workloads.&lt;/p></description></item><item><title>Patch Automation</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvnt/patch-automation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvnt/patch-automation/</guid><description>&lt;h1 id="patch-automation">
 Patch Automation
 &lt;a class="anchor" href="#patch-automation">#&lt;/a>
&lt;/h1>
&lt;p>Firmware upgrades and automation improvements for the dvnt (home) site infrastructure.&lt;/p>

&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p></description></item><item><title>Patch Automation</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvntm/patch-automation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvntm/patch-automation/</guid><description>&lt;h1 id="patch-automation">
 Patch Automation
 &lt;a class="anchor" href="#patch-automation">#&lt;/a>
&lt;/h1>
&lt;p>Automated patching strategies, firmware upgrades, and automation improvements for substrate infrastructure components.&lt;/p>
&lt;div class="progress-container">
 &lt;div class="progress-bar">&lt;div class="progress-segment-planned" style="width: 100%;" title="16 planned">&lt;/div>&lt;/div>
 &lt;div class="progress-legend">
 &lt;span class="progress-legend-completed">&amp;#x2713; 0&lt;/span> |
 &lt;span class="progress-legend-in-progress">&amp;#x21bb; 0&lt;/span> |
 &lt;span class="progress-legend-planned">&amp;#x23f3; 16&lt;/span>
 (16 total)
 &lt;/div>
&lt;/div>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Define and implement consistent patching strategies across all substrate components to maintain security posture while minimizing downtime. Includes firmware upgrades and automation improvements identified during the network build.&lt;/p>
&lt;p>&lt;strong>In Scope&lt;/strong>&lt;/p></description></item><item><title>Patching</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/patching/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/patching/</guid><description>&lt;h1 id="patching">
 Patching
 &lt;a class="anchor" href="#patching">#&lt;/a>
&lt;/h1>
&lt;p>Day 2 maintenance and security updates for substrate hosts.&lt;/p>
&lt;hr>
&lt;h2 id="status-planned">
 Status: Planned
 &lt;a class="anchor" href="#status-planned">#&lt;/a>
&lt;/h2>
&lt;p>This section will document:&lt;/p>
&lt;ul>
&lt;li>Online patching (hosts with internet access)&lt;/li>
&lt;li>Offline patching (air-gapped site)&lt;/li>
&lt;li>Local dnf mirror setup for full air-gap&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="decision-required">
 Decision Required
 &lt;a class="anchor" href="#decision-required">#&lt;/a>
&lt;/h2>
&lt;p>Post-install updates currently require internet access. Options:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Option&lt;/th>
 &lt;th>Pros&lt;/th>
 &lt;th>Cons&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Accept internet required&lt;/td>
 &lt;td>Simple, no extra storage&lt;/td>
 &lt;td>Not true air-gap&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Full local dnf mirror&lt;/td>
 &lt;td>True air-gap&lt;/td>
 &lt;td>~200GB per Fedora release&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Hybrid (security only)&lt;/td>
 &lt;td>Balanced&lt;/td>
 &lt;td>Complex to maintain&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="current-state">
 Current State
 &lt;a class="anchor" href="#current-state">#&lt;/a>
&lt;/h2>
&lt;p>Install-time packages come from ISO/cdrom (air-gap ready).&lt;/p></description></item><item><title>SDR Platform</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/raspberry-pi/sdr/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/raspberry-pi/sdr/</guid><description>&lt;h1 id="pi-sdr-project">
 Pi-SDR Project
 &lt;a class="anchor" href="#pi-sdr-project">#&lt;/a>
&lt;/h1>
&lt;p>Hardware adoption of the CaribouLite SDR HAT — software-defined radio on Raspberry Pi.&lt;/p>
&lt;p>Part of &lt;code>deevnet-image-factory&lt;/code>.&lt;/p>
&lt;div class="progress-container">
 &lt;div class="progress-bar">&lt;div class="progress-segment-completed" style="width: 77.77777777777779%;" title="7 completed">&lt;/div>&lt;div class="progress-segment-in-progress" style="width: 11.11111111111111%;" title="1 in progress">&lt;/div>&lt;div class="progress-segment-planned" style="width: 11.11111111111111%;" title="1 planned">&lt;/div>&lt;/div>
 &lt;div class="progress-legend">
 &lt;span class="progress-legend-completed">&amp;#x2713; 7&lt;/span> |
 &lt;span class="progress-legend-in-progress">&amp;#x21bb; 1&lt;/span> |
 &lt;span class="progress-legend-planned">&amp;#x23f3; 1&lt;/span>
 (9 total)
 &lt;/div>
&lt;/div>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Adopt the CaribouLite SDR HAT hardware and deploy a software-defined radio platform on Raspberry Pi for RF signal monitoring and experimentation.&lt;/p></description></item><item><title>Secure Identity</title><link>https://deevnet.github.io/deevnet-docs/docs/standards/secure-identity/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/standards/secure-identity/</guid><description>&lt;h1 id="deevnet-secure-identity-standard">
 Deevnet Secure Identity Standard
 &lt;a class="anchor" href="#deevnet-secure-identity-standard">#&lt;/a>
&lt;/h1>
&lt;h3 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h3>
&lt;p>This document defines what it means for &lt;strong>Deevnet client access to be secure&lt;/strong>.&lt;/p>
&lt;p>Secure identity is not defined by whether you can “SSH in,” but whether access:&lt;/p>
&lt;ul>
&lt;li>minimizes secret exposure,&lt;/li>
&lt;li>is reproducible across devices and OSes,&lt;/li>
&lt;li>supports least privilege and revocation,&lt;/li>
&lt;li>and avoids habits that don’t scale beyond a lab.&lt;/li>
&lt;/ul>
&lt;p>This document captures the &lt;strong>intent, principles, and invariants&lt;/strong> of secure client identity and access in Deevnet.&lt;/p></description></item><item><title>Seed Inventory</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/inventory-setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/inventory-setup/</guid><description>&lt;h1 id="seed-inventory">
 Seed Inventory
 &lt;a class="anchor" href="#seed-inventory">#&lt;/a>
&lt;/h1>
&lt;p>Before any host can be PXE booted, its definition must exist in the Ansible inventory. MAC addresses, IP assignments, DNS records, and DHCP reservations are all driven from host_vars.&lt;/p>
&lt;p>&lt;strong>Repository:&lt;/strong> &lt;code>ansible-inventory-deevnet&lt;/code>&lt;/p>
&lt;hr>
&lt;h2 id="when-this-is-required">
 When This Is Required
 &lt;a class="anchor" href="#when-this-is-required">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Scenario&lt;/th>
 &lt;th>Action&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Capacity expansion&lt;/td>
 &lt;td>Add host to &lt;code>hosts.yml&lt;/code>, create new &lt;code>host_vars/&amp;lt;hostname&amp;gt;.yml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Hardware replacement&lt;/td>
 &lt;td>Update MAC address in existing &lt;code>host_vars/&amp;lt;hostname&amp;gt;.yml&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Greenfield build&lt;/td>
 &lt;td>All hosts need both steps&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="inventory-structure">
 Inventory Structure
 &lt;a class="anchor" href="#inventory-structure">#&lt;/a>
&lt;/h2>
&lt;pre tabindex="0">&lt;code>ansible-inventory-deevnet/
└── dvntm/
 ├── hosts.yml # Main inventory (hosts and group memberships)
 ├── group_vars/ # Variables by group
 └── host_vars/ # Per-host variables (MAC, IP, DNS, DHCP)
 ├── hv01.yml
 ├── hv02.yml
 └── ...
&lt;/code>&lt;/pre>&lt;hr>
&lt;h2 id="adding-a-new-host-expansion">
 Adding a New Host (Expansion)
 &lt;a class="anchor" href="#adding-a-new-host-expansion">#&lt;/a>
&lt;/h2>
&lt;h3 id="1-add-to-hostsyml">
 1. Add to hosts.yml
 &lt;a class="anchor" href="#1-add-to-hostsyml">#&lt;/a>
&lt;/h3>
&lt;p>Add the hostname to appropriate groups:&lt;/p></description></item><item><title>Site IaC</title><link>https://deevnet.github.io/deevnet-docs/docs/standards/project-workflows/site-iac/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/standards/project-workflows/site-iac/</guid><description>&lt;h1 id="site-iac-workflow">
 Site IaC Workflow
 &lt;a class="anchor" href="#site-iac-workflow">#&lt;/a>
&lt;/h1>
&lt;p>Template for full infrastructure site builds involving bare-metal provisioning, network automation, and end-to-end rebuild validation. Use this for complex, multi-layer infrastructure projects.&lt;/p>
&lt;p>For simpler automation projects, see &lt;a href="../iac-cac/">IaC/CaC&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Define the infrastructure domain and automation goals.&lt;/p>
&lt;p>&lt;strong>In Scope&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Target infrastructure components&lt;/li>
&lt;li>Automation tooling&lt;/li>
&lt;li>Provisioning and configuration scope&lt;/li>
&lt;li>Operational boundaries&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Out of Scope&lt;/strong>&lt;/p></description></item><item><title>VLAN Foundation</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/vlan-foundation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/vlan-foundation/</guid><description>&lt;h1 id="vlan-foundation">
 VLAN Foundation
 &lt;a class="anchor" href="#vlan-foundation">#&lt;/a>
&lt;/h1>
&lt;p>Create the VLAN infrastructure on the router and switch. All steps in this phase are non-disruptive — no existing traffic is affected.&lt;/p>
&lt;hr>
&lt;h2 id="step-2-opnsense-vlan-interfaces">
 Step 2: OPNsense VLAN Interfaces
 &lt;a class="anchor" href="#step-2-opnsense-vlan-interfaces">#&lt;/a>
&lt;/h2>
&lt;p>Create VLAN sub-interfaces on OPNsense. This step is non-disruptive — it only adds new interfaces without affecting existing traffic.&lt;/p>
&lt;p>&lt;strong>Run:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ansible-collection-deevnet.net
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make migration-opnsense-vlans
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Verify:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>OPNsense GUI -&amp;gt; Interfaces -&amp;gt; Devices -&amp;gt; VLAN&lt;/li>
&lt;li>Confirm 11 VLANs created on the correct parent interface&lt;/li>
&lt;li>Each VLAN shows the correct tag (10, 20, 25, 30, 31, 35, 40, 50, 51, 52, 99)&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Rollback:&lt;/strong>
Delete VLAN interfaces via OPNsense GUI -&amp;gt; Interfaces -&amp;gt; Devices -&amp;gt; VLAN -&amp;gt; delete each entry.&lt;/p></description></item><item><title>Application Development</title><link>https://deevnet.github.io/deevnet-docs/docs/standards/project-workflows/application-development/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/standards/project-workflows/application-development/</guid><description>&lt;h1 id="application-development-workflow">
 Application Development Workflow
 &lt;a class="anchor" href="#application-development-workflow">#&lt;/a>
&lt;/h1>
&lt;p>Template for software projects including services, tools, libraries, and applications. Covers the common phases of software development lifecycle.&lt;/p>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Define what the application aims to achieve and establish boundaries.&lt;/p>
&lt;p>&lt;strong>In Scope&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Core functionality and features&lt;/li>
&lt;li>Target platforms and environments&lt;/li>
&lt;li>Key integrations and dependencies&lt;/li>
&lt;li>User personas and use cases&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Out of Scope&lt;/strong>&lt;/p></description></item><item><title>Authority Transition Gap Analysis</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/authority-transition-gap-analysis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/authority-transition-gap-analysis/</guid><description>&lt;h1 id="authority-transition-gap-analysis">
 Authority Transition Gap Analysis
 &lt;a class="anchor" href="#authority-transition-gap-analysis">#&lt;/a>
&lt;/h1>
&lt;p>Analysis of gaps between the &lt;a href="https://deevnet.github.io/deevnet-docs/docs/runbook/authority-transition/">authority transition runbook&lt;/a> and the actual state of automation, performed 2026-03-26 against the segmented 10-space (10.20.x.x with per-VLAN subnets).&lt;/p>
&lt;p>&lt;strong>Scope:&lt;/strong> &lt;code>bootstrap-authoritative.yml&lt;/code>, &lt;code>core-authoritative.yml&lt;/code>, the &lt;code>bootstrap&lt;/code> role, inventory group_vars, dnsmasq templates, and the OPNsense DNS/DHCP roles in &lt;code>deevnet.net&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="critical-gaps">
 Critical Gaps
 &lt;a class="anchor" href="#critical-gaps">#&lt;/a>
&lt;/h2>
&lt;h3 id="gap-1-bootstrap-authoritativeyml-doesnt-enable-dhcp">
 GAP 1: &lt;code>bootstrap-authoritative.yml&lt;/code> doesn&amp;rsquo;t enable DHCP
 &lt;a class="anchor" href="#gap-1-bootstrap-authoritativeyml-doesnt-enable-dhcp">#&lt;/a>
&lt;/h3>
&lt;p>&lt;strong>Runbook says:&lt;/strong> &lt;code>make bootstrap-auth&lt;/code> enables DNS/DHCP/gateway on the builder.&lt;/p>
&lt;p>&lt;strong>Reality:&lt;/strong> The playbook calls &lt;code>include_role: bootstrap&lt;/code> without overriding &lt;code>bootstrap_tftp_backend&lt;/code> or &lt;code>bootstrap_dnsmasq_dhcp_enabled&lt;/code>. Inventory has both set to their production values (&lt;code>tftpd&lt;/code> / &lt;code>false&lt;/code>), so running the playbook installs standalone tftpd with DHCP off.&lt;/p></description></item><item><title>Builder Cutover</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/builder-cutover/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/builder-cutover/</guid><description>&lt;h1 id="builder-cutover-to-management-vlan">
 Builder Cutover to Management VLAN
 &lt;a class="anchor" href="#builder-cutover-to-management-vlan">#&lt;/a>
&lt;/h1>
&lt;p>Move the builder (&lt;code>provisioner-ph01&lt;/code>) from the flat network to VLAN 99 with a static IP. This eliminates the DHCP dependency — the builder&amp;rsquo;s eth0 is configured with a static address before its port moves to the new VLAN. After this step, the builder has routed access to all VLANs for the rest of the migration.&lt;/p>
&lt;p>&lt;strong>Prerequisites:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="../vlan-foundation/#step-4-trunk-uplink-tagged-vlans">Step 4&lt;/a> complete (trunk uplink carrying tagged VLANs)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="5a--assign-and-configure-opnsense-vlan-interfaces">
 5a — Assign and configure OPNsense VLAN interfaces
 &lt;a class="anchor" href="#5a--assign-and-configure-opnsense-vlan-interfaces">#&lt;/a>
&lt;/h2>
&lt;p>Assign all VLAN devices to OPNsense interface slots and configure gateway IPs. The OPNsense API does not support interface assignment (&lt;a href="https://github.com/opnsense/core/issues/7324">GitHub #7324&lt;/a>), so the playbook will pause and prompt you to complete a manual GUI step before continuing with automated IP configuration.&lt;/p></description></item><item><title>Building</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/tenant/building/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/tenant/building/</guid><description>&lt;h1 id="tenant-building">
 Tenant Building
 &lt;a class="anchor" href="#tenant-building">#&lt;/a>
&lt;/h1>
&lt;p>Defines the provisioning model for tenant workloads.&lt;/p>
&lt;hr>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>Tenant building provides:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Declarative infrastructure&lt;/strong> — Define tenant environments as code&lt;/li>
&lt;li>&lt;strong>Reproducibility&lt;/strong> — Recreate tenant environments reliably&lt;/li>
&lt;li>&lt;strong>Drift detection&lt;/strong> — Identify manual changes&lt;/li>
&lt;li>&lt;strong>Lifecycle automation&lt;/strong> — Create, update, destroy via automation&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="terraform-first-approach">
 Terraform-First Approach
 &lt;a class="anchor" href="#terraform-first-approach">#&lt;/a>
&lt;/h2>
&lt;p>Unlike substrate infrastructure (automation-first), tenant workloads use &lt;strong>Terraform&lt;/strong>:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Aspect&lt;/th>
 &lt;th>Substrate (Automation)&lt;/th>
 &lt;th>Tenant (Terraform)&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Change frequency&lt;/strong>&lt;/td>
 &lt;td>Rare, deliberate&lt;/td>
 &lt;td>Frequent, agile&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>State model&lt;/strong>&lt;/td>
 &lt;td>Procedural, idempotent&lt;/td>
 &lt;td>Declarative, stateful&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Drift detection&lt;/strong>&lt;/td>
 &lt;td>Manual verification&lt;/td>
 &lt;td>Built-in plan/apply&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Lifecycle&lt;/strong>&lt;/td>
 &lt;td>Configure existing&lt;/td>
 &lt;td>Create/destroy&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Use case&lt;/strong>&lt;/td>
 &lt;td>Infrastructure config&lt;/td>
 &lt;td>VM provisioning&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="why-terraform-for-tenants">
 Why Terraform for Tenants?
 &lt;a class="anchor" href="#why-terraform-for-tenants">#&lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Declarative definitions&lt;/strong> — Define what should exist, not how to create it&lt;/li>
&lt;li>&lt;strong>State tracking&lt;/strong> — Know exactly what&amp;rsquo;s deployed&lt;/li>
&lt;li>&lt;strong>Plan before apply&lt;/strong> — Preview changes before execution&lt;/li>
&lt;li>&lt;strong>Destroy support&lt;/strong> — Clean up tenant resources completely&lt;/li>
&lt;li>&lt;strong>Proxmox provider&lt;/strong> — Native Terraform support for VM lifecycle&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="tenant-provisioning-workflow">
 Tenant Provisioning Workflow
 &lt;a class="anchor" href="#tenant-provisioning-workflow">#&lt;/a>
&lt;/h2>
&lt;h3 id="1-define-tenant-infrastructure">
 1. Define Tenant Infrastructure
 &lt;a class="anchor" href="#1-define-tenant-infrastructure">#&lt;/a>
&lt;/h3>
&lt;p>Create Terraform configuration for tenant VMs:&lt;/p></description></item><item><title>Core Services</title><link>https://deevnet.github.io/deevnet-docs/docs/platforms/management-plane/core-services/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/platforms/management-plane/core-services/</guid><description>&lt;h1 id="core-services-implementation">
 Core Services Implementation
 &lt;a class="anchor" href="#core-services-implementation">#&lt;/a>
&lt;/h1>
&lt;p>How each site implements the DNS authority model defined in &lt;a href="https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/management-plane/core-services/">Core Services Architecture&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2 id="dvntm-mobile-lab">
 dvntm (Mobile Lab)
 &lt;a class="anchor" href="#dvntm-mobile-lab">#&lt;/a>
&lt;/h2>
&lt;h3 id="production-mode">
 Production Mode
 &lt;a class="anchor" href="#production-mode">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>OPNsense Core Router is DNS/DHCP authority&lt;/li>
&lt;li>Provisioner&amp;rsquo;s dnsmasq is disabled&lt;/li>
&lt;li>Provisioner uses reserved IP at low end of management subnet (e.g., &lt;code>192.168.10.95&lt;/code>)&lt;/li>
&lt;/ul>
&lt;p>DNS records held in Core Router:&lt;/p>
&lt;pre tabindex="0">&lt;code>provisioner-01.mgmt.deevnet.net A 192.168.10.95
artifacts.mgmt.deevnet.net CNAME provisioner-01.mgmt.deevnet.net
pxe.mgmt.deevnet.net CNAME provisioner-01.mgmt.deevnet.net
tftp.mgmt.deevnet.net CNAME provisioner-01.mgmt.deevnet.net
&lt;/code>&lt;/pre>&lt;h3 id="bootstrap-mode">
 Bootstrap Mode
 &lt;a class="anchor" href="#bootstrap-mode">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>Provisioner&amp;rsquo;s dnsmasq is DNS/DHCP/gateway authority&lt;/li>
&lt;li>Provisioner uses gateway IP (e.g., &lt;code>192.168.10.1&lt;/code>)&lt;/li>
&lt;li>Core Router may not exist&lt;/li>
&lt;/ul>
&lt;p>DNS records held in provisioner dnsmasq:&lt;/p></description></item><item><title>Extended Management Plane</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvnt/management-plane/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvnt/management-plane/</guid><description>&lt;h1 id="extended-management-plane">
 Extended Management Plane
 &lt;a class="anchor" href="#extended-management-plane">#&lt;/a>
&lt;/h1>
&lt;p>Extended management services for the dvnt (home) site — logging, telemetry, alerting, secrets, and identity.&lt;/p>

&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p></description></item><item><title>Extended Management Plane</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvntm/management-plane/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvntm/management-plane/</guid><description>&lt;h1 id="extended-management-plane">
 Extended Management Plane
 &lt;a class="anchor" href="#extended-management-plane">#&lt;/a>
&lt;/h1>
&lt;p>Extended management services for the dvntm (mobile) site — logging, telemetry, alerting, secrets, and identity. Builds on the core substrate once it is operational.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>GitHub:&lt;/strong> &lt;a href="https://github.com/deevnet/ansible-collection-deevnet.mgmt">https://github.com/deevnet/ansible-collection-deevnet.mgmt&lt;/a>&lt;/li>
&lt;li>&lt;strong>Documentation:&lt;/strong> &lt;a href="https://deevnet.github.io/deevnet-docs/">https://deevnet.github.io/deevnet-docs/&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="progress-container">
 &lt;div class="progress-bar">&lt;div class="progress-segment-planned" style="width: 100%;" title="33 planned">&lt;/div>&lt;/div>
 &lt;div class="progress-legend">
 &lt;span class="progress-legend-completed">&amp;#x2713; 0&lt;/span> |
 &lt;span class="progress-legend-in-progress">&amp;#x21bb; 0&lt;/span> |
 &lt;span class="progress-legend-planned">&amp;#x23f3; 33&lt;/span>
 (33 total)
 &lt;/div>
&lt;/div>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Deploy a unified management plane providing observability, security, and identity services for all substrate components, running as tenants on the Proxmox hypervisor.&lt;/p></description></item><item><title>Extended Services</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/management-plane/extended-services/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/management-plane/extended-services/</guid><description>&lt;h1 id="extended-services-architecture">
 Extended Services Architecture
 &lt;a class="anchor" href="#extended-services-architecture">#&lt;/a>
&lt;/h1>
&lt;h3 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h3>
&lt;p>This document defines the &lt;strong>extended management services&lt;/strong> layer within the Deevnet management plane.&lt;/p>
&lt;p>Extended management services provide observability, automation, and access tooling. They are &lt;strong>additive&lt;/strong> to &lt;a href="../core-services/">Core Services&lt;/a>—the minimal set of services required for the substrate to function on its own.&lt;/p>
&lt;p>These services may be rebuilt entirely from the builder and core services. If the extended services tier is lost, core provisioning and network services remain operational.&lt;/p></description></item><item><title>IaC/CaC</title><link>https://deevnet.github.io/deevnet-docs/docs/standards/project-workflows/iac-cac/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/standards/project-workflows/iac-cac/</guid><description>&lt;h1 id="iaccac-workflow">
 IaC/CaC Workflow
 &lt;a class="anchor" href="#iaccac-workflow">#&lt;/a>
&lt;/h1>
&lt;p>Template for Infrastructure as Code and Configuration as Code projects that automate a single system, appliance, or service. Use this for focused automation projects that don&amp;rsquo;t require full site orchestration.&lt;/p>
&lt;p>For complex multi-layer infrastructure, see &lt;a href="../site-iac/">Site IaC&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Define the automation target and goals.&lt;/p>
&lt;p>&lt;strong>In Scope&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Target system or service&lt;/li>
&lt;li>Automation tooling&lt;/li>
&lt;li>Configuration scope&lt;/li>
&lt;li>Deployment target&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Out of Scope&lt;/strong>&lt;/p></description></item><item><title>Identity vs Intent</title><link>https://deevnet.github.io/deevnet-docs/docs/standards/identity-vs-intent/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/standards/identity-vs-intent/</guid><description>&lt;h1 id="identity-vs-intent-in-deevnet">
 Identity vs Intent in Deevnet
 &lt;a class="anchor" href="#identity-vs-intent-in-deevnet">#&lt;/a>
&lt;/h1>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>This document explains how &lt;strong>identity&lt;/strong> and &lt;strong>intent&lt;/strong> are deliberately separated in the Deevnet infrastructure model.&lt;/p>
&lt;p>The goal of this separation is to ensure that:&lt;/p>
&lt;ul>
&lt;li>Hosts can change purpose without renaming&lt;/li>
&lt;li>Workloads can move without rewriting inventory&lt;/li>
&lt;li>Configuration intent can be preserved, detached, and reused&lt;/li>
&lt;li>Infrastructure history is not lost when systems are repurposed&lt;/li>
&lt;li>Inventory remains truthful over time&lt;/li>
&lt;/ul>
&lt;p>This document complements the &lt;a href="../naming/">Naming Standard&lt;/a> and focuses specifically on how inventory and configuration are modeled in Deevnet.&lt;/p></description></item><item><title>Network Segmentation</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/network-segmentation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/network-segmentation/</guid><description>&lt;h1 id="network-segmentation">
 Network Segmentation
 &lt;a class="anchor" href="#network-segmentation">#&lt;/a>
&lt;/h1>
&lt;p>Defines the network segmentation model for Deevnet sites.&lt;/p>
&lt;hr>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>Network segmentation divides each substrate into isolated broadcast domains with controlled routing between them. This provides:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Security boundaries&lt;/strong> — Limit blast radius when devices are compromised&lt;/li>
&lt;li>&lt;strong>Traffic isolation&lt;/strong> — Separate management, storage, and workload traffic&lt;/li>
&lt;li>&lt;strong>Operational clarity&lt;/strong> — Each segment has a defined purpose and trust level&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="segment-model">
 Segment Model
 &lt;a class="anchor" href="#segment-model">#&lt;/a>
&lt;/h2>
&lt;p>Each substrate implements nine segment types:&lt;/p></description></item><item><title>PiDP-11</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/raspberry-pi/pidp11/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/raspberry-pi/pidp11/</guid><description>&lt;h1 id="pidp-11-project">
 PiDP-11 Project
 &lt;a class="anchor" href="#pidp-11-project">#&lt;/a>
&lt;/h1>
&lt;p>Hardware adoption of the PiDP-11 kit — a PDP-11 replica using simh emulation on Raspberry Pi.&lt;/p>
&lt;p>Part of &lt;code>deevnet-image-factory&lt;/code>.&lt;/p>
&lt;div class="progress-container">
 &lt;div class="progress-bar">&lt;div class="progress-segment-completed" style="width: 10%;" title="1 completed">&lt;/div>&lt;div class="progress-segment-in-progress" style="width: 10%;" title="1 in progress">&lt;/div>&lt;div class="progress-segment-planned" style="width: 80%;" title="8 planned">&lt;/div>&lt;/div>
 &lt;div class="progress-legend">
 &lt;span class="progress-legend-completed">&amp;#x2713; 1&lt;/span> |
 &lt;span class="progress-legend-in-progress">&amp;#x21bb; 1&lt;/span> |
 &lt;span class="progress-legend-planned">&amp;#x23f3; 8&lt;/span>
 (10 total)
 &lt;/div>
&lt;/div>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Build a functional PDP-11 replica by assembling the PiDP-11 kit and running simh emulation, capable of running period-accurate operating systems with an authentic front panel experience.&lt;/p></description></item><item><title>PXE Role</title><link>https://deevnet.github.io/deevnet-docs/docs/platforms/management-plane/bootstrap-node/pxe-role/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/platforms/management-plane/bootstrap-node/pxe-role/</guid><description>&lt;h1 id="pxe-role">
 PXE Role
 &lt;a class="anchor" href="#pxe-role">#&lt;/a>
&lt;/h1>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>The PXE boot infrastructure enables &lt;strong>fully automated, zero-touch provisioning&lt;/strong> of bare-metal hosts. Hosts boot from the network, receive their OS installation automatically based on their MAC address, and require no human intervention.&lt;/p>
&lt;p>Goals:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Zero-touch&lt;/strong> — MAC-specific configs eliminate boot menus and manual selection&lt;/li>
&lt;li>&lt;strong>UEFI-native&lt;/strong> — Modern UEFI boot with network-enabled GRUB&lt;/li>
&lt;li>&lt;strong>Decoupled services&lt;/strong> — DHCP (Core Router) and TFTP (bootstrap node) are separate&lt;/li>
&lt;li>&lt;strong>Air-gap capable&lt;/strong> — All boot artifacts served from local infrastructure&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="use-cases">
 Use Cases
 &lt;a class="anchor" href="#use-cases">#&lt;/a>
&lt;/h2>
&lt;h3 id="primary-bare-metal-provisioning">
 Primary: Bare-Metal Provisioning
 &lt;a class="anchor" href="#primary-bare-metal-provisioning">#&lt;/a>
&lt;/h3>
&lt;p>PXE boot is the standard method for provisioning bare-metal hosts:&lt;/p></description></item><item><title>Storage</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/storage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/storage/</guid><description>&lt;h1 id="substrate-storage">
 Substrate Storage
 &lt;a class="anchor" href="#substrate-storage">#&lt;/a>
&lt;/h1>
&lt;p>Defines the shared and persistent storage model for Deevnet sites.&lt;/p>
&lt;hr>
&lt;h2 id="status">
 Status
 &lt;a class="anchor" href="#status">#&lt;/a>
&lt;/h2>
&lt;p>Storage is a &lt;strong>planned future addition&lt;/strong> to core services. This document will be expanded as the storage architecture is defined.&lt;/p>
&lt;hr>
&lt;h2 id="intent">
 Intent
 &lt;a class="anchor" href="#intent">#&lt;/a>
&lt;/h2>
&lt;p>Shared storage will provide persistent volumes for substrate consumers — both management-plane services and tenant workloads — independent of any single compute host.&lt;/p></description></item><item><title>Stratum 1 NTP</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/raspberry-pi/stratum1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/raspberry-pi/stratum1/</guid><description>&lt;h1 id="pi-stratum-1-ntp-server">
 Pi Stratum 1 NTP Server
 &lt;a class="anchor" href="#pi-stratum-1-ntp-server">#&lt;/a>
&lt;/h1>
&lt;p>Raspberry Pi Zero-based Stratum 1 NTP server with GPS time source.&lt;/p>
&lt;p>Part of &lt;code>deevnet-image-factory&lt;/code>.&lt;/p>
&lt;div class="progress-container">
 &lt;div class="progress-bar">&lt;div class="progress-segment-planned" style="width: 100%;" title="9 planned">&lt;/div>&lt;/div>
 &lt;div class="progress-legend">
 &lt;span class="progress-legend-completed">&amp;#x2713; 0&lt;/span> |
 &lt;span class="progress-legend-in-progress">&amp;#x21bb; 0&lt;/span> |
 &lt;span class="progress-legend-planned">&amp;#x23f3; 9&lt;/span>
 (9 total)
 &lt;/div>
&lt;/div>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Deploy a local Stratum 1 NTP server using GPS as the time source, providing accurate time synchronization for all substrate hosts independent of internet connectivity.&lt;/p></description></item><item><title>Vault Operations</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/vault-operations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/vault-operations/</guid><description>&lt;h1 id="vault-operations">
 Vault Operations
 &lt;a class="anchor" href="#vault-operations">#&lt;/a>
&lt;/h1>
&lt;p>Ansible Vault protects sensitive variables (passwords, API keys, certificates) stored in the inventory. Each environment has its own set of &lt;code>vault.yml&lt;/code> files that must be encrypted at rest and decrypted only while editing.&lt;/p>
&lt;p>&lt;strong>Repository:&lt;/strong> &lt;code>ansible-inventory-deevnet&lt;/code>&lt;/p>
&lt;hr>
&lt;h2 id="setup">
 Setup
 &lt;a class="anchor" href="#setup">#&lt;/a>
&lt;/h2>
&lt;p>After cloning the inventory repository, run the one-time hook setup:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ansible-inventory-deevnet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make install-hooks
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This runs &lt;code>git config core.hooksPath hooks&lt;/code>, pointing Git at the version-controlled &lt;code>hooks/&lt;/code> directory. The hooks stay in sync with the repo automatically — no copying required. This must be run once per clone.&lt;/p></description></item><item><title>Addressing</title><link>https://deevnet.github.io/deevnet-docs/docs/architecture/addressing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/architecture/addressing/</guid><description>&lt;h1 id="addressing">
 Addressing
 &lt;a class="anchor" href="#addressing">#&lt;/a>
&lt;/h1>
&lt;p>Defines the IP addressing convention for Deevnet sites.&lt;/p>
&lt;hr>
&lt;h2 id="addressing-convention">
 Addressing Convention
 &lt;a class="anchor" href="#addressing-convention">#&lt;/a>
&lt;/h2>
&lt;p>Each site is assigned a /16 block from the 10.0.0.0/8 RFC1918 space:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Site&lt;/th>
 &lt;th>Address Block&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>dvnt&lt;/strong>&lt;/td>
 &lt;td>10.10.0.0/16&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>dvntm&lt;/strong>&lt;/td>
 &lt;td>10.20.0.0/16&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>The addressing pattern is: &lt;code>10.{site_id}.{vlan_id}.0/24&lt;/code>&lt;/p>
&lt;ul>
&lt;li>The second octet identifies the site&lt;/li>
&lt;li>The third octet matches the VLAN ID for that segment&lt;/li>
&lt;li>Each segment subnet is a /24 within the site&amp;rsquo;s /16&lt;/li>
&lt;/ul>
&lt;p>This creates a predictable, self-documenting address scheme where any IP immediately reveals which site and segment it belongs to.&lt;/p></description></item><item><title>Configure PXE</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/build-sequence/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/build-sequence/</guid><description>&lt;h1 id="configure-pxe">
 Configure PXE
 &lt;a class="anchor" href="#configure-pxe">#&lt;/a>
&lt;/h1>
&lt;p>Configure PXE boot authority before provisioning hosts.&lt;/p>
&lt;hr>
&lt;h2 id="greenfield-build-no-core-router">
 Greenfield Build (No Core Router)
 &lt;a class="anchor" href="#greenfield-build-no-core-router">#&lt;/a>
&lt;/h2>
&lt;p>For initial site build or full recovery, the bootstrap node provides DNS/DHCP/TFTP for the management subnet.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ~/dvnt/ansible-collection-deevnet.builder
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make bootstrap-auth
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This:&lt;/p>
&lt;ul>
&lt;li>Discovers the WAN interface from inventory (&lt;code>bootstrap_wan_interface_key&lt;/code>)&lt;/li>
&lt;li>Enables IP forwarding and masquerading on the WAN interface&lt;/li>
&lt;li>Activates dnsmasq for DHCP/DNS/TFTP on the downstream (management) interface&lt;/li>
&lt;li>Populates DNS host records and DHCP static reservations from inventory&lt;/li>
&lt;li>Swaps the management interface IP from the reserved address to the gateway address&lt;/li>
&lt;/ul>
&lt;p>The IP swap is the last step — it drops the SSH connection. All configuration completes first while connectivity is stable. Reconnect at the gateway IP to verify.&lt;/p></description></item><item><title>ESP32 Ma Bell Bluetooth Gateway</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/esp32/ma-bell/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/esp32/ma-bell/</guid><description>&lt;h1 id="ma-bell-project">
 Ma Bell Project
 &lt;a class="anchor" href="#ma-bell-project">#&lt;/a>
&lt;/h1>
&lt;p>Bluetooth Phone Gateway for vintage telephone integration.&lt;/p>
&lt;p>&lt;em>Project implemented in a separate repository.&lt;/em>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>GitHub:&lt;/strong> &lt;a href="https://github.com/cdeever/esp32-ma-bell-gateway">https://github.com/cdeever/esp32-ma-bell-gateway&lt;/a>&lt;/li>
&lt;li>&lt;strong>Documentation:&lt;/strong> &lt;a href="https://cdeever.github.io/esp32-ma-bell-gateway/">https://cdeever.github.io/esp32-ma-bell-gateway/&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="progress-container">
 &lt;div class="progress-bar">&lt;div class="progress-segment-completed" style="width: 25%;" title="19 completed">&lt;/div>&lt;div class="progress-segment-in-progress" style="width: 9.210526315789473%;" title="7 in progress">&lt;/div>&lt;div class="progress-segment-planned" style="width: 65.78947368421053%;" title="50 planned">&lt;/div>&lt;/div>
 &lt;div class="progress-legend">
 &lt;span class="progress-legend-completed">&amp;#x2713; 19&lt;/span> |
 &lt;span class="progress-legend-in-progress">&amp;#x21bb; 7&lt;/span> |
 &lt;span class="progress-legend-planned">&amp;#x23f3; 50&lt;/span>
 (76 total)
 &lt;/div>
&lt;/div>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope-">
 Project Vision &amp;amp; Scope 🔄
 &lt;a class="anchor" href="#project-vision--scope-">#&lt;/a>
&lt;/h2>
&lt;p>Restore full, authentic use of vintage analog telephones by bridging them to modern Bluetooth cell phones — preserving rotary dialing, ringing behavior, tones, and user experience.&lt;/p></description></item><item><title>Full Site Rebuild</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvnt/full-rebuild/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvnt/full-rebuild/</guid><description>&lt;h1 id="full-site-rebuild">
 Full Site Rebuild
 &lt;a class="anchor" href="#full-site-rebuild">#&lt;/a>
&lt;/h1>
&lt;p>End-to-end rebuild of the dvnt (home) site from scratch. Validates that all dvnt automation is end-to-end and exercises the full build sequence.&lt;/p>

&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p></description></item><item><title>Full Site Rebuild</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvntm/full-rebuild/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/dvntm/full-rebuild/</guid><description>&lt;h1 id="full-site-rebuild">
 Full Site Rebuild
 &lt;a class="anchor" href="#full-site-rebuild">#&lt;/a>
&lt;/h1>
&lt;p>End-to-end rebuild of the dvntm site from scratch. Validates air-gap recovery capability and exercises all automation built across the Builder, Patch Automation, and Extended Management Plane projects.&lt;/p>
&lt;div class="progress-container">
 &lt;div class="progress-bar">&lt;div class="progress-segment-planned" style="width: 100%;" title="6 planned">&lt;/div>&lt;/div>
 &lt;div class="progress-legend">
 &lt;span class="progress-legend-completed">&amp;#x2713; 0&lt;/span> |
 &lt;span class="progress-legend-in-progress">&amp;#x21bb; 0&lt;/span> |
 &lt;span class="progress-legend-planned">&amp;#x23f3; 6&lt;/span>
 (6 total)
 &lt;/div>
&lt;/div>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Perform a complete tear-down and rebuild of the dvntm (mobile) site to validate that the infrastructure-as-code automation is truly end-to-end. This is the capstone event that proves the system works.&lt;/p></description></item><item><title>MAC Address Format</title><link>https://deevnet.github.io/deevnet-docs/docs/standards/mac-address-format/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/standards/mac-address-format/</guid><description>&lt;h1 id="mac-address-format-standard">
 MAC Address Format Standard
 &lt;a class="anchor" href="#mac-address-format-standard">#&lt;/a>
&lt;/h1>
&lt;h2 id="rule">
 Rule
 &lt;a class="anchor" href="#rule">#&lt;/a>
&lt;/h2>
&lt;p>All MAC addresses in Deevnet inventory and configuration MUST use:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>lowercase&lt;/strong> hex digits (a-f, not A-F)&lt;/li>
&lt;li>&lt;strong>Colon separators&lt;/strong> (&lt;code>:&lt;/code>, not &lt;code>-&lt;/code>)&lt;/li>
&lt;/ul>
&lt;h2 id="examples">
 Examples
 &lt;a class="anchor" href="#examples">#&lt;/a>
&lt;/h2>
&lt;p>&lt;strong>Correct:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">mac&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;bc:24:11:2e:26:4e&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">mac&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;dc:a6:32:c3:b4:bc&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Incorrect:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">mac&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;BC:24:11:2E:26:4E&amp;#34;&lt;/span> &lt;span style="color:#75715e"># uppercase&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">mac&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;bc-24-11-2e-26-4e&amp;#34;&lt;/span> &lt;span style="color:#75715e"># dashes&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="rationale">
 Rationale
 &lt;a class="anchor" href="#rationale">#&lt;/a>
&lt;/h2>
&lt;p>Deevnet uses lowercase to match Unix tooling conventions:&lt;/p>
&lt;ul>
&lt;li>&lt;code>ifconfig&lt;/code>, &lt;code>ip link&lt;/code>, and most Linux utilities display MAC addresses in lowercase&lt;/li>
&lt;li>Copy-paste from system output works without transformation&lt;/li>
&lt;li>Consistent with what operators see when troubleshooting&lt;/li>
&lt;/ul>
&lt;p>IEEE 802 and RFC 7042 documentation examples use uppercase, but this is a
documentation convention rather than a technical requirement. We prioritize
practical alignment with the Unix ecosystem over formal documentation style.&lt;/p></description></item><item><title>Network Controller Role</title><link>https://deevnet.github.io/deevnet-docs/docs/platforms/management-plane/bootstrap-node/network-controller-role/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/platforms/management-plane/bootstrap-node/network-controller-role/</guid><description>&lt;h1 id="network-controller-role">
 Network Controller Role
 &lt;a class="anchor" href="#network-controller-role">#&lt;/a>
&lt;/h1>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>The network controller role deploys &lt;strong>centralized management software&lt;/strong> for switches and access points as Podman containers managed by systemd.&lt;/p>
&lt;hr>
&lt;h2 id="controllers">
 Controllers
 &lt;a class="anchor" href="#controllers">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Site&lt;/th>
 &lt;th>Controller&lt;/th>
 &lt;th>Managed Devices&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>dvntm&lt;/strong>&lt;/td>
 &lt;td>TP-Link Omada SDN&lt;/td>
 &lt;td>SG2218 switch, EAP650-Outdoor AP&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>dvnt&lt;/strong>&lt;/td>
 &lt;td>Ubiquiti UniFi Network&lt;/td>
 &lt;td>USW-24-G2, US-8 switches, UAP-AC-M APs&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Both controllers run on the bootstrap node because they must be available for initial network configuration before VLANs exist.&lt;/p></description></item><item><title>Security</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/security/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/security/</guid><description>&lt;h1 id="security--vulnerability-management">
 Security &amp;amp; Vulnerability Management
 &lt;a class="anchor" href="#security--vulnerability-management">#&lt;/a>
&lt;/h1>
&lt;p>Documents &lt;strong>security posture, assumptions, and lifecycle practices&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="scope">
 Scope
 &lt;a class="anchor" href="#scope">#&lt;/a>
&lt;/h2>
&lt;p>This section includes:&lt;/p>
&lt;ul>
&lt;li>Trust boundaries and threat assumptions&lt;/li>
&lt;li>Credential and key management philosophy&lt;/li>
&lt;li>Vulnerability monitoring and response expectations&lt;/li>
&lt;li>Patch and upgrade responsibility by layer&lt;/li>
&lt;li>Security-related guardrails and invariants&lt;/li>
&lt;/ul>
&lt;p>This section defines what &amp;ldquo;secure enough&amp;rdquo; means for Deevnet.&lt;/p>
&lt;hr>
&lt;h2 id="status-planned">
 Status: Planned
 &lt;a class="anchor" href="#status-planned">#&lt;/a>
&lt;/h2>
&lt;p>Detailed security documentation is planned. Key areas to document:&lt;/p>
&lt;h3 id="trust-boundaries">
 Trust Boundaries
 &lt;a class="anchor" href="#trust-boundaries">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>Substrate network is trusted&lt;/li>
&lt;li>Upstream/WAN is untrusted&lt;/li>
&lt;li>Tenant isolation requirements&lt;/li>
&lt;/ul>
&lt;h3 id="credential-management">
 Credential Management
 &lt;a class="anchor" href="#credential-management">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>SSH key distribution via artifact server&lt;/li>
&lt;li>No passwords in playbooks or inventory&lt;/li>
&lt;li>API tokens for service accounts&lt;/li>
&lt;/ul>
&lt;h3 id="vulnerability-response">
 Vulnerability Response
 &lt;a class="anchor" href="#vulnerability-response">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>Monitoring sources (CVE feeds, vendor advisories)&lt;/li>
&lt;li>Patch timelines by severity&lt;/li>
&lt;li>Emergency response procedures&lt;/li>
&lt;/ul></description></item><item><title>Services &amp; Routing</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/services-and-routing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/services-and-routing/</guid><description>&lt;h1 id="services--routing">
 Services &amp;amp; Routing
 &lt;a class="anchor" href="#services--routing">#&lt;/a>
&lt;/h1>
&lt;p>Configure DHCP, interface IPs, firewall rules, and trunk PVID. After this phase, all VLANs are fully routed and served.&lt;/p>
&lt;blockquote class="book-hint info">
 
**Post-cutover inventory:** All `make` targets from this point forward automatically use the `dvntm-new` inventory (target IPs on the new VLAN subnets). The builder is on VLAN 99 and can only reach devices at their new addresses. No manual `-i` overrides are needed.

&lt;/blockquote>

&lt;hr>
&lt;h2 id="step-6-test-second-port">
 Step 6: Test Second Port
 &lt;a class="anchor" href="#step-6-test-second-port">#&lt;/a>
&lt;/h2>
&lt;p>Test a non-builder port on a different VLAN to validate the trunk + VLAN path end-to-end.&lt;/p></description></item><item><title>Inventory Lifecycle</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/inventory-lifecycle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/inventory-lifecycle/</guid><description>&lt;h1 id="inventory--lifecycle-management">
 Inventory &amp;amp; Lifecycle Management
 &lt;a class="anchor" href="#inventory--lifecycle-management">#&lt;/a>
&lt;/h1>
&lt;p>Documents how &lt;strong>infrastructure assets are tracked, managed, and retired&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="scope">
 Scope
 &lt;a class="anchor" href="#scope">#&lt;/a>
&lt;/h2>
&lt;p>This section includes:&lt;/p>
&lt;ul>
&lt;li>Host identity and inventory sources of truth&lt;/li>
&lt;li>Hardware lifecycle stages (active, standby, retired)&lt;/li>
&lt;li>Image and configuration lifecycle expectations&lt;/li>
&lt;li>Decommissioning and cleanup principles&lt;/li>
&lt;/ul>
&lt;p>This section ensures infrastructure ages intentionally, not accidentally.&lt;/p>
&lt;hr>
&lt;h2 id="lifecycle-stages">
 Lifecycle Stages
 &lt;a class="anchor" href="#lifecycle-stages">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Stage&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Provisioning&lt;/strong>&lt;/td>
 &lt;td>Host being set up, not yet in service&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Active&lt;/strong>&lt;/td>
 &lt;td>In production use&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Standby&lt;/strong>&lt;/td>
 &lt;td>Available but not currently assigned&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Maintenance&lt;/strong>&lt;/td>
 &lt;td>Temporarily offline for updates/repairs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Retired&lt;/strong>&lt;/td>
 &lt;td>Decommissioned, removed from inventory&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="inventory-sources-of-truth">
 Inventory Sources of Truth
 &lt;a class="anchor" href="#inventory-sources-of-truth">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>ansible-inventory-deevnet&lt;/strong> - Canonical host identity&lt;/li>
&lt;li>&lt;strong>OPNsense&lt;/strong> - Authoritative DNS/DHCP (production)&lt;/li>
&lt;li>&lt;strong>Bootstrap node&lt;/strong> - Authoritative DNS/DHCP (during provisioning)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="decommissioning">
 Decommissioning
 &lt;a class="anchor" href="#decommissioning">#&lt;/a>
&lt;/h2>
&lt;p>When retiring a host:&lt;/p></description></item><item><title>MAC Namespace Specification</title><link>https://deevnet.github.io/deevnet-docs/docs/standards/mac-naming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/standards/mac-naming/</guid><description>&lt;h1 id="mac-namespace-specification">
 MAC Namespace Specification
 &lt;a class="anchor" href="#mac-namespace-specification">#&lt;/a>
&lt;/h1>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>This document defines the &lt;strong>deterministic MAC address strategy&lt;/strong> used across the
Deevnet platform, with a primary focus on &lt;strong>management-plane workloads&lt;/strong>.&lt;/p>
&lt;p>Deterministic MAC addressing enables:&lt;/p>
&lt;ul>
&lt;li>Stable DHCP reservations&lt;/li>
&lt;li>Predictable IP assignments&lt;/li>
&lt;li>Reproducible VM rebuilds&lt;/li>
&lt;li>Clear mapping between identity layers&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>Formatting&lt;/strong>: All MAC addresses must follow the formatting rules in the
&lt;a href="../mac-address-format/">MAC Address Format Standard&lt;/a> (lowercase hex, colon
separators).&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="guiding-principles">
 Guiding Principles
 &lt;a class="anchor" href="#guiding-principles">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>MAC addresses are &lt;strong>generated outside the hypervisor&lt;/strong>&lt;/li>
&lt;li>MACs are &lt;strong>explicitly defined in inventory/code&lt;/strong>&lt;/li>
&lt;li>Hypervisors must never auto-generate identity&lt;/li>
&lt;li>Identity must survive VM destruction and recreation&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="scope">
 Scope
 &lt;a class="anchor" href="#scope">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Workload Type&lt;/th>
 &lt;th>Policy&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Management Plane&lt;/strong>&lt;/td>
 &lt;td>Mandatory deterministic MACs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Tenant Workloads&lt;/strong>&lt;/td>
 &lt;td>Optional, future-controlled&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Ephemeral/Test VMs&lt;/strong>&lt;/td>
 &lt;td>May use auto-generated MACs&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>This specification applies &lt;strong>primarily to the management plane&lt;/strong>.&lt;/p></description></item><item><title>Network Segmentation</title><link>https://deevnet.github.io/deevnet-docs/docs/standards/network-segmentation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/standards/network-segmentation/</guid><description>&lt;h1 id="network-segmentation">
 Network Segmentation
 &lt;a class="anchor" href="#network-segmentation">#&lt;/a>
&lt;/h1>
&lt;p>Defines mandatory requirements for network segmentation in Deevnet sites.&lt;/p>
&lt;hr>
&lt;h2 id="purpose">
 Purpose
 &lt;a class="anchor" href="#purpose">#&lt;/a>
&lt;/h2>
&lt;p>This standard establishes rules for how sites implement network segmentation. It complements the &lt;a href="https://deevnet.github.io/deevnet-docs/docs/architecture/substrate/networking/">Substrate Networking&lt;/a> architecture document, which describes the segment model and design rationale.&lt;/p>
&lt;hr>
&lt;h2 id="definitions">
 Definitions
 &lt;a class="anchor" href="#definitions">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Term&lt;/th>
 &lt;th>Definition&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Segment&lt;/strong>&lt;/td>
 &lt;td>An isolated broadcast domain (VLAN) with controlled routing to other segments&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Trust boundary&lt;/strong>&lt;/td>
 &lt;td>The point where traffic policy changes between segments&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Inter-segment traffic&lt;/strong>&lt;/td>
 &lt;td>Network communication that crosses segment boundaries&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Segment authority&lt;/strong>&lt;/td>
 &lt;td>The system responsible for segment routing and policy (core router in production)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="segment-requirements">
 Segment Requirements
 &lt;a class="anchor" href="#segment-requirements">#&lt;/a>
&lt;/h2>
&lt;h3 id="1-management-segment">
 1. Management Segment
 &lt;a class="anchor" href="#1-management-segment">#&lt;/a>
&lt;/h3>
&lt;p>The management segment contains infrastructure management plane systems.&lt;/p></description></item><item><title>Port Migration &amp; Wireless</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/port-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/port-migration/</guid><description>&lt;h1 id="port-migration--wireless">
 Port Migration &amp;amp; Wireless
 &lt;a class="anchor" href="#port-migration--wireless">#&lt;/a>
&lt;/h1>
&lt;p>Move remaining switch ports to their assigned VLANs, perform the management cutover, adopt devices in Omada, and configure AP SSIDs.&lt;/p>
&lt;hr>
&lt;h2 id="step-10-migrate-remaining-access-ports">
 Step 10: Migrate Remaining Access Ports
 &lt;a class="anchor" href="#step-10-migrate-remaining-access-ports">#&lt;/a>
&lt;/h2>
&lt;p>Move all remaining switch ports to their assigned VLANs as defined in &lt;code>host_vars/access-sw01.yml&lt;/code>.&lt;/p>
&lt;blockquote class="book-hint info">
 
**DNS:** New 10.20.x.x addresses will not resolve via DNS until post-migration ([Step 11](#step-11-management-cutover) / [Post-Migration](../post-migration/)). This is expected — Ansible uses inventory IPs directly. Use IP addresses for any manual verification during this step.

&lt;/blockquote>

&lt;blockquote class="book-hint warning">
 
**Wireless clients:** AP SSID-to-VLAN mappings are not reconfigured in this step. When the AP's port moves to its target VLAN, wireless clients may lose connectivity. SSID configuration is handled in [Step 13](#step-13-ap-ssid-configuration) after Omada adoption ([Step 12](#step-12-omada-device-adoption)).

&lt;/blockquote>

&lt;p>&lt;strong>Run:&lt;/strong>&lt;/p></description></item><item><title>SSL Cert Automation</title><link>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/ssl-cert-automation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/roadmap/infrastructure/ssl-cert-automation/</guid><description>&lt;h1 id="ssl-cert-automation">
 SSL Cert Automation
 &lt;a class="anchor" href="#ssl-cert-automation">#&lt;/a>
&lt;/h1>
&lt;p>Automated SSL certificate provisioning and renewal for substrate services.&lt;/p>
&lt;div class="progress-container">
 &lt;div class="progress-bar">&lt;div class="progress-segment-planned" style="width: 100%;" title="16 planned">&lt;/div>&lt;/div>
 &lt;div class="progress-legend">
 &lt;span class="progress-legend-completed">&amp;#x2713; 0&lt;/span> |
 &lt;span class="progress-legend-in-progress">&amp;#x21bb; 0&lt;/span> |
 &lt;span class="progress-legend-planned">&amp;#x23f3; 16&lt;/span>
 (16 total)
 &lt;/div>
&lt;/div>
&lt;p>&lt;strong>Legend:&lt;/strong> ✅ Complete | 🔄 In Progress | ⏳ Planned&lt;/p>
&lt;hr>
&lt;h2 id="project-vision--scope">
 Project Vision &amp;amp; Scope
 &lt;a class="anchor" href="#project-vision--scope">#&lt;/a>
&lt;/h2>
&lt;p>Eliminate browser security warnings and enable secure communication between substrate services by deploying an internal Certificate Authority and automating certificate lifecycle management.&lt;/p>
&lt;p>&lt;strong>In Scope&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Internal CA deployment and trust distribution&lt;/li>
&lt;li>SSL certificates for infrastructure web UIs (Proxmox, OPNsense, Omada)&lt;/li>
&lt;li>Automated certificate renewal&lt;/li>
&lt;li>Expiration monitoring&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Out of Scope&lt;/strong>&lt;/p></description></item><item><title>Change Management</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/change-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/change-management/</guid><description>&lt;h1 id="change-management--cicd">
 Change Management &amp;amp; CI/CD
 &lt;a class="anchor" href="#change-management--cicd">#&lt;/a>
&lt;/h1>
&lt;p>Defines how &lt;strong>change is introduced safely&lt;/strong> into the Deevnet ecosystem.&lt;/p>
&lt;hr>
&lt;h2 id="scope">
 Scope
 &lt;a class="anchor" href="#scope">#&lt;/a>
&lt;/h2>
&lt;p>This section includes:&lt;/p>
&lt;ul>
&lt;li>Change classification (routine vs disruptive)&lt;/li>
&lt;li>Required validation before changes are applied&lt;/li>
&lt;li>Automated testing expectations by layer&lt;/li>
&lt;li>CI/CD pipeline responsibilities&lt;/li>
&lt;li>Guardrails that prevent unsafe changes from reaching production sites&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="principles">
 Principles
 &lt;a class="anchor" href="#principles">#&lt;/a>
&lt;/h2>
&lt;p>Automated testing and CI/CD exist to:&lt;/p>
&lt;ul>
&lt;li>Validate assumptions early&lt;/li>
&lt;li>Prevent regressions&lt;/li>
&lt;li>Ensure changes preserve correctness&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Manual changes without validation are considered defects.&lt;/strong>&lt;/p></description></item><item><title>Network Reference</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-reference/</guid><description>&lt;h1 id="network-reference">
 Network Reference
 &lt;a class="anchor" href="#network-reference">#&lt;/a>
&lt;/h1>
&lt;p>Quick reference for VLAN assignments and network configuration across Deevnet sites.&lt;/p>
&lt;hr>
&lt;h2 id="dvntm-vlan-assignments">
 dvntm VLAN Assignments
 &lt;a class="anchor" href="#dvntm-vlan-assignments">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Segment&lt;/th>
 &lt;th>VLAN ID&lt;/th>
 &lt;th>Subnet&lt;/th>
 &lt;th>Gateway&lt;/th>
 &lt;th>DHCP&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Trusted&lt;/td>
 &lt;td>10&lt;/td>
 &lt;td>10.20.10.0/24&lt;/td>
 &lt;td>10.20.10.1&lt;/td>
 &lt;td>.100-.200&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Storage&lt;/td>
 &lt;td>20&lt;/td>
 &lt;td>10.20.20.0/24&lt;/td>
 &lt;td>10.20.20.1&lt;/td>
 &lt;td>Static only&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Platform&lt;/td>
 &lt;td>25&lt;/td>
 &lt;td>10.20.25.0/24&lt;/td>
 &lt;td>10.20.25.1&lt;/td>
 &lt;td>Static only&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>IoT&lt;/td>
 &lt;td>30&lt;/td>
 &lt;td>10.20.30.0/24&lt;/td>
 &lt;td>10.20.30.1&lt;/td>
 &lt;td>.100-.200&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>IoT Vendor&lt;/td>
 &lt;td>31&lt;/td>
 &lt;td>10.20.31.0/24&lt;/td>
 &lt;td>10.20.31.1&lt;/td>
 &lt;td>.100-.200&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>IoT Backend&lt;/td>
 &lt;td>35&lt;/td>
 &lt;td>10.20.35.0/24&lt;/td>
 &lt;td>10.20.35.1&lt;/td>
 &lt;td>Static only&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Guest&lt;/td>
 &lt;td>40&lt;/td>
 &lt;td>10.20.40.0/24&lt;/td>
 &lt;td>10.20.40.1&lt;/td>
 &lt;td>.50-.250&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tenant 1&lt;/td>
 &lt;td>50&lt;/td>
 &lt;td>10.20.50.0/24&lt;/td>
 &lt;td>10.20.50.1&lt;/td>
 &lt;td>Per-tenant&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tenant 2&lt;/td>
 &lt;td>51&lt;/td>
 &lt;td>10.20.51.0/24&lt;/td>
 &lt;td>10.20.51.1&lt;/td>
 &lt;td>Per-tenant&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tenant 3&lt;/td>
 &lt;td>52&lt;/td>
 &lt;td>10.20.52.0/24&lt;/td>
 &lt;td>10.20.52.1&lt;/td>
 &lt;td>Per-tenant&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Management&lt;/td>
 &lt;td>99&lt;/td>
 &lt;td>10.20.99.0/24&lt;/td>
 &lt;td>10.20.99.1&lt;/td>
 &lt;td>Static only&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Blackhole&lt;/td>
 &lt;td>999&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>None (unrouted)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="dvnt-vlan-assignments">
 dvnt VLAN Assignments
 &lt;a class="anchor" href="#dvnt-vlan-assignments">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Segment&lt;/th>
 &lt;th>VLAN ID&lt;/th>
 &lt;th>Subnet&lt;/th>
 &lt;th>Gateway&lt;/th>
 &lt;th>DHCP&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Trusted&lt;/td>
 &lt;td>10&lt;/td>
 &lt;td>10.10.10.0/24&lt;/td>
 &lt;td>10.10.10.1&lt;/td>
 &lt;td>.100-.200&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Storage&lt;/td>
 &lt;td>20&lt;/td>
 &lt;td>10.10.20.0/24&lt;/td>
 &lt;td>10.10.20.1&lt;/td>
 &lt;td>Static only&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Platform&lt;/td>
 &lt;td>25&lt;/td>
 &lt;td>10.10.25.0/24&lt;/td>
 &lt;td>10.10.25.1&lt;/td>
 &lt;td>Static only&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>IoT&lt;/td>
 &lt;td>30&lt;/td>
 &lt;td>10.10.30.0/24&lt;/td>
 &lt;td>10.10.30.1&lt;/td>
 &lt;td>.100-.200&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>IoT Vendor&lt;/td>
 &lt;td>31&lt;/td>
 &lt;td>10.10.31.0/24&lt;/td>
 &lt;td>10.10.31.1&lt;/td>
 &lt;td>.100-.200&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>IoT Backend&lt;/td>
 &lt;td>35&lt;/td>
 &lt;td>10.10.35.0/24&lt;/td>
 &lt;td>10.10.35.1&lt;/td>
 &lt;td>Static only&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Guest&lt;/td>
 &lt;td>40&lt;/td>
 &lt;td>10.10.40.0/24&lt;/td>
 &lt;td>10.10.40.1&lt;/td>
 &lt;td>.50-.250&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tenant 1&lt;/td>
 &lt;td>50&lt;/td>
 &lt;td>10.10.50.0/24&lt;/td>
 &lt;td>10.10.50.1&lt;/td>
 &lt;td>Per-tenant&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tenant 2&lt;/td>
 &lt;td>51&lt;/td>
 &lt;td>10.10.51.0/24&lt;/td>
 &lt;td>10.10.51.1&lt;/td>
 &lt;td>Per-tenant&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tenant 3&lt;/td>
 &lt;td>52&lt;/td>
 &lt;td>10.10.52.0/24&lt;/td>
 &lt;td>10.10.52.1&lt;/td>
 &lt;td>Per-tenant&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Management&lt;/td>
 &lt;td>99&lt;/td>
 &lt;td>10.10.99.0/24&lt;/td>
 &lt;td>10.10.99.1&lt;/td>
 &lt;td>Static only&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Blackhole&lt;/td>
 &lt;td>999&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>None (unrouted)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="segment-purpose-summary">
 Segment Purpose Summary
 &lt;a class="anchor" href="#segment-purpose-summary">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Segment&lt;/th>
 &lt;th>Trust Level&lt;/th>
 &lt;th>Purpose&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Management&lt;/td>
 &lt;td>High&lt;/td>
 &lt;td>Infrastructure management plane (provisioners, hypervisor mgmt, switches, IPMI)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Trusted&lt;/td>
 &lt;td>High&lt;/td>
 &lt;td>User devices (workstations, laptops, personal devices)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Storage&lt;/td>
 &lt;td>High&lt;/td>
 &lt;td>Dedicated storage traffic (NAS, backup targets)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Platform&lt;/td>
 &lt;td>High&lt;/td>
 &lt;td>Shared infrastructure services (DNS, NTP, artifact mirrors, reverse proxy)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tenant&lt;/td>
 &lt;td>Medium&lt;/td>
 &lt;td>Per-tenant workload isolation&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>IoT Backend&lt;/td>
 &lt;td>Medium&lt;/td>
 &lt;td>IoT application backends (MQTT, Home Assistant, data pipelines)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>IoT Vendor&lt;/td>
 &lt;td>Very Low&lt;/td>
 &lt;td>Vendor-managed IoT containment zone (cloud-dependent, unauditable)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>IoT&lt;/td>
 &lt;td>Medium&lt;/td>
 &lt;td>Custom-developed embedded devices with controlled firmware (Pis, sensors)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Guest&lt;/td>
 &lt;td>Untrusted&lt;/td>
 &lt;td>Transient visitor access (internet only)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="canonical-source">
 Canonical Source
 &lt;a class="anchor" href="#canonical-source">#&lt;/a>
&lt;/h2>
&lt;p>VLAN definitions are maintained in Ansible inventory:&lt;/p></description></item><item><title>Post-Migration</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/post-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/post-migration/</guid><description>&lt;h1 id="post-migration">
 Post-Migration
 &lt;a class="anchor" href="#post-migration">#&lt;/a>
&lt;/h1>
&lt;p>After all steps complete and connectivity is verified:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Run automated post-migration validation:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ansible-collection-deevnet.net
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make postcheck
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Validates OPNsense VLANs, switch database/trunk, device reachability, gateway IPs, and builder state. All checks should show &lt;code>[PASS]&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Run DNS and DHCP roles&lt;/strong> (must run before vault encryption):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ansible-collection-deevnet.net
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make dns
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make dhcp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Re-encrypt vault files:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd ansible-inventory-deevnet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make vault
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Remove old network config:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Delete old 192.168.10.0/23 Kea DHCP subnet (if not already removed)&lt;/li>
&lt;li>Remove temp VLAN 99 DHCP pool (if not already removed)&lt;/li>
&lt;li>Remove old 192.168.10.0 LAN interface from OPNsense (Interfaces → LAN → clear IP or reassign)&lt;/li>
&lt;li>Remove any old static routes referencing 192.168.10.x&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Ongoing switch management&lt;/strong> — use the &lt;code>switch&lt;/code> target for day-2 operations:&lt;/p></description></item><item><title>Troubleshooting</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/network-migration/troubleshooting/</guid><description>&lt;h1 id="troubleshooting--known-issues">
 Troubleshooting &amp;amp; Known Issues
 &lt;a class="anchor" href="#troubleshooting--known-issues">#&lt;/a>
&lt;/h1>
&lt;h2 id="lost-switch-access-after-trunk-configuration">
 Lost switch access after trunk configuration
 &lt;a class="anchor" href="#lost-switch-access-after-trunk-configuration">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Connect via console cable&lt;/li>
&lt;li>Check &lt;code>show interface switchport gigabitEthernet 1/0/1&lt;/code> for native VLAN mismatch&lt;/li>
&lt;li>Revert to access mode on uplink if needed&lt;/li>
&lt;/ul>
&lt;h2 id="device-not-getting-dhcp-lease">
 Device not getting DHCP lease
 &lt;a class="anchor" href="#device-not-getting-dhcp-lease">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Kea not listening on VLAN interfaces:&lt;/strong> Check OPNsense GUI → Services → Kea DHCP → Settings → Interfaces. All VLAN interfaces must be selected. By default, Kea only listens on LAN (re0). The &lt;code>opnsense_dhcp&lt;/code> role automates this, but verify with: &lt;code>ssh root@10.20.99.1 'cat /usr/local/etc/kea/kea-dhcp4.conf'&lt;/code> and check the &lt;code>interfaces-config&lt;/code> section.&lt;/li>
&lt;li>Verify port VLAN assignment: &lt;code>show vlan brief&lt;/code>&lt;/li>
&lt;li>Verify DHCP subnet exists in OPNsense for that VLAN&lt;/li>
&lt;li>Check OPNsense firewall rules allow DHCP on VLAN interface&lt;/li>
&lt;li>Check &lt;code>show mac address-table&lt;/code> to confirm device is on expected port&lt;/li>
&lt;/ul>
&lt;h2 id="ap-not-discoverable-or-adoption-fails-in-omada">
 AP not discoverable or adoption fails in Omada
 &lt;a class="anchor" href="#ap-not-discoverable-or-adoption-fails-in-omada">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Factory reset AP&lt;/strong> uses static fallback IP &lt;code>192.168.0.254&lt;/code>, not DHCP. Add temp IP on builder (&lt;code>sudo ip addr add 192.168.0.1/24 dev enp4s0&lt;/code>) and access AP web UI at &lt;code>http://192.168.0.254&lt;/code> (admin/admin) to set inform URL.&lt;/li>
&lt;li>&lt;strong>Adoption timeout (errorCode -39002):&lt;/strong> AP can&amp;rsquo;t reach controller on required ports. Check &lt;code>ss -tlnp | grep 29814&lt;/code> — Omada must listen on &lt;strong>TCP&lt;/strong> 29814 (not just UDP). Newer AP firmware (EAP650-Outdoor) requires TCP 29814 for v2 adoption.&lt;/li>
&lt;li>&lt;strong>Omada controller version mismatch:&lt;/strong> Controller 5.12.7 does not listen on TCP 29814. Update the controller to a version that supports v2 adoption protocol.&lt;/li>
&lt;li>&lt;strong>Firewalld missing ports:&lt;/strong> Verify &lt;code>sudo firewall-cmd --list-ports&lt;/code> includes &lt;code>29810-29814/udp&lt;/code> AND &lt;code>29811-29814/tcp&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h2 id="builder-lost-connectivity-during-step-5">
 Builder lost connectivity during Step 5
 &lt;a class="anchor" href="#builder-lost-connectivity-during-step-5">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Verify ethernet cable is connected to &lt;code>gi1/0/16&lt;/code> — do not rely on WiFi for substrate access&lt;/li>
&lt;li>Check port VLAN assignment: &lt;code>show interface switchport gigabitEthernet 1/0/16&lt;/code>&lt;/li>
&lt;li>Verify VLAN 99 interface is enabled with IP &lt;code>10.20.99.1&lt;/code> in OPNsense&lt;/li>
&lt;li>If the builder has the wrong static IP config, revert the port to VLAN 1 and re-run the builder playbook with the dvntm inventory&lt;/li>
&lt;li>If the builder is unreachable, Omada adoption (&lt;a href="../port-migration/#step-12-omada-device-adoption">Step 12&lt;/a>) cannot proceed — but the switch and AP continue to function independently&lt;/li>
&lt;li>Last resort: revert the builder port to VLAN 1 via console:
&lt;pre tabindex="0">&lt;code>configure
interface gigabitEthernet 1/0/16
 switchport access vlan 1
end
copy running-config startup-config
&lt;/code>&lt;/pre>&lt;/li>
&lt;/ul>
&lt;h2 id="inter-vlan-routing-not-working">
 Inter-VLAN routing not working
 &lt;a class="anchor" href="#inter-vlan-routing-not-working">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Check default gateway on target device:&lt;/strong> Devices on VLAN 99 (management) need &lt;code>ip route 0.0.0.0 0.0.0.0 10.20.99.1&lt;/code> to route responses back to other VLANs. Without this, the device receives cross-VLAN traffic but replies are silently dropped (no return route). This was the root cause of the &amp;ldquo;builder can&amp;rsquo;t ping cross-VLAN gateways&amp;rdquo; issue — the switch had no default gateway.&lt;/li>
&lt;li>Verify VLAN interfaces have IP addresses assigned in OPNsense&lt;/li>
&lt;li>Check OPNsense firewall rules for inter-VLAN traffic&lt;/li>
&lt;li>Verify routing table: OPNsense GUI -&amp;gt; System -&amp;gt; Routes&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="to-do">
 To Do
 &lt;a class="anchor" href="#to-do">#&lt;/a>
&lt;/h2>
&lt;p>Automation gaps and improvements identified during the initial migration run.&lt;/p></description></item><item><title>Build Network</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/build-network/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/build-network/</guid><description>&lt;h1 id="build-network">
 Build Network
 &lt;a class="anchor" href="#build-network">#&lt;/a>
&lt;/h1>
&lt;p>Configure network infrastructure: Core Router, VLANs, firewall, DHCP, and wireless access points.&lt;/p>
&lt;p>&lt;strong>Collection:&lt;/strong> &lt;code>deevnet.net&lt;/code>&lt;/p>
&lt;hr>
&lt;h2 id="components">
 Components
 &lt;a class="anchor" href="#components">#&lt;/a>
&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Component&lt;/th>
 &lt;th>Role&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Core Router&lt;/td>
 &lt;td>Firewall, DHCP, DNS, routing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Switch/VLANs&lt;/td>
 &lt;td>Network segmentation&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Wireless AP&lt;/td>
 &lt;td>SSIDs, guest networks&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="prerequisites">
 Prerequisites
 &lt;a class="anchor" href="#prerequisites">#&lt;/a>
&lt;/h2>
&lt;p>Before the automated build-network procedures begin, the following manual steps must be completed:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Prerequisite&lt;/th>
 &lt;th>Method&lt;/th>
 &lt;th>Notes&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Core Router&lt;/td>
 &lt;td>Fresh OPNsense install from USB&lt;/td>
 &lt;td>Manual installer; no PXE support&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Access Switch&lt;/td>
 &lt;td>Factory reset to default state&lt;/td>
 &lt;td>Clears any prior VLAN/port config&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Wireless AP&lt;/td>
 &lt;td>Factory reset to default state&lt;/td>
 &lt;td>Clears any prior SSID/network config&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Additionally:&lt;/p></description></item><item><title>Build Management Plane</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/build-management-plane/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/build-management-plane/</guid><description>&lt;h1 id="build-management-plane">
 Build Management Plane
 &lt;a class="anchor" href="#build-management-plane">#&lt;/a>
&lt;/h1>
&lt;p>PXE boot and install Proxmox VE hypervisors from local artifacts.&lt;/p>
&lt;hr>
&lt;h2 id="prerequisites">
 Prerequisites
 &lt;a class="anchor" href="#prerequisites">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>MAC addresses seeded in inventory&lt;/li>
&lt;li>Network infrastructure running (or bootstrap-authoritative mode enabled)&lt;/li>
&lt;li>Proxmox VE ISO staged on artifact server&lt;/li>
&lt;li>DHCP reservations configured for target hosts&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="procedure">
 Procedure
 &lt;a class="anchor" href="#procedure">#&lt;/a>
&lt;/h2>
&lt;p>&lt;em>TBD&lt;/em>&lt;/p></description></item><item><title>Verify Site</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/build-verification/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/build-verification/</guid><description>&lt;h1 id="verify-site">
 Verify Site
 &lt;a class="anchor" href="#verify-site">#&lt;/a>
&lt;/h1>
&lt;p>Validation after site build is complete.&lt;/p>
&lt;hr>
&lt;h2 id="overview">
 Overview
 &lt;a class="anchor" href="#overview">#&lt;/a>
&lt;/h2>
&lt;p>Each build phase includes automated verification via Ansible. This page covers final validation once all components are operational.&lt;/p>
&lt;hr>
&lt;h2 id="network-verification">
 Network Verification
 &lt;a class="anchor" href="#network-verification">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Core Router reachable&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ping gateway.dvntm.deevnet.net
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># DNS resolution working&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dig +short hv01.dvntm.deevnet.net
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dig +short @192.168.10.1 hv01.dvntm.deevnet.net
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># DHCP serving leases&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># (check Core Router UI or API)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># VLAN connectivity&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># (ping across segments as appropriate)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="management-plane-verification">
 Management Plane Verification
 &lt;a class="anchor" href="#management-plane-verification">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Hypervisors reachable&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ping hv01.dvntm.deevnet.net
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ping hv02.dvntm.deevnet.net
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Proxmox API accessible&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -k https://hv01.dvntm.deevnet.net:8006/api2/json/version
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># SSH access working&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ssh hv01.dvntm.deevnet.net hostname
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="pxe-infrastructure-verification">
 PXE Infrastructure Verification
 &lt;a class="anchor" href="#pxe-infrastructure-verification">#&lt;/a>
&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># TFTP service running&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>systemctl status tftp.socket
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># PXE configs present&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ls /srv/tftp/pxelinux.cfg/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Artifact server accessible&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -I http://artifacts.dvntm.deevnet.net/fedora/43/mirror/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="automated-verification">
 Automated Verification
 &lt;a class="anchor" href="#automated-verification">#&lt;/a>
&lt;/h2>
&lt;p>&lt;em>TBD - Ansible playbook for full substrate health check&lt;/em>&lt;/p></description></item><item><title>Build Tenants</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/build-tenants/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/build-tenants/</guid><description>&lt;h1 id="build-tenants">
 Build Tenants
 &lt;a class="anchor" href="#build-tenants">#&lt;/a>
&lt;/h1>
&lt;p>Provision tenant VMs and deploy application workloads.&lt;/p>
&lt;hr>
&lt;h2 id="prerequisites">
 Prerequisites
 &lt;a class="anchor" href="#prerequisites">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Proxmox hypervisor(s) running&lt;/li>
&lt;li>VM templates available&lt;/li>
&lt;li>Application configuration in source control&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="procedure">
 Procedure
 &lt;a class="anchor" href="#procedure">#&lt;/a>
&lt;/h2>
&lt;p>&lt;em>TBD&lt;/em>&lt;/p></description></item><item><title>Verify Tenants</title><link>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/verify-tenants/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deevnet.github.io/deevnet-docs/docs/runbook/building-recovery/verify-tenants/</guid><description>&lt;h1 id="verify-tenants">
 Verify Tenants
 &lt;a class="anchor" href="#verify-tenants">#&lt;/a>
&lt;/h1>
&lt;p>Validation after tenant workloads are provisioned.&lt;/p>
&lt;hr>
&lt;h2 id="prerequisites">
 Prerequisites
 &lt;a class="anchor" href="#prerequisites">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Tenant VMs deployed via &lt;a href="../build-tenants/">Build Tenants&lt;/a>&lt;/li>
&lt;li>Application services started&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="application-verification">
 Application Verification
 &lt;a class="anchor" href="#application-verification">#&lt;/a>
&lt;/h2>
&lt;p>&lt;em>TBD - Application-specific health checks&lt;/em>&lt;/p>
&lt;hr>
&lt;h2 id="backup-verification">
 Backup Verification
 &lt;a class="anchor" href="#backup-verification">#&lt;/a>
&lt;/h2>
&lt;p>&lt;em>TBD - Verify tenant backup jobs configured and running&lt;/em>&lt;/p></description></item></channel></rss>