Skip to main content

A modern, type-safe Python library for Hetzner Cloud Server management

Project description

PyHetznerServer

PyPI version Python Support License: MIT Downloads

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

🚀 Features

  • Complete Server Lifecycle Management - Create, manage, and delete cloud servers
  • All Server Actions - Power management, backups, rescue mode, ISO handling, and more
  • Type Safety - Full type hints throughout the codebase
  • Dry-Run Mode - Test your code without making real API calls
  • Comprehensive Error Handling - Detailed exception hierarchy
  • Automatic Model Parsing - JSON responses automatically converted to Python objects
  • Rate Limiting Aware - Built-in handling of API rate limits
  • Modern Python - Supports Python 3.8+

📦 Installation

pip install pyhetznerserver

🔑 Authentication

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

  1. Go to your project
  2. Navigate to SecurityAPI 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:

  • Server Management - CRUD operations
  • Power Actions - Start, stop, reboot, reset
  • Image Management - Create snapshots, rebuild
  • Backup System - Enable/disable, scheduling
  • Rescue Mode - Recovery operations
  • ISO Handling - Mount/unmount ISO images
  • Network Operations - Attach/detach networks
  • DNS Management - PTR record management
  • Security - Password reset, protection settings
  • Server Types - Hardware configuration changes
  • Actions - Retrieve operation status and history

🤝 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

  • Hetzner Cloud for providing excellent cloud infrastructure
  • The Python community for amazing tools and libraries

📞 Support

🔗 Related Projects


Made with ❤️ for the Python and Hetzner Cloud community

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyhetznerserver-1.1.0.tar.gz (24.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyhetznerserver-1.1.0-py3-none-any.whl (16.1 kB view details)

Uploaded Python 3

File details

Details for the file pyhetznerserver-1.1.0.tar.gz.

File metadata

  • Download URL: pyhetznerserver-1.1.0.tar.gz
  • Upload date:
  • Size: 24.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyhetznerserver-1.1.0.tar.gz
Algorithm Hash digest
SHA256 f4bcbc69235010c5ca188ca1e0e070e3396668fcb852b1a07d2016cdc39c24d5
MD5 88650489cf120661946a8ceecc140018
BLAKE2b-256 ac20d59c152a029120bf3bce9e817ec59584422c056bb07fa36559b13eeda168

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyhetznerserver-1.1.0.tar.gz:

Publisher: publish.yml on DeepPythonist/PyHetznerServer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyhetznerserver-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pyhetznerserver-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3ac534ead96b32c98f3274284154c1f938c0ccd8eaf49ea3104012a7daa4776e
MD5 a0c9419bda64847a38409f687594cd03
BLAKE2b-256 6c37815b9041b9539fd05c0292599a308d061792dfabbd48f32f43640aafbbc8

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyhetznerserver-1.1.0-py3-none-any.whl:

Publisher: publish.yml on DeepPythonist/PyHetznerServer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page