Skip to content

Commit 18f0f7f

Browse files
authored
feat(digitalocean): add droplet provisioning support (#10871)
2 parents 5936874 + c303c34 commit 18f0f7f

32 files changed

Lines changed: 2796 additions & 19 deletions

app/Actions/Server/DeleteServer.php

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use App\Models\Server;
77
use App\Models\Team;
88
use App\Notifications\Server\HetznerDeletionFailed;
9+
use App\Services\DigitalOceanService;
910
use App\Services\HetznerService;
1011
use App\Services\VultrService;
1112
use Lorisleiva\Actions\Concerns\AsAction;
@@ -14,7 +15,7 @@ class DeleteServer
1415
{
1516
use AsAction;
1617

17-
public function handle(int $serverId, bool $deleteFromHetzner = false, ?int $hetznerServerId = null, ?int $cloudProviderTokenId = null, ?int $teamId = null, bool $deleteFromVultr = false, ?string $vultrInstanceId = null)
18+
public function handle(int $serverId, bool $deleteFromHetzner = false, ?int $hetznerServerId = null, ?int $cloudProviderTokenId = null, ?int $teamId = null, bool $deleteFromVultr = false, ?string $vultrInstanceId = null, bool $deleteFromDigitalOcean = false, ?int $digitalOceanDropletId = null)
1819
{
1920
$server = Server::withTrashed()->find($serverId);
2021

@@ -35,6 +36,14 @@ public function handle(int $serverId, bool $deleteFromHetzner = false, ?int $het
3536
);
3637
}
3738

39+
if ($deleteFromDigitalOcean && ($digitalOceanDropletId || ($server && $server->digitalocean_droplet_id))) {
40+
$this->deleteFromDigitalOceanById(
41+
$digitalOceanDropletId ?? $server->digitalocean_droplet_id,
42+
$cloudProviderTokenId ?? $server->cloud_provider_token_id,
43+
$teamId ?? $server->team_id
44+
);
45+
}
46+
3847
logger()->debug($server ? 'Deleting server from Coolify' : 'Server already deleted from Coolify, skipping Coolify deletion');
3948

4049
// If server is already deleted from Coolify, skip this part
@@ -136,4 +145,47 @@ private function deleteFromVultrById(string $vultrInstanceId, ?int $cloudProvide
136145
]);
137146
}
138147
}
148+
149+
private function deleteFromDigitalOceanById(int $digitalOceanDropletId, ?int $cloudProviderTokenId, int $teamId): void
150+
{
151+
try {
152+
$token = null;
153+
154+
if ($cloudProviderTokenId) {
155+
$token = CloudProviderToken::where('id', $cloudProviderTokenId)
156+
->where('team_id', $teamId)
157+
->where('provider', 'digitalocean')
158+
->first();
159+
}
160+
161+
if (! $token) {
162+
$token = CloudProviderToken::where('team_id', $teamId)
163+
->where('provider', 'digitalocean')
164+
->first();
165+
}
166+
167+
if (! $token) {
168+
logger()->debug('No DigitalOcean token found for team, skipping droplet deletion', [
169+
'team_id' => $teamId,
170+
'digitalocean_droplet_id' => $digitalOceanDropletId,
171+
]);
172+
173+
return;
174+
}
175+
176+
$digitalOceanService = new DigitalOceanService($token->token);
177+
$digitalOceanService->deleteDroplet($digitalOceanDropletId);
178+
179+
logger()->debug('Deleted droplet from DigitalOcean', [
180+
'digitalocean_droplet_id' => $digitalOceanDropletId,
181+
'team_id' => $teamId,
182+
]);
183+
} catch (\Throwable $e) {
184+
logger()->error('Failed to delete droplet from DigitalOcean', [
185+
'error' => $e->getMessage(),
186+
'digitalocean_droplet_id' => $digitalOceanDropletId,
187+
'team_id' => $teamId,
188+
]);
189+
}
190+
}
139191
}

app/Actions/Server/ValidateServer.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@ public function handle(Server $server)
4141
}
4242
}
4343

44+
if ($server->digitalocean_droplet_id) {
45+
$status = $server->refreshDigitalOceanState();
46+
if (in_array($status, ['off', 'archive', 'deleted'], true)) {
47+
$this->error = $status === 'deleted'
48+
? 'DigitalOcean droplet is deleted or no longer accessible. Relink this server before validating.'
49+
: 'DigitalOcean droplet is '.($status ?? 'not running').'. Power it on before validating.';
50+
$server->update([
51+
'validation_logs' => $this->error,
52+
]);
53+
throw new \Exception($this->error);
54+
}
55+
}
56+
4457
['uptime' => $this->uptime, 'error' => $error] = $server->validateConnection();
4558
if (! $this->uptime) {
4659
$sanitizedError = htmlspecialchars($error ?? '', ENT_QUOTES, 'UTF-8');

0 commit comments

Comments
 (0)