provisioning/tools/distribution/generate-docs.nu
2025-10-07 11:12:02 +01:00

1941 lines
50 KiB
Plaintext

#!/usr/bin/env nu
# Documentation generation tool - generates distribution documentation
#
# Generates:
# - Installation guides and system requirements
# - User manuals and API documentation
# - Configuration references and examples
# - Troubleshooting guides and FAQ
# - Developer documentation and contributing guides
use std log
def main [
--source-root: string = "" # Source root directory (auto-detected if empty)
--output-dir: string = "dist/docs" # Output directory for documentation
--doc-types: string = "all" # Documentation types: user, admin, dev, api, all
--format: string = "markdown" # Output format: markdown, html, pdf, all
--include-examples: bool = true # Include configuration examples
--generate-api: bool = true # Generate API documentation
--create-index: bool = true # Create documentation index
--minify-output: bool = false # Minify output files
--verbose: bool = false # Enable verbose logging
] -> record {
let repo_root = if $source_root == "" {
($env.PWD | path dirname | path dirname | path dirname)
} else {
($source_root | path expand)
}
let doc_types_list = if $doc_types == "all" {
["user", "admin", "dev", "api"]
} else {
($doc_types | split row "," | each { str trim })
}
let format_list = if $format == "all" {
["markdown", "html"]
} else {
[$format]
}
let docs_config = {
source_root: $repo_root
output_dir: ($output_dir | path expand)
doc_types: $doc_types_list
formats: $format_list
include_examples: $include_examples
generate_api: $generate_api
create_index: $create_index
minify_output: $minify_output
verbose: $verbose
}
log info $"Starting documentation generation with config: ($docs_config)"
# Ensure output directory exists
mkdir ($docs_config.output_dir)
let generation_results = []
try {
# Phase 1: Discover documentation sources
let discovery_result = discover_documentation_sources $docs_config
let generation_results = ($generation_results | append { phase: "discovery", result: $discovery_result })
# Phase 2: Generate user documentation
let user_docs_result = if "user" in $docs_config.doc_types {
generate_user_documentation $docs_config $discovery_result
} else {
{ status: "skipped", reason: "user documentation not requested" }
}
let generation_results = ($generation_results | append { phase: "user", result: $user_docs_result })
# Phase 3: Generate admin documentation
let admin_docs_result = if "admin" in $docs_config.doc_types {
generate_admin_documentation $docs_config $discovery_result
} else {
{ status: "skipped", reason: "admin documentation not requested" }
}
let generation_results = ($generation_results | append { phase: "admin", result: $admin_docs_result })
# Phase 4: Generate developer documentation
let dev_docs_result = if "dev" in $docs_config.doc_types {
generate_developer_documentation $docs_config $discovery_result
} else {
{ status: "skipped", reason: "developer documentation not requested" }
}
let generation_results = ($generation_results | append { phase: "dev", result: $dev_docs_result })
# Phase 5: Generate API documentation
let api_docs_result = if "api" in $docs_config.doc_types and $docs_config.generate_api {
generate_api_documentation $docs_config $discovery_result
} else {
{ status: "skipped", reason: "API documentation not requested or disabled" }
}
let generation_results = ($generation_results | append { phase: "api", result: $api_docs_result })
# Phase 6: Create documentation index
let index_result = if $docs_config.create_index {
create_documentation_index $docs_config $generation_results
} else {
{ status: "skipped", reason: "index creation disabled" }
}
let generation_results = ($generation_results | append { phase: "index", result: $index_result })
# Phase 7: Convert to additional formats
let conversion_result = convert_documentation_formats $docs_config $generation_results
let generation_results = ($generation_results | append { phase: "conversion", result: $conversion_result })
let summary = {
source_root: $docs_config.source_root
output_directory: $docs_config.output_dir
doc_types: ($docs_config.doc_types | length)
formats: ($docs_config.formats | length)
successful_phases: ($generation_results | where {|r| $r.result.status == "success"} | length)
total_phases: ($generation_results | length)
documents_generated: (count_generated_documents $generation_results)
total_size: (get_directory_size $docs_config.output_dir)
docs_config: $docs_config
phases: $generation_results
}
log info $"Documentation generation completed - ($summary.documents_generated) documents generated"
return $summary
} catch {|err|
log error $"Documentation generation failed: ($err.msg)"
exit 1
}
}
# Discover documentation sources in the project
def discover_documentation_sources [docs_config: record] -> record {
log info "Discovering documentation sources..."
let start_time = (date now)
try {
# Find existing documentation files
let existing_docs = find_existing_documentation $docs_config.source_root
# Analyze project structure for automatic documentation generation
let project_structure = analyze_project_structure $docs_config.source_root
# Discover configuration examples
let config_examples = find_configuration_examples $docs_config.source_root
# Find API endpoints for documentation
let api_endpoints = if $docs_config.generate_api {
discover_api_endpoints $docs_config.source_root
} else {
[]
}
{
status: "success"
existing_docs: $existing_docs
project_structure: $project_structure
config_examples: $config_examples
api_endpoints: $api_endpoints
duration: ((date now) - $start_time)
}
} catch {|err|
{
status: "failed"
reason: $err.msg
duration: ((date now) - $start_time)
}
}
}
# Find existing documentation files
def find_existing_documentation [repo_root: string] -> record {
let doc_patterns = ["README.md", "*.md", "*.rst", "docs/*", "doc/*"]
let mut found_docs = []
for pattern in $doc_patterns {
let matching_files = try {
find $repo_root -name $pattern -type f | head -50
} catch {
[]
}
$found_docs = ($found_docs | append $matching_files)
}
let categorized_docs = $found_docs | each {|doc|
{
path: $doc
name: ($doc | path basename)
category: (categorize_document $doc)
size: (ls $doc | get 0.size)
}
}
{
total_docs: ($found_docs | length)
readme_files: ($categorized_docs | where category == "readme")
user_docs: ($categorized_docs | where category == "user")
dev_docs: ($categorized_docs | where category == "dev")
api_docs: ($categorized_docs | where category == "api")
other_docs: ($categorized_docs | where category == "other")
all_docs: $categorized_docs
}
}
# Categorize document based on filename and location
def categorize_document [doc_path: string] -> string {
let name = ($doc_path | path basename | str downcase)
let path = ($doc_path | str downcase)
if ($name == "readme.md") or ($name | str starts-with "readme") {
return "readme"
}
if ($name | str contains "install") or ($name | str contains "setup") or ($name | str contains "getting") {
return "user"
}
if ($name | str contains "api") or ($path | str contains "/api/") {
return "api"
}
if ($name | str contains "dev") or ($name | str contains "contrib") or ($path | str contains "/dev/") {
return "dev"
}
if ($name | str contains "config") or ($name | str contains "reference") {
return "admin"
}
return "other"
}
# Analyze project structure for documentation generation
def analyze_project_structure [repo_root: string] -> record {
# Find major components
let components = [
{ name: "orchestrator", path: ($repo_root | path join "orchestrator") }
{ name: "control-center", path: ($repo_root | path join "control-center") }
{ name: "provisioning", path: ($repo_root | path join "provisioning") }
{ name: "platform", path: ($repo_root | path join "platform") }
{ name: "core", path: ($repo_root | path join "core") }
]
let existing_components = ($components | where {|comp| ($comp.path | path exists) })
# Analyze Nushell modules for documentation
let nu_modules = try {
find $repo_root -name "*.nu" -type f | head -100
} catch {
[]
}
# Find configuration files
let config_files = try {
find $repo_root -name "*.toml" -o -name "*.yaml" -o -name "*.json" | head -50
} catch {
[]
}
{
components: $existing_components
nu_modules: ($nu_modules | length)
config_files: ($config_files | length)
has_rust_projects: (($repo_root | path join "Cargo.toml") | path exists)
has_docker: (($repo_root | path join "Dockerfile") | path exists)
}
}
# Find configuration examples
def find_configuration_examples [repo_root: string] -> list {
let example_patterns = ["*.example", "*.template", "examples/*", "config/*"]
let mut examples = []
for pattern in $example_patterns {
let matching_files = try {
find $repo_root -name $pattern -type f | head -20
} catch {
[]
}
$examples = ($examples | append $matching_files)
}
return ($examples | each {|ex|
{
path: $ex
name: ($ex | path basename)
type: (get_config_type $ex)
}
})
}
# Get configuration file type
def get_config_type [config_path: string] -> string {
let ext = ($config_path | path extension)
match $ext {
"toml" => "toml"
"yaml" | "yml" => "yaml"
"json" => "json"
"env" => "environment"
_ => "unknown"
}
}
# Discover API endpoints for documentation
def discover_api_endpoints [repo_root: string] -> list {
# This would analyze Rust source files to find API routes
# For now, we'll return a placeholder structure
[
{ path: "/health", method: "GET", description: "Health check endpoint" }
{ path: "/version", method: "GET", description: "System version information" }
{ path: "/workflows", method: "GET", description: "List workflows" }
{ path: "/workflows", method: "POST", description: "Create new workflow" }
{ path: "/workflows/{id}", method: "GET", description: "Get workflow details" }
{ path: "/workflows/{id}", method: "DELETE", description: "Delete workflow" }
]
}
# Generate user documentation
def generate_user_documentation [
docs_config: record
discovery_result: record
] -> record {
log info "Generating user documentation..."
let start_time = (date now)
try {
let user_docs_dir = ($docs_config.output_dir | path join "user")
mkdir $user_docs_dir
let mut generated_docs = []
# Generate getting started guide
let getting_started = generate_getting_started_guide $docs_config $discovery_result
$getting_started | save ($user_docs_dir | path join "getting-started.md")
$generated_docs = ($generated_docs | append "getting-started.md")
# Generate installation guide
let installation_guide = generate_installation_guide $docs_config $discovery_result
$installation_guide | save ($user_docs_dir | path join "installation.md")
$generated_docs = ($generated_docs | append "installation.md")
# Generate CLI reference
let cli_reference = generate_cli_reference $docs_config $discovery_result
$cli_reference | save ($user_docs_dir | path join "cli-reference.md")
$generated_docs = ($generated_docs | append "cli-reference.md")
# Generate troubleshooting guide
let troubleshooting = generate_troubleshooting_guide $docs_config $discovery_result
$troubleshooting | save ($user_docs_dir | path join "troubleshooting.md")
$generated_docs = ($generated_docs | append "troubleshooting.md")
# Generate FAQ
let faq = generate_faq $docs_config $discovery_result
$faq | save ($user_docs_dir | path join "faq.md")
$generated_docs = ($generated_docs | append "faq.md")
{
status: "success"
docs_generated: ($generated_docs | length)
generated_docs: $generated_docs
user_docs_dir: $user_docs_dir
duration: ((date now) - $start_time)
}
} catch {|err|
{
status: "failed"
reason: $err.msg
duration: ((date now) - $start_time)
}
}
}
# Generate getting started guide
def generate_getting_started_guide [docs_config: record, discovery_result: record] -> string {
$"# Getting Started with Provisioning System
Welcome to the Provisioning System! This guide will help you get up and running quickly.
## What is the Provisioning System?
The Provisioning System is a cloud-native infrastructure provisioning and management platform that helps you:
- Provision and manage cloud infrastructure across multiple providers
- Deploy and orchestrate containerized applications
- Manage configuration and secrets
- Monitor and observe your infrastructure
## Quick Start
### 1. Installation
Choose your preferred installation method:
#### Using the installer script (Recommended)
```bash
# Linux/macOS
sudo ./install.sh
# Windows (as Administrator)
install.bat
```
#### Manual installation
See the [Installation Guide](installation.md) for detailed instructions.
### 2. Verify Installation
```bash
# Check version
provisioning version
# Check environment
provisioning env
# Get help
provisioning help
```
### 3. Basic Configuration
Create your user configuration:
```bash
cp config/config.user.toml.template config/config.user.toml
# Edit config/config.user.toml with your preferences
```
### 4. Your First Workflow
Create a simple server:
```bash
# List available commands
provisioning help
# Create a server (dry-run first)
provisioning servers create --check
# Actually create the server
provisioning servers create
```
## Key Concepts
### Workflows
Workflows are automated sequences of infrastructure operations. They can be:
- **Server workflows**: Provision and configure servers
- **Application workflows**: Deploy applications and services
- **Maintenance workflows**: Updates, backups, and monitoring
### Providers
The system supports multiple cloud providers:
- **AWS**: Amazon Web Services
- **UpCloud**: European cloud provider
- **Local**: Local development and testing
### Configuration
Configuration is hierarchical and environment-aware:
- **System defaults**: Built-in sensible defaults
- **User config**: Personal preferences and credentials
- **Project config**: Project-specific settings
- **Environment config**: Environment-specific overrides
## Next Steps
1. Read the [CLI Reference](cli-reference.md) for detailed command information
2. See the [Configuration Guide](../admin/configuration.md) for advanced configuration
3. Check out the [Examples](../examples/) directory for sample configurations
4. Join our community for support and discussions
## Getting Help
- **Documentation**: Browse this documentation for comprehensive guides
- **CLI Help**: Use `provisioning help <command>` for specific command help
- **Troubleshooting**: See the [Troubleshooting Guide](troubleshooting.md)
- **FAQ**: Check the [Frequently Asked Questions](faq.md)
Happy provisioning! 🚀
"
}
# Generate installation guide
def generate_installation_guide [docs_config: record, discovery_result: record] -> string {
$"# Installation Guide
This guide covers all installation methods for the Provisioning System.
## System Requirements
### Minimum Requirements
- **Operating System**: Linux (Ubuntu 20.04+, CentOS 8+), macOS (10.15+), or Windows 10+
- **Memory**: 2GB RAM (4GB recommended)
- **Storage**: 1GB free disk space
- **Network**: Internet connectivity for package downloads
### Dependencies
- **Nushell**: 0.107.1 or later (installed automatically)
- **Git**: For source installations and updates
- **Docker**: Optional, for containerized deployments
## Installation Methods
### 1. Automated Installer (Recommended)
The automated installer handles all dependencies and configuration:
#### Linux/macOS
```bash
# Download and extract the distribution
tar -xzf provisioning-*-linux-complete.tar.gz
cd provisioning-*-linux-complete
# Run the installer
sudo ./install.sh
# Verify installation
provisioning version
```
#### Windows
```cmd
# Extract the distribution
# Run the installer as Administrator
install.bat
# Verify installation
provisioning version
```
### 2. Package Manager Installation
#### Homebrew (macOS)
```bash
brew tap your-org/provisioning
brew install provisioning
```
#### APT (Debian/Ubuntu)
```bash
# Add repository
curl -fsSL https://apt.your-org.com/gpg | sudo apt-key add -
echo \"deb https://apt.your-org.com/ubuntu stable main\" | sudo tee /etc/apt/sources.list.d/provisioning.list
# Install
sudo apt update
sudo apt install provisioning
```
#### YUM/DNF (RHEL/CentOS/Fedora)
```bash
# Add repository
sudo yum-config-manager --add-repo https://yum.your-org.com/provisioning.repo
# Install
sudo yum install provisioning
```
### 3. Container Installation
#### Docker
```bash
# Run the orchestrator
docker run -d --name provisioning-orchestrator \\
-p 8080:8080 \\
-v provisioning-data:/data \\
provisioning/orchestrator:latest
# Run the control center
docker run -d --name provisioning-control-center \\
-p 9080:9080 \\
provisioning/control-center:latest
```
#### Docker Compose
```bash
# Use the provided docker-compose.yml
docker-compose up -d
```
### 4. Source Installation
For development or customization:
```bash
# Clone the repository
git clone https://github.com/your-org/provisioning.git
cd provisioning
# Build the system
./tools/distribution/generate-distribution.nu
# Install from built distribution
cd dist
sudo ./install.sh
```
## Post-Installation Configuration
### 1. Environment Setup
The installer automatically configures:
- System PATH updates
- Environment variables
- Shell integration
Restart your shell or run:
```bash
source /etc/profile.d/provisioning.sh # Linux/macOS
```
### 2. User Configuration
Create your personal configuration:
```bash
# Copy the template
cp /etc/provisioning/config.user.toml.template ~/.config/provisioning/config.user.toml
# Edit with your preferences
$EDITOR ~/.config/provisioning/config.user.toml
```
### 3. Service Configuration (Optional)
Enable system services for automatic startup:
```bash
# Enable orchestrator service
sudo systemctl enable provisioning-orchestrator
sudo systemctl start provisioning-orchestrator
# Check service status
sudo systemctl status provisioning-orchestrator
```
## Verification
Verify your installation:
```bash
# Check version and build info
provisioning version
# Check configuration
provisioning env
# Test basic functionality
provisioning help
# Verify orchestrator connection (if running)
provisioning workflows list
```
## Troubleshooting
### Common Issues
#### Permission Denied
```bash
# Fix binary permissions
sudo chmod +x /usr/local/bin/provisioning*
```
#### Command Not Found
```bash
# Check PATH
echo $PATH
# Add to PATH if needed
export PATH=\"/usr/local/bin:$PATH\"
```
#### Configuration Errors
```bash
# Validate configuration
provisioning validate config
# Check environment variables
provisioning allenv
```
### Getting Help
If you encounter issues:
1. Check the [Troubleshooting Guide](troubleshooting.md)
2. Review system logs: `journalctl -u provisioning-*`
3. Validate configuration: `provisioning validate config`
4. Ask for help in our community channels
## Uninstallation
To remove the Provisioning System:
### Using the Uninstaller
```bash
# Linux/macOS
sudo ./uninstall.sh
# Windows (as Administrator)
uninstall.bat
```
### Manual Removal
```bash
# Remove binaries
sudo rm -f /usr/local/bin/provisioning*
# Remove libraries
sudo rm -rf /usr/local/lib/provisioning
# Remove configuration
sudo rm -rf /etc/provisioning
# Remove data (optional)
sudo rm -rf /var/lib/provisioning
sudo rm -rf /var/log/provisioning
```
## Next Steps
After successful installation:
1. Follow the [Getting Started Guide](getting-started.md)
2. Review the [CLI Reference](cli-reference.md)
3. Explore [Configuration Options](../admin/configuration.md)
"
}
# Generate CLI reference
def generate_cli_reference [docs_config: record, discovery_result: record] -> string {
$"# CLI Reference
Complete reference for the Provisioning System command-line interface.
## Overview
The `provisioning` command is the main entry point for all system operations. It provides a consistent interface across all platforms and environments.
## Global Options
These options are available for all commands:
- `--help, -h`: Show help information
- `--version, -V`: Show version information
- `--verbose, -v`: Enable verbose output
- `--debug, -x`: Enable debug mode
- `--config, -c <file>`: Use specific configuration file
- `--env <env>`: Use specific environment (dev/test/prod)
## Core Commands
### help
Show help information for commands.
```bash
provisioning help [COMMAND]
```
Examples:
```bash
provisioning help # Show main help
provisioning help servers # Show servers command help
provisioning help servers create # Show servers create help
```
### version
Display version and build information.
```bash
provisioning version [OPTIONS]
```
Options:
- `--json`: Output in JSON format
- `--short`: Show only version number
Examples:
```bash
provisioning version # Show full version info
provisioning version --short # Show version number only
provisioning version --json # JSON output for scripts
```
### env
Display environment and configuration information.
```bash
provisioning env [OPTIONS]
```
Options:
- `--all`: Show all environment variables
- `--config`: Show configuration sources
- `--paths`: Show file paths
Examples:
```bash
provisioning env # Show basic environment
provisioning env --all # Show all variables
provisioning env --config # Show config sources
```
## Server Management
### servers create
Create new servers.
```bash
provisioning servers create [OPTIONS]
```
Options:
- `--check, -c`: Dry run mode (no actual changes)
- `--infra <name>`: Target infrastructure
- `--count <n>`: Number of servers to create
- `--wait, -w`: Wait for completion
Examples:
```bash
provisioning servers create --check # Dry run
provisioning servers create # Create with defaults
provisioning servers create --count 3 # Create 3 servers
```
### servers list
List existing servers.
```bash
provisioning servers list [OPTIONS]
```
Options:
- `--infra <name>`: Filter by infrastructure
- `--status <status>`: Filter by status
- `--json`: JSON output
Examples:
```bash
provisioning servers list # List all servers
provisioning servers list --infra production # Production servers only
provisioning servers list --status running # Running servers only
```
### servers delete
Delete servers.
```bash
provisioning servers delete [OPTIONS] [SERVER_NAME]
```
Options:
- `--check, -c`: Dry run mode
- `--force, -f`: Skip confirmation
- `--all`: Delete all servers
Examples:
```bash
provisioning servers delete web-01 # Delete specific server
provisioning servers delete --all --check # Dry run delete all
```
### servers ssh
SSH into a server.
```bash
provisioning servers ssh <SERVER_NAME> [OPTIONS]
```
Options:
- `--user <user>`: SSH username
- `--key <keyfile>`: SSH private key
- `--port <port>`: SSH port
Examples:
```bash
provisioning servers ssh web-01 # SSH with defaults
provisioning servers ssh web-01 --user admin # Specific user
```
## Workflow Management
### workflows list
List workflows.
```bash
provisioning workflows list [OPTIONS]
```
Options:
- `--status <status>`: Filter by status (pending/running/completed/failed)
- `--type <type>`: Filter by workflow type
- `--limit <n>`: Limit results
### workflows create
Create a new workflow.
```bash
provisioning workflows create <TYPE> [OPTIONS]
```
Types:
- `server`: Server provisioning workflow
- `taskserv`: Task service deployment workflow
- `cluster`: Cluster deployment workflow
### workflows status
Get workflow status.
```bash
provisioning workflows status <WORKFLOW_ID>
```
### workflows cancel
Cancel a running workflow.
```bash
provisioning workflows cancel <WORKFLOW_ID> [OPTIONS]
```
## Task Services
### taskserv create
Install a task service.
```bash
provisioning taskserv create <SERVICE> [OPTIONS]
```
Services:
- `kubernetes`: Kubernetes orchestrator
- `cilium`: Network CNI
- `containerd`: Container runtime
- `postgres`: PostgreSQL database
Options:
- `--check, -c`: Dry run mode
- `--infra <name>`: Target infrastructure
- `--config <file>`: Service configuration
Examples:
```bash
provisioning taskserv create kubernetes --check
provisioning taskserv create postgres --config db-config.toml
```
### taskserv list
List available and installed task services.
```bash
provisioning taskserv list [OPTIONS]
```
Options:
- `--available`: Show available services
- `--installed`: Show installed services only
- `--updates`: Check for updates
### taskserv delete
Remove a task service.
```bash
provisioning taskserv delete <SERVICE> [OPTIONS]
```
### taskserv check-updates
Check for service updates.
```bash
provisioning taskserv check-updates [SERVICE]
```
## Cluster Operations
### cluster create
Create a Kubernetes cluster.
```bash
provisioning cluster create <CLUSTER_TYPE> [OPTIONS]
```
Cluster Types:
- `buildkit`: Build cluster
- `web`: Web services cluster
- `data`: Data processing cluster
### cluster delete
Delete a cluster.
```bash
provisioning cluster delete <CLUSTER_NAME> [OPTIONS]
```
### cluster list
List clusters.
```bash
provisioning cluster list [OPTIONS]
```
## Configuration
### validate config
Validate configuration files.
```bash
provisioning validate config [OPTIONS]
```
Options:
- `--file <file>`: Validate specific file
- `--env <env>`: Validate environment config
### show
Show configuration details.
```bash
provisioning show <TYPE> [OPTIONS]
```
Types:
- `settings`: System settings
- `servers`: Server configurations
- `providers`: Provider configurations
## Examples and Workflows
### Complete Server Setup
```bash
# 1. Check current environment
provisioning env
# 2. Create servers (dry run first)
provisioning servers create --check
# 3. Create servers
provisioning servers create --wait
# 4. Install Kubernetes
provisioning taskserv create kubernetes --check
provisioning taskserv create kubernetes
# 5. Deploy a cluster
provisioning cluster create web --check
provisioning cluster create web
```
### Development Workflow
```bash
# Use development environment
export PROVISIONING_ENV=dev
# Create development infrastructure
provisioning generate infra --new dev-project
provisioning servers create --infra dev-project --count 1
# Install development services
provisioning taskserv create containerd
provisioning taskserv create postgres
```
### Production Deployment
```bash
# Use production environment
export PROVISIONING_ENV=prod
# Create production servers
provisioning servers create --infra production --count 3 --wait
# Install production services
provisioning taskserv create kubernetes
provisioning taskserv create cilium
provisioning cluster create web
```
## Exit Codes
The CLI uses standard exit codes:
- `0`: Success
- `1`: General errors
- `2`: Misuse of shell command
- `126`: Command invoked cannot execute
- `127`: Command not found
- `130`: Script terminated by Control-C
## Environment Variables
Key environment variables that affect CLI behavior:
- `PROVISIONING_HOME`: Installation directory
- `PROVISIONING_CONFIG`: Configuration file path
- `PROVISIONING_ENV`: Environment name (dev/test/prod)
- `PROVISIONING_DEBUG`: Enable debug output
- `PROVISIONING_LOG_LEVEL`: Log level (error/warn/info/debug)
## Shell Integration
### Bash Completion
```bash
# Add to ~/.bashrc
eval \"$(provisioning completion bash)\"
```
### Zsh Completion
```bash
# Add to ~/.zshrc
eval \"$(provisioning completion zsh)\"
```
### Fish Completion
```bash
# Add to ~/.config/fish/config.fish
provisioning completion fish | source
```
For more detailed information about specific commands, use:
```bash
provisioning help <command>
```
"
}
# Generate troubleshooting guide
def generate_troubleshooting_guide [docs_config: record, discovery_result: record] -> string {
$"# Troubleshooting Guide
This guide helps you diagnose and resolve common issues with the Provisioning System.
## General Troubleshooting Steps
1. **Check system status**: `provisioning env`
2. **Validate configuration**: `provisioning validate config`
3. **Review logs**: Check system logs for errors
4. **Verify permissions**: Ensure proper file and directory permissions
5. **Update system**: Make sure you're running the latest version
## Common Issues
### Installation Issues
#### \"Command not found: provisioning\"
**Symptoms**: Shell cannot find the provisioning command
**Causes**:
- Installation incomplete
- PATH not updated
- Binary permissions incorrect
**Solutions**:
```bash
# Check if binary exists
ls -la /usr/local/bin/provisioning*
# Check PATH
echo $PATH | grep \"/usr/local/bin\"
# Fix PATH (add to shell profile)
echo 'export PATH=\"/usr/local/bin:$PATH\"' >> ~/.bashrc
source ~/.bashrc
# Fix permissions
sudo chmod +x /usr/local/bin/provisioning*
```
#### \"Permission denied\" errors
**Symptoms**: Cannot execute commands or access files
**Solutions**:
```bash
# Fix binary permissions
sudo chmod +x /usr/local/bin/provisioning*
# Fix directory permissions
sudo chown -R $(whoami):$(whoami) ~/.config/provisioning
sudo chmod -R 755 ~/.config/provisioning
# Check service user permissions
sudo usermod -a -G provisioning $(whoami)
```
### Configuration Issues
#### \"Configuration file not found\"
**Symptoms**: System cannot load configuration files
**Solutions**:
```bash
# Check configuration paths
provisioning env --config
# Create missing user config
cp /etc/provisioning/config.user.toml.template ~/.config/provisioning/config.user.toml
# Validate configuration
provisioning validate config
```
#### \"Invalid configuration\" errors
**Symptoms**: Configuration parsing fails
**Solutions**:
```bash
# Check TOML syntax
# Use a TOML validator or editor with syntax checking
# Reset to defaults
cp /etc/provisioning/config.defaults.toml /etc/provisioning/config.user.toml
# Check for encoding issues (ensure UTF-8)
file ~/.config/provisioning/config.user.toml
```
### Network and Connectivity Issues
#### Cannot connect to services
**Symptoms**: API calls fail, services unreachable
**Solutions**:
```bash
# Check service status
sudo systemctl status provisioning-orchestrator
sudo systemctl status provisioning-control-center
# Check ports
netstat -tlnp | grep 8080
curl -f http://localhost:8080/health
# Check firewall
sudo ufw status
sudo firewall-cmd --list-ports
# Restart services
sudo systemctl restart provisioning-orchestrator
```
#### Provider authentication failures
**Symptoms**: Cloud provider operations fail with auth errors
**Solutions**:
```bash
# Check provider credentials
provisioning validate config --provider aws
# Update credentials in config
$EDITOR ~/.config/provisioning/config.user.toml
# Check credential file permissions (should not be world-readable)
chmod 600 ~/.config/provisioning/config.user.toml
```
### Workflow and Operation Issues
#### Workflows stuck in \"pending\" state
**Symptoms**: Workflows don't progress from pending
**Solutions**:
```bash
# Check orchestrator status
provisioning workflows orchestrator
# Check orchestrator logs
sudo journalctl -u provisioning-orchestrator -f
# Restart orchestrator
sudo systemctl restart provisioning-orchestrator
# Check for resource locks
provisioning workflows list --status pending
```
#### \"Resource already exists\" errors
**Symptoms**: Operations fail due to existing resources
**Solutions**:
```bash
# List existing resources
provisioning servers list
provisioning cluster list
# Use different names or clean up existing resources
provisioning servers delete old-server-name
# Use --force flag to override (use with caution)
provisioning servers create --force
```
### Performance Issues
#### Slow command execution
**Symptoms**: Commands take unusually long to complete
**Solutions**:
```bash
# Enable debug mode to see what's happening
provisioning --debug servers list
# Check system resources
top
df -h
# Clear caches
rm -rf ~/.cache/provisioning/*
# Check for large log files
find /var/log/provisioning -name \"*.log\" -size +100M
```
#### High memory usage
**Symptoms**: System using excessive memory
**Solutions**:
```bash
# Check memory usage
free -h
ps aux | grep provisioning
# Restart services to free memory
sudo systemctl restart provisioning-orchestrator
# Check for memory leaks in logs
sudo journalctl -u provisioning-orchestrator | grep -i memory
```
## Advanced Troubleshooting
### Debug Mode
Enable comprehensive debugging:
```bash
export PROVISIONING_DEBUG=true
export PROVISIONING_LOG_LEVEL=debug
provisioning --debug <command>
```
### Log Analysis
Key log locations:
- System logs: `/var/log/provisioning/`
- Service logs: `sudo journalctl -u provisioning-*`
- User logs: `~/.local/share/provisioning/logs/`
Common log patterns to look for:
```bash
# Error patterns
grep -i \"error\\|exception\\|failed\" /var/log/provisioning/*.log
# Connection issues
grep -i \"connection\\|timeout\\|refused\" /var/log/provisioning/*.log
# Permission issues
grep -i \"permission\\|denied\\|unauthorized\" /var/log/provisioning/*.log
```
### Configuration Debugging
```bash
# Show all configuration sources
provisioning env --all
# Show computed configuration
provisioning show settings
# Test configuration loading
provisioning validate config --verbose
```
### Network Debugging
```bash
# Test local services
curl -v http://localhost:8080/health
curl -v http://localhost:9080/health
# Test external connectivity
curl -v https://api.upcloud.com/
curl -v https://ec2.amazonaws.com/
# Check DNS resolution
nslookup api.upcloud.com
```
## Getting Help
### Before Asking for Help
1. Check this troubleshooting guide
2. Search existing issues on GitHub
3. Review recent changes to your configuration
4. Gather relevant log output
### Information to Include
When reporting issues, include:
```bash
# System information
provisioning version
uname -a
cat /etc/os-release
# Environment
provisioning env
# Configuration (remove sensitive data)
provisioning show settings
# Recent logs
sudo journalctl -u provisioning-* --since \"1 hour ago\"
# Error messages (exact text)
```
### Support Channels
- **GitHub Issues**: Report bugs and feature requests
- **Documentation**: Check online documentation for updates
- **Community**: Join community discussions and forums
### Emergency Recovery
#### Complete System Reset
If the system is completely broken:
```bash
# Stop all services
sudo systemctl stop provisioning-*
# Backup configuration
cp -r /etc/provisioning /tmp/provisioning-backup
# Reinstall system
sudo ./uninstall.sh
sudo ./install.sh
# Restore configuration
sudo cp -r /tmp/provisioning-backup/* /etc/provisioning/
```
#### Factory Reset
To start completely fresh:
```bash
# Uninstall completely
sudo ./uninstall.sh
# Remove all data
sudo rm -rf /var/lib/provisioning
sudo rm -rf /var/log/provisioning
sudo rm -rf ~/.config/provisioning
sudo rm -rf ~/.cache/provisioning
# Reinstall
sudo ./install.sh
```
Remember: Always backup your configuration and data before performing major troubleshooting steps!
"
}
# Generate FAQ
def generate_faq [docs_config: record, discovery_result: record] -> string {
$"# Frequently Asked Questions (FAQ)
## General Questions
### What is the Provisioning System?
The Provisioning System is a cloud-native infrastructure provisioning and management platform that helps you automate the deployment and management of infrastructure across multiple cloud providers.
### Which cloud providers are supported?
Currently supported providers:
- **AWS** (Amazon Web Services)
- **UpCloud** (European cloud provider)
- **Local** (for development and testing)
Additional providers can be added through the plugin system.
### What operating systems are supported?
- **Linux**: Ubuntu 20.04+, CentOS 8+, Debian 11+
- **macOS**: 10.15+ (Catalina and newer)
- **Windows**: Windows 10+, Windows Server 2019+
### Is it open source?
Yes, the Provisioning System is open source. Check the LICENSE file in the repository for specific licensing terms.
## Installation and Setup
### How do I install the system?
The easiest way is using the automated installer:
```bash
# Linux/macOS
sudo ./install.sh
# Windows (as Administrator)
install.bat
```
See the [Installation Guide](installation.md) for other methods.
### Do I need root/administrator privileges?
Yes, for system installation. The installer needs to:
- Copy files to system directories
- Create system users and groups
- Install and configure services
- Set up system PATH and environment
### Can I install without root privileges?
Yes, you can do a user-local installation, but some features may be limited:
```bash
# User installation
./install.sh --user-install --no-services
```
### Where are configuration files stored?
Configuration files are stored in multiple locations:
- **System config**: `/etc/provisioning/` (Linux/macOS), `C:\\ProgramData\\Provisioning\\` (Windows)
- **User config**: `~/.config/provisioning/`
- **Runtime config**: `/var/lib/provisioning/`
## Usage and Operations
### How do I get started after installation?
1. Verify installation: `provisioning version`
2. Check environment: `provisioning env`
3. Create user config: Copy and edit the template from system config
4. Follow the [Getting Started Guide](getting-started.md)
### Can I use multiple cloud providers simultaneously?
Yes! The system supports multi-cloud deployments. You can provision resources across different providers in the same workflow.
### How do I manage secrets and credentials?
The system supports multiple credential management methods:
- Configuration files (encrypted with SOPS/Age)
- Environment variables
- External secret managers (HashiCorp Vault, AWS Secrets Manager)
- Cloud provider credential chains
### Can I run this in containers?
Yes, the system provides Docker containers for all services:
```bash
docker run -d provisioning/orchestrator:latest
docker run -d provisioning/control-center:latest
```
Use the provided `docker-compose.yml` for easy container deployment.
## Configuration and Customization
### How do I configure different environments (dev/test/prod)?
Use environment-specific configuration files:
```bash
# Set environment
export PROVISIONING_ENV=prod
# Use environment-specific config
cp config.prod.toml.template config.prod.toml
# Edit config.prod.toml
```
### Can I customize the installation paths?
Yes, but it requires manual installation. The automated installer uses standard paths for better system integration.
### How do I add custom providers or services?
The system supports extensions through:
- Custom Nushell modules
- Plugin architecture
- Provider templates
See the developer documentation for details.
### Can I integrate with existing CI/CD pipelines?
Yes, the system is designed for CI/CD integration:
- Command-line interface for all operations
- JSON output for scripting
- Return codes for success/failure detection
- Webhook support for notifications
## Troubleshooting
### The `provisioning` command is not found
**Solution**: Check your PATH and permissions:
```bash
# Check PATH
echo $PATH | grep /usr/local/bin
# Check binary
ls -la /usr/local/bin/provisioning*
# Fix PATH
export PATH=\"/usr/local/bin:$PATH\"
```
### Configuration validation fails
**Solution**: Check TOML syntax and file permissions:
```bash
# Validate configuration
provisioning validate config
# Check file permissions
ls -la ~/.config/provisioning/
```
### Services won't start
**Solution**: Check service status and logs:
```bash
sudo systemctl status provisioning-orchestrator
sudo journalctl -u provisioning-orchestrator -f
```
### Operations are slow
**Solution**:
- Check system resources (CPU, memory, disk)
- Enable debug mode: `provisioning --debug <command>`
- Clear caches: `rm -rf ~/.cache/provisioning/*`
See the [Troubleshooting Guide](troubleshooting.md) for more detailed solutions.
## Development and Contributing
### How can I contribute to the project?
We welcome contributions! See the `CONTRIBUTING.md` file for guidelines on:
- Bug reports
- Feature requests
- Code contributions
- Documentation improvements
### How do I build from source?
```bash
git clone <repository-url>
cd provisioning
./tools/distribution/generate-distribution.nu
```
### Can I create custom modules?
Yes! The system supports custom Nushell modules. Place them in:
- System modules: `/usr/local/lib/provisioning/extensions/`
- User modules: `~/.config/provisioning/modules/`
### How do I debug issues during development?
```bash
# Enable debug mode
export PROVISIONING_DEBUG=true
export PROVISIONING_LOG_LEVEL=debug
# Run with debug output
provisioning --debug <command>
# Check development logs
tail -f ~/.local/share/provisioning/logs/debug.log
```
## Performance and Scaling
### How many servers can I manage?
The system is designed to scale horizontally. Limits depend on:
- Available system resources
- Cloud provider API limits
- Network bandwidth and latency
Typical deployments handle hundreds to thousands of servers.
### Can I run multiple orchestrators?
Yes, for high availability and load distribution:
```bash
# Configure multiple orchestrators with load balancing
# See the HA deployment documentation
```
### How do I monitor system performance?
The system provides built-in monitoring:
```bash
# Check system health
provisioning workflows orchestrator
# Monitor workflows
provisioning workflows list --status running
# View performance metrics
provisioning show stats
```
## Security
### How are credentials stored?
Credentials are stored securely:
- Configuration files encrypted with SOPS/Age
- Environment variables (for temporary use)
- Integration with cloud provider credential chains
- Support for external secret managers
### Can I audit system operations?
Yes, all operations are logged:
- System logs: `/var/log/provisioning/`
- Audit trail: All API calls and workflows are logged
- User actions: Command history and results
### Is network traffic encrypted?
Yes:
- All API communications use HTTPS/TLS
- Cloud provider communications use provider security standards
- Internal service communication can be configured with TLS
### How do I secure a multi-user deployment?
- Use separate user configurations
- Implement RBAC through cloud provider IAM
- Use dedicated service accounts
- Enable audit logging
- Regular security updates
## Support and Community
### Where can I get help?
- **Documentation**: This documentation and online resources
- **GitHub Issues**: Bug reports and feature requests
- **Community Forums**: Discussion and support
- **Professional Support**: Available for enterprise users
### How do I report bugs?
1. Check existing issues on GitHub
2. Create a new issue with:
- System information (`provisioning version`)
- Steps to reproduce
- Expected vs actual behavior
- Relevant log output
### How often is the system updated?
- **Major releases**: Every 3-6 months
- **Minor releases**: Monthly
- **Security patches**: As needed
- **Development builds**: Continuously
### Can I get commercial support?
Yes, commercial support options are available for enterprise deployments. Contact us for details about:
- Professional services
- Custom development
- Training and consultation
- SLA-backed support
---
## Still have questions?
If your question isn't answered here:
1. Check the full documentation
2. Search existing GitHub issues
3. Create a new issue or discussion
4. Join our community channels
We're here to help! 🚀
"
}
# Generate admin documentation (placeholder)
def generate_admin_documentation [docs_config: record, discovery_result: record] -> record {
log info "Generating admin documentation..."
let start_time = (date now)
# Placeholder for admin docs
log warning "Admin documentation generation not fully implemented"
{
status: "skipped"
reason: "admin documentation not fully implemented"
docs_generated: 0
duration: ((date now) - $start_time)
}
}
# Generate developer documentation (placeholder)
def generate_developer_documentation [docs_config: record, discovery_result: record] -> record {
log info "Generating developer documentation..."
let start_time = (date now)
# Placeholder for dev docs
log warning "Developer documentation generation not fully implemented"
{
status: "skipped"
reason: "developer documentation not fully implemented"
docs_generated: 0
duration: ((date now) - $start_time)
}
}
# Generate API documentation (placeholder)
def generate_api_documentation [docs_config: record, discovery_result: record] -> record {
log info "Generating API documentation..."
let start_time = (date now)
# Placeholder for API docs
log warning "API documentation generation not fully implemented"
{
status: "skipped"
reason: "API documentation not fully implemented"
docs_generated: 0
duration: ((date now) - $start_time)
}
}
# Create documentation index
def create_documentation_index [docs_config: record, generation_results: list] -> record {
log info "Creating documentation index..."
let start_time = (date now)
try {
let index_content = $"# Documentation Index
Welcome to the Provisioning System documentation!
## User Documentation
- [Getting Started Guide](user/getting-started.md) - Quick start guide for new users
- [Installation Guide](user/installation.md) - Complete installation instructions
- [CLI Reference](user/cli-reference.md) - Comprehensive command reference
- [Troubleshooting Guide](user/troubleshooting.md) - Common issues and solutions
- [FAQ](user/faq.md) - Frequently asked questions
## Administrator Documentation
- Configuration Guide - Advanced configuration options
- Security Guide - Security best practices and configuration
- Monitoring Guide - System monitoring and observability
- Backup and Recovery - Data protection strategies
## Developer Documentation
- Architecture Overview - System architecture and design
- API Reference - REST API documentation
- Plugin Development - Creating custom plugins and extensions
- Contributing Guide - How to contribute to the project
## Generated Documentation
This documentation was generated automatically on (date now | format date '%Y-%m-%d %H:%M:%S').
For the most up-to-date information, visit the online documentation.
"
$index_content | save ($docs_config.output_dir | path join "README.md")
{
status: "success"
index_file: ($docs_config.output_dir | path join "README.md")
duration: ((date now) - $start_time)
}
} catch {|err|
{
status: "failed"
reason: $err.msg
duration: ((date now) - $start_time)
}
}
}
# Convert documentation to additional formats (placeholder)
def convert_documentation_formats [docs_config: record, generation_results: list] -> record {
log info "Converting documentation formats..."
let start_time = (date now)
# Format conversion would happen here (markdown to HTML, PDF, etc.)
log warning "Documentation format conversion not fully implemented"
{
status: "skipped"
reason: "format conversion not fully implemented"
converted_files: 0
duration: ((date now) - $start_time)
}
}
# Count generated documents from results
def count_generated_documents [generation_results: list] -> int {
let user_count = try {
let user_result = ($generation_results | where phase == "user" | get 0.result)
$user_result.docs_generated
} catch { 0 }
let admin_count = try {
let admin_result = ($generation_results | where phase == "admin" | get 0.result)
$admin_result.docs_generated
} catch { 0 }
let dev_count = try {
let dev_result = ($generation_results | where phase == "dev" | get 0.result)
$dev_result.docs_generated
} catch { 0 }
let api_count = try {
let api_result = ($generation_results | where phase == "api" | get 0.result)
$api_result.docs_generated
} catch { 0 }
return ($user_count + $admin_count + $dev_count + $api_count + 1) # +1 for index
}
# Get directory size helper
def get_directory_size [dir: string] -> int {
if not ($dir | path exists) {
return 0
}
try {
find $dir -type f | each {|file| ls $file | get 0.size } | math sum | if $in == null { 0 } else { $in }
} catch {
0
}
}
# Show documentation generation status
def "main status" [] {
let repo_root = ($env.PWD | path dirname | path dirname | path dirname)
# Check for documentation sources
let existing_docs = find_existing_documentation $repo_root
let has_readme = (($repo_root | path join "README.md") | path exists)
{
repository: $repo_root
existing_docs: $existing_docs.total_docs
has_readme: $has_readme
supported_formats: ["markdown", "html"]
doc_types: ["user", "admin", "dev", "api"]
ready_for_generation: true
}
}
# Quick documentation generation with minimal options
def "main quick" [
--output-dir: string = "dist/docs" # Output directory
--doc-types: string = "user" # Documentation types
] {
main --output-dir $output_dir --doc-types $doc_types --format markdown
}