Add Vultr cloud provider integration

This commit is contained in:
Cornelis Terblanche
2026-06-03 21:32:18 +02:00
parent 2833c68af9
commit 94abbe1590
33 changed files with 2978 additions and 44 deletions
+49
View File
@@ -17,6 +17,7 @@ use App\Livewire\Server\Proxy;
use App\Notifications\Server\Reachable;
use App\Notifications\Server\Unreachable;
use App\Services\ConfigurationRepository;
use App\Services\VultrService;
use App\Support\ValidationPatterns;
use App\Traits\ClearsGlobalSearchCache;
use App\Traits\HasMetrics;
@@ -270,7 +271,10 @@ class Server extends BaseModel
'team_id',
'hetzner_server_id',
'hetzner_server_status',
'vultr_instance_id',
'vultr_instance_status',
'is_validating',
'validation_logs',
'detected_traefik_version',
'traefik_outdated_info',
'server_metadata',
@@ -291,6 +295,51 @@ class Server extends BaseModel
return 'server';
}
public function refreshVultrState(): ?string
{
if (! $this->vultr_instance_id || ! $this->cloudProviderToken) {
return null;
}
$vultrService = new VultrService($this->cloudProviderToken->token);
try {
$instance = $vultrService->getInstance($this->vultr_instance_id);
} catch (\Throwable $e) {
if ((int) $e->getCode() !== 404) {
throw $e;
}
if ($this->vultr_instance_status !== 'deleted') {
$this->update(['vultr_instance_status' => 'deleted']);
$this->forceFill(['vultr_instance_status' => 'deleted']);
}
return 'deleted';
}
$status = ($instance['power_status'] ?? null) === 'stopped'
? 'stopped'
: ($instance['status'] ?? null);
$publicIp = $vultrService->getPublicIp($instance);
$updates = [];
if ($this->vultr_instance_status !== $status) {
$updates['vultr_instance_status'] = $status;
}
$hasPlaceholderIp = blank($this->ip) || in_array($this->ip, ['0.0.0.0', '::'], true);
if ($hasPlaceholderIp && $publicIp) {
$updates['ip'] = $publicIp;
}
if (! empty($updates)) {
$this->update($updates);
$this->forceFill($updates);
}
return $status;
}
protected function isCoolifyHost(): Attribute
{
return Attribute::make(