#!/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 ` 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 `: Use specific configuration file - `--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 `: Target infrastructure - `--count `: 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 `: Filter by infrastructure - `--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 [OPTIONS] ``` Options: - `--user `: SSH username - `--key `: SSH private key - `--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 `: Filter by status (pending/running/completed/failed) - `--type `: Filter by workflow type - `--limit `: Limit results ### workflows create Create a new workflow. ```bash provisioning workflows create [OPTIONS] ``` Types: - `server`: Server provisioning workflow - `taskserv`: Task service deployment workflow - `cluster`: Cluster deployment workflow ### workflows status Get workflow status. ```bash provisioning workflows status ``` ### workflows cancel Cancel a running workflow. ```bash provisioning workflows cancel [OPTIONS] ``` ## Task Services ### taskserv create Install a task service. ```bash provisioning taskserv create [OPTIONS] ``` Services: - `kubernetes`: Kubernetes orchestrator - `cilium`: Network CNI - `containerd`: Container runtime - `postgres`: PostgreSQL database Options: - `--check, -c`: Dry run mode - `--infra `: Target infrastructure - `--config `: 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 [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 [OPTIONS] ``` Cluster Types: - `buildkit`: Build cluster - `web`: Web services cluster - `data`: Data processing cluster ### cluster delete Delete a cluster. ```bash provisioning cluster delete [OPTIONS] ``` ### cluster list List clusters. ```bash provisioning cluster list [OPTIONS] ``` ## Configuration ### validate config Validate configuration files. ```bash provisioning validate config [OPTIONS] ``` Options: - `--file `: Validate specific file - `--env `: Validate environment config ### show Show configuration details. ```bash provisioning show [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 ``` " } # 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 ``` ### 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 ` - 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 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 # 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 }