feat(v5): deploy nginx applications through Flux

Create nginx containers through Flux image and container primitives instead of SSH, and allow selecting a custom nginx image from the dashboard.
This commit is contained in:
Andras Bacsai committed 2026-06-21 22:39:16 +02:00
1 parent ec3e5dc9eb
commit e543d2b376
7 files changed
+315 -103

No files matched your search

+53
View File
@@ -21,6 +21,59 @@ class FluxClient
return is_array($data) ? $data : [];
}
public function pullImage(string $hostId, string $image): string
{
$payload = $this->dispatch($hostId, [
'type' => 'images.pull',
'reference' => $image,
]);
return $this->output($payload, 'Image pulled.');
}
/**
* @param array<string, mixed> $spec
*/
public function createContainer(string $hostId, array $spec): string
{
$payload = $this->dispatch($hostId, [
'type' => 'containers.create',
...$spec,
]);
$data = $payload['data'] ?? [];
$id = is_array($data) && is_string($data['id'] ?? null) ? $data['id'] : '';
if ($id === '') {
throw new RuntimeException('Flux did not return a container id.');
}
return $id;
}
public function startContainer(string $hostId, string $id): string
{
$payload = $this->dispatch($hostId, [
'type' => 'containers.start',
'id' => $id,
]);
return $this->output($payload, 'Container started.');
}
/**
* @return array<string, mixed>
*/
public function inspectContainer(string $hostId, string $id): array
{
$payload = $this->dispatch($hostId, [
'type' => 'containers.inspect',
'id' => $id,
]);
$data = $payload['data'] ?? [];
return is_array($data) ? $data : [];
}
/**
* @param array<int, array{name: string, config: string}> $apps
*/