This commit is contained in:
Andras Bacsai 2023-05-23 15:48:05 +02:00
parent 8e819485e4
commit 8677b1d85d
11 changed files with 49 additions and 25 deletions

View File

@ -21,3 +21,5 @@ DB_PASSWORD=
QUEUE_CONNECTION=redis QUEUE_CONNECTION=redis
REDIS_HOST=coolify-redis REDIS_HOST=coolify-redis
REDIS_PASSWORD= REDIS_PASSWORD=
CACHE_DRIVER=redis

View File

@ -16,6 +16,8 @@ class Kernel extends ConsoleKernel
*/ */
protected function schedule(Schedule $schedule): void protected function schedule(Schedule $schedule): void
{ {
$schedule->command('horizon:snapshot')->everyFiveMinutes();
$schedule->job(new DockerCleanupDanglingImagesJob)->everyFiveMinutes(); $schedule->job(new DockerCleanupDanglingImagesJob)->everyFiveMinutes();
$schedule->job(new AutoUpdateJob)->everyFifteenMinutes(); $schedule->job(new AutoUpdateJob)->everyFifteenMinutes();
$schedule->job(new ProxyCheckJob)->everyMinute(); $schedule->job(new ProxyCheckJob)->everyMinute();

View File

@ -27,7 +27,7 @@ public function mount()
$this->parameters = getParameters(); $this->parameters = getParameters();
$this->application = Application::where('id', $this->applicationId)->first(); $this->application = Application::where('id', $this->applicationId)->first();
$this->destination = $this->application->destination->getMorphClass()::where('id', $this->application->destination->id)->first(); $this->destination = $this->application->destination->getMorphClass()::where('id', $this->application->destination->id)->first();
dispatch(new ContainerStatusJob($this->application->uuid)); // dispatch(new ContainerStatusJob($this->application->uuid));
} }
protected function setDeploymentUuid() protected function setDeploymentUuid()
{ {

View File

@ -5,6 +5,7 @@
use App\Actions\CoolifyTask\RunRemoteProcess; use App\Actions\CoolifyTask\RunRemoteProcess;
use App\Data\CoolifyTaskArgs; use App\Data\CoolifyTaskArgs;
use App\Enums\ActivityTypes; use App\Enums\ActivityTypes;
use App\Enums\ProcessStatus;
use App\Models\Application; use App\Models\Application;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
@ -18,12 +19,13 @@
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Spatie\Url\Url; use Spatie\Url\Url;
use Illuminate\Queue\Middleware\WithoutOverlapping; use Illuminate\Queue\Middleware\WithoutOverlapping;
use Throwable;
class DeployApplicationJob implements ShouldQueue class DeployApplicationJob implements ShouldQueue
{ {
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $application; protected Application $application;
protected $destination; protected $destination;
protected $source; protected $source;
protected Activity $activity; protected Activity $activity;
@ -34,15 +36,13 @@ class DeployApplicationJob implements ShouldQueue
protected $env_args; protected $env_args;
public static int $batch_counter = 0; public static int $batch_counter = 0;
public $timeout = 3600; public $timeout = 3600;
public $tries = 60;
public function middleware(): array public function middleware(): array
{ {
return [new WithoutOverlapping($this->application_uuid)]; return [(new WithoutOverlapping($this->application->uuid))->releaseAfter(10)];
}
public function uniqueId(): string
{
return $this->application_uuid;
} }
public function __construct( public function __construct(
public string $deployment_uuid, public string $deployment_uuid,
public string $application_uuid, public string $application_uuid,
@ -223,10 +223,26 @@ public function handle(): void
Storage::disk('deployments')->put(Str::kebab($this->application->name) . '/docker-compose.yml', $this->docker_compose); Storage::disk('deployments')->put(Str::kebab($this->application->name) . '/docker-compose.yml', $this->docker_compose);
} }
$this->executeNow(["docker rm -f {$this->deployment_uuid} >/dev/null 2>&1"], hideFromOutput: true); $this->executeNow(["docker rm -f {$this->deployment_uuid} >/dev/null 2>&1"], hideFromOutput: true);
dispatch(new ContainerStatusJob($this->application_uuid)); // dispatch(new ContainerStatusJob($this->application_uuid));
} }
} }
public function failed(Throwable $exception): void
{
$outputStack[] = [
'type' => 'out',
'output' => $exception->getMessage(),
'timestamp' => hrtime(true),
'batch' => DeployApplicationJob::$batch_counter,
'order' => 0,
];
$this->activity->description = json_encode($outputStack);
$this->activity->properties = $this->activity->properties->merge([
'exitCode' => 0,
'status' => ProcessStatus::ERROR->value,
]);
$this->activity->save();
$this->fail($exception);
}
private function execute_in_builder(string $command) private function execute_in_builder(string $command)
{ {
return "docker exec {$this->deployment_uuid} bash -c '{$command}'"; return "docker exec {$this->deployment_uuid} bash -c '{$command}'";

View File

@ -14,7 +14,7 @@
class DockerCleanupDanglingImagesJob implements ShouldQueue class DockerCleanupDanglingImagesJob implements ShouldQueue
{ {
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $timeout = 500;
/** /**
* Create a new job instance. * Create a new job instance.
*/ */

View File

@ -115,7 +115,7 @@ function generateSshCommand(string $private_key_location, string $server_ip, str
. '-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ' . '-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null '
. '-o PasswordAuthentication=no ' . '-o PasswordAuthentication=no '
. '-o ConnectTimeout=3600 ' . '-o ConnectTimeout=3600 '
. '-o ServerAliveInterval=60 ' . '-o ServerAliveInterval=20 '
. '-o RequestTTY=no ' . '-o RequestTTY=no '
. '-o LogLevel=ERROR ' . '-o LogLevel=ERROR '
. "-p {$port} " . "-p {$port} "

View File

@ -180,7 +180,7 @@
*/ */
'defaults' => [ 'defaults' => [
'supervisor-1' => [ 's6' => [
'connection' => 'redis', 'connection' => 'redis',
'queue' => ['default'], 'queue' => ['default'],
'balance' => 'auto', 'balance' => 'auto',
@ -190,25 +190,27 @@
'maxJobs' => 0, 'maxJobs' => 0,
'memory' => 128, 'memory' => 128,
'tries' => 1, 'tries' => 1,
'timeout' => 600, 'timeout' => 3600,
'nice' => 0, 'nice' => 0,
], ],
], ],
'environments' => [ 'environments' => [
'production' => [ 'production' => [
'supervisor-1' => [ 's6' => [
'autoScalingStrategy' => 'size',
'maxProcesses' => env('HORIZON_MAX_PROCESSES', 10), 'maxProcesses' => env('HORIZON_MAX_PROCESSES', 10),
'balanceMaxShift' => env('HORIZON_BALANCE_MAX_SHIFT', 1), 'balanceMaxShift' => env('HORIZON_BALANCE_MAX_SHIFT', 1),
'balanceCooldown' => env('HORIZON_BALANCE_COOLDOWN', 3), 'balanceCooldown' => env('HORIZON_BALANCE_COOLDOWN', 1),
], ],
], ],
'local' => [ 'local' => [
'supervisor-1' => [ 's6' => [
'autoScalingStrategy' => 'size',
'maxProcesses' => env('HORIZON_MAX_PROCESSES', 10), 'maxProcesses' => env('HORIZON_MAX_PROCESSES', 10),
'balanceMaxShift' => env('HORIZON_BALANCE_MAX_SHIFT', 1), 'balanceMaxShift' => env('HORIZON_BALANCE_MAX_SHIFT', 1),
'balanceCooldown' => env('HORIZON_BALANCE_COOLDOWN', 3), 'balanceCooldown' => env('HORIZON_BALANCE_COOLDOWN', 1),
], ],
], ],
], ],

View File

@ -1,2 +1,2 @@
#!/command/execlineb -P #!/command/execlineb -P
su - webuser -c "php /var/www/html/artisan queue:listen --timeout=600" su - webuser -c "php /var/www/html/artisan queue:listen"

View File

@ -1,9 +1,10 @@
<a @class([ <a @class([
'bg-coolgray-200 p-2 border-l border-dashed border-transparent transition-colors hover:no-underline', 'bg-coolgray-200 p-2 border-l border-dashed transition-colors hover:no-underline',
'border-warning hover:bg-warning hover:text-black' => 'border-warning hover:bg-warning hover:text-black' =>
$status == 'in_progress' || $status == 'queued', $status === 'in_progress',
'border-error hover:bg-error' => $status == 'error', 'border-primary hover:bg-primary' => $status === 'queued',
'border-success hover:bg-success' => $status == 'finished', 'border-error hover:bg-error' => $status === 'error',
'border-success hover:bg-success' => $status === 'finished',
]) @if ($status === 'in_progress' || $status === 'queued') ]) @if ($status === 'in_progress' || $status === 'queued')
wire:poll.5000ms='polling' wire:poll.5000ms='polling'
@endif href="{{ url()->current() }}/{{ $deployment_uuid }}" class="hover:no-underline"> @endif href="{{ url()->current() }}/{{ $deployment_uuid }}" class="hover:no-underline">

View File

@ -25,6 +25,9 @@ function sync-bunny {
function queue { function queue {
bash vendor/bin/spin exec -u webuser coolify php artisan queue:listen bash vendor/bin/spin exec -u webuser coolify php artisan queue:listen
} }
function horizon {
bash vendor/bin/spin exec -u webuser coolify php artisan horizon -vvv
}
function schedule { function schedule {
bash vendor/bin/spin exec -u webuser coolify php artisan schedule:work bash vendor/bin/spin exec -u webuser coolify php artisan schedule:work
} }

View File

@ -1,2 +0,0 @@
*
!.gitignore