# Hetzner Cloud Provider A comprehensive provider implementation for Hetzner Cloud infrastructure automation, enabling seamless integration with the provisioning platform. ## Overview The Hetzner Cloud provider enables management of: - **Server Infrastructure**: Create, delete, resize, and manage cloud servers - **Private Networking**: Configure private networks and VPCs - **Block Storage**: Attach and manage persistent volumes - **Firewalls**: Define and manage firewall rules - **Load Balancing**: Configure load balancers - **Floating IPs**: Manage floating IP addresses - **Placement Groups**: Organize servers with placement policies ## Features ### Core Capabilities - ✅ Server lifecycle management (create, delete, start, stop, restart) - ✅ Dual interface support (HTTP API + hcloud CLI) - ✅ Private network configuration - ✅ Block storage volume management - ✅ Pricing calculations (hourly/monthly) - ✅ Intelligent caching for performance - ✅ Type-safe Nickel schemas - ✅ Interactive code generation ### Supported Locations | Code | Name | Country | | ------ | ------ | --------- | | fsn1 | Falkenstein | Germany | | nbg1 | Nuremberg | Germany | | hel1 | Helsinki | Finland | | ash | Ashburn | USA | | hil | Hillsboro | USA | ### Server Types **Shared vCPU (CX Series)** - cx11: 1 vCPU, 2GB RAM, 20GB SSD - cx21: 2 vCPU, 4GB RAM, 40GB SSD - cx31: 2 vCPU, 8GB RAM, 80GB SSD - cx41: 4 vCPU, 16GB RAM, 160GB SSD - cx51: 8 vCPU, 32GB RAM, 240GB SSD **Dedicated vCPU (CPX Series)** - cpx11: 2 vCPU, 2GB RAM, 40GB SSD - cpx21: 3 vCPU, 4GB RAM, 80GB SSD - cpx31: 4 vCPU, 8GB RAM, 160GB SSD - cpx41: 8 vCPU, 16GB RAM, 240GB SSD - cpx51: 16 vCPU, 32GB RAM, 360GB SSD **Dedicated CPU (CCX Series)** - ccx13: 2 cores, 8GB RAM, 80GB SSD - ccx23: 4 cores, 16GB RAM, 160GB SSD - ccx33: 8 cores, 32GB RAM, 240GB SSD - ccx43: 16 cores, 64GB RAM, 360GB SSD - ccx53: 32 cores, 128GB RAM, 960GB SSD ## Prerequisites ### Required - **Hetzner Cloud Account**: Create at - **API Token**: Generate in Cloud Console → API Tokens - **Nushell**: 0.109.0 or higher ### Optional - **hcloud CLI**: For CLI-based operations (install from ) - **SSH Keys**: Pre-configured in Hetzner Cloud Console for authentication ## Installation ### 1. Set Up API Token ```bash # Store API token securely using SOPS sops -e ~/.config/provisioning/hetzner-secrets.yaml # Add to secrets file: # hetzner: # api_token: "your_token_here" # Or set environment variable: export HCLOUD_TOKEN="your_token_here" ``` ### 2. Install hcloud CLI (Optional) ```bash # Using the provided installation script cd provisioning/extensions/providers/hetzner/bin ./install.sh # Or install manually # macOS brew install hcloud # Ubuntu/Debian apt-get install hcloud # From source https://github.com/hetznercloud/cli/releases ``` ### 3. Configure Provider Create or update `workspace/config/providers/hetzner.toml`: ```toml [provider] name = "hetzner" enabled = true workspace = "production" [provider.auth] interface = "API" # API or CLI # Token from environment: HCLOUD_TOKEN # or secrets: sops://hetzner/api_token [provider.defaults] location = "nbg1" server_type = "cx11" image = "ubuntu-22.04" [provider.api] url = "https://api.hetzner.cloud/v1" timeout = 30 retry_attempts = 3 [provider.features] enable_private_network = true enable_volumes = true enable_firewall = true enable_load_balancer = true ``` ## Usage Examples ### List Available Resources ```bash # List all Hetzner servers provisioning server list --provider hetzner # List locations provisioning providers info hetzner --detail locations # List server types provisioning providers info hetzner --detail server_types ``` ### Create Server ```bash # Interactive generation provisioning generate server hetzner # Create server with defaults provisioning server create web-01 --provider hetzner --location nbg1 --server-type cx11 # Create with options provisioning server create web-01 --provider hetzner --location nbg1 --server-type cx21 --image ubuntu-22.04 --ssh-key my-key # Dry-run (check mode) provisioning server create web-01 --provider hetzner --check ``` ### Server Management ```bash # Get server details provisioning server info web-01 --provider hetzner # Start server provisioning server start web-01 --provider hetzner # Stop server provisioning server stop web-01 --provider hetzner # Reboot server provisioning server reboot web-01 --provider hetzner # Delete server provisioning server delete web-01 --provider hetzner # Delete with volumes provisioning server delete web-01 --provider hetzner --delete-storage ``` ### SSH Connections ```bash # SSH into server (automatic IP detection) provisioning server ssh web-01 --provider hetzner # SSH with custom user provisioning server ssh web-01 --provider hetzner --user root # SSH with specific port provisioning server ssh web-01 --provider hetzner --port 2222 ``` ### Nickel Configuration Define servers in Nickel with full type safety: ```javascript let hetzner = import "hetzner/server_hetzner.ncl" in let servers = [ { hostname = "web-01", server_type = "cx21", location = "nbg1", image = "ubuntu-22.04", volumes = [ { name = "data-01", size = 100, format = "ext4", automount = true } ], networks = [ { name = "private-01", ip = "10.0.0.10" } ], labels = { env = "production", app = "web" }, backups = true } ] in servers ``` ## Configuration Reference ### Environment Variables ```bash # API Authentication export HCLOUD_TOKEN="token_here" # Interface selection export HCLOUD_INTERFACE="API" # API or CLI # API URL (usually not needed) export HCLOUD_API_URL="https://api.hetzner.cloud/v1" # Timeout settings export PROVISIONING_PROVIDER_HETZNER_TIMEOUT=30 export PROVISIONING_PROVIDER_HETZNER_RETRY_ATTEMPTS=3 ``` ### Configuration Hierarchy Settings are loaded in priority order (highest wins): 1. **Runtime Arguments**: CLI flags (`--location nbg1`) 2. **Environment Variables**: `PROVISIONING_PROVIDER_HETZNER_*` 3. **User Config**: `workspace/config/providers/hetzner.toml` 4. **System Defaults**: `provisioning/extensions/providers/hetzner/config.defaults.toml` ### Config File Structure **workspace/config/providers/hetzner.toml**: ```toml [provider] name = "hetzner" enabled = true [provider.auth] interface = "API" [provider.defaults] location = "nbg1" server_type = "cx11" image = "ubuntu-22.04" [provider.api] url = "https://api.hetzner.cloud/v1" timeout = 30 retry_attempts = 3 rate_limit = 10 [provider.features] enable_private_network = true enable_volumes = true enable_firewall = true enable_load_balancer = true ``` ## API Reference ### Server Operations **List Servers** ```bash curl -H "Authorization: Bearer $HCLOUD_TOKEN" https://api.hetzner.cloud/v1/servers ``` **Get Server Details** ```bash curl -H "Authorization: Bearer $HCLOUD_TOKEN" https://api.hetzner.cloud/v1/servers/{id} ``` **Create Server** ```bash curl -X POST -H "Authorization: Bearer $HCLOUD_TOKEN" -H "Content-Type: application/json" -d '{ "name": "web-01", "server_type": "cx11", "image": "ubuntu-22.04", "location": "nbg1", "start_after_create": true }' https://api.hetzner.cloud/v1/servers ``` **Delete Server** ```bash curl -X DELETE -H "Authorization: Bearer $HCLOUD_TOKEN" https://api.hetzner.cloud/v1/servers/{id} ``` ### Pricing API **Get Pricing Information** ```bash curl -H "Authorization: Bearer $HCLOUD_TOKEN" https://api.hetzner.cloud/v1/pricing ``` ### Locations API **List All Locations** ```bash curl -H "Authorization: Bearer $HCLOUD_TOKEN" https://api.hetzner.cloud/v1/locations ``` ### Server Types API **List All Server Types** ```bash curl -H "Authorization: Bearer $HCLOUD_TOKEN" https://api.hetzner.cloud/v1/server_types ``` ## Troubleshooting ### Authentication Issues **Problem**: "HCLOUD_TOKEN not set" or "Unauthorized" **Solution**: ```bash # Check token is set echo $HCLOUD_TOKEN # Test token validity curl -H "Authorization: Bearer $HCLOUD_TOKEN" https://api.hetzner.cloud/v1/locations | head -20 # Generate new token in Cloud Console # Settings → API Tokens → Generate Token ``` ### Server Creation Fails **Problem**: "Server type not available in location" **Solution**: Not all server types are available in all locations. Check availability: ```bash provisioning providers info hetzner --detail locations ``` **Problem**: "SSH key not found" **Solution**: Pre-upload SSH keys in Hetzner Cloud Console: ```bash # List available SSH keys hcloud ssh-key list # Add new SSH key hcloud ssh-key create --name my-key --public-key-from-file ~/.ssh/id_rsa.pub ``` ### Performance Issues **Problem**: Slow operations **Solution**: Enable caching: ```toml [provider.caching] enabled = true ttl_seconds = 3600 # Cache for 1 hour ``` ### CLI vs API Issues **Problem**: Commands work with API but fail with CLI **Solution**: Check hcloud CLI version: ```bash hcloud version # Update hcloud CLI brew upgrade hcloud # macOS apt-get upgrade hcloud # Ubuntu ``` **Problem**: "hcloud: command not found" **Solution**: Install hcloud CLI: ```bash provisioning/extensions/providers/hetzner/bin/install.sh ``` ## Advanced Usage ### Private Networks ```javascript let networks = [ { name = "backend-01", ip = "10.0.0.10", alias_ips = ["10.0.0.11", "10.0.0.12"] } ] in networks ``` ### Block Storage Volumes ```javascript let volumes = [ { name = "data-01", size = 100, # GB location = "nbg1", format = "ext4", automount = true, delete_on_termination = false } ] in volumes ``` ### Firewalls ```javascript let firewalls = [ { name = "web-firewall", apply_to = ["app=web"] } ] in firewalls ``` ### Labels and Metadata ```bash labels = { env = "production" app = "web" team = "platform" managed_by = "provisioning" } ``` ## Pricing Hetzner Cloud pricing (EUR): | Server Type | Hourly | Monthly | | ------------ | -------- | --------- | | cx11 | €0.0070 | €3.29 | | cx21 | €0.0140 | €6.58 | | cx31 | €0.0280 | €13.16 | | cpx11 | €0.0140 | €6.58 | | cpx21 | €0.0300 | €14.07 | | ccx13 | €0.0410 | €19.29 | | ccx23 | €0.0820 | €38.59 | **Storage Pricing**: - Volumes: €0.0850/GB/month - Backup: Free (1 automatic backup per server) - Snapshots: €0.0850/GB/month See for current pricing. ## Development ### Testing Provider ```bash # Test provider discovery provisioning providers discover provisioning providers list | grep hetzner # Test provider info provisioning providers info hetzner # Test server operations (dry-run) provisioning server list --provider hetzner --check provisioning server create test-01 --provider hetzner --check # Test with real infrastructure export HCLOUD_TOKEN="your_token" provisioning server create test-01 --provider hetzner --server-type cx11 --location nbg1 provisioning server list --provider hetzner provisioning server delete test-01 --provider hetzner ``` ### Adding New Features 1. Extend Nickel schemas in `schemas/defaults_hetzner.ncl` 2. Implement support functions in `nulib/hetzner/` 3. Add interface functions to `provider.nu` 4. Add tests in `tests/` 5. Update documentation ## API Documentation **Official Documentation**: **CLI Documentation**: **Pricing**: **Status**: ## Support For issues and questions: 1. Check this README 2. Review troubleshooting section 3. Check provider logs: `tail -f workspace/.providers/hetzner/logs/operations.log` 4. Enable debug mode: `PROVISIONING_DEBUG=true` ## Version History **v1.0.0** (2025) - Initial release - Server management (create, delete, list, info) - Private networking support - Block storage (volumes) - Pricing calculations - Caching system - Nickel schema definitions - Code generation templates - Interactive configuration - Dual API/CLI interface ## License MIT - See LICENSE file for details ## Contributing Contributions welcome! Please: 1. Follow Nushell style guide 2. Add tests for new features 3. Update documentation 4. Submit PR with detailed description