From 20a627ffe6f84f48643cacfb4d6a1b6ba03e0316 Mon Sep 17 00:00:00 2001 From: MarkosTech Date: Sun, 16 Aug 2026 13:14:28 +0200 Subject: [PATCH 1/4] fix(databases): redirect stdin for the SSL cert chown Remote command lists are piped into `bash -se`, so the script sits on stdin. `docker compose run` attaches stdin and eats the rest of it, including the `docker compose up -d` that follows. The container is removed and never recreated, and bash exits 0, so the deploy reports success. `-T` does not help, it does not detach stdin. Affects MongoDB, MySQL, MariaDB and PostgreSQL when enable_ssl is set. --- app/Actions/Database/StartMariadb.php | 2 +- app/Actions/Database/StartMongodb.php | 2 +- app/Actions/Database/StartMysql.php | 2 +- app/Actions/Database/StartPostgresql.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Actions/Database/StartMariadb.php b/app/Actions/Database/StartMariadb.php index f44008085c..c4f98cfdfe 100644 --- a/app/Actions/Database/StartMariadb.php +++ b/app/Actions/Database/StartMariadb.php @@ -211,7 +211,7 @@ class StartMariadb $this->commands[] = dockerStopCommand(10, $container_name, $this->database->destination->server).' 2>/dev/null || true'; $this->commands[] = "docker rm -f $container_name 2>/dev/null || true"; if ($this->database->enable_ssl) { - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml run --rm --no-deps --user root --entrypoint chown $container_name mysql:mysql /etc/mysql/certs/server.key /etc/mysql/certs/server.crt"; + $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml run --rm --no-deps --user root --entrypoint chown $container_name mysql:mysql /etc/mysql/certs/server.key /etc/mysql/certs/server.crt < /dev/null"; } $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml up -d"; $this->commands[] = "echo 'Database started.'"; diff --git a/app/Actions/Database/StartMongodb.php b/app/Actions/Database/StartMongodb.php index b31251ce20..0f9bba6797 100644 --- a/app/Actions/Database/StartMongodb.php +++ b/app/Actions/Database/StartMongodb.php @@ -260,7 +260,7 @@ class StartMongodb $this->commands[] = dockerStopCommand(10, $container_name, $this->database->destination->server).' 2>/dev/null || true'; $this->commands[] = "docker rm -f $container_name 2>/dev/null || true"; if ($this->database->enable_ssl) { - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml run --rm --no-deps --user root --entrypoint chown $container_name mongodb:mongodb /etc/mongo/certs/server.pem"; + $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml run --rm --no-deps --user root --entrypoint chown $container_name mongodb:mongodb /etc/mongo/certs/server.pem < /dev/null"; } $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml up -d"; $this->commands[] = "echo 'Database started.'"; diff --git a/app/Actions/Database/StartMysql.php b/app/Actions/Database/StartMysql.php index 16b8e15856..3eab004643 100644 --- a/app/Actions/Database/StartMysql.php +++ b/app/Actions/Database/StartMysql.php @@ -212,7 +212,7 @@ class StartMysql $this->commands[] = dockerStopCommand(10, $container_name, $this->database->destination->server).' 2>/dev/null || true'; $this->commands[] = "docker rm -f $container_name 2>/dev/null || true"; if ($this->database->enable_ssl) { - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml run --rm --no-deps --user root --entrypoint chown $container_name mysql:mysql /etc/mysql/certs/server.key /etc/mysql/certs/server.crt"; + $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml run --rm --no-deps --user root --entrypoint chown $container_name mysql:mysql /etc/mysql/certs/server.key /etc/mysql/certs/server.crt < /dev/null"; } $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml up -d"; diff --git a/app/Actions/Database/StartPostgresql.php b/app/Actions/Database/StartPostgresql.php index 3b0f820df3..21cb278fbb 100644 --- a/app/Actions/Database/StartPostgresql.php +++ b/app/Actions/Database/StartPostgresql.php @@ -222,7 +222,7 @@ class StartPostgresql $this->commands[] = dockerStopCommand(10, $container_name, $this->database->destination->server).' 2>/dev/null || true'; $this->commands[] = "docker rm -f $container_name 2>/dev/null || true"; if ($this->database->enable_ssl) { - $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml run --rm --no-deps --user root --entrypoint chown $container_name postgres:postgres /var/lib/postgresql/certs/server.key /var/lib/postgresql/certs/server.crt"; + $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml run --rm --no-deps --user root --entrypoint chown $container_name postgres:postgres /var/lib/postgresql/certs/server.key /var/lib/postgresql/certs/server.crt < /dev/null"; } $this->commands[] = "docker compose -f $this->configuration_dir/docker-compose.yml up -d"; $this->commands[] = "echo 'Database started.'"; From c9d5c4c41fc46220448cd1b3b7d144c3477d000d Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:41:45 +0200 Subject: [PATCH 2/4] fix(upgrade): handle missing status after restart (#11350) --- resources/views/livewire/upgrade.blade.php | 10 ++++++++++ tests/Unit/CoolifyUpgradeStatusTest.php | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/resources/views/livewire/upgrade.blade.php b/resources/views/livewire/upgrade.blade.php index f93c7bcea7..97c08c0357 100644 --- a/resources/views/livewire/upgrade.blade.php +++ b/resources/views/livewire/upgrade.blade.php @@ -295,6 +295,16 @@ } throw error; } + if (!data) { + if (this.instanceWentDown) { + // The upgraded instance can no longer return data for the old Livewire component. + // A healthy response after observed downtime confirms that the restart completed. + this.showSuccess(); + } else { + this.currentStatus = this.getReviveStatusMessage(elapsedMinutes, this.healthCheckAttempts); + } + return; + } if (data.status === 'complete') { this.showSuccess(); } else if (data.status === 'error') { diff --git a/tests/Unit/CoolifyUpgradeStatusTest.php b/tests/Unit/CoolifyUpgradeStatusTest.php index a00283615f..2248e382b5 100644 --- a/tests/Unit/CoolifyUpgradeStatusTest.php +++ b/tests/Unit/CoolifyUpgradeStatusTest.php @@ -149,6 +149,16 @@ it('finishes after health recovers from observed downtime for older target relea ->toContain('return;'); }); +it('finishes when the post-restart Livewire status response is undefined', function () { + $upgradeView = file_get_contents(__DIR__.'/../../resources/views/livewire/upgrade.blade.php'); + + expect($upgradeView) + ->toContain('if (!data) {') + ->toContain('if (this.instanceWentDown) {') + ->toContain('this.showSuccess();') + ->toContain('return;'); +}); + it('tells users to reload manually if the automatic reload does not happen', function () { $upgradeView = file_get_contents(__DIR__.'/../../resources/views/livewire/upgrade.blade.php'); From 05ebba9f1a9875b3e0f5faf42c71fbafc031d37e Mon Sep 17 00:00:00 2001 From: Prai'ns Date: Tue, 18 Aug 2026 12:30:09 +0300 Subject: [PATCH 3/4] fix: compress dashboard over HTTPS (#10828) Co-authored-by: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> --- app/Models/Server.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/Models/Server.php b/app/Models/Server.php index 1acc4e45f1..0f5a35364c 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -736,6 +736,9 @@ class Server extends BaseModel ]; $traefik_dynamic_conf['http']['routers']['coolify-https'] = [ + 'middlewares' => [ + 0 => 'gzip', + ], 'entryPoints' => [ 0 => 'https', ], @@ -791,6 +794,7 @@ class Server extends BaseModel $schema = $url->getScheme(); $caddy_file = " $schema://$host { + encode zstd gzip handle /app/* { reverse_proxy coolify-realtime:6001 } From 30da9e96eb05b89020d1da8b155207c7d9e5d4c3 Mon Sep 17 00:00:00 2001 From: NrwPlay Date: Tue, 18 Aug 2026 11:38:01 +0200 Subject: [PATCH 4/4] fix(notification): update storage email link in S3 error (#8633) --- app/Models/S3Storage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/S3Storage.php b/app/Models/S3Storage.php index e8e1788e3f..e4b1e2fd68 100644 --- a/app/Models/S3Storage.php +++ b/app/Models/S3Storage.php @@ -198,7 +198,7 @@ class S3Storage extends BaseModel try { $mail = new MailMessage; $mail->subject('Coolify: S3 Storage Connection Error'); - $mail->view('emails.s3-connection-error', ['name' => $this->name, 'reason' => $exception->getMessage(), 'url' => route('storage.show', ['storage_uuid' => $this->uuid])]); + $mail->view('emails.s3-connection-error', ['name' => $this->name, 'reason' => $e->getMessage(), 'url' => base_url().'/storages/'.$this->uuid]); // Load the team with its members and their roles explicitly $team = $this->team()->with(['members' => function ($query) {