PyHetznerServer

PyPI version Python Support License: MIT Downloads

A modern, type-safe Python library for Hetzner Cloud Server management with comprehensive API coverage.

๐Ÿš€ Features

๐Ÿ“ฆ Installation

pip install pyhetznerserver

๐Ÿ”‘ Authentication

First, create an API token in the Hetzner Cloud Console:

  1. Go to your project
  2. Navigate to Security โ†’ API Tokens
  3. Generate a new token with appropriate permissions

๐Ÿ› ๏ธ Quick Start

from pyhetznerserver import HetznerClient

# Initialize client
client = HetznerClient(token="your_api_token_here")

# List all servers
servers = client.servers.list()
print(f"Found {len(servers)} servers")

# Create a new server
server, action = client.servers.create(
    name="my-web-server",
    server_type="cx11",
    image="ubuntu-20.04",
    location="fsn1",
    ssh_keys=["your-ssh-key-name"],
    labels={"env": "production", "app": "web"}
)

print(f"Server created: {server.name} ({server.public_net.ipv4.ip})")

# Server management
server.power_off()      # Power off server
server.power_on()       # Power on server  
server.reboot()         # Reboot server
server.reset()          # Hard reset

# Advanced operations
server.enable_backup("22-02")                    # Enable daily backups
server.create_image("my-snapshot")               # Create server image
server.enable_rescue()                           # Enable rescue mode
server.attach_iso("ubuntu-20.04")               # Mount ISO
server.change_type("cx21", upgrade_disk=True)   # Upgrade server

# Cleanup
client.close()

๐Ÿ“‹ Server Operations

Power Management

server.power_on()        # Start server
server.power_off()       # Stop server  
server.reboot()          # Restart server
server.reset()           # Force restart
server.shutdown()        # Graceful shutdown

Backup & Recovery

server.enable_backup("22-02")         # Enable backups at 22:00-02:00 UTC
server.disable_backup()               # Disable backups
server.create_image("snapshot-name")  # Create snapshot
server.rebuild("ubuntu-22.04")        # Rebuild from image

Rescue & Maintenance

password, action = server.enable_rescue("linux64", ssh_keys=["key1"])
server.disable_rescue()
server.attach_iso("ubuntu-20.04")
server.detach_iso()

Network Management

server.attach_to_network(network_id, ip="10.0.0.100")
server.detach_from_network(network_id)
server.change_dns_ptr("1.2.3.4", "server.example.com")

Security

password, action = server.reset_password()
server.change_protection(delete=True, rebuild=False)

๐Ÿ” Server Information

Access comprehensive server information through nested objects:

server = client.servers.get(server_id)

# Basic info
print(f"Server: {server.name} (ID: {server.id})")
print(f"Status: {server.status}")
print(f"Created: {server.created}")

# Network information
print(f"IPv4: {server.public_net.ipv4.ip}")
print(f"IPv6: {server.public_net.ipv6.ip}")

# Hardware details
print(f"Type: {server.server_type.name}")
print(f"CPU Cores: {server.server_type.cores}")
print(f"RAM: {server.server_type.memory} GB")
print(f"Disk: {server.server_type.disk} GB")

# Location
print(f"Datacenter: {server.datacenter.name}")
print(f"Location: {server.datacenter.location.city}, {server.datacenter.location.country}")

# Operating System
print(f"OS: {server.image.name} ({server.image.os_flavor})")

๐Ÿงช Testing & Development

Enable dry-run mode for testing without making real API calls:

client = HetznerClient(token="fake_token", dry_run=True)

# All operations return mock data
servers = client.servers.list()  # Returns empty list
server, action = client.servers.create(name="test", server_type="cx11", image="ubuntu-20.04")
print(f"Mock server created: {server.name}")  # Uses fake data

๐Ÿšจ Error Handling

The library provides detailed exception hierarchy:

from pyhetznerserver import (
    HetznerAPIError,
    AuthenticationError, 
    ValidationError,
    ServerNotFoundError,
    RateLimitError
)

try:
    server = client.servers.get(999999)
except ServerNotFoundError:
    print("Server not found")
except AuthenticationError:
    print("Invalid API token")
except RateLimitError:
    print("API rate limit exceeded")
except ValidationError as e:
    print(f"Invalid input: {e}")
except HetznerAPIError as e:
    print(f"API error: {e}")

๐Ÿ“Š Filtering & Pagination

# Filter servers
servers = client.servers.list(
    status="running",
    label_selector="env=production",
    sort="name:asc"
)

# Pagination
servers = client.servers.list(page=2, per_page=10)

๐Ÿท๏ธ Labels & Metadata

# Create server with labels
server, action = client.servers.create(
    name="web-server",
    server_type="cx11", 
    image="ubuntu-20.04",
    labels={
        "environment": "production",
        "team": "backend",
        "cost-center": "engineering"
    }
)

# Filter by labels
prod_servers = client.servers.list(label_selector="environment=production")

๐Ÿ”ง Advanced Configuration

client = HetznerClient(
    token="your_token",
    dry_run=False,           # Enable for testing
    timeout=30               # Request timeout in seconds
)

๐Ÿ“š API Coverage

This library covers all Hetzner Cloud Server API endpoints:

๐Ÿค Contributing

Contributions are welcome! Please read our Contributing Guide for details.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

๐Ÿ™ Acknowledgments

๐Ÿ“ž Support


Made with โค๏ธ for the Python and Hetzner Cloud community