boci/hetzner-laravel
Laravel package that integrates Hetzner Cloud into your app, offering a fluent API to manage servers, volumes, networks, SSH keys, and other resources. Simplifies provisioning, scaling, and automating infrastructure from Laravel with clean, expressive methods.
Architecture fit
boci/hetzner-laravel is a Laravel-native SDK: package auto-discovery, a published config file, credential wiring via env, and type-safe DTOs over Hetzner's REST APIs. It fits an architecture where the Laravel application is the control plane — provisioning app servers, managing DNS records during tenant onboarding, or scripting network/LB setup from an admin panel or queue worker. The value proposition is real but narrow: it replaces hand-rolled Http::withToken(...)->post('api.hetzner.cloud/v1/servers', ...) calls with typed request/response objects and centralized config.
Critically, this is a transport client, not an orchestrator. It carries no state, performs no drift detection, and provides no reconciliation semantics. A TPM should scope it as an adapter layer beneath a domain service you own (e.g. CloudProvisioner), never as the thing that decides what infrastructure should exist.
Integration feasibility
Initial integration cost is low — composer require, one env var, one config publish. The real effort sits in three places:
Http::fake() works. If it constructs its own client, your test strategy and your ability to exercise failure paths degrade significantly.Technical risk The adoption signal is weak and should be stated plainly to stakeholders: 91 stars, 0 dependents, single maintainer, and an aggregate score of ~20/100. Zero dependents means zero public evidence of production use — you would be an early adopter, not a follower. The reported last release of 2026-10-25 is a future date, which is either a metadata artifact or a signal that release/tag hygiene is unreliable; verify tags and changelog against the actual repository before pinning anything.
Bus factor is 1. Assume you may need to fork and maintain. Hetzner-specific lock-in is low (the API is Hetzner's regardless of client), but DTO/namespace coupling is real — mitigate with an internal interface.
Key questions for the maintainer / spike
Http::fake()-able, middleware-aware, timeout-configurable)?Stack fit
Requires a modern PHP/Laravel baseline (verify the exact support matrix — likely PHP 8.2+, Laravel 10–12). Because it is a plain synchronous client, it composes cleanly with queue workers and jobs, which is how provisioning should run: HTTP request in, ProvisionServerJob dispatched, status polled with backoff.
Migration path There are three realistic entry points, in ascending order of effort:
Compatibility and abstraction
Define an internal CloudProvider interface (createServer, deleteServer, upsertDnsRecord, listServers) and implement it with this package. That single step converts a bus-factor-1 dependency into a replaceable detail and bounds the blast radius of abandonment or a breaking upstream release. Pin exact versions, commit composer.lock, and mirror to a private fork if the package lands on a critical path.
Sequencing
Http::fake() works.Maintenance Budget explicit ownership: roughly one day per quarter to review upstream releases and CVEs, plus contingency for a fork if the maintainer goes dormant. Assign a named code owner. Treat any upgrade as a change requiring the fake-based test suite to pass.
Support No commercial support and no SLA — issues are community-only. Your on-call absorbs all consequences. Escalation path is Hetzner's own support for API-side problems and the upstream repo (best-effort) for client-side bugs. Document that internal reality so nobody assumes vendor backing.
Scaling Hetzner Cloud imposes per-project rate limits (on the order of a few thousand requests/hour, with tighter per-endpoint limits). Two consequences matter at scale:
foreach. Design this into the adapter, not per-caller.If the package does not implement retry/backoff itself, wrap it — do not rely on ad-hoc handling scattered across call sites.
Failure modes The dangerous cases are the partial ones, and a stateless SDK cannot protect you from them:
Ramp-up Low for engineers: any Laravel developer is productive in under a day, since the idioms (facade, config, DTOs) are familiar. The learning curve is Hetzner's API semantics, not the package — Actions, async state transitions, per-project rate limits, and the Cloud-vs-DNS split. Budget that as the real onboarding cost and put it in a short internal runbook rather than leaving it tribal.
TPM recommendation
Adopt conditionally. It is a reasonable convenience layer with genuine type-safety benefits, but a 0-dependent, single-maintainer, low-score dependency does not belong on an unmediated critical path. Gate adoption on the spike answering the questions above — particularly HTTP-client testability, retry behavior, and DNS API coverage — and require the internal CloudProvider abstraction and reconciliation job as non-negotiable prerequisites to production use.
How can I help you explore Laravel packages today?