Merge branch 'next' into feat/disable-default-redirect
This commit is contained in:
@@ -38,7 +38,7 @@ class Kernel extends ConsoleKernel
|
||||
$schedule->job(new CleanupInstanceStuffsJob)->everyMinute()->onOneServer();
|
||||
// Server Jobs
|
||||
$this->check_scheduled_backups($schedule);
|
||||
$this->check_resources($schedule);
|
||||
// $this->check_resources($schedule);
|
||||
$this->check_scheduled_tasks($schedule);
|
||||
$schedule->command('uploads:clear')->everyTwoMinutes();
|
||||
|
||||
|
||||
@@ -2,14 +2,16 @@
|
||||
|
||||
namespace App\Jobs;
|
||||
|
||||
use App\Actions\Proxy\StartProxy;
|
||||
use App\Models\Application;
|
||||
use App\Models\ApplicationPreview;
|
||||
use App\Models\Server;
|
||||
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\SerializesModels;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class PushServerUpdateJob implements ShouldQueue
|
||||
@@ -25,11 +27,19 @@ class PushServerUpdateJob implements ShouldQueue
|
||||
return isDev() ? 1 : 3;
|
||||
}
|
||||
|
||||
public function __construct(public Server $server, public $data) {}
|
||||
public function __construct(public Server $server, public $data)
|
||||
{
|
||||
// TODO: Handle multiple servers
|
||||
// TODO: Handle Preview deployments
|
||||
// TODO: Handle DB TCP proxies
|
||||
// TODO: Handle DBs
|
||||
// TODO: Handle services
|
||||
// TODO: Handle proxies
|
||||
}
|
||||
|
||||
public function handle()
|
||||
{
|
||||
if (!$this->data) {
|
||||
if (! $this->data) {
|
||||
throw new \Exception('No data provided');
|
||||
}
|
||||
$data = collect($this->data);
|
||||
@@ -37,17 +47,90 @@ class PushServerUpdateJob implements ShouldQueue
|
||||
if ($containers->isEmpty()) {
|
||||
return;
|
||||
}
|
||||
$foundApplicationIds = collect();
|
||||
$foundServiceIds = collect();
|
||||
$foundProxy = false;
|
||||
foreach ($containers as $container) {
|
||||
$containerStatus = data_get($container, 'status', 'exited');
|
||||
$containerHealth = data_get($container, 'health', 'unhealthy');
|
||||
$containerStatus = data_get($container, 'state', 'exited');
|
||||
$containerHealth = data_get($container, 'health_status', 'unhealthy');
|
||||
$containerStatus = "$containerStatus ($containerHealth)";
|
||||
$labels = collect(data_get($container, 'labels'));
|
||||
if ($labels->has('coolify.applicationId')) {
|
||||
$applicationId = $labels->get('coolify.applicationId');
|
||||
$coolify_managed = $labels->has('coolify.managed');
|
||||
if ($coolify_managed) {
|
||||
if ($labels->has('coolify.applicationId')) {
|
||||
$applicationId = $labels->get('coolify.applicationId');
|
||||
$pullRequestId = data_get($labels, 'coolify.pullRequestId', '0');
|
||||
$foundApplicationIds->push($applicationId);
|
||||
try {
|
||||
$this->updateApplicationStatus($applicationId, $pullRequestId, $containerStatus);
|
||||
} catch (\Exception $e) {
|
||||
Log::error($e);
|
||||
}
|
||||
} elseif ($labels->has('coolify.serviceId')) {
|
||||
$serviceId = $labels->get('coolify.serviceId');
|
||||
$foundServiceIds->push($serviceId);
|
||||
Log::info("Service: $serviceId, $containerStatus");
|
||||
} else {
|
||||
$name = data_get($container, 'name');
|
||||
$uuid = $labels->get('com.docker.compose.service');
|
||||
$type = $labels->get('coolify.type');
|
||||
if ($name === 'coolify-proxy') {
|
||||
$foundProxy = true;
|
||||
Log::info("Proxy: $uuid, $containerStatus");
|
||||
} elseif ($type === 'service') {
|
||||
Log::info("Service: $uuid, $containerStatus");
|
||||
} else {
|
||||
Log::info("Database: $uuid, $containerStatus");
|
||||
}
|
||||
}
|
||||
}
|
||||
Log::info("$applicationId, $containerStatus");
|
||||
}
|
||||
|
||||
// If proxy is not found, start it
|
||||
if (! $foundProxy && $this->server->isProxyShouldRun()) {
|
||||
Log::info('Proxy not found, starting it');
|
||||
StartProxy::dispatch($this->server);
|
||||
}
|
||||
|
||||
// Update not found applications
|
||||
$allApplicationIds = $this->server->applications()->pluck('id');
|
||||
$notFoundApplicationIds = $allApplicationIds->diff($foundApplicationIds);
|
||||
if ($notFoundApplicationIds->isNotEmpty()) {
|
||||
Log::info('Not found application ids', ['application_ids' => $notFoundApplicationIds]);
|
||||
$this->updateNotFoundApplications($notFoundApplicationIds);
|
||||
}
|
||||
}
|
||||
|
||||
private function updateApplicationStatus(string $applicationId, string $pullRequestId, string $containerStatus)
|
||||
{
|
||||
if ($pullRequestId === '0') {
|
||||
$application = Application::find($applicationId);
|
||||
if (! $application) {
|
||||
return;
|
||||
}
|
||||
$application->status = $containerStatus;
|
||||
$application->save();
|
||||
Log::info('Application updated', ['application_id' => $applicationId, 'status' => $containerStatus]);
|
||||
} else {
|
||||
$application = ApplicationPreview::where('application_id', $applicationId)->where('pull_request_id', $pullRequestId)->first();
|
||||
if (! $application) {
|
||||
return;
|
||||
}
|
||||
$application->status = $containerStatus;
|
||||
$application->save();
|
||||
}
|
||||
}
|
||||
|
||||
private function updateNotFoundApplications(Collection $applicationIds)
|
||||
{
|
||||
$applicationIds->each(function ($applicationId) {
|
||||
Log::info('Updating application status', ['application_id' => $applicationId, 'status' => 'exited']);
|
||||
$application = Application::find($applicationId);
|
||||
if ($application) {
|
||||
$application->status = 'exited';
|
||||
$application->save();
|
||||
Log::info('Application status updated', ['application_id' => $applicationId, 'status' => 'exited']);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,8 +17,6 @@ use Spatie\SchemalessAttributes\Casts\SchemalessAttributes;
|
||||
use Spatie\SchemalessAttributes\SchemalessAttributesTrait;
|
||||
use Spatie\Url\Url;
|
||||
use Symfony\Component\Yaml\Yaml;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
|
||||
#[OA\Schema(
|
||||
description: 'Server model',
|
||||
@@ -177,7 +175,7 @@ class Server extends BaseModel
|
||||
public function setupDefaultRedirect()
|
||||
{
|
||||
$banner =
|
||||
"# This file is generated by Coolify, do not edit it manually.\n" .
|
||||
"# This file is generated by Coolify, do not edit it manually.\n".
|
||||
"# Disable the default redirect to customize (only if you know what are you doing).\n\n";
|
||||
$dynamic_conf_path = $this->proxyPath() . '/dynamic';
|
||||
$proxy_type = $this->proxyType();
|
||||
@@ -254,7 +252,7 @@ class Server extends BaseModel
|
||||
}
|
||||
$conf = Yaml::dump($dynamic_conf, 12, 2);
|
||||
}
|
||||
$conf = $banner . $conf;
|
||||
$conf = $banner.$conf;
|
||||
$base64 = base64_encode($conf);
|
||||
instant_remote_process([
|
||||
"echo '$base64' | base64 -d | tee $default_redirect_file > /dev/null",
|
||||
@@ -269,7 +267,7 @@ class Server extends BaseModel
|
||||
public function setupDynamicProxyConfiguration()
|
||||
{
|
||||
$settings = instanceSettings();
|
||||
$dynamic_config_path = $this->proxyPath() . '/dynamic';
|
||||
$dynamic_config_path = $this->proxyPath().'/dynamic';
|
||||
if ($this->proxyType() === ProxyTypes::TRAEFIK->value) {
|
||||
$file = "$dynamic_config_path/coolify.yaml";
|
||||
if (empty($settings->fqdn) || (isCloud() && $this->id !== 0) || ! $this->isLocalhost()) {
|
||||
@@ -388,8 +386,8 @@ class Server extends BaseModel
|
||||
}
|
||||
$yaml = Yaml::dump($traefik_dynamic_conf, 12, 2);
|
||||
$yaml =
|
||||
"# This file is automatically generated by Coolify.\n" .
|
||||
"# Do not edit it manually (only if you know what are you doing).\n\n" .
|
||||
"# This file is automatically generated by Coolify.\n".
|
||||
"# Do not edit it manually (only if you know what are you doing).\n\n".
|
||||
$yaml;
|
||||
|
||||
$base64 = base64_encode($yaml);
|
||||
@@ -453,13 +451,13 @@ $schema://$host {
|
||||
if (isDev()) {
|
||||
$proxy_path = '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/proxy/caddy';
|
||||
} else {
|
||||
$proxy_path = $proxy_path . '/caddy';
|
||||
$proxy_path = $proxy_path.'/caddy';
|
||||
}
|
||||
} elseif ($proxyType === ProxyTypes::NGINX->value) {
|
||||
if (isDev()) {
|
||||
$proxy_path = '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/proxy/nginx';
|
||||
} else {
|
||||
$proxy_path = $proxy_path . '/nginx';
|
||||
$proxy_path = $proxy_path.'/nginx';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -531,8 +529,10 @@ $schema://$host {
|
||||
$encrypted = encrypt($token);
|
||||
$this->settings->sentinel_token = $encrypted;
|
||||
$this->settings->save();
|
||||
|
||||
return $encrypted;
|
||||
}
|
||||
|
||||
public function isSentinelEnabled()
|
||||
{
|
||||
return $this->isMetricsEnabled() || $this->isServerApiEnabled();
|
||||
@@ -984,7 +984,8 @@ $schema://$host {
|
||||
|
||||
public function isProxyShouldRun()
|
||||
{
|
||||
if ($this->proxyType() === ProxyTypes::NONE->value || $this->settings->is_build_server) {
|
||||
// TODO: Do we need "|| $this->proxy->force_stop" here?
|
||||
if ($this->proxyType() === ProxyTypes::NONE->value || $this->isBuildServer()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user