feat(digitalocean): add droplet provisioning support

This commit is contained in:
Andras Bacsai committed 2026-07-08 10:42:58 +02:00
1 parent 5936874ffd
commit c303c34cfd
32 files changed
+2796 -19

No files matched your search

+48
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\DigitalOceanService;
use App\Services\VultrService;
use App\Support\ValidationPatterns;
use App\Traits\ClearsGlobalSearchCache;
@@ -282,6 +283,8 @@ class Server extends BaseModel
'hetzner_server_status',
'vultr_instance_id',
'vultr_instance_status',
'digitalocean_droplet_id',
'digitalocean_droplet_status',
'is_validating',
'validation_logs',
'detected_traefik_version',
@@ -349,6 +352,51 @@ class Server extends BaseModel
return $status;
}
public function refreshDigitalOceanState(): ?string
{
if (! $this->digitalocean_droplet_id || ! $this->cloudProviderToken || $this->cloudProviderToken->provider !== 'digitalocean') {
return $this->digitalocean_droplet_status;
}
$digitalOceanService = new DigitalOceanService($this->cloudProviderToken->token);
try {
$droplet = $digitalOceanService->getDroplet((int) $this->digitalocean_droplet_id);
} catch (RequestException $e) {
if ($e->response?->status() === 404) {
$this->update(['digitalocean_droplet_status' => 'deleted']);
return 'deleted';
}
throw $e;
} catch (\Throwable $e) {
if ((int) $e->getCode() === 404) {
$this->update(['digitalocean_droplet_status' => 'deleted']);
return 'deleted';
}
throw $e;
}
if (empty($droplet)) {
return $this->digitalocean_droplet_status;
}
$status = $droplet['status'] ?? null;
$ip = $digitalOceanService->getPublicIpAddress($droplet);
$updates = ['digitalocean_droplet_status' => $status];
if ($ip && $ip !== $this->ip) {
$updates['ip'] = $ip;
}
$this->update($updates);
return $status;
}
protected function isCoolifyHost(): Attribute
{
return Attribute::make(