coolify/app/Jobs/CheckLogDrainContainerJob.php

94 lines
3.6 KiB
PHP
Raw Normal View History

2023-11-17 21:16:25 +01:00
<?php
namespace App\Jobs;
use App\Actions\Server\InstallLogDrain;
use App\Models\Server;
use App\Notifications\Container\ContainerRestarted;
use App\Notifications\Container\ContainerStopped;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Sleep;
2024-06-10 22:43:34 +02:00
class CheckLogDrainContainerJob implements ShouldBeEncrypted, ShouldQueue
2023-11-17 21:16:25 +01:00
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
2024-06-19 08:59:46 +02:00
public function __construct(public Server $server) {}
2024-06-10 22:43:34 +02:00
2023-11-17 21:16:25 +01:00
public function middleware(): array
{
return [(new WithoutOverlapping($this->server->id))->dontRelease()];
}
public function uniqueId(): int
{
return $this->server->id;
}
2024-06-10 22:43:34 +02:00
2023-11-17 21:16:25 +01:00
public function healthcheck()
{
$status = instant_remote_process(["docker inspect --format='{{json .State.Status}}' coolify-log-drain"], $this->server, false);
if (str($status)->contains('running')) {
return true;
} else {
return false;
}
}
2024-06-10 22:43:34 +02:00
public function handle()
2023-11-17 21:16:25 +01:00
{
// ray("checking log drain statuses for {$this->server->id}");
try {
2024-06-10 22:43:34 +02:00
if (! $this->server->isFunctional()) {
2023-11-17 21:16:25 +01:00
return;
2024-06-10 22:43:34 +02:00
}
$containers = instant_remote_process(['docker container ls -q'], $this->server, false);
if (! $containers) {
2023-11-17 21:16:25 +01:00
return;
}
$containers = instant_remote_process(["docker container inspect $(docker container ls -q) --format '{{json .}}'"], $this->server);
$containers = format_docker_command_output_to_json($containers);
$foundLogDrainContainer = $containers->filter(function ($value, $key) {
return data_get($value, 'Name') === '/coolify-log-drain';
})->first();
2024-06-10 22:43:34 +02:00
if (! $foundLogDrainContainer || ! $this->healthcheck()) {
2023-11-17 21:16:25 +01:00
ray('Log drain container not found or unhealthy. Restarting...');
InstallLogDrain::run($this->server);
Sleep::for(10)->seconds();
if ($this->healthcheck()) {
if ($this->server->log_drain_notification_sent) {
2023-12-13 12:01:27 +01:00
$this->server->team?->notify(new ContainerRestarted('Coolify Log Drainer', $this->server));
2023-11-17 21:16:25 +01:00
$this->server->update(['log_drain_notification_sent' => false]);
}
2024-06-10 22:43:34 +02:00
2023-11-17 21:16:25 +01:00
return;
}
2024-06-10 22:43:34 +02:00
if (! $this->server->log_drain_notification_sent) {
2023-11-17 21:16:25 +01:00
ray('Log drain container still unhealthy. Sending notification...');
// $this->server->team?->notify(new ContainerStopped('Coolify Log Drainer', $this->server, null));
2023-11-17 21:16:25 +01:00
$this->server->update(['log_drain_notification_sent' => true]);
}
} else {
if ($this->server->log_drain_notification_sent) {
2023-12-13 12:01:27 +01:00
$this->server->team?->notify(new ContainerRestarted('Coolify Log Drainer', $this->server));
$this->server->update(['log_drain_notification_sent' => false]);
}
2023-11-17 21:16:25 +01:00
}
} catch (\Throwable $e) {
2024-06-10 22:43:34 +02:00
if (! isCloud()) {
send_internal_notification("CheckLogDrainContainerJob failed on ({$this->server->id}) with: ".$e->getMessage());
}
2023-11-17 21:16:25 +01:00
ray($e->getMessage());
2024-06-10 22:43:34 +02:00
return handleError($e);
2023-11-17 21:16:25 +01:00
}
}
}