Update configuration files, templates, and internal documentation for the provisioning repository system. Configuration Updates: - KMS configuration modernization - Plugin system settings - Service port mappings - Test cluster topologies - Installation configuration examples - VM configuration defaults - Cedar authorization policies Documentation Updates: - Library module documentation - Extension API guides - AI system documentation - Service management guides - Test environment setup - Plugin usage guides - Validator configuration documentation All changes are backward compatible.
1375 lines
83 KiB
HTML
1375 lines
83 KiB
HTML
<!DOCTYPE HTML>
|
|
<html lang="en" class="ayu sidebar-visible" dir="ltr">
|
|
<head>
|
|
<!-- Book generated using mdBook -->
|
|
<meta charset="UTF-8">
|
|
<title>Architecture Overview - Provisioning Platform Documentation</title>
|
|
|
|
|
|
<!-- Custom HTML head -->
|
|
|
|
<meta name="description" content="Complete documentation for the Provisioning Platform - Infrastructure automation with Nushell, KCL, and Rust">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="theme-color" content="#ffffff">
|
|
|
|
<link rel="icon" href="../favicon.svg">
|
|
<link rel="shortcut icon" href="../favicon.png">
|
|
<link rel="stylesheet" href="../css/variables.css">
|
|
<link rel="stylesheet" href="../css/general.css">
|
|
<link rel="stylesheet" href="../css/chrome.css">
|
|
<link rel="stylesheet" href="../css/print.css" media="print">
|
|
|
|
<!-- Fonts -->
|
|
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
|
|
<link rel="stylesheet" href="../fonts/fonts.css">
|
|
|
|
<!-- Highlight.js Stylesheets -->
|
|
<link rel="stylesheet" id="highlight-css" href="../highlight.css">
|
|
<link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
|
|
<link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
|
|
|
|
<!-- Custom theme stylesheets -->
|
|
|
|
|
|
<!-- Provide site root and default themes to javascript -->
|
|
<script>
|
|
const path_to_root = "../";
|
|
const default_light_theme = "ayu";
|
|
const default_dark_theme = "navy";
|
|
</script>
|
|
<!-- Start loading toc.js asap -->
|
|
<script src="../toc.js"></script>
|
|
</head>
|
|
<body>
|
|
<div id="mdbook-help-container">
|
|
<div id="mdbook-help-popup">
|
|
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
|
<div>
|
|
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
|
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
|
<p>Press <kbd>?</kbd> to show this help</p>
|
|
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="body-container">
|
|
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
|
<script>
|
|
try {
|
|
let theme = localStorage.getItem('mdbook-theme');
|
|
let sidebar = localStorage.getItem('mdbook-sidebar');
|
|
|
|
if (theme.startsWith('"') && theme.endsWith('"')) {
|
|
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
|
}
|
|
|
|
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
|
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
|
}
|
|
} catch (e) { }
|
|
</script>
|
|
|
|
<!-- Set the theme before any content is loaded, prevents flash -->
|
|
<script>
|
|
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
|
let theme;
|
|
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
|
if (theme === null || theme === undefined) { theme = default_theme; }
|
|
const html = document.documentElement;
|
|
html.classList.remove('ayu')
|
|
html.classList.add(theme);
|
|
html.classList.add("js");
|
|
</script>
|
|
|
|
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
|
|
|
<!-- Hide / unhide sidebar before it is displayed -->
|
|
<script>
|
|
let sidebar = null;
|
|
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
|
if (document.body.clientWidth >= 1080) {
|
|
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
|
sidebar = sidebar || 'visible';
|
|
} else {
|
|
sidebar = 'hidden';
|
|
}
|
|
sidebar_toggle.checked = sidebar === 'visible';
|
|
html.classList.remove('sidebar-visible');
|
|
html.classList.add("sidebar-" + sidebar);
|
|
</script>
|
|
|
|
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
|
<!-- populated by js -->
|
|
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
|
<noscript>
|
|
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
|
</noscript>
|
|
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
|
<div class="sidebar-resize-indicator"></div>
|
|
</div>
|
|
</nav>
|
|
|
|
<div id="page-wrapper" class="page-wrapper">
|
|
|
|
<div class="page">
|
|
<div id="menu-bar-hover-placeholder"></div>
|
|
<div id="menu-bar" class="menu-bar sticky">
|
|
<div class="left-buttons">
|
|
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
|
<i class="fa fa-bars"></i>
|
|
</label>
|
|
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
|
<i class="fa fa-paint-brush"></i>
|
|
</button>
|
|
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
|
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
|
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
|
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
|
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
|
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
|
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
|
</ul>
|
|
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
|
<i class="fa fa-search"></i>
|
|
</button>
|
|
</div>
|
|
|
|
<h1 class="menu-title">Provisioning Platform Documentation</h1>
|
|
|
|
<div class="right-buttons">
|
|
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
|
<i id="print-button" class="fa fa-print"></i>
|
|
</a>
|
|
<a href="https://github.com/provisioning/provisioning-platform" title="Git repository" aria-label="Git repository">
|
|
<i id="git-repository-button" class="fa fa-github"></i>
|
|
</a>
|
|
<a href="https://github.com/provisioning/provisioning-platform/edit/main/provisioning/docs/src/architecture/ARCHITECTURE_OVERVIEW.md" title="Suggest an edit" aria-label="Suggest an edit">
|
|
<i id="git-edit-button" class="fa fa-edit"></i>
|
|
</a>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div id="search-wrapper" class="hidden">
|
|
<form id="searchbar-outer" class="searchbar-outer">
|
|
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
|
</form>
|
|
<div id="searchresults-outer" class="searchresults-outer hidden">
|
|
<div id="searchresults-header" class="searchresults-header"></div>
|
|
<ul id="searchresults">
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
|
<script>
|
|
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
|
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
|
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
|
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
|
});
|
|
</script>
|
|
|
|
<div id="content" class="content">
|
|
<main>
|
|
<h1 id="provisioning-platform---architecture-overview"><a class="header" href="#provisioning-platform---architecture-overview">Provisioning Platform - Architecture Overview</a></h1>
|
|
<p><strong>Version</strong>: 3.5.0
|
|
<strong>Date</strong>: 2025-10-06
|
|
<strong>Status</strong>: Production
|
|
<strong>Maintainers</strong>: Architecture Team</p>
|
|
<hr />
|
|
<h2 id="table-of-contents"><a class="header" href="#table-of-contents">Table of Contents</a></h2>
|
|
<ol>
|
|
<li><a href="#executive-summary">Executive Summary</a></li>
|
|
<li><a href="#system-architecture">System Architecture</a></li>
|
|
<li><a href="#component-architecture">Component Architecture</a></li>
|
|
<li><a href="#mode-architecture">Mode Architecture</a></li>
|
|
<li><a href="#network-architecture">Network Architecture</a></li>
|
|
<li><a href="#data-architecture">Data Architecture</a></li>
|
|
<li><a href="#security-architecture">Security Architecture</a></li>
|
|
<li><a href="#deployment-architecture">Deployment Architecture</a></li>
|
|
<li><a href="#integration-architecture">Integration Architecture</a></li>
|
|
<li><a href="#performance-and-scalability">Performance and Scalability</a></li>
|
|
<li><a href="#evolution-and-roadmap">Evolution and Roadmap</a></li>
|
|
</ol>
|
|
<hr />
|
|
<h2 id="executive-summary"><a class="header" href="#executive-summary">Executive Summary</a></h2>
|
|
<h3 id="what-is-the-provisioning-platform"><a class="header" href="#what-is-the-provisioning-platform">What is the Provisioning Platform?</a></h3>
|
|
<p>The Provisioning Platform is a modern, cloud-native infrastructure automation system that combines the simplicity of declarative configuration (KCL) with the power of shell scripting (Nushell) and high-performance coordination (Rust).</p>
|
|
<h3 id="key-characteristics"><a class="header" href="#key-characteristics">Key Characteristics</a></h3>
|
|
<ul>
|
|
<li><strong>Hybrid Architecture</strong>: Rust for coordination, Nushell for business logic, KCL for configuration</li>
|
|
<li><strong>Mode-Based</strong>: Adapts from solo development to enterprise production</li>
|
|
<li><strong>OCI-Native</strong>: Extends leveraging industry-standard OCI distribution</li>
|
|
<li><strong>Provider-Agnostic</strong>: Supports multiple cloud providers (AWS, UpCloud) and local infrastructure</li>
|
|
<li><strong>Extension-Driven</strong>: Core functionality enhanced through modular extensions</li>
|
|
</ul>
|
|
<h3 id="architecture-at-a-glance"><a class="header" href="#architecture-at-a-glance">Architecture at a Glance</a></h3>
|
|
<pre><code>┌─────────────────────────────────────────────────────────────────────┐
|
|
│ Provisioning Platform │
|
|
├─────────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
│ │ User Layer │ │ Extension │ │ Service │ │
|
|
│ │ (CLI/UI) │ │ Registry │ │ Registry │ │
|
|
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
|
|
│ │ │ │ │
|
|
│ ┌──────┴──────────────────┴──────────────────┴───────┐ │
|
|
│ │ Core Provisioning Engine │ │
|
|
│ │ (Config | Dependency Resolution | Workflows) │ │
|
|
│ └──────┬──────────────────────────────────────┬───────┘ │
|
|
│ │ │ │
|
|
│ ┌──────┴─────────┐ ┌───────┴──────────┐ │
|
|
│ │ Orchestrator │ │ Business Logic │ │
|
|
│ │ (Rust) │ ←─ Coordination → │ (Nushell) │ │
|
|
│ └──────┬─────────┘ └───────┬──────────┘ │
|
|
│ │ │ │
|
|
│ ┌──────┴───────────────────────────────────────┴──────┐ │
|
|
│ │ Extension System │ │
|
|
│ │ (Providers | Task Services | Clusters) │ │
|
|
│ └──────┬───────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ┌──────┴───────────────────────────────────────────────────┐ │
|
|
│ │ Infrastructure (Cloud | Local | Kubernetes) │ │
|
|
│ └───────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────────┘
|
|
</code></pre>
|
|
<h3 id="key-metrics"><a class="header" href="#key-metrics">Key Metrics</a></h3>
|
|
<div class="table-wrapper"><table><thead><tr><th>Metric</th><th>Value</th><th>Description</th></tr></thead><tbody>
|
|
<tr><td><strong>Codebase Size</strong></td><td>~50,000 LOC</td><td>Nushell (60%), Rust (30%), KCL (10%)</td></tr>
|
|
<tr><td><strong>Extensions</strong></td><td>100+</td><td>Providers, taskservs, clusters</td></tr>
|
|
<tr><td><strong>Supported Providers</strong></td><td>3</td><td>AWS, UpCloud, Local</td></tr>
|
|
<tr><td><strong>Task Services</strong></td><td>50+</td><td>Kubernetes, databases, monitoring, etc.</td></tr>
|
|
<tr><td><strong>Deployment Modes</strong></td><td>5</td><td>Binary, Docker, Docker Compose, K8s, Remote</td></tr>
|
|
<tr><td><strong>Operational Modes</strong></td><td>4</td><td>Solo, Multi-user, CI/CD, Enterprise</td></tr>
|
|
<tr><td><strong>API Endpoints</strong></td><td>80+</td><td>REST, WebSocket, GraphQL (planned)</td></tr>
|
|
</tbody></table>
|
|
</div>
|
|
<hr />
|
|
<h2 id="system-architecture"><a class="header" href="#system-architecture">System Architecture</a></h2>
|
|
<h3 id="high-level-architecture"><a class="header" href="#high-level-architecture">High-Level Architecture</a></h3>
|
|
<pre><code>┌────────────────────────────────────────────────────────────────────────────┐
|
|
│ PRESENTATION LAYER │
|
|
├────────────────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ ┌────────────┐ │
|
|
│ │ CLI (Nu) │ │ Control │ │ REST API │ │ MCP │ │
|
|
│ │ │ │ Center (Yew) │ │ Gateway │ │ Server │ │
|
|
│ └─────────────┘ └──────────────┘ └──────────────┘ └────────────┘ │
|
|
│ │
|
|
└──────────────────────────────────┬─────────────────────────────────────────┘
|
|
│
|
|
┌──────────────────────────────────┴─────────────────────────────────────────┐
|
|
│ CORE LAYER │
|
|
├────────────────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌──────────────────────────────────────────────────────────────────┐ │
|
|
│ │ Configuration Management │ │
|
|
│ │ (KCL Schemas | TOML Config | Hierarchical Loading) │ │
|
|
│ └──────────────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
|
|
│ │ Dependency │ │ Module/Layer │ │ Workspace │ │
|
|
│ │ Resolution │ │ System │ │ Management │ │
|
|
│ └──────────────────┘ └──────────────────┘ └──────────────────┘ │
|
|
│ │
|
|
│ ┌──────────────────────────────────────────────────────────────────┐ │
|
|
│ │ Workflow Engine │ │
|
|
│ │ (Batch Operations | Checkpoints | Rollback) │ │
|
|
│ └──────────────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
└──────────────────────────────────┬─────────────────────────────────────────┘
|
|
│
|
|
┌──────────────────────────────────┴─────────────────────────────────────────┐
|
|
│ ORCHESTRATION LAYER │
|
|
├────────────────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌──────────────────────────────────────────────────────────────────┐ │
|
|
│ │ Orchestrator (Rust) │ │
|
|
│ │ • Task Queue (File-based persistence) │ │
|
|
│ │ • State Management (Checkpoints) │ │
|
|
│ │ • Health Monitoring │ │
|
|
│ │ • REST API (HTTP/WS) │ │
|
|
│ └──────────────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌──────────────────────────────────────────────────────────────────┐ │
|
|
│ │ Business Logic (Nushell) │ │
|
|
│ │ • Provider operations (AWS, UpCloud, Local) │ │
|
|
│ │ • Server lifecycle (create, delete, configure) │ │
|
|
│ │ • Taskserv installation (50+ services) │ │
|
|
│ │ • Cluster deployment │ │
|
|
│ └──────────────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
└──────────────────────────────────┬─────────────────────────────────────────┘
|
|
│
|
|
┌──────────────────────────────────┴─────────────────────────────────────────┐
|
|
│ EXTENSION LAYER │
|
|
├────────────────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌────────────────┐ ┌──────────────────┐ ┌───────────────────┐ │
|
|
│ │ Providers │ │ Task Services │ │ Clusters │ │
|
|
│ │ (3 types) │ │ (50+ types) │ │ (10+ types) │ │
|
|
│ │ │ │ │ │ │ │
|
|
│ │ • AWS │ │ • Kubernetes │ │ • Buildkit │ │
|
|
│ │ • UpCloud │ │ • Containerd │ │ • Web cluster │ │
|
|
│ │ • Local │ │ • Databases │ │ • CI/CD │ │
|
|
│ │ │ │ • Monitoring │ │ │ │
|
|
│ └────────────────┘ └──────────────────┘ └───────────────────┘ │
|
|
│ │
|
|
│ ┌──────────────────────────────────────────────────────────────────┐ │
|
|
│ │ Extension Distribution (OCI Registry) │ │
|
|
│ │ • Zot (local development) │ │
|
|
│ │ • Harbor (multi-user/enterprise) │ │
|
|
│ └──────────────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
└──────────────────────────────────┬─────────────────────────────────────────┘
|
|
│
|
|
┌──────────────────────────────────┴─────────────────────────────────────────┐
|
|
│ INFRASTRUCTURE LAYER │
|
|
├────────────────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌────────────────┐ ┌──────────────────┐ ┌───────────────────┐ │
|
|
│ │ Cloud (AWS) │ │ Cloud (UpCloud) │ │ Local (Docker) │ │
|
|
│ │ │ │ │ │ │ │
|
|
│ │ • EC2 │ │ • Servers │ │ • Containers │ │
|
|
│ │ • EKS │ │ • LoadBalancer │ │ • Local K8s │ │
|
|
│ │ • RDS │ │ • Networking │ │ • Processes │ │
|
|
│ └────────────────┘ └──────────────────┘ └───────────────────┘ │
|
|
│ │
|
|
└────────────────────────────────────────────────────────────────────────────┘
|
|
</code></pre>
|
|
<h3 id="multi-repository-architecture"><a class="header" href="#multi-repository-architecture">Multi-Repository Architecture</a></h3>
|
|
<p>The system is organized into three separate repositories:</p>
|
|
<h4 id="provisioning-core"><a class="header" href="#provisioning-core"><strong>provisioning-core</strong></a></h4>
|
|
<pre><code>Core system functionality
|
|
├── CLI interface (Nushell entry point)
|
|
├── Core libraries (lib_provisioning)
|
|
├── Base KCL schemas
|
|
├── Configuration system
|
|
├── Workflow engine
|
|
└── Build/distribution tools
|
|
</code></pre>
|
|
<p><strong>Distribution</strong>: <code>oci://registry/provisioning-core:v3.5.0</code></p>
|
|
<h4 id="provisioning-extensions"><a class="header" href="#provisioning-extensions"><strong>provisioning-extensions</strong></a></h4>
|
|
<pre><code>All provider, taskserv, cluster extensions
|
|
├── providers/
|
|
│ ├── aws/
|
|
│ ├── upcloud/
|
|
│ └── local/
|
|
├── taskservs/
|
|
│ ├── kubernetes/
|
|
│ ├── containerd/
|
|
│ ├── postgres/
|
|
│ └── (50+ more)
|
|
└── clusters/
|
|
├── buildkit/
|
|
├── web/
|
|
└── (10+ more)
|
|
</code></pre>
|
|
<p><strong>Distribution</strong>: Each extension as separate OCI artifact</p>
|
|
<ul>
|
|
<li><code>oci://registry/provisioning-extensions/kubernetes:1.28.0</code></li>
|
|
<li><code>oci://registry/provisioning-extensions/aws:2.0.0</code></li>
|
|
</ul>
|
|
<h4 id="provisioning-platform"><a class="header" href="#provisioning-platform"><strong>provisioning-platform</strong></a></h4>
|
|
<pre><code>Platform services
|
|
├── orchestrator/ (Rust)
|
|
├── control-center/ (Rust/Yew)
|
|
├── mcp-server/ (Rust)
|
|
└── api-gateway/ (Rust)
|
|
</code></pre>
|
|
<p><strong>Distribution</strong>: Docker images in OCI registry</p>
|
|
<ul>
|
|
<li><code>oci://registry/provisioning-platform/orchestrator:v1.2.0</code></li>
|
|
</ul>
|
|
<hr />
|
|
<h2 id="component-architecture"><a class="header" href="#component-architecture">Component Architecture</a></h2>
|
|
<h3 id="core-components"><a class="header" href="#core-components">Core Components</a></h3>
|
|
<h4 id="1-cli-interface-nushell"><a class="header" href="#1-cli-interface-nushell">1. <strong>CLI Interface</strong> (Nushell)</a></h4>
|
|
<p><strong>Location</strong>: <code>provisioning/core/cli/provisioning</code></p>
|
|
<p><strong>Purpose</strong>: Primary user interface for all provisioning operations</p>
|
|
<p><strong>Architecture</strong>:</p>
|
|
<pre><code>Main CLI (211 lines)
|
|
↓
|
|
Command Dispatcher (264 lines)
|
|
↓
|
|
Domain Handlers (7 modules)
|
|
├── infrastructure.nu (117 lines)
|
|
├── orchestration.nu (64 lines)
|
|
├── development.nu (72 lines)
|
|
├── workspace.nu (56 lines)
|
|
├── generation.nu (78 lines)
|
|
├── utilities.nu (157 lines)
|
|
└── configuration.nu (316 lines)
|
|
</code></pre>
|
|
<p><strong>Key Features</strong>:</p>
|
|
<ul>
|
|
<li>80+ command shortcuts</li>
|
|
<li>Bi-directional help system</li>
|
|
<li>Centralized flag handling</li>
|
|
<li>Domain-driven design</li>
|
|
</ul>
|
|
<h4 id="2-configuration-system-kcl--toml"><a class="header" href="#2-configuration-system-kcl--toml">2. <strong>Configuration System</strong> (KCL + TOML)</a></h4>
|
|
<p><strong>Hierarchical Loading</strong>:</p>
|
|
<pre><code>1. System defaults (config.defaults.toml)
|
|
2. User config (~/.provisioning/config.user.toml)
|
|
3. Workspace config (workspace/config/provisioning.yaml)
|
|
4. Environment config (workspace/config/{env}-defaults.toml)
|
|
5. Infrastructure config (workspace/infra/{name}/config.toml)
|
|
6. Runtime overrides (CLI flags, ENV variables)
|
|
</code></pre>
|
|
<p><strong>Variable Interpolation</strong>:</p>
|
|
<ul>
|
|
<li><code>{{paths.base}}</code> - Path references</li>
|
|
<li><code>{{env.HOME}}</code> - Environment variables</li>
|
|
<li><code>{{now.date}}</code> - Dynamic values</li>
|
|
<li><code>{{git.branch}}</code> - Git context</li>
|
|
</ul>
|
|
<h4 id="3-orchestrator-rust"><a class="header" href="#3-orchestrator-rust">3. <strong>Orchestrator</strong> (Rust)</a></h4>
|
|
<p><strong>Location</strong>: <code>provisioning/platform/orchestrator/</code></p>
|
|
<p><strong>Architecture</strong>:</p>
|
|
<pre><code class="language-rust">src/
|
|
├── main.rs // Entry point
|
|
├── api/
|
|
│ ├── routes.rs // HTTP routes
|
|
│ ├── workflows.rs // Workflow endpoints
|
|
│ └── batch.rs // Batch endpoints
|
|
├── workflow/
|
|
│ ├── engine.rs // Workflow execution
|
|
│ ├── state.rs // State management
|
|
│ └── checkpoint.rs // Checkpoint/recovery
|
|
├── task_queue/
|
|
│ ├── queue.rs // File-based queue
|
|
│ ├── priority.rs // Priority scheduling
|
|
│ └── retry.rs // Retry logic
|
|
├── health/
|
|
│ └── monitor.rs // Health checks
|
|
├── nushell/
|
|
│ └── bridge.rs // Nu execution bridge
|
|
└── test_environment/ // Test env management
|
|
├── container_manager.rs
|
|
├── test_orchestrator.rs
|
|
└── topologies.rs</code></pre>
|
|
<p><strong>Key Features</strong>:</p>
|
|
<ul>
|
|
<li>File-based task queue (reliable, simple)</li>
|
|
<li>Checkpoint-based recovery</li>
|
|
<li>Priority scheduling</li>
|
|
<li>REST API (HTTP/WebSocket)</li>
|
|
<li>Nushell script execution bridge</li>
|
|
</ul>
|
|
<h4 id="4-workflow-engine-nushell"><a class="header" href="#4-workflow-engine-nushell">4. <strong>Workflow Engine</strong> (Nushell)</a></h4>
|
|
<p><strong>Location</strong>: <code>provisioning/core/nulib/workflows/</code></p>
|
|
<p><strong>Workflow Types</strong>:</p>
|
|
<pre><code>workflows/
|
|
├── server_create.nu // Server provisioning
|
|
├── taskserv.nu // Task service management
|
|
├── cluster.nu // Cluster deployment
|
|
├── batch.nu // Batch operations
|
|
└── management.nu // Workflow monitoring
|
|
</code></pre>
|
|
<p><strong>Batch Workflow Features</strong>:</p>
|
|
<ul>
|
|
<li>Provider-agnostic (mix AWS, UpCloud, local)</li>
|
|
<li>Dependency resolution (hard/soft dependencies)</li>
|
|
<li>Parallel execution (configurable limits)</li>
|
|
<li>Rollback support</li>
|
|
<li>Real-time monitoring</li>
|
|
</ul>
|
|
<h4 id="5-extension-system"><a class="header" href="#5-extension-system">5. <strong>Extension System</strong></a></h4>
|
|
<p><strong>Extension Types</strong>:</p>
|
|
<div class="table-wrapper"><table><thead><tr><th>Type</th><th>Count</th><th>Purpose</th><th>Example</th></tr></thead><tbody>
|
|
<tr><td><strong>Providers</strong></td><td>3</td><td>Cloud platform integration</td><td>AWS, UpCloud, Local</td></tr>
|
|
<tr><td><strong>Task Services</strong></td><td>50+</td><td>Infrastructure components</td><td>Kubernetes, Postgres</td></tr>
|
|
<tr><td><strong>Clusters</strong></td><td>10+</td><td>Complete configurations</td><td>Buildkit, Web cluster</td></tr>
|
|
</tbody></table>
|
|
</div>
|
|
<p><strong>Extension Structure</strong>:</p>
|
|
<pre><code>extension-name/
|
|
├── kcl/
|
|
│ ├── kcl.mod // KCL dependencies
|
|
│ ├── {name}.k // Main schema
|
|
│ ├── version.k // Version management
|
|
│ └── dependencies.k // Dependencies
|
|
├── scripts/
|
|
│ ├── install.nu // Installation logic
|
|
│ ├── check.nu // Health check
|
|
│ └── uninstall.nu // Cleanup
|
|
├── templates/ // Config templates
|
|
├── docs/ // Documentation
|
|
├── tests/ // Extension tests
|
|
└── manifest.yaml // Extension metadata
|
|
</code></pre>
|
|
<p><strong>OCI Distribution</strong>:
|
|
Each extension packaged as OCI artifact:</p>
|
|
<ul>
|
|
<li>KCL schemas</li>
|
|
<li>Nushell scripts</li>
|
|
<li>Templates</li>
|
|
<li>Documentation</li>
|
|
<li>Manifest</li>
|
|
</ul>
|
|
<h4 id="6-module-and-layer-system"><a class="header" href="#6-module-and-layer-system">6. <strong>Module and Layer System</strong></a></h4>
|
|
<p><strong>Module System</strong>:</p>
|
|
<pre><code class="language-bash"># Discover available extensions
|
|
provisioning module discover taskservs
|
|
|
|
# Load into workspace
|
|
provisioning module load taskserv my-workspace kubernetes containerd
|
|
|
|
# List loaded modules
|
|
provisioning module list taskserv my-workspace
|
|
</code></pre>
|
|
<p><strong>Layer System</strong> (Configuration Inheritance):</p>
|
|
<pre><code>Layer 1: Core (provisioning/extensions/{type}/{name})
|
|
↓
|
|
Layer 2: Workspace (workspace/extensions/{type}/{name})
|
|
↓
|
|
Layer 3: Infrastructure (workspace/infra/{infra}/extensions/{type}/{name})
|
|
</code></pre>
|
|
<p><strong>Resolution Priority</strong>: Infrastructure → Workspace → Core</p>
|
|
<h4 id="7-dependency-resolution"><a class="header" href="#7-dependency-resolution">7. <strong>Dependency Resolution</strong></a></h4>
|
|
<p><strong>Algorithm</strong>: Topological sort with cycle detection</p>
|
|
<p><strong>Features</strong>:</p>
|
|
<ul>
|
|
<li>Hard dependencies (must exist)</li>
|
|
<li>Soft dependencies (optional enhancement)</li>
|
|
<li>Conflict detection</li>
|
|
<li>Circular dependency prevention</li>
|
|
<li>Version compatibility checking</li>
|
|
</ul>
|
|
<p><strong>Example</strong>:</p>
|
|
<pre><code class="language-kcl">import provisioning.dependencies as schema
|
|
|
|
_dependencies = schema.TaskservDependencies {
|
|
name = "kubernetes"
|
|
version = "1.28.0"
|
|
requires = ["containerd", "etcd", "os"]
|
|
optional = ["cilium", "helm"]
|
|
conflicts = ["docker", "podman"]
|
|
}
|
|
</code></pre>
|
|
<h4 id="8-service-management"><a class="header" href="#8-service-management">8. <strong>Service Management</strong></a></h4>
|
|
<p><strong>Supported Services</strong>:</p>
|
|
<div class="table-wrapper"><table><thead><tr><th>Service</th><th>Type</th><th>Category</th><th>Purpose</th></tr></thead><tbody>
|
|
<tr><td>orchestrator</td><td>Platform</td><td>Orchestration</td><td>Workflow coordination</td></tr>
|
|
<tr><td>control-center</td><td>Platform</td><td>UI</td><td>Web management interface</td></tr>
|
|
<tr><td>coredns</td><td>Infrastructure</td><td>DNS</td><td>Local DNS resolution</td></tr>
|
|
<tr><td>gitea</td><td>Infrastructure</td><td>Git</td><td>Self-hosted Git service</td></tr>
|
|
<tr><td>oci-registry</td><td>Infrastructure</td><td>Registry</td><td>OCI artifact storage</td></tr>
|
|
<tr><td>mcp-server</td><td>Platform</td><td>API</td><td>Model Context Protocol</td></tr>
|
|
<tr><td>api-gateway</td><td>Platform</td><td>API</td><td>Unified API access</td></tr>
|
|
</tbody></table>
|
|
</div>
|
|
<p><strong>Lifecycle Management</strong>:</p>
|
|
<pre><code class="language-bash"># Start all auto-start services
|
|
provisioning platform start
|
|
|
|
# Start specific service (with dependencies)
|
|
provisioning platform start orchestrator
|
|
|
|
# Check health
|
|
provisioning platform health
|
|
|
|
# View logs
|
|
provisioning platform logs orchestrator --follow
|
|
</code></pre>
|
|
<h4 id="9-test-environment-service"><a class="header" href="#9-test-environment-service">9. <strong>Test Environment Service</strong></a></h4>
|
|
<p><strong>Architecture</strong>:</p>
|
|
<pre><code>User Command (CLI)
|
|
↓
|
|
Test Orchestrator (Rust)
|
|
↓
|
|
Container Manager (bollard)
|
|
↓
|
|
Docker API
|
|
↓
|
|
Isolated Test Containers
|
|
</code></pre>
|
|
<p><strong>Test Types</strong>:</p>
|
|
<ul>
|
|
<li>Single taskserv testing</li>
|
|
<li>Server simulation (multiple taskservs)</li>
|
|
<li>Multi-node cluster topologies</li>
|
|
</ul>
|
|
<p><strong>Topology Templates</strong>:</p>
|
|
<ul>
|
|
<li><code>kubernetes_3node</code> - 3-node HA cluster</li>
|
|
<li><code>kubernetes_single</code> - All-in-one K8s</li>
|
|
<li><code>etcd_cluster</code> - 3-node etcd</li>
|
|
<li><code>postgres_redis</code> - Database stack</li>
|
|
</ul>
|
|
<hr />
|
|
<h2 id="mode-architecture"><a class="header" href="#mode-architecture">Mode Architecture</a></h2>
|
|
<h3 id="mode-based-system-overview"><a class="header" href="#mode-based-system-overview">Mode-Based System Overview</a></h3>
|
|
<p>The platform supports four operational modes that adapt the system from individual development to enterprise production.</p>
|
|
<h3 id="mode-comparison"><a class="header" href="#mode-comparison">Mode Comparison</a></h3>
|
|
<pre><code>┌───────────────────────────────────────────────────────────────────────┐
|
|
│ MODE ARCHITECTURE │
|
|
├───────────────┬───────────────┬───────────────┬───────────────────────┤
|
|
│ SOLO │ MULTI-USER │ CI/CD │ ENTERPRISE │
|
|
├───────────────┼───────────────┼───────────────┼───────────────────────┤
|
|
│ │ │ │ │
|
|
│ Single Dev │ Team (5-20) │ Pipelines │ Production │
|
|
│ │ │ │ │
|
|
│ ┌─────────┐ │ ┌──────────┐ │ ┌──────────┐ │ ┌──────────────────┐ │
|
|
│ │ No Auth │ │ │Token(JWT)│ │ │Token(1h) │ │ │ mTLS (TLS 1.3) │ │
|
|
│ └─────────┘ │ └──────────┘ │ └──────────┘ │ └──────────────────┘ │
|
|
│ │ │ │ │
|
|
│ ┌─────────┐ │ ┌──────────┐ │ ┌──────────┐ │ ┌──────────────────┐ │
|
|
│ │ Local │ │ │ Remote │ │ │ Remote │ │ │ Kubernetes (HA) │ │
|
|
│ │ Binary │ │ │ Docker │ │ │ K8s │ │ │ Multi-AZ │ │
|
|
│ └─────────┘ │ └──────────┘ │ └──────────┘ │ └──────────────────┘ │
|
|
│ │ │ │ │
|
|
│ ┌─────────┐ │ ┌──────────┐ │ ┌──────────┐ │ ┌──────────────────┐ │
|
|
│ │ Local │ │ │ OCI (Zot)│ │ │OCI(Harbor│ │ │ OCI (Harbor HA) │ │
|
|
│ │ Files │ │ │ or Harbor│ │ │ required)│ │ │ + Replication │ │
|
|
│ └─────────┘ │ └──────────┘ │ └──────────┘ │ └──────────────────┘ │
|
|
│ │ │ │ │
|
|
│ ┌─────────┐ │ ┌──────────┐ │ ┌──────────┐ │ ┌──────────────────┐ │
|
|
│ │ None │ │ │ Gitea │ │ │ Disabled │ │ │ etcd (mandatory) │ │
|
|
│ │ │ │ │(optional)│ │ │ (stateless) │ │ │ │
|
|
│ └─────────┘ │ └──────────┘ │ └──────────┘ │ └──────────────────┘ │
|
|
│ │ │ │ │
|
|
│ Unlimited │ 10 srv, 32 │ 5 srv, 16 │ 20 srv, 64 cores │
|
|
│ │ cores, 128GB │ cores, 64GB │ 256GB per user │
|
|
│ │ │ │ │
|
|
└───────────────┴───────────────┴───────────────┴───────────────────────┘
|
|
</code></pre>
|
|
<h3 id="mode-configuration"><a class="header" href="#mode-configuration">Mode Configuration</a></h3>
|
|
<p><strong>Mode Templates</strong>: <code>workspace/config/modes/{mode}.yaml</code></p>
|
|
<p><strong>Active Mode</strong>: <code>~/.provisioning/config/active-mode.yaml</code></p>
|
|
<p><strong>Switching Modes</strong>:</p>
|
|
<pre><code class="language-bash"># Check current mode
|
|
provisioning mode current
|
|
|
|
# Switch to another mode
|
|
provisioning mode switch multi-user
|
|
|
|
# Validate mode requirements
|
|
provisioning mode validate enterprise
|
|
</code></pre>
|
|
<h3 id="mode-specific-workflows"><a class="header" href="#mode-specific-workflows">Mode-Specific Workflows</a></h3>
|
|
<h4 id="solo-mode"><a class="header" href="#solo-mode">Solo Mode</a></h4>
|
|
<pre><code class="language-bash"># 1. Default mode, no setup needed
|
|
provisioning workspace init
|
|
|
|
# 2. Start local orchestrator
|
|
provisioning platform start orchestrator
|
|
|
|
# 3. Create infrastructure
|
|
provisioning server create
|
|
</code></pre>
|
|
<h4 id="multi-user-mode"><a class="header" href="#multi-user-mode">Multi-User Mode</a></h4>
|
|
<pre><code class="language-bash"># 1. Switch mode and authenticate
|
|
provisioning mode switch multi-user
|
|
provisioning auth login
|
|
|
|
# 2. Lock workspace
|
|
provisioning workspace lock my-infra
|
|
|
|
# 3. Pull extensions from OCI
|
|
provisioning extension pull upcloud kubernetes
|
|
|
|
# 4. Work...
|
|
|
|
# 5. Unlock workspace
|
|
provisioning workspace unlock my-infra
|
|
</code></pre>
|
|
<h4 id="cicd-mode"><a class="header" href="#cicd-mode">CI/CD Mode</a></h4>
|
|
<pre><code class="language-yaml"># GitLab CI
|
|
deploy:
|
|
stage: deploy
|
|
script:
|
|
- export PROVISIONING_MODE=cicd
|
|
- echo "$TOKEN" > /var/run/secrets/provisioning/token
|
|
- provisioning validate --all
|
|
- provisioning test quick kubernetes
|
|
- provisioning server create --check
|
|
- provisioning server create
|
|
after_script:
|
|
- provisioning workspace cleanup
|
|
</code></pre>
|
|
<h4 id="enterprise-mode"><a class="header" href="#enterprise-mode">Enterprise Mode</a></h4>
|
|
<pre><code class="language-bash"># 1. Switch to enterprise, verify K8s
|
|
provisioning mode switch enterprise
|
|
kubectl get pods -n provisioning-system
|
|
|
|
# 2. Request workspace (approval required)
|
|
provisioning workspace request prod-deployment
|
|
|
|
# 3. After approval, lock with etcd
|
|
provisioning workspace lock prod-deployment --provider etcd
|
|
|
|
# 4. Pull verified extensions
|
|
provisioning extension pull upcloud --verify-signature
|
|
|
|
# 5. Deploy
|
|
provisioning infra create --check
|
|
provisioning infra create
|
|
|
|
# 6. Release
|
|
provisioning workspace unlock prod-deployment
|
|
</code></pre>
|
|
<hr />
|
|
<h2 id="network-architecture"><a class="header" href="#network-architecture">Network Architecture</a></h2>
|
|
<h3 id="service-communication"><a class="header" href="#service-communication">Service Communication</a></h3>
|
|
<pre><code>┌──────────────────────────────────────────────────────────────────────┐
|
|
│ NETWORK LAYER │
|
|
├──────────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌───────────────────────┐ ┌──────────────────────────┐ │
|
|
│ │ Ingress/Load │ │ API Gateway │ │
|
|
│ │ Balancer │──────────│ (Optional) │ │
|
|
│ └───────────────────────┘ └──────────────────────────┘ │
|
|
│ │ │ │
|
|
│ │ │ │
|
|
│ ┌───────────┴────────────────────────────────────┴──────────┐ │
|
|
│ │ Service Mesh (Optional) │ │
|
|
│ │ (mTLS, Circuit Breaking, Retries) │ │
|
|
│ └────┬──────────┬───────────┬────────────┬──────────────┬───┘ │
|
|
│ │ │ │ │ │ │
|
|
│ ┌────┴─────┐ ┌─┴────────┐ ┌┴─────────┐ ┌┴──────────┐ ┌┴───────┐ │
|
|
│ │ Orchestr │ │ Control │ │ CoreDNS │ │ Gitea │ │ OCI │ │
|
|
│ │ ator │ │ Center │ │ │ │ │ │Registry│ │
|
|
│ │ │ │ │ │ │ │ │ │ │ │
|
|
│ │ :9090 │ │ :3000 │ │ :5353 │ │ :3001 │ │ :5000 │ │
|
|
│ └──────────┘ └──────────┘ └──────────┘ └───────────┘ └────────┘ │
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────────┐ │
|
|
│ │ DNS Resolution (CoreDNS) │ │
|
|
│ │ • *.prov.local → Internal services │ │
|
|
│ │ • *.infra.local → Infrastructure nodes │ │
|
|
│ └────────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
└──────────────────────────────────────────────────────────────────────┘
|
|
</code></pre>
|
|
<h3 id="port-allocation"><a class="header" href="#port-allocation">Port Allocation</a></h3>
|
|
<div class="table-wrapper"><table><thead><tr><th>Service</th><th>Port</th><th>Protocol</th><th>Purpose</th></tr></thead><tbody>
|
|
<tr><td>Orchestrator</td><td>8080</td><td>HTTP/WS</td><td>REST API, WebSocket</td></tr>
|
|
<tr><td>Control Center</td><td>3000</td><td>HTTP</td><td>Web UI</td></tr>
|
|
<tr><td>CoreDNS</td><td>5353</td><td>UDP/TCP</td><td>DNS resolution</td></tr>
|
|
<tr><td>Gitea</td><td>3001</td><td>HTTP</td><td>Git operations</td></tr>
|
|
<tr><td>OCI Registry (Zot)</td><td>5000</td><td>HTTP</td><td>OCI artifacts</td></tr>
|
|
<tr><td>OCI Registry (Harbor)</td><td>443</td><td>HTTPS</td><td>OCI artifacts (prod)</td></tr>
|
|
<tr><td>MCP Server</td><td>8081</td><td>HTTP</td><td>MCP protocol</td></tr>
|
|
<tr><td>API Gateway</td><td>8082</td><td>HTTP</td><td>Unified API</td></tr>
|
|
</tbody></table>
|
|
</div>
|
|
<h3 id="network-security"><a class="header" href="#network-security">Network Security</a></h3>
|
|
<p><strong>Solo Mode</strong>:</p>
|
|
<ul>
|
|
<li>Localhost-only bindings</li>
|
|
<li>No authentication</li>
|
|
<li>No encryption</li>
|
|
</ul>
|
|
<p><strong>Multi-User Mode</strong>:</p>
|
|
<ul>
|
|
<li>Token-based authentication (JWT)</li>
|
|
<li>TLS for external access</li>
|
|
<li>Firewall rules</li>
|
|
</ul>
|
|
<p><strong>CI/CD Mode</strong>:</p>
|
|
<ul>
|
|
<li>Token authentication (short-lived)</li>
|
|
<li>Full TLS encryption</li>
|
|
<li>Network isolation</li>
|
|
</ul>
|
|
<p><strong>Enterprise Mode</strong>:</p>
|
|
<ul>
|
|
<li>mTLS for all connections</li>
|
|
<li>Network policies (Kubernetes)</li>
|
|
<li>Zero-trust networking</li>
|
|
<li>Audit logging</li>
|
|
</ul>
|
|
<hr />
|
|
<h2 id="data-architecture"><a class="header" href="#data-architecture">Data Architecture</a></h2>
|
|
<h3 id="data-storage"><a class="header" href="#data-storage">Data Storage</a></h3>
|
|
<pre><code>┌────────────────────────────────────────────────────────────────┐
|
|
│ DATA LAYER │
|
|
├────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────┐ │
|
|
│ │ Configuration Data (Hierarchical) │ │
|
|
│ │ │ │
|
|
│ │ ~/.provisioning/ │ │
|
|
│ │ ├── config.user.toml (User preferences) │ │
|
|
│ │ └── config/ │ │
|
|
│ │ ├── active-mode.yaml (Active mode) │ │
|
|
│ │ └── user_config.yaml (Workspaces, preferences) │ │
|
|
│ │ │ │
|
|
│ │ workspace/ │ │
|
|
│ │ ├── config/ │ │
|
|
│ │ │ ├── provisioning.yaml (Workspace config) │ │
|
|
│ │ │ └── modes/*.yaml (Mode templates) │ │
|
|
│ │ └── infra/{name}/ │ │
|
|
│ │ ├── settings.k (Infrastructure KCL) │ │
|
|
│ │ └── config.toml (Infra-specific) │ │
|
|
│ └─────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────┐ │
|
|
│ │ State Data (Runtime) │ │
|
|
│ │ │ │
|
|
│ │ ~/.provisioning/orchestrator/data/ │ │
|
|
│ │ ├── tasks/ (Task queue) │ │
|
|
│ │ ├── workflows/ (Workflow state) │ │
|
|
│ │ └── checkpoints/ (Recovery points) │ │
|
|
│ │ │ │
|
|
│ │ ~/.provisioning/services/ │ │
|
|
│ │ ├── pids/ (Process IDs) │ │
|
|
│ │ ├── logs/ (Service logs) │ │
|
|
│ │ └── state/ (Service state) │ │
|
|
│ └─────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────┐ │
|
|
│ │ Cache Data (Performance) │ │
|
|
│ │ │ │
|
|
│ │ ~/.provisioning/cache/ │ │
|
|
│ │ ├── oci/ (OCI artifacts) │ │
|
|
│ │ ├── kcl/ (Compiled KCL) │ │
|
|
│ │ └── modules/ (Module cache) │ │
|
|
│ └─────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────┐ │
|
|
│ │ Extension Data (OCI Artifacts) │ │
|
|
│ │ │ │
|
|
│ │ OCI Registry (localhost:5000 or harbor.company.com) │ │
|
|
│ │ ├── provisioning-core:v3.5.0 │ │
|
|
│ │ ├── provisioning-extensions/ │ │
|
|
│ │ │ ├── kubernetes:1.28.0 │ │
|
|
│ │ │ ├── aws:2.0.0 │ │
|
|
│ │ │ └── (100+ artifacts) │ │
|
|
│ │ └── provisioning-platform/ │ │
|
|
│ │ ├── orchestrator:v1.2.0 │ │
|
|
│ │ └── (4 service images) │ │
|
|
│ └─────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────┐ │
|
|
│ │ Secrets (Encrypted) │ │
|
|
│ │ │ │
|
|
│ │ workspace/secrets/ │ │
|
|
│ │ ├── keys.yaml.enc (SOPS-encrypted) │ │
|
|
│ │ ├── ssh-keys/ (SSH keys) │ │
|
|
│ │ └── tokens/ (API tokens) │ │
|
|
│ │ │ │
|
|
│ │ KMS Integration (Enterprise): │ │
|
|
│ │ • AWS KMS │ │
|
|
│ │ • HashiCorp Vault │ │
|
|
│ │ • Age encryption (local) │ │
|
|
│ └─────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
└────────────────────────────────────────────────────────────────┘
|
|
</code></pre>
|
|
<h3 id="data-flow"><a class="header" href="#data-flow">Data Flow</a></h3>
|
|
<p><strong>Configuration Loading</strong>:</p>
|
|
<pre><code>1. Load system defaults (config.defaults.toml)
|
|
2. Merge user config (~/.provisioning/config.user.toml)
|
|
3. Load workspace config (workspace/config/provisioning.yaml)
|
|
4. Load environment config (workspace/config/{env}-defaults.toml)
|
|
5. Load infrastructure config (workspace/infra/{name}/config.toml)
|
|
6. Apply runtime overrides (ENV variables, CLI flags)
|
|
</code></pre>
|
|
<p><strong>State Persistence</strong>:</p>
|
|
<pre><code>Workflow execution
|
|
↓
|
|
Create checkpoint (JSON)
|
|
↓
|
|
Save to ~/.provisioning/orchestrator/data/checkpoints/
|
|
↓
|
|
On failure, load checkpoint and resume
|
|
</code></pre>
|
|
<p><strong>OCI Artifact Flow</strong>:</p>
|
|
<pre><code>1. Package extension (oci-package.nu)
|
|
2. Push to OCI registry (provisioning oci push)
|
|
3. Extension stored as OCI artifact
|
|
4. Pull when needed (provisioning oci pull)
|
|
5. Cache locally (~/.provisioning/cache/oci/)
|
|
</code></pre>
|
|
<hr />
|
|
<h2 id="security-architecture"><a class="header" href="#security-architecture">Security Architecture</a></h2>
|
|
<h3 id="security-layers"><a class="header" href="#security-layers">Security Layers</a></h3>
|
|
<pre><code>┌─────────────────────────────────────────────────────────────────┐
|
|
│ SECURITY ARCHITECTURE │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────┐ │
|
|
│ │ Layer 1: Authentication & Authorization │ │
|
|
│ │ │ │
|
|
│ │ Solo: None (local development) │ │
|
|
│ │ Multi-user: JWT tokens (24h expiry) │ │
|
|
│ │ CI/CD: CI-injected tokens (1h expiry) │ │
|
|
│ │ Enterprise: mTLS (TLS 1.3, mutual auth) │ │
|
|
│ └────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────┐ │
|
|
│ │ Layer 2: Encryption │ │
|
|
│ │ │ │
|
|
│ │ In Transit: │ │
|
|
│ │ • TLS 1.3 (multi-user, CI/CD, enterprise) │ │
|
|
│ │ • mTLS (enterprise) │ │
|
|
│ │ │ │
|
|
│ │ At Rest: │ │
|
|
│ │ • SOPS + Age (secrets encryption) │ │
|
|
│ │ • KMS integration (CI/CD, enterprise) │ │
|
|
│ │ • Encrypted filesystems (enterprise) │ │
|
|
│ └────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────┐ │
|
|
│ │ Layer 3: Secret Management │ │
|
|
│ │ │ │
|
|
│ │ • SOPS for file encryption │ │
|
|
│ │ • Age for key management │ │
|
|
│ │ • KMS integration (AWS KMS, Vault) │ │
|
|
│ │ • SSH key storage (KMS-backed) │ │
|
|
│ │ • API token management │ │
|
|
│ └────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────┐ │
|
|
│ │ Layer 4: Access Control │ │
|
|
│ │ │ │
|
|
│ │ • RBAC (Role-Based Access Control) │ │
|
|
│ │ • Workspace isolation │ │
|
|
│ │ • Workspace locking (Gitea, etcd) │ │
|
|
│ │ • Resource quotas (per-user limits) │ │
|
|
│ └────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────┐ │
|
|
│ │ Layer 5: Network Security │ │
|
|
│ │ │ │
|
|
│ │ • Network policies (Kubernetes) │ │
|
|
│ │ • Firewall rules │ │
|
|
│ │ • Zero-trust networking (enterprise) │ │
|
|
│ │ • Service mesh (optional, mTLS) │ │
|
|
│ └────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌────────────────────────────────────────────────────────┐ │
|
|
│ │ Layer 6: Audit & Compliance │ │
|
|
│ │ │ │
|
|
│ │ • Audit logs (all operations) │ │
|
|
│ │ • Compliance policies (SOC2, ISO27001) │ │
|
|
│ │ • Image signing (cosign, notation) │ │
|
|
│ │ • Vulnerability scanning (Harbor) │ │
|
|
│ └────────────────────────────────────────────────────────┘ │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
</code></pre>
|
|
<h3 id="secret-management"><a class="header" href="#secret-management">Secret Management</a></h3>
|
|
<p><strong>SOPS Integration</strong>:</p>
|
|
<pre><code class="language-bash"># Edit encrypted file
|
|
provisioning sops workspace/secrets/keys.yaml.enc
|
|
|
|
# Encryption happens automatically on save
|
|
# Decryption happens automatically on load
|
|
</code></pre>
|
|
<p><strong>KMS Integration</strong> (Enterprise):</p>
|
|
<pre><code class="language-yaml"># workspace/config/provisioning.yaml
|
|
secrets:
|
|
provider: "kms"
|
|
kms:
|
|
type: "aws" # or "vault"
|
|
region: "us-east-1"
|
|
key_id: "arn:aws:kms:..."
|
|
</code></pre>
|
|
<h3 id="image-signing-and-verification"><a class="header" href="#image-signing-and-verification">Image Signing and Verification</a></h3>
|
|
<p><strong>CI/CD Mode</strong> (Required):</p>
|
|
<pre><code class="language-bash"># Sign OCI artifact
|
|
cosign sign oci://registry/kubernetes:1.28.0
|
|
|
|
# Verify signature
|
|
cosign verify oci://registry/kubernetes:1.28.0
|
|
</code></pre>
|
|
<p><strong>Enterprise Mode</strong> (Mandatory):</p>
|
|
<pre><code class="language-bash"># Pull with verification
|
|
provisioning extension pull kubernetes --verify-signature
|
|
|
|
# System blocks unsigned artifacts
|
|
</code></pre>
|
|
<hr />
|
|
<h2 id="deployment-architecture"><a class="header" href="#deployment-architecture">Deployment Architecture</a></h2>
|
|
<h3 id="deployment-modes"><a class="header" href="#deployment-modes">Deployment Modes</a></h3>
|
|
<h4 id="1-binary-deployment-solo-multi-user"><a class="header" href="#1-binary-deployment-solo-multi-user">1. <strong>Binary Deployment</strong> (Solo, Multi-user)</a></h4>
|
|
<pre><code>User Machine
|
|
├── ~/.provisioning/bin/
|
|
│ ├── provisioning-orchestrator
|
|
│ ├── provisioning-control-center
|
|
│ └── ...
|
|
├── ~/.provisioning/orchestrator/data/
|
|
├── ~/.provisioning/services/
|
|
└── Process Management (PID files, logs)
|
|
</code></pre>
|
|
<p><strong>Pros</strong>: Simple, fast startup, no Docker dependency
|
|
<strong>Cons</strong>: Platform-specific binaries, manual updates</p>
|
|
<h4 id="2-docker-deployment-multi-user-cicd"><a class="header" href="#2-docker-deployment-multi-user-cicd">2. <strong>Docker Deployment</strong> (Multi-user, CI/CD)</a></h4>
|
|
<pre><code>Docker Daemon
|
|
├── Container: provisioning-orchestrator
|
|
├── Container: provisioning-control-center
|
|
├── Container: provisioning-coredns
|
|
├── Container: provisioning-gitea
|
|
├── Container: provisioning-oci-registry
|
|
└── Volumes: ~/.provisioning/data/
|
|
</code></pre>
|
|
<p><strong>Pros</strong>: Consistent environment, easy updates
|
|
<strong>Cons</strong>: Requires Docker, resource overhead</p>
|
|
<h4 id="3-docker-compose-deployment-multi-user"><a class="header" href="#3-docker-compose-deployment-multi-user">3. <strong>Docker Compose Deployment</strong> (Multi-user)</a></h4>
|
|
<pre><code class="language-yaml"># provisioning/platform/docker-compose.yaml
|
|
services:
|
|
orchestrator:
|
|
image: provisioning-platform/orchestrator:v1.2.0
|
|
ports:
|
|
- "8080:9090"
|
|
volumes:
|
|
- orchestrator-data:/data
|
|
|
|
control-center:
|
|
image: provisioning-platform/control-center:v1.2.0
|
|
ports:
|
|
- "3000:3000"
|
|
depends_on:
|
|
- orchestrator
|
|
|
|
coredns:
|
|
image: coredns/coredns:1.11.1
|
|
ports:
|
|
- "5353:53/udp"
|
|
|
|
gitea:
|
|
image: gitea/gitea:1.20
|
|
ports:
|
|
- "3001:3000"
|
|
|
|
oci-registry:
|
|
image: ghcr.io/project-zot/zot:latest
|
|
ports:
|
|
- "5000:5000"
|
|
</code></pre>
|
|
<p><strong>Pros</strong>: Easy multi-service orchestration, declarative
|
|
<strong>Cons</strong>: Local only, no HA</p>
|
|
<h4 id="4-kubernetes-deployment-cicd-enterprise"><a class="header" href="#4-kubernetes-deployment-cicd-enterprise">4. <strong>Kubernetes Deployment</strong> (CI/CD, Enterprise)</a></h4>
|
|
<pre><code class="language-yaml"># Namespace: provisioning-system
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: orchestrator
|
|
spec:
|
|
replicas: 3 # HA
|
|
selector:
|
|
matchLabels:
|
|
app: orchestrator
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: orchestrator
|
|
spec:
|
|
containers:
|
|
- name: orchestrator
|
|
image: harbor.company.com/provisioning-platform/orchestrator:v1.2.0
|
|
ports:
|
|
- containerPort: 8080
|
|
env:
|
|
- name: RUST_LOG
|
|
value: "info"
|
|
volumeMounts:
|
|
- name: data
|
|
mountPath: /data
|
|
livenessProbe:
|
|
httpGet:
|
|
path: /health
|
|
port: 8080
|
|
readinessProbe:
|
|
httpGet:
|
|
path: /health
|
|
port: 8080
|
|
volumes:
|
|
- name: data
|
|
persistentVolumeClaim:
|
|
claimName: orchestrator-data
|
|
</code></pre>
|
|
<p><strong>Pros</strong>: HA, scalability, production-ready
|
|
<strong>Cons</strong>: Complex setup, Kubernetes required</p>
|
|
<h4 id="5-remote-deployment-all-modes"><a class="header" href="#5-remote-deployment-all-modes">5. <strong>Remote Deployment</strong> (All modes)</a></h4>
|
|
<pre><code class="language-yaml"># Connect to remotely-running services
|
|
services:
|
|
orchestrator:
|
|
deployment:
|
|
mode: "remote"
|
|
remote:
|
|
endpoint: "https://orchestrator.company.com"
|
|
tls_enabled: true
|
|
auth_token_path: "~/.provisioning/tokens/orchestrator.token"
|
|
</code></pre>
|
|
<p><strong>Pros</strong>: No local resources, centralized
|
|
<strong>Cons</strong>: Network dependency, latency</p>
|
|
<hr />
|
|
<h2 id="integration-architecture"><a class="header" href="#integration-architecture">Integration Architecture</a></h2>
|
|
<h3 id="integration-patterns"><a class="header" href="#integration-patterns">Integration Patterns</a></h3>
|
|
<h4 id="1-hybrid-language-integration-rust--nushell"><a class="header" href="#1-hybrid-language-integration-rust--nushell">1. <strong>Hybrid Language Integration</strong> (Rust ↔ Nushell)</a></h4>
|
|
<pre><code>Rust Orchestrator
|
|
↓ (HTTP API)
|
|
Nushell CLI
|
|
↓ (exec via bridge)
|
|
Nushell Business Logic
|
|
↓ (returns JSON)
|
|
Rust Orchestrator
|
|
↓ (updates state)
|
|
File-based Task Queue
|
|
</code></pre>
|
|
<p><strong>Communication</strong>: HTTP API + stdin/stdout JSON</p>
|
|
<h4 id="2-provider-abstraction"><a class="header" href="#2-provider-abstraction">2. <strong>Provider Abstraction</strong></a></h4>
|
|
<pre><code>Unified Provider Interface
|
|
├── create_server(config) -> Server
|
|
├── delete_server(id) -> bool
|
|
├── list_servers() -> [Server]
|
|
└── get_server_status(id) -> Status
|
|
|
|
Provider Implementations:
|
|
├── AWS Provider (aws-sdk-rust, aws cli)
|
|
├── UpCloud Provider (upcloud API)
|
|
└── Local Provider (Docker, libvirt)
|
|
</code></pre>
|
|
<h4 id="3-oci-registry-integration"><a class="header" href="#3-oci-registry-integration">3. <strong>OCI Registry Integration</strong></a></h4>
|
|
<pre><code>Extension Development
|
|
↓
|
|
Package (oci-package.nu)
|
|
↓
|
|
Push (provisioning oci push)
|
|
↓
|
|
OCI Registry (Zot/Harbor)
|
|
↓
|
|
Pull (provisioning oci pull)
|
|
↓
|
|
Cache (~/.provisioning/cache/oci/)
|
|
↓
|
|
Load into Workspace
|
|
</code></pre>
|
|
<h4 id="4-gitea-integration-multi-user-enterprise"><a class="header" href="#4-gitea-integration-multi-user-enterprise">4. <strong>Gitea Integration</strong> (Multi-user, Enterprise)</a></h4>
|
|
<pre><code>Workspace Operations
|
|
↓
|
|
Check Lock Status (Gitea API)
|
|
↓
|
|
Acquire Lock (Create lock file in Git)
|
|
↓
|
|
Perform Changes
|
|
↓
|
|
Commit + Push
|
|
↓
|
|
Release Lock (Delete lock file)
|
|
</code></pre>
|
|
<p><strong>Benefits</strong>:</p>
|
|
<ul>
|
|
<li>Distributed locking</li>
|
|
<li>Change tracking via Git history</li>
|
|
<li>Collaboration features</li>
|
|
</ul>
|
|
<h4 id="5-coredns-integration"><a class="header" href="#5-coredns-integration">5. <strong>CoreDNS Integration</strong></a></h4>
|
|
<pre><code>Service Registration
|
|
↓
|
|
Update CoreDNS Corefile
|
|
↓
|
|
Reload CoreDNS
|
|
↓
|
|
DNS Resolution Available
|
|
|
|
Zones:
|
|
├── *.prov.local (Internal services)
|
|
├── *.infra.local (Infrastructure nodes)
|
|
└── *.test.local (Test environments)
|
|
</code></pre>
|
|
<hr />
|
|
<h2 id="performance-and-scalability"><a class="header" href="#performance-and-scalability">Performance and Scalability</a></h2>
|
|
<h3 id="performance-characteristics"><a class="header" href="#performance-characteristics">Performance Characteristics</a></h3>
|
|
<div class="table-wrapper"><table><thead><tr><th>Metric</th><th>Value</th><th>Notes</th></tr></thead><tbody>
|
|
<tr><td><strong>CLI Startup Time</strong></td><td>< 100ms</td><td>Nushell cold start</td></tr>
|
|
<tr><td><strong>CLI Response Time</strong></td><td>< 50ms</td><td>Most commands</td></tr>
|
|
<tr><td><strong>Workflow Submission</strong></td><td>< 200ms</td><td>To orchestrator</td></tr>
|
|
<tr><td><strong>Task Processing</strong></td><td>10-50/sec</td><td>Orchestrator throughput</td></tr>
|
|
<tr><td><strong>Batch Operations</strong></td><td>Up to 100 servers</td><td>Parallel execution</td></tr>
|
|
<tr><td><strong>OCI Pull Time</strong></td><td>1-5s</td><td>Cached: <100ms</td></tr>
|
|
<tr><td><strong>Configuration Load</strong></td><td>< 500ms</td><td>Full hierarchy</td></tr>
|
|
<tr><td><strong>Health Check Interval</strong></td><td>10s</td><td>Configurable</td></tr>
|
|
</tbody></table>
|
|
</div>
|
|
<h3 id="scalability-limits"><a class="header" href="#scalability-limits">Scalability Limits</a></h3>
|
|
<p><strong>Solo Mode</strong>:</p>
|
|
<ul>
|
|
<li>Unlimited local resources</li>
|
|
<li>Limited by machine capacity</li>
|
|
</ul>
|
|
<p><strong>Multi-User Mode</strong>:</p>
|
|
<ul>
|
|
<li>10 servers per user</li>
|
|
<li>32 cores, 128GB RAM per user</li>
|
|
<li>5-20 concurrent users</li>
|
|
</ul>
|
|
<p><strong>CI/CD Mode</strong>:</p>
|
|
<ul>
|
|
<li>5 servers per pipeline</li>
|
|
<li>16 cores, 64GB RAM per pipeline</li>
|
|
<li>100+ concurrent pipelines</li>
|
|
</ul>
|
|
<p><strong>Enterprise Mode</strong>:</p>
|
|
<ul>
|
|
<li>20 servers per user</li>
|
|
<li>64 cores, 256GB RAM per user</li>
|
|
<li>1000+ concurrent users</li>
|
|
<li>Horizontal scaling via Kubernetes</li>
|
|
</ul>
|
|
<h3 id="optimization-strategies"><a class="header" href="#optimization-strategies">Optimization Strategies</a></h3>
|
|
<p><strong>Caching</strong>:</p>
|
|
<ul>
|
|
<li>OCI artifacts cached locally</li>
|
|
<li>KCL compilation cached</li>
|
|
<li>Module resolution cached</li>
|
|
</ul>
|
|
<p><strong>Parallel Execution</strong>:</p>
|
|
<ul>
|
|
<li>Batch operations with configurable limits</li>
|
|
<li>Dependency-aware parallel starts</li>
|
|
<li>Workflow DAG execution</li>
|
|
</ul>
|
|
<p><strong>Incremental Operations</strong>:</p>
|
|
<ul>
|
|
<li>Only update changed resources</li>
|
|
<li>Checkpoint-based recovery</li>
|
|
<li>Delta synchronization</li>
|
|
</ul>
|
|
<hr />
|
|
<h2 id="evolution-and-roadmap"><a class="header" href="#evolution-and-roadmap">Evolution and Roadmap</a></h2>
|
|
<h3 id="version-history"><a class="header" href="#version-history">Version History</a></h3>
|
|
<div class="table-wrapper"><table><thead><tr><th>Version</th><th>Date</th><th>Major Features</th></tr></thead><tbody>
|
|
<tr><td><strong>v3.5.0</strong></td><td>2025-10-06</td><td>Mode system, OCI distribution, comprehensive docs</td></tr>
|
|
<tr><td><strong>v3.4.0</strong></td><td>2025-10-06</td><td>Test environment service</td></tr>
|
|
<tr><td><strong>v3.3.0</strong></td><td>2025-09-30</td><td>Interactive guides</td></tr>
|
|
<tr><td><strong>v3.2.0</strong></td><td>2025-09-30</td><td>Modular CLI refactoring</td></tr>
|
|
<tr><td><strong>v3.1.0</strong></td><td>2025-09-25</td><td>Batch workflow system</td></tr>
|
|
<tr><td><strong>v3.0.0</strong></td><td>2025-09-25</td><td>Hybrid orchestrator</td></tr>
|
|
<tr><td><strong>v2.0.5</strong></td><td>2025-10-02</td><td>Workspace switching</td></tr>
|
|
<tr><td><strong>v2.0.0</strong></td><td>2025-09-23</td><td>Configuration migration</td></tr>
|
|
</tbody></table>
|
|
</div>
|
|
<h3 id="roadmap-future-versions"><a class="header" href="#roadmap-future-versions">Roadmap (Future Versions)</a></h3>
|
|
<p><strong>v3.6.0</strong> (Q1 2026):</p>
|
|
<ul>
|
|
<li>GraphQL API</li>
|
|
<li>Advanced RBAC</li>
|
|
<li>Multi-tenancy</li>
|
|
<li>Observability enhancements (OpenTelemetry)</li>
|
|
</ul>
|
|
<p><strong>v4.0.0</strong> (Q2 2026):</p>
|
|
<ul>
|
|
<li>Multi-repository split complete</li>
|
|
<li>Extension marketplace</li>
|
|
<li>Advanced workflow features (conditional execution, loops)</li>
|
|
<li>Cost optimization engine</li>
|
|
</ul>
|
|
<p><strong>v4.1.0</strong> (Q3 2026):</p>
|
|
<ul>
|
|
<li>AI-assisted infrastructure generation</li>
|
|
<li>Policy-as-code (OPA integration)</li>
|
|
<li>Advanced compliance features</li>
|
|
</ul>
|
|
<p><strong>Long-term Vision</strong>:</p>
|
|
<ul>
|
|
<li>Serverless workflow execution</li>
|
|
<li>Edge computing support</li>
|
|
<li>Multi-cloud failover</li>
|
|
<li>Self-healing infrastructure</li>
|
|
</ul>
|
|
<hr />
|
|
<h2 id="related-documentation"><a class="header" href="#related-documentation">Related Documentation</a></h2>
|
|
<h3 id="architecture"><a class="header" href="#architecture">Architecture</a></h3>
|
|
<ul>
|
|
<li><strong><a href="MULTI_REPO_ARCHITECTURE.html">Multi-Repo Architecture</a></strong> - Repository organization</li>
|
|
<li><strong><a href="design-principles.html">Design Principles</a></strong> - Architectural philosophy</li>
|
|
<li><strong><a href="integration-patterns.html">Integration Patterns</a></strong> - Integration details</li>
|
|
<li><strong><a href="orchestrator-integration-model.html">Orchestrator Model</a></strong> - Hybrid orchestration</li>
|
|
</ul>
|
|
<h3 id="adrs"><a class="header" href="#adrs">ADRs</a></h3>
|
|
<ul>
|
|
<li><strong><a href="adr/ADR-001-project-structure.html">ADR-001</a></strong> - Project structure</li>
|
|
<li><strong><a href="adr/ADR-002-distribution-strategy.html">ADR-002</a></strong> - Distribution strategy</li>
|
|
<li><strong><a href="adr/ADR-003-workspace-isolation.html">ADR-003</a></strong> - Workspace isolation</li>
|
|
<li><strong><a href="adr/ADR-004-hybrid-architecture.html">ADR-004</a></strong> - Hybrid architecture</li>
|
|
<li><strong><a href="adr/ADR-005-extension-framework.html">ADR-005</a></strong> - Extension framework</li>
|
|
<li><strong><a href="adr/ADR-006-provisioning-cli-refactoring.html">ADR-006</a></strong> - CLI refactoring</li>
|
|
</ul>
|
|
<h3 id="user-guides"><a class="header" href="#user-guides">User Guides</a></h3>
|
|
<ul>
|
|
<li><strong><a href="../user/getting-started.html">Getting Started</a></strong> - First steps</li>
|
|
<li><strong><a href="../user/MODE_SYSTEM_QUICK_REFERENCE.html">Mode System</a></strong> - Modes overview</li>
|
|
<li><strong><a href="../user/SERVICE_MANAGEMENT_GUIDE.html">Service Management</a></strong> - Services</li>
|
|
<li><strong><a href="../user/OCI_REGISTRY_GUIDE.html">OCI Registry</a></strong> - OCI operations</li>
|
|
</ul>
|
|
<hr />
|
|
<p><strong>Maintained By</strong>: Architecture Team
|
|
<strong>Review Cycle</strong>: Quarterly
|
|
<strong>Next Review</strong>: 2026-01-06</p>
|
|
|
|
</main>
|
|
|
|
<nav class="nav-wrapper" aria-label="Page navigation">
|
|
<!-- Mobile navigation buttons -->
|
|
<a rel="prev" href="../user/PLUGIN_INTEGRATION_GUIDE.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
|
<i class="fa fa-angle-left"></i>
|
|
</a>
|
|
|
|
<a rel="next prefetch" href="../architecture/integration-patterns.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
|
<i class="fa fa-angle-right"></i>
|
|
</a>
|
|
|
|
<div style="clear: both"></div>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
|
|
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
|
<a rel="prev" href="../user/PLUGIN_INTEGRATION_GUIDE.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
|
<i class="fa fa-angle-left"></i>
|
|
</a>
|
|
|
|
<a rel="next prefetch" href="../architecture/integration-patterns.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
|
<i class="fa fa-angle-right"></i>
|
|
</a>
|
|
</nav>
|
|
|
|
</div>
|
|
|
|
<!-- Livereload script (if served using the cli tool) -->
|
|
<script>
|
|
const wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
const wsAddress = wsProtocol + "//" + location.host + "/" + "__livereload";
|
|
const socket = new WebSocket(wsAddress);
|
|
socket.onmessage = function (event) {
|
|
if (event.data === "reload") {
|
|
socket.close();
|
|
location.reload();
|
|
}
|
|
};
|
|
|
|
window.onbeforeunload = function() {
|
|
socket.close();
|
|
}
|
|
</script>
|
|
|
|
|
|
|
|
<script>
|
|
window.playground_copyable = true;
|
|
</script>
|
|
|
|
|
|
<script src="../elasticlunr.min.js"></script>
|
|
<script src="../mark.min.js"></script>
|
|
<script src="../searcher.js"></script>
|
|
|
|
<script src="../clipboard.min.js"></script>
|
|
<script src="../highlight.js"></script>
|
|
<script src="../book.js"></script>
|
|
|
|
<!-- Custom JS scripts -->
|
|
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|