diff --git a/app/Livewire/Project/Application/Advanced.php b/app/Livewire/Project/Application/Advanced.php index a57d529bcb..96f6d9f504 100644 --- a/app/Livewire/Project/Application/Advanced.php +++ b/app/Livewire/Project/Application/Advanced.php @@ -86,7 +86,7 @@ class Advanced extends Component public bool $isConnectToDockerNetworkEnabled = false; #[Validate(['integer', 'min:0'])] - public int $maxRestartCount = 10; + public int $maxRestartCount = 0; public function mount() { @@ -148,7 +148,7 @@ class Advanced extends Component $this->disableBuildCache = $this->application->settings->disable_build_cache; $this->injectBuildArgsToDockerfile = $this->application->settings->inject_build_args_to_dockerfile ?? true; $this->includeSourceCommitInBuild = $this->application->settings->include_source_commit_in_build ?? false; - $this->maxRestartCount = $this->application->max_restart_count ?? 10; + $this->maxRestartCount = $this->application->max_restart_count ?? 0; } // Load stop_grace_period separately since it has its own save handler diff --git a/app/Livewire/Project/Service/Index.php b/app/Livewire/Project/Service/Index.php index c73e8bb06e..f4b6bec2d4 100644 --- a/app/Livewire/Project/Service/Index.php +++ b/app/Livewire/Project/Service/Index.php @@ -84,7 +84,7 @@ class Index extends Component public bool $isStripprefixEnabled = false; - public mixed $maxRestartCount = 10; + public mixed $maxRestartCount = 0; protected $listeners = ['generateDockerCompose', 'refreshScheduledBackups' => '$refresh', 'refreshFileStorages']; @@ -432,7 +432,7 @@ class Index extends Component $this->isLogDrainEnabled = data_get($this->serviceApplication, 'is_log_drain_enabled', false); $this->isGzipEnabled = data_get($this->serviceApplication, 'is_gzip_enabled', true); $this->isStripprefixEnabled = data_get($this->serviceApplication, 'is_stripprefix_enabled', true); - $this->maxRestartCount = $this->serviceApplication->max_restart_count ?? 10; + $this->maxRestartCount = $this->serviceApplication->max_restart_count ?? 0; } } diff --git a/app/Models/Application.php b/app/Models/Application.php index 2e559b7b78..264d6e38b0 100644 --- a/app/Models/Application.php +++ b/app/Models/Application.php @@ -136,6 +136,10 @@ class Application extends BaseModel private static $parserVersion = '5'; + protected $attributes = [ + 'max_restart_count' => 0, + ]; + protected $fillable = [ 'name', 'description', diff --git a/app/Models/ApplicationPreview.php b/app/Models/ApplicationPreview.php index bffbdab621..d15142b6ad 100644 --- a/app/Models/ApplicationPreview.php +++ b/app/Models/ApplicationPreview.php @@ -13,6 +13,10 @@ class ApplicationPreview extends BaseModel { use HasRestartLimit, SoftDeletes; + protected $attributes = [ + 'max_restart_count' => 0, + ]; + protected $fillable = [ 'uuid', 'application_id', diff --git a/app/Models/ServiceApplication.php b/app/Models/ServiceApplication.php index cba18c1f23..066a86fac8 100644 --- a/app/Models/ServiceApplication.php +++ b/app/Models/ServiceApplication.php @@ -54,6 +54,7 @@ class ServiceApplication extends BaseModel protected $attributes = [ 'is_force_https_enabled' => true, + 'max_restart_count' => 0, ]; protected function casts(): array diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index ea9f359a50..73df990adf 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -2400,7 +2400,7 @@ function get_public_ips() } } -function isAnyDeploymentInprogress() +function isAnyDeploymentInprogress(bool $showAll = false) { $runningJobs = ApplicationDeploymentQueue::where('horizon_job_worker', gethostname())->where('status', ApplicationDeploymentStatus::IN_PROGRESS->value)->get(); @@ -2417,34 +2417,31 @@ function isAnyDeploymentInprogress() if ($horizonJobStatus === 'unknown' || $horizonJobStatus === 'reserved') { $horizonJobIds[] = $runningJob->horizon_job_id; - // Get application and team information - $application = Application::find($runningJob->application_id); - $teamMembers = []; - $deploymentUrl = ''; + if ($showAll) { + $application = Application::find($runningJob->application_id); + $teamMembers = []; + $deploymentUrl = ''; - if ($application) { - // Get team members through the application's project - $team = $application->team(); - if ($team) { - $teamMembers = $team->members()->pluck('email')->toArray(); + if ($application) { + $team = $application->team(); + if ($team) { + $teamMembers = $team->members()->pluck('email')->toArray(); + } + + if ($runningJob->deployment_url) { + $deploymentUrl = base_url().$runningJob->deployment_url; + } } - // Construct the full deployment URL - if ($runningJob->deployment_url) { - $baseUrl = base_url(); - $deploymentUrl = $baseUrl.$runningJob->deployment_url; - } + $deploymentDetails[] = [ + 'application_name' => $runningJob->application_name ?? 'Unknown', + 'server_name' => $runningJob->server_name ?? 'Unknown', + 'deployment_url' => $deploymentUrl, + 'team_members' => $teamMembers, + 'created_at' => $runningJob->created_at->format('Y-m-d H:i:s'), + 'horizon_job_id' => $runningJob->horizon_job_id, + ]; } - - $deploymentDetails[] = [ - 'id' => $runningJob->id, - 'application_name' => $runningJob->application_name ?? 'Unknown', - 'server_name' => $runningJob->server_name ?? 'Unknown', - 'deployment_url' => $deploymentUrl, - 'team_members' => $teamMembers, - 'created_at' => $runningJob->created_at->format('Y-m-d H:i:s'), - 'horizon_job_id' => $runningJob->horizon_job_id, - ]; } } @@ -2453,30 +2450,41 @@ function isAnyDeploymentInprogress() exit(0); } - // Display enhanced deployment information - echo "\n=== Running Deployments ===\n"; - echo 'Total active deployments: '.count($horizonJobIds)."\n\n"; - - foreach ($deploymentDetails as $index => $deployment) { - echo 'Deployment #'.($index + 1).":\n"; - echo ' Application: '.$deployment['application_name']."\n"; - echo ' Server: '.$deployment['server_name']."\n"; - echo ' Started: '.$deployment['created_at']."\n"; - if ($deployment['deployment_url']) { - echo ' URL: '.$deployment['deployment_url']."\n"; - } - if (! empty($deployment['team_members'])) { - echo ' Team members: '.implode(', ', $deployment['team_members'])."\n"; - } else { - echo " Team members: No team members found\n"; - } - echo ' Horizon Job ID: '.$deployment['horizon_job_id']."\n"; - echo "\n"; - } + echo formatRunningDeploymentsOutput(count($horizonJobIds), $deploymentDetails, $showAll); exit(1); } +function formatRunningDeploymentsOutput(int $activeDeploymentCount, array $deploymentDetails = [], bool $showAll = false): string +{ + $output = "\n=== Running Deployments ===\n"; + $output .= 'Total active deployments: '.$activeDeploymentCount."\n"; + + if (! $showAll) { + return $output; + } + + $output .= "\n"; + + foreach ($deploymentDetails as $index => $deployment) { + $output .= 'Deployment #'.($index + 1).":\n"; + $output .= ' Application: '.$deployment['application_name']."\n"; + $output .= ' Server: '.$deployment['server_name']."\n"; + $output .= ' Started: '.$deployment['created_at']."\n"; + if ($deployment['deployment_url']) { + $output .= ' URL: '.$deployment['deployment_url']."\n"; + } + if (! empty($deployment['team_members'])) { + $output .= ' Team members: '.implode(', ', $deployment['team_members'])."\n"; + } else { + $output .= " Team members: No team members found\n"; + } + $output .= ' Horizon Job ID: '.$deployment['horizon_job_id']."\n\n"; + } + + return $output; +} + function isBase64Encoded($strValue) { return base64_encode(base64_decode($strValue, true)) === $strValue; diff --git a/config/constants.php b/config/constants.php index 3f8335134f..6a37550e4f 100644 --- a/config/constants.php +++ b/config/constants.php @@ -2,7 +2,7 @@ return [ 'coolify' => [ - 'version' => env('COOLIFY_VERSION') ?: '4.3.20', + 'version' => env('COOLIFY_VERSION') ?: '4.3.21', 'helper_version' => '1.0.17', 'realtime_version' => '1.0.19', 'railpack_version' => '0.23.0', diff --git a/database/migrations/2026_09_15_105627_make_restart_limits_opt_in.php b/database/migrations/2026_09_15_105627_make_restart_limits_opt_in.php new file mode 100644 index 0000000000..9c1c927c01 --- /dev/null +++ b/database/migrations/2026_09_15_105627_make_restart_limits_opt_in.php @@ -0,0 +1,47 @@ +integer('max_restart_count')->default(0)->change(); + }); + + DB::table($tableName) + ->select('id') + ->where('max_restart_count', 10) + ->chunkById(5000, function ($resources) use ($tableName): void { + DB::table($tableName) + ->whereIn('id', $resources->pluck('id')) + ->update([ + 'max_restart_count' => 0, + 'restart_limit_reached' => false, + ]); + }); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + foreach (['applications', 'application_previews', 'service_applications'] as $tableName) { + Schema::table($tableName, function (Blueprint $table) { + $table->integer('max_restart_count')->default(10)->change(); + }); + } + } +}; diff --git a/docker-compose-maxio.dev.yml b/docker-compose-maxio.dev.yml index b429244166..885d17f3c8 100644 --- a/docker-compose-maxio.dev.yml +++ b/docker-compose-maxio.dev.yml @@ -162,7 +162,7 @@ services: networks: - coolify # maxio-init: - # image: quay.io/minio/aistor/mc:RELEASE.2026-09-06T02-44-40Z + # image: ghcr.io/coollabsio/mx:0.1.0 # pull_policy: always # container_name: coolify-maxio-init # restart: no @@ -182,7 +182,7 @@ services: # networks: # - coolify minio-init: - image: quay.io/minio/aistor/mc:RELEASE.2026-09-06T02-44-40Z + image: ghcr.io/coollabsio/mx:0.1.0 pull_policy: always container_name: coolify-minio-init restart: no diff --git a/docker-compose.dev-multi.yml b/docker-compose.dev-multi.yml index 31908436f4..c8f2833117 100644 --- a/docker-compose.dev-multi.yml +++ b/docker-compose.dev-multi.yml @@ -195,7 +195,7 @@ services: minio-init: profiles: ["minio"] - image: quay.io/minio/aistor/mc:RELEASE.2026-09-06T02-44-40Z + image: ghcr.io/coollabsio/mx:0.1.0 pull_policy: always restart: "no" depends_on: diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 869a059c94..d33d9aab5c 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -150,7 +150,7 @@ services: networks: - coolify minio-init: - image: quay.io/minio/aistor/mc:RELEASE.2026-09-06T02-44-40Z + image: ghcr.io/coollabsio/mx:0.1.0 pull_policy: always container_name: coolify-minio-init restart: no diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile index e0df74b220..62bb0ee241 100644 --- a/docker/development/Dockerfile +++ b/docker/development/Dockerfile @@ -12,7 +12,7 @@ ARG NGINX_VERSION=1.31.2-r1 # ================================================================= # Get MinIO client # ================================================================= -FROM quay.io/minio/aistor/mc:RELEASE.2026-09-06T02-44-40Z AS minio-client +FROM ghcr.io/coollabsio/mx:0.1.0 AS minio-client # ================================================================= # Final Stage: Production image diff --git a/other/nightly/versions.json b/other/nightly/versions.json index 6818286b29..e010c30695 100644 --- a/other/nightly/versions.json +++ b/other/nightly/versions.json @@ -1,7 +1,7 @@ { "coolify": { "v4": { - "version": "4.3.20" + "version": "4.3.21" }, "nightly": { "version": "4.4-rc.1" @@ -17,14 +17,14 @@ } }, "traefik": { - "v3.7": "3.7.8", - "v3.6": "3.6.23", + "v3.7": "3.7.13", + "v3.6": "3.6.25", "v3.5": "3.5.6", "v3.4": "3.4.5", "v3.3": "3.3.7", "v3.2": "3.2.5", "v3.1": "3.1.7", "v3.0": "3.0.4", - "v2.11": "2.11.52" + "v2.11": "2.11.57" } } diff --git a/resources/css/utilities.css b/resources/css/utilities.css index 9851180c2b..67d898da3a 100644 --- a/resources/css/utilities.css +++ b/resources/css/utilities.css @@ -59,7 +59,7 @@ /* input, select before */ @utility input-select { - @apply block h-9 px-3 py-1.5 w-full text-sm text-black rounded-md border border-neutral-200 bg-[var(--coollabs-recessed)] dark:text-fg dark:border-white/[0.08] transition-colors disabled:bg-neutral-100 disabled:text-neutral-400 dark:disabled:bg-white/[0.03] dark:disabled:text-fg-faint; + @apply block h-8 px-3 py-1.5 w-full text-sm text-black rounded-md border border-neutral-200 bg-[var(--coollabs-recessed)] dark:text-fg dark:border-white/[0.08] transition-colors disabled:bg-neutral-100 disabled:text-neutral-400 dark:disabled:bg-white/[0.03] dark:disabled:text-fg-faint; box-shadow: none; &:where(.dark, .dark *) { diff --git a/resources/views/livewire/dashboard.blade.php b/resources/views/livewire/dashboard.blade.php index b43075893a..12d2f9f958 100644 --- a/resources/views/livewire/dashboard.blade.php +++ b/resources/views/livewire/dashboard.blade.php @@ -71,7 +71,7 @@ {{ $project->name }}
- {{ $project->description ?: 'No description' }} + {{ $project->description }}
@@ -186,7 +186,7 @@ {{ $server->name }}- {{ $server->description ?: 'No description' }} + {{ $server->description }}
@if ($serverStatusType !== 'success') diff --git a/resources/views/livewire/project/index.blade.php b/resources/views/livewire/project/index.blade.php index 4cd0e22d19..108b4024ac 100644 --- a/resources/views/livewire/project/index.blade.php +++ b/resources/views/livewire/project/index.blade.php @@ -121,7 +121,7 @@ class="truncate text-[13px]! leading-4! font-semibold! text-black dark:text-fg" x-text="project.name"> + x-text="project.description || ''"> diff --git a/resources/views/livewire/server/index.blade.php b/resources/views/livewire/server/index.blade.php index 9f5680160e..52a0c3a990 100644 --- a/resources/views/livewire/server/index.blade.php +++ b/resources/views/livewire/server/index.blade.php @@ -55,7 +55,7 @@ return [ 'uuid' => $server->uuid, 'name' => $server->name, - 'description' => $server->description ?: 'No description', + 'description' => $server->description, 'href' => route('server.show', ['server_uuid' => $server->uuid]), 'status' => $status, 'statusType' => $statusType, diff --git a/resources/views/livewire/server/private-key/show.blade.php b/resources/views/livewire/server/private-key/show.blade.php index bf938a888d..0663dd1168 100644 --- a/resources/views/livewire/server/private-key/show.blade.php +++ b/resources/views/livewire/server/private-key/show.blade.php @@ -78,7 +78,7 @@ @endif- {{ $privateKey->description ?: 'No description provided.' }} + {{ $privateKey->description }}
diff --git a/resources/views/livewire/shared-variables/environment/index.blade.php b/resources/views/livewire/shared-variables/environment/index.blade.php index 15c6dd461d..645f2e61be 100644 --- a/resources/views/livewire/shared-variables/environment/index.blade.php +++ b/resources/views/livewire/shared-variables/environment/index.blade.php @@ -33,7 +33,7 @@ href="{{ route('shared-variables.environment.show', ['project_uuid' => $project->uuid, 'environment_uuid' => $environment->uuid]) }}" {{ wireNavigate() }}>{{ $environment->description ?: 'No description' }}
{{ $environment->description }}
{{ $project->description ?: 'No description' }}
+{{ $project->description }}