chore: add PROVISIONING page and resosurces

This commit is contained in:
Jesús Pérez 2025-10-07 10:41:14 +01:00
parent 77b63ef3c8
commit 33289a8480
4 changed files with 1231 additions and 11 deletions

914
PROVISIONING.md Normal file
View File

@ -0,0 +1,914 @@
<p align="center">
<img src="resources/provisioning_logo.svg" alt="Provisioning Logo" width="300"/>
</p>
<p align="center">
<img src="resources/logo-text.svg" alt="Provisioning" width="500"/>
</p>
# Provisioning - Infrastructure Automation Platform
> **A modular, declarative Infrastructure as Code (IaC) platform for managing complete infrastructure lifecycles**
## Table of Contents
- [What is Provisioning?](#what-is-provisioning)
- [Why Provisioning?](#why-provisioning)
- [Core Concepts](#core-concepts)
- [Architecture](#architecture)
- [Key Features](#key-features)
- [Technology Stack](#technology-stack)
- [How It Works](#how-it-works)
- [Use Cases](#use-cases)
- [Getting Started](#getting-started)
---
## What is Provisioning?
**Provisioning** is a comprehensive **Infrastructure as Code (IaC)** platform designed to manage complete infrastructure lifecycles: cloud providers, infrastructure services, clusters, and isolated workspaces across multiple cloud/local environments.
Extensible and customizable by design, it delivers type-safe, configuration-driven workflows with enterprise security (encrypted configuration, Cosmian KMS integration, Cedar policy engine, secrets management, authorization and permissions control, compliance checking, anomaly detection) and adaptable deployment modes (interactive UI, CLI automation, unattended CI/CD) suitable for any scale from development to production.
### Technical Definition
Declarative Infrastructure as Code (IaC) platform providing:
- **Type-safe, configuration-driven workflows** with schema validation and constraint checking
- **Modular, extensible architecture**: cloud providers, task services, clusters, workspaces
- **Multi-cloud abstraction layer** with unified API (UpCloud, AWS, local infrastructure)
- **High-performance state management**:
- Graph database backend for complex relationships
- Real-time state tracking and queries
- Multi-model data storage (document, graph, relational)
- **Enterprise security stack**:
- Encrypted configuration and secrets management
- Cosmian KMS integration for confidential key management
- Cedar policy engine for fine-grained access control
- Authorization and permissions control via platform services
- Compliance checking and policy enforcement
- Anomaly detection for security monitoring
- Audit logging and compliance tracking
- **Hybrid orchestration**: Rust-based performance layer + scripting flexibility
- **Production-ready features**:
- Batch workflows with dependency resolution
- Checkpoint recovery and automatic rollback
- Parallel execution with state management
- **Adaptable deployment modes**:
- Interactive TUI for guided setup
- Headless CLI for scripted automation
- Unattended mode for CI/CD pipelines
- **Hierarchical configuration system** with inheritance and overrides
### What It Does
- **Provisions Infrastructure** - Create servers, networks, storage across multiple cloud providers
- **Installs Services** - Deploy Kubernetes, containerd, databases, monitoring, and 50+ infrastructure components
- **Manages Clusters** - Orchestrate complete cluster deployments with dependency management
- **Handles Configuration** - Hierarchical configuration system with inheritance and overrides
- **Orchestrates Workflows** - Batch operations with parallel execution and checkpoint recovery
- **Manages Secrets** - SOPS/Age integration for encrypted configuration
---
## Why Provisioning?
### The Problems It Solves
#### 1. **Multi-Cloud Complexity**
**Problem**: Each cloud provider has different APIs, tools, and workflows.
**Solution**: Unified abstraction layer with provider-agnostic interfaces. Write configuration once, deploy anywhere.
```kcl
# Same configuration works on UpCloud, AWS, or local infrastructure
server: Server {
name = "web-01"
plan = "medium" # Abstract size, provider-specific translation
provider = "upcloud" # Switch to "aws" or "local" as needed
}
```
#### 2. **Dependency Hell**
**Problem**: Infrastructure components have complex dependencies (Kubernetes needs containerd, Cilium needs Kubernetes, etc.).
**Solution**: Automatic dependency resolution with topological sorting and health checks.
```kcl
# Provisioning resolves: containerd → etcd → kubernetes → cilium
taskservs = ["cilium"] # Automatically installs all dependencies
```
#### 3. **Configuration Sprawl**
**Problem**: Environment variables, hardcoded values, scattered configuration files.
**Solution**: Hierarchical configuration system with 476+ config accessors replacing 200+ ENV variables.
```
Defaults → User → Project → Infrastructure → Environment → Runtime
```
#### 4. **Imperative Scripts**
**Problem**: Brittle shell scripts that don't handle failures, don't support rollback, hard to maintain.
**Solution**: Declarative KCL configurations with validation, type safety, and automatic rollback.
#### 5. **Lack of Visibility**
**Problem**: No insight into what's happening during deployment, hard to debug failures.
**Solution**:
- Real-time workflow monitoring
- Comprehensive logging system
- Web-based control center
- REST API for integration
#### 6. **No Standardization**
**Problem**: Each team builds their own deployment tools, no shared patterns.
**Solution**: Reusable task services, cluster templates, and workflow patterns.
---
## Core Concepts
### 1. **Providers**
Cloud infrastructure backends that handle resource provisioning.
- **UpCloud** - Primary cloud provider
- **AWS** - Amazon Web Services integration
- **Local** - Local infrastructure (VMs, Docker, bare metal)
Providers implement a common interface, making infrastructure code portable.
### 2. **Task Services (TaskServs)**
Reusable infrastructure components that can be installed on servers.
**Categories**:
- **Container Runtimes** - containerd, Docker, Podman, crun, runc, youki
- **Orchestration** - Kubernetes, etcd, CoreDNS
- **Networking** - Cilium, Flannel, Calico, ip-aliases
- **Storage** - Rook-Ceph, local storage
- **Databases** - PostgreSQL, Redis, SurrealDB
- **Observability** - Prometheus, Grafana, Loki
- **Security** - Webhook, KMS, Vault
- **Development** - Gitea, Radicle, ORAS
Each task service includes:
- Version management
- Dependency declarations
- Health checks
- Installation/uninstallation logic
- Configuration schemas
### 3. **Clusters**
Complete infrastructure deployments combining servers and task services.
**Examples**:
- **Kubernetes Cluster** - HA control plane + worker nodes + CNI + storage
- **Database Cluster** - Replicated PostgreSQL with backup
- **Build Infrastructure** - BuildKit + container registry + CI/CD
Clusters handle:
- Multi-node coordination
- Service distribution
- High availability
- Rolling updates
### 4. **Workspaces**
Isolated environments for different projects or deployment stages.
```
workspace_librecloud/ # Production workspace
├── infra/ # Infrastructure definitions
├── config/ # Workspace configuration
├── extensions/ # Custom modules
└── runtime/ # State and runtime data
workspace_dev/ # Development workspace
├── infra/
└── config/
```
Switch between workspaces with single command:
```bash
provisioning workspace switch librecloud
```
### 5. **Workflows**
Coordinated sequences of operations with dependency management.
**Types**:
- **Server Workflows** - Create/delete/update servers
- **TaskServ Workflows** - Install/remove infrastructure services
- **Cluster Workflows** - Deploy/scale complete clusters
- **Batch Workflows** - Multi-cloud parallel operations
**Features**:
- Dependency resolution
- Parallel execution
- Checkpoint recovery
- Automatic rollback
- Progress monitoring
---
## Architecture
### System Components
```
┌─────────────────────────────────────────────────────────────────┐
│ User Interface Layer │
│ • CLI (provisioning command) │
│ • Web Control Center (UI) │
│ • REST API │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ Core Engine Layer │
│ • Command Routing & Dispatch │
│ • Configuration Management │
│ • Provider Abstraction │
│ • Utility Libraries │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ Orchestration Layer │
│ • Workflow Orchestrator (Rust/Nushell hybrid) │
│ • Dependency Resolver │
│ • State Manager │
│ • Task Scheduler │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ Extension Layer │
│ • Providers (Cloud APIs) │
│ • Task Services (Infrastructure Components) │
│ • Clusters (Complete Deployments) │
│ • Workflows (Automation Templates) │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ Infrastructure Layer │
│ • Cloud Resources (Servers, Networks, Storage) │
│ • Kubernetes Clusters │
│ • Running Services │
└─────────────────────────────────────────────────────────────────┘
```
### Directory Structure
```
project-provisioning/
├── provisioning/ # Core provisioning system
│ ├── core/ # Core engine and libraries
│ │ ├── cli/ # Command-line interface
│ │ ├── nulib/ # Core Nushell libraries
│ │ ├── plugins/ # System plugins
│ │ └── scripts/ # Utility scripts
│ │
│ ├── extensions/ # Extensible components
│ │ ├── providers/ # Cloud provider implementations
│ │ ├── taskservs/ # Infrastructure service definitions
│ │ ├── clusters/ # Complete cluster configurations
│ │ └── workflows/ # Core workflow templates
│ │
│ ├── platform/ # Platform services
│ │ ├── orchestrator/ # Rust orchestrator service
│ │ ├── control-center/ # Web control center
│ │ ├── mcp-server/ # Model Context Protocol server
│ │ ├── api-gateway/ # REST API gateway
│ │ ├── oci-registry/ # OCI registry for extensions
│ │ └── installer/ # Platform installer (TUI + CLI)
│ │
│ ├── kcl/ # KCL configuration schemas
│ ├── config/ # Configuration files
│ ├── templates/ # Template files
│ └── tools/ # Build and distribution tools
├── workspace/ # User workspaces and data
│ ├── infra/ # Infrastructure definitions
│ ├── config/ # User configuration
│ ├── extensions/ # User extensions
│ └── runtime/ # Runtime data and state
└── docs/ # Documentation
├── user/ # User guides
├── api/ # API documentation
├── architecture/ # Architecture docs
└── development/ # Development guides
```
### Platform Services
#### 1. **Orchestrator** (`platform/orchestrator/`)
- **Language**: Rust + Nushell
- **Purpose**: Workflow execution, task scheduling, state management
- **Features**:
- File-based persistence
- Priority processing
- Retry logic with exponential backoff
- Checkpoint-based recovery
- REST API endpoints
#### 2. **Control Center** (`platform/control-center/`)
- **Language**: Web UI + Backend API
- **Purpose**: Web-based infrastructure management
- **Features**:
- Dashboard views
- Real-time monitoring
- Interactive deployments
- Log viewing
#### 3. **MCP Server** (`platform/mcp-server/`)
- **Language**: Nushell
- **Purpose**: Model Context Protocol integration for AI assistance
- **Features**:
- 7 AI-powered settings tools
- Intelligent config completion
- Natural language infrastructure queries
#### 4. **OCI Registry** (`platform/oci-registry/`)
- **Purpose**: Extension distribution and versioning
- **Features**:
- Task service packages
- Provider packages
- Cluster templates
- Workflow definitions
#### 5. **Installer** (`platform/installer/`)
- **Language**: Rust (Ratatui TUI) + Nushell
- **Purpose**: Platform installation and setup
- **Features**:
- Interactive TUI mode
- Headless CLI mode
- Unattended CI/CD mode
- Configuration generation
---
## Key Features
### 1. **Modular CLI Architecture** (v3.2.0)
84% code reduction with domain-driven design.
- **Main CLI**: 211 lines (from 1,329 lines)
- **80+ shortcuts**: `s``server`, `t``taskserv`, etc.
- **Bi-directional help**: `provisioning help ws` = `provisioning ws help`
- **7 domain modules**: infrastructure, orchestration, development, workspace, configuration, utilities, generation
### 2. **Configuration System** (v2.0.0)
Hierarchical, config-driven architecture.
- **476+ config accessors** replacing 200+ ENV variables
- **Hierarchical loading**: defaults → user → project → infra → env → runtime
- **Variable interpolation**: `{{paths.base}}`, `{{env.HOME}}`, `{{now.date}}`
- **Multi-format support**: TOML, YAML, KCL
### 3. **Batch Workflow System** (v3.1.0)
Provider-agnostic batch operations with 85-90% token efficiency.
- **Multi-cloud support**: Mixed UpCloud + AWS + local in single workflow
- **KCL schema integration**: Type-safe workflow definitions
- **Dependency resolution**: Topological sorting with soft/hard dependencies
- **State management**: Checkpoint-based recovery with rollback
- **Real-time monitoring**: Live progress tracking
### 4. **Hybrid Orchestrator** (v3.0.0)
Rust/Nushell architecture solving deep call stack limitations.
- **High-performance coordination layer**
- **File-based persistence**
- **Priority processing with retry logic**
- **REST API for external integration**
- **Comprehensive workflow system**
### 5. **Workspace Switching** (v2.0.5)
Centralized workspace management.
- **Single-command switching**: `provisioning workspace switch <name>`
- **Automatic tracking**: Last-used timestamps, active workspace markers
- **User preferences**: Global settings across all workspaces
- **Workspace registry**: Centralized configuration in `user_config.yaml`
### 6. **Interactive Guides** (v3.3.0)
Step-by-step walkthroughs and quick references.
- **Quick reference**: `provisioning sc` (fastest)
- **Complete guides**: from-scratch, update, customize
- **Copy-paste ready**: All commands include placeholders
- **Beautiful rendering**: Uses glow, bat, or less
### 7. **Test Environment Service** (v3.4.0)
Automated container-based testing.
- **Three test types**: Single taskserv, server simulation, multi-node clusters
- **Topology templates**: Kubernetes HA, etcd clusters, etc.
- **Auto-cleanup**: Optional automatic cleanup after tests
- **CI/CD integration**: Easy integration into pipelines
### 8. **Platform Installer** (v3.5.0)
Multi-mode installation system with TUI, CLI, and unattended modes.
- **Interactive TUI**: Beautiful Ratatui terminal UI with 7 screens
- **Headless Mode**: CLI automation for scripted installations
- **Unattended Mode**: Zero-interaction CI/CD deployments
- **Deployment Modes**: Solo (2 CPU/4GB), MultiUser (4 CPU/8GB), CICD (8 CPU/16GB), Enterprise (16 CPU/32GB)
- **MCP Integration**: 7 AI-powered settings tools for intelligent configuration
### 9. **Version Management**
Comprehensive version tracking and updates.
- **Automatic updates**: Check for taskserv updates
- **Version constraints**: Semantic versioning support
- **Grace periods**: Cached version checks
- **Update strategies**: major, minor, patch, none
---
## Technology Stack
### Core Technologies
| Technology | Version | Purpose | Why |
|------------|---------|---------|-----|
| **Nushell** | 0.107.1+ | Primary shell and scripting language | Structured data pipelines, cross-platform, modern built-in parsers (JSON/YAML/TOML) |
| **KCL** | 0.11.3+ | Configuration language | Type safety, schema validation, immutability, constraint checking |
| **Rust** | Latest | Platform services (orchestrator, control-center, installer) | Performance, memory safety, concurrency, reliability |
| **Tera** | Latest | Template engine | Jinja2-like syntax, configuration file rendering, variable interpolation, filters and functions |
### Data & State Management
| Technology | Version | Purpose | Features |
|------------|---------|---------|----------|
| **SurrealDB** | Latest | High-performance graph database backend | Multi-model (document, graph, relational), real-time queries, distributed architecture, complex relationship tracking |
### Platform Services (Rust-based)
| Service | Purpose | Security Features |
|---------|---------|-------------------|
| **Orchestrator** | Workflow execution, task scheduling, state management | File-based persistence, retry logic, checkpoint recovery |
| **Control Center** | Web-based infrastructure management | **Authorization and permissions control**, RBAC, audit logging |
| **Installer** | Platform installation (TUI + CLI modes) | Secure configuration generation, validation |
| **API Gateway** | REST API for external integration | Authentication, rate limiting, request validation |
### Security & Secrets
| Technology | Version | Purpose | Enterprise Features |
|------------|---------|---------|---------------------|
| **SOPS** | 3.10.2+ | Secrets management | Encrypted configuration files |
| **Age** | 1.2.1+ | Encryption | Secure key-based encryption |
| **Cosmian KMS** | Latest | Key Management System | Confidential computing, secure key storage, cloud-native KMS |
| **Cedar** | Latest | Policy engine | Fine-grained access control, policy-as-code, compliance checking, anomaly detection |
### Optional Tools
| Tool | Purpose |
|------|---------|
| **K9s** | Kubernetes management interface |
| **nu_plugin_tera** | Nushell plugin for Tera template rendering |
| **nu_plugin_kcl** | Nushell plugin for KCL integration (CLI required, plugin optional) |
| **glow** | Markdown rendering for interactive guides |
| **bat** | Syntax highlighting for file viewing and guides |
---
## How It Works
### Data Flow
```
1. User defines infrastructure in KCL
2. CLI loads configuration (hierarchical)
3. Configuration validated against schemas
4. Workflow created with operations
5. Orchestrator receives workflow
6. Dependencies resolved (topological sort)
7. Operations executed in order
8. Providers handle cloud operations
9. Task services installed on servers
10. State persisted and monitored
```
### Example Workflow: Deploy Kubernetes Cluster
**Step 1**: Define infrastructure in KCL
```kcl
# infra/my-cluster.k
import provisioning.settings as cfg
settings: cfg.Settings = {
infra = {
name = "my-cluster"
provider = "upcloud"
}
servers = [
{name = "control-01", plan = "medium", role = "control"}
{name = "worker-01", plan = "large", role = "worker"}
{name = "worker-02", plan = "large", role = "worker"}
]
taskservs = ["kubernetes", "cilium", "rook-ceph"]
}
```
**Step 2**: Submit to Provisioning
```bash
provisioning server create --infra my-cluster
```
**Step 3**: Provisioning executes workflow
```
1. Create workflow: "deploy-my-cluster"
2. Resolve dependencies:
- containerd (required by kubernetes)
- etcd (required by kubernetes)
- kubernetes (explicitly requested)
- cilium (explicitly requested, requires kubernetes)
- rook-ceph (explicitly requested, requires kubernetes)
3. Execution order:
a. Provision servers (parallel)
b. Install containerd on all nodes
c. Install etcd on control nodes
d. Install kubernetes control plane
e. Join worker nodes
f. Install Cilium CNI
g. Install Rook-Ceph storage
4. Checkpoint after each step
5. Monitor health checks
6. Report completion
```
**Step 4**: Verify deployment
```bash
provisioning cluster status my-cluster
```
### Configuration Hierarchy
Configuration values are resolved through a hierarchy:
```
1. System Defaults (provisioning/config/config.defaults.toml)
↓ (overridden by)
2. User Preferences (~/.config/provisioning/user_config.yaml)
↓ (overridden by)
3. Workspace Config (workspace/config/provisioning.yaml)
↓ (overridden by)
4. Infrastructure Config (workspace/infra/<name>/config.toml)
↓ (overridden by)
5. Environment Config (workspace/config/prod-defaults.toml)
↓ (overridden by)
6. Runtime Flags (--flag value)
```
**Example**:
```toml
# System default
[servers]
default_plan = "small"
# User preference
[servers]
default_plan = "medium" # Overrides system default
# Infrastructure config
[servers]
default_plan = "large" # Overrides user preference
# Runtime
provisioning server create --plan xlarge # Overrides everything
```
---
## Use Cases
### 1. **Multi-Cloud Kubernetes Deployment**
Deploy Kubernetes clusters across different cloud providers with identical configuration.
```bash
# UpCloud cluster
provisioning cluster create k8s-prod --provider upcloud
# AWS cluster (same config)
provisioning cluster create k8s-prod --provider aws
```
### 2. **Development → Staging → Production Pipeline**
Manage multiple environments with workspace switching.
```bash
# Development
provisioning workspace switch dev
provisioning cluster create app-stack
# Staging (same config, different resources)
provisioning workspace switch staging
provisioning cluster create app-stack
# Production (HA, larger resources)
provisioning workspace switch prod
provisioning cluster create app-stack
```
### 3. **Infrastructure as Code Testing**
Test infrastructure changes before deploying to production.
```bash
# Test Kubernetes upgrade locally
provisioning test topology load kubernetes_3node | \
test env cluster kubernetes --version 1.29.0
# Verify functionality
provisioning test env run <env-id>
# Cleanup
provisioning test env cleanup <env-id>
```
### 4. **Batch Multi-Region Deployment**
Deploy to multiple regions in parallel.
```kcl
# workflows/multi-region.k
batch_workflow: BatchWorkflow = {
operations = [
{
id = "eu-cluster"
type = "cluster"
region = "eu-west-1"
cluster = "app-stack"
}
{
id = "us-cluster"
type = "cluster"
region = "us-east-1"
cluster = "app-stack"
}
{
id = "asia-cluster"
type = "cluster"
region = "ap-south-1"
cluster = "app-stack"
}
]
parallel_limit = 3 # All at once
}
```
```bash
provisioning batch submit workflows/multi-region.k
provisioning batch monitor <workflow-id>
```
### 5. **Automated Disaster Recovery**
Recreate infrastructure from configuration.
```bash
# Infrastructure destroyed
provisioning workspace switch prod
# Recreate from config
provisioning cluster create --infra backup-restore --wait
# All services restored with same configuration
```
### 6. **CI/CD Integration**
Automated testing and deployment pipelines.
```yaml
# .gitlab-ci.yml
test-infrastructure:
script:
- provisioning test quick kubernetes
- provisioning test quick postgres
deploy-staging:
script:
- provisioning workspace switch staging
- provisioning cluster create app-stack --check
- provisioning cluster create app-stack --yes
deploy-production:
when: manual
script:
- provisioning workspace switch prod
- provisioning cluster create app-stack --yes
```
---
## Getting Started
### Quick Start
1. **Install Prerequisites**
```bash
# Install Nushell
brew install nushell # macOS
# Install KCL
brew install kcl-lang/tap/kcl # macOS
# Install SOPS (optional, for secrets)
brew install sops
```
2. **Add CLI to PATH**
```bash
ln -sf "$(pwd)/provisioning/core/cli/provisioning" /usr/local/bin/provisioning
```
3. **Initialize Workspace**
```bash
provisioning workspace init my-project
```
4. **Configure Provider**
```bash
# Edit workspace config
provisioning sops workspace/config/provisioning.yaml
```
5. **Deploy Infrastructure**
```bash
# Check what will be created
provisioning server create --check
# Create servers
provisioning server create --yes
# Install Kubernetes
provisioning taskserv create kubernetes
```
### Learning Path
1. **Start with Guides**
```bash
provisioning sc # Quick reference
provisioning guide from-scratch # Complete walkthrough
```
2. **Explore Examples**
```bash
ls provisioning/examples/
```
3. **Read Architecture Docs**
- [Core Engine](provisioning/core/README.md)
- [CLI Architecture](.claude/features/cli-architecture.md)
- [Configuration System](.claude/features/configuration-system.md)
- [Batch Workflows](.claude/features/batch-workflow-system.md)
4. **Try Test Environments**
```bash
provisioning test quick kubernetes
provisioning test quick postgres
```
5. **Build Custom Extensions**
- Create custom task services
- Define cluster templates
- Write workflow automation
---
## Documentation Index
### User Documentation
- **[Quick Start Guide](docs/user/quickstart.md)** - Get started in 10 minutes
- **[Command Reference](docs/user/command-reference.md)** - Complete CLI reference
- **[Configuration Guide](docs/user/configuration.md)** - Configuration system details
- **[Workspace Guide](docs/user/workspace-guide.md)** - Workspace management
- **[Test Environment Guide](docs/user/test-environment-guide.md)** - Testing infrastructure
### Architecture Documentation
- **[Core Engine](provisioning/core/README.md)** - Core component overview
- **[CLI Architecture](.claude/features/cli-architecture.md)** - CLI design and shortcuts
- **[Configuration System](.claude/features/configuration-system.md)** - Config hierarchy
- **[Batch Workflows](.claude/features/batch-workflow-system.md)** - Batch operations
- **[Orchestrator](.claude/features/orchestrator-architecture.md)** - Workflow execution
- **[Workspace Switching](.claude/features/workspace-switching.md)** - Multi-workspace
### Development Documentation
- **[Contributing Guide](docs/development/CONTRIBUTING.md)** - How to contribute
- **[Nushell Patterns](.claude/best_nushell_code.md)** - Nushell best practices
- **[KCL Patterns](.claude/kcl_idiomatic_patterns.md)** - KCL idiomatic code
- **[Extension Development](docs/development/extensions.md)** - Create extensions
### API Documentation
- **[REST API](docs/api/rest-api.md)** - HTTP endpoints
- **[Nushell API](docs/api/nushell-api.md)** - Library functions
- **[Provider API](docs/api/provider-api.md)** - Provider interface
---
## Project Status
**Current Version**: Active Development (2025-10-07)
### Recent Milestones
- ✅ **v2.0.5** (2025-10-06) - Platform Installer with TUI and CI/CD modes
- ✅ **v2.0.4** (2025-10-06) - Test Environment Service with container management
- ✅ **v2.0.3** (2025-09-30) - Interactive Guides system
- ✅ **v2.0.2** (2025-09-30) - Modular CLI Architecture (84% code reduction)
- ✅ **v2.0.2** (2025-09-25) - Batch Workflow System (85-90% token efficiency)
- ✅ **v2.0.1** (2025-09-25) - Hybrid Orchestrator (Rust/Nushell)
- ✅ **v2.0.1** (2025-10-02) - Workspace Switching system
- ✅ **v2.0.0** (2025-09-23) - Configuration System (476+ accessors)
### Roadmap
- **Platform Services**
- [ ] Web Control Center UI completion
- [ ] API Gateway implementation
- [ ] Enhanced MCP server capabilities
- **Extension Ecosystem**
- [ ] OCI registry for extension distribution
- [ ] Community task service marketplace
- [ ] Cluster template library
- **Enterprise Features**
- [ ] Multi-tenancy support
- [ ] RBAC and audit logging
- [ ] Cost tracking and optimization
---
## Support and Community
### Getting Help
- **Documentation**: Start with `provisioning help` or `provisioning guide from-scratch`
- **Issues**: Report bugs and request features on the issue tracker
- **Discussions**: Join community discussions for questions and ideas
### Contributing
Contributions are welcome! See [CONTRIBUTING.md](docs/development/CONTRIBUTING.md) for guidelines.
**Key areas for contribution**:
- New task service definitions
- Cloud provider implementations
- Cluster templates
- Documentation improvements
- Bug fixes and testing
---
## License
See [LICENSE](LICENSE) file in project root.
---
**Maintained By**: Architecture Team
**Last Updated**: 2025-10-07
**Project Home**: [provisioning/](provisioning/)

View File

@ -1,15 +1,11 @@
# Provisioning
<p align="center">
<img src="resources/provisioning_logo.svg" alt="Provisioning Logo" width="300"/>
</p>
<p align="center">
<img src="resources/logo-text.svg" alt="Provisioning" width="500"/>
</p>
<div align="center">
<img src="resources/images/provisioning_logo-light.svg" alt="Provisioning Logo" width="200"/>
<br>
<br>
<picture>
<source media="(prefers-color-scheme: dark)" srcset="resources/images/provisioning_logo-text-dark.svg">
<source media="(prefers-color-scheme: light)" srcset="resources/images/provisioning_logo-text-light.svg">
<img alt="Provisioning Logo Text" src="resources/images/provisioning_logo-text-light.svg" width="400">
</picture>
</div>
# Provisioning
A provisioning system built with Nushell and KCL for infrastructure automation and Kubernetes cluster management.

149
resources/logo-text.svg Normal file
View File

@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 607.69 116.06">
<defs>
<!-- Animated gradient for text glow effect -->
<linearGradient id="textGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#4cc2f1;stop-opacity:1">
<animate attributeName="stop-color" values="#4cc2f1;#f2b03f;#4cc2f1" dur="3s" repeatCount="indefinite"/>
</stop>
<stop offset="50%" style="stop-color:#f2b03f;stop-opacity:1">
<animate attributeName="stop-color" values="#f2b03f;#4cc2f1;#f2b03f" dur="3s" repeatCount="indefinite"/>
</stop>
<stop offset="100%" style="stop-color:#4cc2f1;stop-opacity:1">
<animate attributeName="stop-color" values="#4cc2f1;#f2b03f;#4cc2f1" dur="3s" repeatCount="indefinite"/>
</stop>
</linearGradient>
<!-- Animated gradient for floating particles -->
<linearGradient id="particleGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#00D4FF;stop-opacity:0.8">
<animate attributeName="stop-color" values="#00D4FF;#7B2BFF;#00FFB3;#00D4FF" dur="2s" repeatCount="indefinite"/>
</stop>
<stop offset="100%" style="stop-color:#7B2BFF;stop-opacity:0.8">
<animate attributeName="stop-color" values="#7B2BFF;#00FFB3;#00D4FF;#7B2BFF" dur="2s" repeatCount="indefinite"/>
</stop>
</linearGradient>
</defs>
<g id="c">
<!-- Animated floating particles background -->
<g>
<!-- Floating particles with gentle movement -->
<circle cx="50" cy="30" r="2" style="fill:url(#particleGradient);">
<animateTransform attributeName="transform" type="translate" values="0,0;10,5;0,0" dur="4s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="0.3;0.8;0.3" dur="4s" repeatCount="indefinite"/>
</circle>
<circle cx="150" cy="20" r="1.5" style="fill:url(#particleGradient);">
<animateTransform attributeName="transform" type="translate" values="0,0;-8,7;0,0" dur="5s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="0.2;0.7;0.2" dur="5s" repeatCount="indefinite"/>
</circle>
<circle cx="250" cy="25" r="2.5" style="fill:url(#particleGradient);">
<animateTransform attributeName="transform" type="translate" values="0,0;12,-6;0,0" dur="3.5s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="0.4;0.9;0.4" dur="3.5s" repeatCount="indefinite"/>
</circle>
<circle cx="350" cy="15" r="1.8" style="fill:url(#particleGradient);">
<animateTransform attributeName="transform" type="translate" values="0,0;-6,8;0,0" dur="4.5s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="0.3;0.6;0.3" dur="4.5s" repeatCount="indefinite"/>
</circle>
<circle cx="450" cy="35" r="2.2" style="fill:url(#particleGradient);">
<animateTransform attributeName="transform" type="translate" values="0,0;9,-4;0,0" dur="3.8s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="0.5;0.8;0.5" dur="3.8s" repeatCount="indefinite"/>
</circle>
<circle cx="550" cy="28" r="1.6" style="fill:url(#particleGradient);">
<animateTransform attributeName="transform" type="translate" values="0,0;-7,9;0,0" dur="4.2s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="0.2;0.7;0.2" dur="4.2s" repeatCount="indefinite"/>
</circle>
</g>
<!-- Animated "provisioning" text -->
<g>
<!-- Letter "p" -->
<path d="M6.89,82.3c-1.67-1.33-2.5-3.57-2.5-6.7s1.12-12.62,3.35-28.45c2.23-15.83,3.35-27.13,3.35-33.9s-.47-11.18-1.4-13.25c6.8,.53,11.27,3.2,13.4,8,5.13-2.8,10.78-4.2,16.95-4.2s11.03,1.92,14.6,5.75c3.57,3.83,5.35,8.55,5.35,14.15,0,6.93-2.54,13.2-7.6,18.8-2.47,2.67-5.65,4.83-9.55,6.5-3.9,1.67-8.22,2.5-12.95,2.5-2,0-3.9-.13-5.7-.4l-.3-4.2h.8c7.53,0,13.53-2.8,18-8.4,3.07-4,4.6-8.2,4.6-12.6,0-6.47-2.63-10.73-7.9-12.8-4.47-1.67-9.47-1.33-15,1v.2c0,2.53-.95,10.82-2.85,24.85-1.9,14.03-2.85,25.75-2.85,35.15,0,4.2,.2,7.47,.6,9.8-2.13,.13-3.53,.2-4.2,.2-3.8,0-6.53-.67-8.2-2Z" style="fill:url(#textGradient);">
<!-- Pulse animation -->
<animate attributeName="opacity" values="0.8;1;0.8" dur="2s" repeatCount="indefinite"/>
</path>
<!-- Letter "r" -->
<path d="M80.19,50.1c2.4-8.67,5.28-15.05,8.65-19.15c3.37-4.1,6.5-6.15,9.4-6.15s5.08,1.08,6.55,3.25c1.47,2.17,2.2,4.97,2.2,8.4s-1.02,6.58-3.05,9.45c-2.03,2.87-4.82,4.3-8.35,4.3-.93,0-2.04-.27-3.3-.8,2.07-2.6,3.1-5.73,3.1-9.4,0-2.13-.87-3.2-2.6-3.2-1.27,0-2.63,.88-4.1,2.65-1.47,1.77-2.87,4.2-4.2,7.3-1.33,3.1-2.45,7.07-3.35,11.9-.9,4.83-1.35,9.98-1.35,15.45,0,.67,.17,3.5,.5,8.5-2.13,.13-3.5,.2-4.1,.2-3.8,0-6.53-.67-8.2-2-1.67-1.33-2.5-3.53-2.5-6.6,0-1.33,.7-6.46,2.1-15.4,1.4-8.93,2.1-16.05,2.1-21.35s-.57-10.18-1.7-14.65c4.87,1.53,8.27,3.72,10.2,6.55,1.93,2.83,2.9,6.13,2.9,9.9s-.3,7.38-.9,10.85Z" style="fill:url(#textGradient);">
<animate attributeName="opacity" values="0.8;1;0.8" dur="2s" begin="0.2s" repeatCount="indefinite"/>
</path>
<!-- Letter "o" -->
<path d="M132.39,23.5c.73,0,1.42,.22,2.05,.65,.63,.43,.95,.88,.95,1.35-6.73,4.67-10.77,11.17-12.1,19.5,1.4-3.73,3.12-6.97,5.15-9.7,2.03-2.73,4.15-4.8,6.35-6.2,4.2-2.6,8.3-3.9,12.3-3.9s7.4,1.97,10.2,5.9c2.8,3.93,4.2,9.2,4.2,15.8,0,7.4-1.5,14.2-4.5,20.4-3.33,7-8.07,11.83-14.2,14.5-3.47,1.53-7.27,2.3-11.4,2.3-5.8,0-10.85-2.25-15.15-6.75s-6.45-10.97-6.45-19.4,2.07-15.87,6.2-22.3c4.13-6.43,9.6-10.48,16.4-12.15Zm8.5,9c-4.33,0-8.2,2.92-11.6,8.75-3.4,5.83-5.1,11.65-5.1,17.45,0,12.13,3.13,18.2,9.4,18.2,4.47,0,8.1-2.92,10.9-8.75,2.8-5.83,4.2-12.38,4.2-19.65,0-10.67-2.6-16-7.8-16Z" style="fill:url(#textGradient);">
<animate attributeName="opacity" values="0.8;1;0.8" dur="2s" begin="0.4s" repeatCount="indefinite"/>
</path>
<!-- Letter "v" -->
<path d="M193.09,82.6c-2.13,.93-4.37,1.4-6.7,1.4s-3.63-.5-3.9-1.5c-1.07-4.27-2.3-10.65-3.7-19.15s-2.82-15.93-4.25-22.3c-1.43-6.37-3.15-11.18-5.15-14.45,3.67-1.73,6.6-2.6,8.8-2.6s3.87,.5,5,1.5c1.13,1,2.08,2.98,2.85,5.95,.77,2.97,1.32,5.42,1.65,7.35,.93,6.4,1.4,9.97,1.4,10.7s.27,3.72,.8,8.95c.53,5.23,.93,8.68,1.2,10.35,11.87-23,17.8-38.37,17.8-46.1,5.47,2.8,8.2,5.83,8.2,9.1,0,2.67-1.38,6.62-4.15,11.85-2.77,5.23-6.23,11.57-10.4,19-4.17,7.43-7.32,14.08-9.45,19.95Z" style="fill:url(#textGradient);">
<animate attributeName="opacity" values="0.8;1;0.8" dur="2s" begin="0.6s" repeatCount="indefinite"/>
</path>
<!-- Letter "i" -->
<path d="M241.34,48.65c-1.63,9.5-2.47,17.33-2.5,23.5-.03,6.17,.35,10.15,1.15,11.95-5.2-1.33-8.7-3.35-10.5-6.05s-2.7-6.65-2.7-11.85c0-2.8,.53-7.87,1.6-15.2,1.07-7.33,1.6-13.03,1.6-17.1s-.2-7.2-.6-9.4c1.47-.13,2.83-.2,4.1-.2,3.87,0,6.55,.65,8.05,1.95,1.5,1.3,2.25,3.52,2.25,6.65,0,1-.82,6.25-2.45,15.75Zm3.95-33.15c-1.87,.27-3.5,.4-4.9,.4-6.87,0-10.3-2.4-10.3-7.2,0-1.73,.5-4.1,1.5-7.1,1.87-.27,3.5-.4,4.9-.4,6.87,0,10.3,2.4,10.3,7.2,0,1.73-.5,4.1-1.5,7.1Z" style="fill:url(#textGradient);">
<animate attributeName="opacity" values="0.8;1;0.8" dur="2s" begin="0.8s" repeatCount="indefinite"/>
</path>
<!-- Letter "s" -->
<path d="M278.59,30.8c-1.87,0-3.53,.62-5,1.85-1.47,1.23-2.2,2.98-2.2,5.25s.78,4.4,2.35,6.4c1.57,2,3.48,3.75,5.75,5.25,2.27,1.5,4.55,3.03,6.85,4.6,2.3,1.57,4.32,3.5,6.05,5.8,1.73,2.3,2.7,4.85,2.9,7.65,0,4.8-2.07,8.83-6.2,12.1-4.13,3.27-9.27,4.9-15.4,4.9s-10.95-1.23-14.45-3.7-5.25-5.3-5.25-8.5,.98-5.78,2.95-7.75,4.42-2.95,7.35-2.95c1.53,0,2.97,.27,4.3,.8-2.13,2.27-3.2,4.67-3.2,7.2s.7,4.57,2.1,6.1c1.4,1.53,3.3,2.3,5.7,2.3s4.42-.62,6.05-1.85c1.63-1.23,2.45-2.83,2.45-4.8s-.57-3.71-1.7-5.25c-1.13-1.53-2.55-2.88-4.25-4.05-1.7-1.17-3.55-2.48-5.55-3.95-2-1.46-3.85-2.95-5.55-4.45-1.7-1.5-3.12-3.4-4.25-5.7-1.13-2.3-1.7-4.82-1.7-7.55,0-4.73,1.95-8.62,5.85-11.65,3.9-3.03,8.77-4.55,14.6-4.55s10.1,1.13,12.8,3.4c2.7,2.27,4.05,4.92,4.05,7.95s-.95,5.62-2.85,7.75c-1.9,2.13-4.35,3.2-7.35,3.2-1.47,0-3.13-.3-5-.9,1.47-1.27,2.6-2.71,3.4-4.35,.8-1.63,1.2-3.25,1.2-4.85s-.67-2.95-2-4.05c-1.33-1.1-2.93-1.65-4.8-1.65Z" style="fill:url(#textGradient);">
<animate attributeName="opacity" values="0.8;1;0.8" dur="2s" begin="1s" repeatCount="indefinite"/>
</path>
<!-- Letter "i" (second) -->
<path d="M323.64,48.65c-1.63,9.5-2.47,17.33-2.5,23.5-.03,6.17,.35,10.15,1.15,11.95-5.2-1.33-8.7-3.35-10.5-6.05s-2.7-6.65-2.7-11.85c0-2.8,.53-7.87,1.6-15.2,1.07-7.33,1.6-13.03,1.6-17.1s-.2-7.2-.6-9.4c1.47-.13,2.83-.2,4.1-.2,3.87,0,6.55,.65,8.05,1.95,1.5,1.3,2.25,3.52,2.25,6.65,0,1-.82,6.25-2.45,15.75Zm3.95-33.15c-1.87,.27-3.5,.4-4.9,.4-6.87,0-10.3-2.4-10.3-7.2,0-1.73,.5-4.1,1.5-7.1,1.87-.27,3.5-.4,4.9-.4,6.87,0,10.3,2.4,10.3,7.2,0,1.73-.5,4.1-1.5,7.1Z" style="fill:url(#textGradient);">
<animate attributeName="opacity" values="0.8;1;0.8" dur="2s" begin="1.2s" repeatCount="indefinite"/>
</path>
<!-- Letter "o" (second) -->
<path d="M360.09,23.5c.73,0,1.42,.22,2.05,.65,.63,.43,.95,.88,.95,1.35-6.73,4.67-10.77,11.17-12.1,19.5,1.4-3.73,3.12-6.97,5.15-9.7,2.03-2.73,4.15-4.8,6.35-6.2,4.2-2.6,8.3-3.9,12.3-3.9s7.4,1.97,10.2,5.9c2.8,3.93,4.2,9.2,4.2,15.8,0,7.4-1.5,14.2-4.5,20.4-3.34,7-8.07,11.83-14.2,14.5-3.47,1.53-7.27,2.3-11.4,2.3-5.8,0-10.85-2.25-15.15-6.75-4.3-4.5-6.45-10.97-6.45-19.4s2.07-15.87,6.2-22.3c4.13-6.43,9.6-10.48,16.4-12.15Zm8.5,9c-4.33,0-8.2,2.92-11.6,8.75-3.4,5.83-5.1,11.65-5.1,17.45,0,12.13,3.13,18.2,9.4,18.2,4.47,0,8.1-2.92,10.9-8.75,2.8-5.83,4.2-12.38,4.2-19.65,0-10.67-2.6-16-7.8-16Z" style="fill:url(#textGradient);">
<animate attributeName="opacity" values="0.8;1;0.8" dur="2s" begin="1.4s" repeatCount="indefinite"/>
</path>
<!-- Letter "n" -->
<path d="M438.99,24.9c3.93,0,6.75,1.22,8.45,3.65,1.7,2.43,2.55,5.73,2.55,9.9s-.65,10.02-1.95,17.55c-1.3,7.53-1.95,13.02-1.95,16.45s.43,5.93,1.3,7.5c.87,1.57,2.33,2.92,4.4,4.05-.87,.07-2.1,.1-3.7,.1-5.6,0-9.58-.87-11.95-2.6-2.37-1.73-3.55-4.77-3.55-9.1,0-2.47,.67-7.28,2-14.45,1.33-7.17,2-12.52,2-16.05,0-4.4-1.33-6.6-4-6.6-1.54,0-3.27,.9-5.2,2.7-1.93,1.8-3.8,4.25-5.6,7.35-1.8,3.1-3.3,7.08-4.5,11.95-1.2,4.87-1.8,9.72-1.8,14.55s.2,8.42,.6,10.75c-2.13,.13-3.54,.2-4.2,.2-3.8,0-6.53-.67-8.2-2-1.67-1.33-2.5-3.53-2.5-6.6,0-1.33,.7-6.46,2.1-15.4,1.4-8.93,2.1-16.05,2.1-21.35s-.57-10.18-1.7-14.65c4.87,1.53,8.27,3.72,10.2,6.55,1.93,2.83,2.9,6.07,2.9,9.7s-.4,7.85-1.2,12.65c2.2-7.46,5.67-13.8,10.4-19,4.73-5.2,9.07-7.8,13-7.8Z" style="fill:url(#textGradient);">
<animate attributeName="opacity" values="0.8;1;0.8" dur="2s" begin="1.6s" repeatCount="indefinite"/>
</path>
<!-- Letter "i" (third) -->
<path d="M480.04,48.65c-1.63,9.5-2.47,17.33-2.5,23.5-.03,6.17,.35,10.15,1.15,11.95-5.2-1.33-8.7-3.35-10.5-6.05-1.8-2.7-2.7-6.65-2.7-11.85,0-2.8,.53-7.87,1.6-15.2,1.07-7.33,1.6-13.03,1.6-17.1s-.2-7.2-.6-9.4c1.47-.13,2.83-.2,4.1-.2,3.87,0,6.55,.65,8.05,1.95,1.5,1.3,2.25,3.52,2.25,6.65,0,1-.82,6.25-2.45,15.75Zm3.95-33.15c-1.87,.27-3.5,.4-4.9,.4-6.87,0-10.3-2.4-10.3-7.2,0-1.73,.5-4.1,1.5-7.1,1.87-.27,3.5-.4,4.9-.4,6.87,0,10.3,2.4,10.3,7.2,0,1.73-.5,4.1-1.5,7.1Z" style="fill:url(#textGradient);">
<animate attributeName="opacity" values="0.8;1;0.8" dur="2s" begin="1.8s" repeatCount="indefinite"/>
</path>
<!-- Letter "n" (second) -->
<path d="M533.69,24.9c3.93,0,6.75,1.22,8.45,3.65,1.7,2.43,2.55,5.73,2.55,9.9s-.65,10.02-1.95,17.55c-1.3,7.53-1.95,13.02-1.95,16.45s.43,5.93,1.3,7.5c.87,1.57,2.33,2.92,4.4,4.05-.87,.07-2.1,.1-3.7,.1-5.6,0-9.58-.87-11.95-2.6-2.37-1.73-3.55-4.77-3.55-9.1,0-2.47,.67-7.28,2-14.45,1.33-7.17,2-12.52,2-16.05,0-4.4-1.33-6.6-4-6.6-1.54,0-3.27,.9-5.2,2.7-1.93,1.8-3.8,4.25-5.6,7.35-1.8,3.1-3.3,7.08-4.5,11.95-1.2,4.87-1.8,9.72-1.8,14.55s.2,8.42,.6,10.75c-2.13,.13-3.54,.2-4.2,.2-3.8,0-6.53-.67-8.2-2-1.67-1.33-2.5-3.53-2.5-6.6,0-1.33,.7-6.46,2.1-15.4,1.4-8.93,2.1-16.05,2.1-21.35s-.57-10.18-1.7-14.65c4.87,1.53,8.27,3.72,10.2,6.55,1.93,2.83,2.9,6.07,2.9,9.7s-.4,7.85-1.2,12.65c2.2-7.46,5.67-13.8,10.4-19,4.73-5.2,9.07-7.8,13-7.8Z" style="fill:url(#textGradient);">
<animate attributeName="opacity" values="0.8;1;0.8" dur="2s" begin="2s" repeatCount="indefinite"/>
</path>
<!-- Letter "g" -->
<path d="M588.59,25.9c1.27,0,2.23,.07,2.9,.2,1.73,.33,2.67,1.57,2.8,3.7-7.27,1.53-13.05,5.47-17.35,11.8-4.3,6.33-6.45,12.93-6.45,19.8,0,8,2.43,12,7.3,12,2.93,0,5.57-1.6,7.9-4.8,4.13-5.8,7.03-14.87,8.7-27.2,1.27-9.73,3.63-16,7.1-18.8,1.67-1.4,3.73-2.5,6.2-3.3-.93,7.07-1.4,12.4-1.4,16,0,26.67-2.85,46.7-8.55,60.1-5.7,13.4-14.98,20.1-27.85,20.1-5.2,0-9.27-1.38-12.2-4.15-2.93-2.77-4.4-5.8-4.4-9.1s1.03-6,3.1-8.1c2.07-2.1,4.96-3.15,8.7-3.15,1.53,0,3.1,.33,4.7,1-2.53,1.67-3.8,4.23-3.8,7.7,0,2.33,.7,4.35,2.1,6.05,1.4,1.7,3.12,2.55,5.15,2.55s3.82-.42,5.35-1.25c1.53-.83,3.1-2.32,4.7-4.45,1.6-2.13,3-4.8,4.2-8,2.73-7.4,4.23-17.5,4.5-30.3-1.93,5.73-4.87,10.33-8.8,13.8-3.93,3.47-7.93,5.2-12,5.2-5.13,0-9.05-1.95-11.75-5.85-2.7-3.9-4.05-8.88-4.05-14.95,0-7.07,1.7-13.63,5.1-19.7,3.8-7,9.07-11.87,15.8-14.6,3.73-1.53,7.83-2.3,12.3-2.3Z" style="fill:url(#textGradient);">
<animate attributeName="opacity" values="0.8;1;0.8" dur="2s" begin="2.2s" repeatCount="indefinite"/>
</path>
</g>
<!-- Brush-painted underline growing from left to right -->
<g>
<!-- Main brush stroke line - thinner than letters, slower -->
<path d="M20,95 L580,95" stroke="url(#textGradient)" stroke-width="4" fill="none" stroke-linecap="round">
<!-- Growing from left to right like brush painting - slower -->
<animate attributeName="stroke-dasharray" values="0,560;560,0" dur="5s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="0;1;1" dur="5s" repeatCount="indefinite"/>
</path>
<!-- Brush texture effect - slightly thicker stroke that follows -->
<path d="M20,95 L580,95" stroke="#4cc2f1" stroke-width="5" fill="none" stroke-linecap="round" opacity="0.3">
<animate attributeName="stroke-dasharray" values="0,560;560,0" dur="5s" begin="0.2s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="0;0.3;0.3" dur="5s" begin="0.2s" repeatCount="indefinite"/>
</path>
<!-- Paint drip effect at the end - smaller for thinner brush -->
<circle cx="580" cy="95" r="0" fill="url(#textGradient)">
<animate attributeName="r" values="0;2;0" dur="0.6s" begin="4.7s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="0;0.8;0" dur="0.6s" begin="4.7s" repeatCount="indefinite"/>
</circle>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,161 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="b" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 359.49 221.13">
<defs>
<clipPath id="d">
<path d="M226.79,113.62c0,19.36,15.85,35.06,35.4,35.06,19.55,0,35.4-15.7,35.4-35.06,0-19.36-15.85-35.06-35.4-35.06h0c-42.68,0-35.4,15.7-35.4,35.06" style="fill:none;"/>
</clipPath>
<!-- Animated gradient for connecting elements -->
<linearGradient id="infinityGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#00D4FF;stop-opacity:1">
<animate attributeName="stop-color" values="#00D4FF;#7B2BFF;#00FFB3;#00D4FF" dur="4s" repeatCount="indefinite"/>
</stop>
<stop offset="50%" style="stop-color:#7B2BFF;stop-opacity:1">
<animate attributeName="stop-color" values="#7B2BFF;#00FFB3;#00D4FF;#7B2BFF" dur="4s" repeatCount="indefinite"/>
</stop>
<stop offset="100%" style="stop-color:#00FFB3;stop-opacity:1">
<animate attributeName="stop-color" values="#00FFB3;#00D4FF;#7B2BFF;#00FFB3" dur="4s" repeatCount="indefinite"/>
</stop>
</linearGradient>
</defs>
<g id="c">
<g>
<!-- Left wheel - only outer shape rotates -->
<g>
<path d="M3.04,87.53c-3.66,16.4-3.36,33.43,.85,49.7l18.49-.31c2.12,7.08,5.09,13.89,8.85,20.26l-12.81,13.12c9.22,14.08,21.56,25.9,36.09,34.55l12.81-13.13c6.56,3.51,13.52,6.22,20.74,8.08l.31,18.3c16.56,3.62,33.75,3.33,50.18-.85l-.31-18.3c7.15-2.1,14.02-5.04,20.46-8.77l13.25,12.69c14.22-9.14,26.14-21.36,34.87-35.75l-13.25-12.68c3.54-6.5,6.28-13.4,8.15-20.55l18.49-.31c3.65-16.4,3.36-33.43-.85-49.7l-18.49,.31c-2.12-7.08-5.09-13.88-8.85-20.26l12.8-13.12c-9.22-14.08-21.56-25.9-36.08-34.55l-12.81,13.13c-6.56-3.51-13.53-6.23-20.75-8.08l-.31-18.3c-16.56-3.62-33.75-3.33-50.18,.85l.31,18.3c-7.15,2.1-14.01,5.04-20.45,8.77l-13.25-12.69c-14.22,9.14-26.15,21.36-34.88,35.75l13.25,12.68c-3.54,6.5-6.28,13.4-8.15,20.55l-18.49,.31Z" style="fill:#4cc2f1; fill-rule:evenodd; stroke:#fff; stroke-miterlimit:10;">
<animateTransform
attributeName="transform"
type="rotate"
values="0 115.86 113.25;360 115.86 113.25"
dur="8s"
repeatCount="indefinite"/>
</path>
</g>
<!-- Right wheel - only outer shape rotates -->
<g>
<path d="M167.28,92.87c-3.19,14.31-2.94,29.17,.74,43.37l16.13-.27c1.85,6.18,4.44,12.12,7.72,17.68l-11.18,11.45c8.05,12.29,18.82,22.6,31.49,30.15l11.18-11.46c5.72,3.06,11.8,5.43,18.1,7.05l.27,15.97c14.45,3.16,29.45,2.91,43.78-.74l-.27-15.97c6.24-1.83,12.23-4.4,17.85-7.66l11.56,11.08c12.41-7.97,22.81-18.64,30.43-31.19l-11.56-11.06c3.09-5.67,5.48-11.69,7.11-17.93l16.13-.27c3.18-14.31,2.93-29.17-.74-43.37l-16.13,.27c-1.85-6.18-4.44-12.11-7.72-17.68l11.17-11.44c-8.04-12.29-18.81-22.6-31.48-30.15l-11.18,11.46c-5.72-3.07-11.8-5.43-18.1-7.05l-.27-15.97c-14.45-3.16-29.45-2.91-43.78,.74l.27,15.97c-6.24,1.83-12.23,4.4-17.84,7.66l-11.56-11.08c-12.41,7.97-22.81,18.64-30.44,31.19l11.56,11.06c-3.09,5.67-5.48,11.69-7.11,17.93l-16.13,.27Z" style="fill:#4cc2f1; fill-rule:evenodd; stroke:#fff; stroke-miterlimit:10;">
<animateTransform
attributeName="transform"
type="rotate"
values="0 261.91 113.28;-360 261.91 113.28"
dur="6s"
repeatCount="indefinite"/>
</path>
</g>
<!-- Left wheel center -->
<path d="M115.86,78.19c19.55,0,35.4,15.7,35.4,35.06s-15.85,35.06-35.4,35.06-35.4-15.7-35.4-35.06,15.85-35.06,35.4-35.06" style="fill:#f2b03f;"/>
<ellipse cx="116.42" cy="115.68" rx="20.17" ry="20.15" style="fill:none; stroke:#4159a4; stroke-miterlimit:10; stroke-width:1.58px;"/>
<path d="M116.42,107.88c4.35-.04,7.91,3.43,7.95,7.73,.04,4.31-3.46,7.83-7.81,7.87-4.35,.04-7.91-3.43-7.95-7.73,0-.02,0-.05,0-.07-.02-4.29,3.48-7.78,7.81-7.8" style="fill:#fff;"/>
<path d="M116.42,100.38c.2,0,.37,.16,.37,.36s-.16,.37-.37,.37c-.2,0-.37-.16-.37-.36,0,0,0,0,0,0,0-.2,.16-.36,.37-.37h0Zm1.38-4.53v-4.06h1.55c.82,.02,1.49-.63,1.51-1.43,.02-.81-.63-1.48-1.45-1.49-.02,0-.04,0-.06,0h-6.1c-.82-.02-1.49,.63-1.51,1.43-.02,.81,.63,1.48,1.45,1.49,.02,0,.04,0,.06,0h1.79v4.06m.14,18.68l6.92-9.15c.08-.11,.23-.13,.34-.05,.09,.07,.12,.19,.08,.29l-4.47,10.56c-.35,.84-1.32,1.23-2.16,.89-.07-.03-.14-.06-.2-.1-.8-.47-1.07-1.49-.6-2.28,.03-.05,.07-.11,.11-.16h0Zm-8.08-16.69l-1.86-3.97m2.09-.71l-3.98,1.86" style="fill:none; stroke:#4159a4; stroke-miterlimit:10; stroke-width:1.58px;"/>
<!-- Green dot with smooth pulse -->
<path d="M86.86,91.68c0-1.42,1.17-2.57,2.6-2.56,1.43,0,2.59,1.16,2.59,2.58,0,1.42-1.17,2.57-2.6,2.56-1.43,0-2.58-1.15-2.59-2.56v-.02Z" style="fill:#50a89c;">
<animateTransform attributeName="transform"
type="scale"
values="1;1.3;1"
dur="2s"
repeatCount="indefinite"/>
</path>
<!-- Connection elements forming infinity symbol - AGILE ANIMATION -->
<!-- Top left part of infinity -->
<path d="M225.8,83.92c1.22-1.35,2.46-2.66,3.75-3.94,16.69-16.54,43.22-18.12,61.79-3.68l17.46-2.65,2.57-16.63c-29.5-25.42-73.83-23.89-101.47,3.5-1.24,1.23-2.45,2.49-3.63,3.77l16.89,2.56,2.64,17.07Z" style="stroke:#fff; stroke-miterlimit:10;">
<animate attributeName="fill" values="#5e74b7;#00D4FF;#7B2BFF;#00FFB3;#5e74b7" dur="2s" repeatCount="indefinite"/>
<animate attributeName="stroke-width" values="1;3;1" dur="2s" repeatCount="indefinite"/>
</path>
<!-- Bottom left part of infinity -->
<path d="M78.59,141.18c-14.54-18.4-12.95-44.65,3.71-61.2,1.33-1.31,2.73-2.54,4.2-3.68l-17.46-2.65-2.57-16.63c-1.3,1.13-2.58,2.28-3.82,3.5-27.79,27.53-28.96,71.57-3.53,100.51l16.79-2.55,2.67-17.3Z" style="stroke:#fff; stroke-miterlimit:10;">
<animate attributeName="fill" values="#5e74b7;#7B2BFF;#00FFB3;#00D4FF;#5e74b7" dur="2s" begin="0.5s" repeatCount="indefinite"/>
<animate attributeName="stroke-width" values="1;3;1" dur="2s" begin="0.5s" repeatCount="indefinite"/>
</path>
<!-- Top right part of infinity -->
<path d="M86.5,76.3c18.57-14.44,45.1-12.86,61.79,3.68,1.29,1.27,2.53,2.6,3.75,3.94l2.64-17.07,16.89-2.56c-1.18-1.28-2.39-2.54-3.63-3.77-27.64-27.39-71.97-28.92-101.48-3.5l2.57,16.63,17.46,2.65Z" style="stroke:#fff; stroke-miterlimit:10;">
<animate attributeName="fill" values="#8d9ccf;#00FFB3;#00D4FF;#7B2BFF;#8d9ccf" dur="2s" begin="1s" repeatCount="indefinite"/>
<animate attributeName="stroke-width" values="1;3;1" dur="2s" begin="1s" repeatCount="indefinite"/>
</path>
<!-- Bottom right part of infinity -->
<path d="M299.26,141.18c-15.88,20.08-45.19,23.61-65.46,7.88l-.04-.03-17.46,2.65-2.57,16.63c29.5,25.42,73.83,23.89,101.47-3.5,1.24-1.22,2.4-2.49,3.53-3.78l-16.79-2.55-2.68-17.3Z" style="stroke:#fff; stroke-miterlimit:10;">
<animate attributeName="fill" values="#8d9ccf;#7B2BFF;#00D4FF;#00FFB3;#8d9ccf" dur="2s" begin="1.5s" repeatCount="indefinite"/>
<animate attributeName="stroke-width" values="1;3;1" dur="2s" begin="1.5s" repeatCount="indefinite"/>
</path>
<!-- Additional elements -->
<path d="M315.19,60.52c-1.23-1.22-2.51-2.38-3.82-3.5l-2.57,16.63-17.46,2.65c1.47,1.14,2.88,2.37,4.2,3.68,16.66,16.55,18.25,42.8,3.71,61.2l2.68,17.3,16.79,2.55c25.42-28.93,24.26-72.98-3.53-100.5m-171.1,88.5c-20.2,15.76-49.48,12.31-65.39-7.7-.04-.05-.08-.1-.12-.15l-2.68,17.3-16.79,2.55c1.13,1.29,2.3,2.56,3.53,3.78,27.64,27.39,71.97,28.92,101.47,3.5l-2.57-16.63-17.46-2.65Z" style="fill:#455aa5; stroke:#fff; stroke-miterlimit:10;"/>
<path d="M204.38,103.42c1.09,1.79,2.17,3.56,3.25,5.32,5.65-8.96,11.44-17.4,18.17-24.81l-2.64-17.07-16.89-2.56c-5.38,5.87-10.34,12.11-14.83,18.68,4.58,6.77,8.8,13.66,12.94,20.45m-30.92,18.5c-1.09-1.79-2.18-3.56-3.25-5.32-6.68,10.59-13.53,20.44-21.92,28.75-1.33,1.31-2.73,2.54-4.21,3.68l17.46,2.65,2.57,16.63c1.3-1.12,2.58-2.28,3.82-3.5,6.84-6.9,13.02-14.41,18.46-22.43-4.57-6.76-8.78-13.66-12.93-20.46" style="fill:#8d9ccf; stroke:#fff; stroke-miterlimit:10;"/>
<!-- Central flow representing infinity -->
<path d="M171.57,64.29c11.77,12.66,20.64,27.17,29.24,41.26,9,14.74,17.5,28.67,28.74,39.8,1.33,1.31,2.73,2.54,4.21,3.68l-17.46,2.65-2.57,16.63c-1.3-1.12-2.58-2.27-3.82-3.5-13.63-13.5-23.41-29.52-32.87-45.02-7.97-13.05-15.55-25.46-24.99-35.86l2.64-17.07,16.89-2.56Z" style="stroke:#fff; stroke-miterlimit:10;">
<animate attributeName="fill" values="#5e74b7;url(#infinityGradient);#00D4FF;url(#infinityGradient);#5e74b7" dur="3s" repeatCount="indefinite"/>
<animate attributeName="stroke-width" values="1;4;1" dur="3s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="0.8;1;0.8" dur="3s" repeatCount="indefinite"/>
</path>
<!-- Chronometer/clock with CSS pulse animation -->
<g>
<ellipse cx="261.91" cy="113.28" rx="35.65" ry="35.31" style="fill:#f9b224;">
<!-- CSS-style pulse animation: scale + opacity -->
<animateTransform attributeName="transform"
type="scale"
values="1;1.05;1"
dur="2s"
repeatCount="indefinite"/>
<animate attributeName="opacity"
values="1;0.75;1"
dur="2s"
repeatCount="indefinite"/>
</ellipse>
<!-- Chronometer display -->
<g style="clip-path:url(#d);">
<g>
<path d="M329.9,88.02v57.19c0,1.92-1.57,3.47-3.51,3.47h-89.87c-1.94,0-3.51-1.55-3.51-3.47v-57.19c0-1.92,1.57-3.47,3.51-3.47h89.87c1.94,0,3.51,1.55,3.51,3.47" style="fill:#5e74b7;"/>
<path d="M236.69,87.19c.3,0,.55,.24,.55,.54s-.25,.54-.55,.54-.55-.24-.55-.54,.25-.54,.55-.54h0" style="fill:#dba0a6;"/>
<path d="M238.63,87.19c.3,0,.55,.24,.55,.54s-.25,.54-.55,.54-.55-.24-.55-.54,.25-.54,.55-.54h0" style="fill:#f5cc56;"/>
<path d="M240.56,87.19c.3,0,.55,.24,.55,.54s-.25,.54-.55,.54-.55-.24-.55-.54,.25-.54,.55-.54h0" style="fill:#263682;"/>
<path d="M237.73,89.86h87.43c.92,0,1.66,.74,1.66,1.64s-.74,1.64-1.66,1.64h-87.43c-.92,0-1.66-.74-1.66-1.64s.74-1.64,1.66-1.64m-1.16,9.24h22.25v45.29h-22.25v-45.29Zm23.91,0h64.88v45.29h-64.88v-45.29Z" style="fill:#f3f4f5;"/>
<!-- Animated chart -->
<path d="M265.45,108.82v13.02h53.62v-9.61s-3.47,2.93-5.61,2.93c-3.49,0-5.5-2.32-7.99-2.27-3.52,.07-4.32,2.03-7.04,2.27-3.57,.31-4.73-4.21-9.35-4.47-4.62-.27-6.46,4.96-10.78,4.65-3.26-.23-6.17-5.71-8.31-6.51-1.48-.45-3.06-.45-4.53,0" style="fill:#f2ac41;">
<!-- Real-time data animation -->
<animateTransform attributeName="transform"
type="scale"
values="1,1;1.02,1.1;1,1"
dur="2s"
repeatCount="indefinite"/>
</path>
<path d="M239.78,102.82h4.96v4.93h-4.96v-4.93Zm0,7.89h4.96v4.93h-4.96v-4.93Zm0,7.89h4.96v4.93h-4.96v-4.93Zm0,7.89h4.96v4.93h-4.96v-4.93Zm0,7.89h4.96v4.93h-4.96v-4.93Z" style="fill:#8d9ccf;"/>
<path d="M284.39,127.69h16.01v11.29h-16.01v-11.29Zm-18.94,0h16.01v11.29h-16.01v-11.29Zm37.61,0h16.01v11.29h-16.01v-11.29Zm-56.48-22.8h9.27v1.08h-9.27v-1.08Zm0,7.89h9.27v1.08h-9.27v-1.08Zm0,7.7h9.27v1.08h-9.27v-1.08Zm0,7.89h9.27v1.08h-9.27v-1.08Zm0,7.79h9.27v1.08h-9.27v-1.08Z" style="fill:#d1d9e0;"/>
</g>
</g>
<!-- Green indicator with CSS pulse animation -->
<ellipse cx="287.99" cy="132.27" rx="11.69" ry="11.58" style="fill:#05ab9e;">
<animateTransform attributeName="transform"
type="scale"
values="1;1.05;1"
dur="2s"
repeatCount="indefinite"/>
<animate attributeName="opacity"
values="1;0.8;1"
dur="2s"
repeatCount="indefinite"/>
</ellipse>
<!-- Animated check mark -->
<path d="M281.89,131.18l4.78,4.73,8.02-7.94" style="fill:none; stroke:#fff; stroke-width:4px;">
<animate attributeName="stroke-dasharray"
values="0 20;20 20"
dur="1s"
repeatCount="indefinite"/>
</path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB