fix(proxy): notify once for each new Traefik patch version

Closes #9727

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Andras BacsaiandClaude Opus 5.5 committed 2026-11-03 20:43:10 +01:00
1 parent 3f929edfc6
commit 2fbe9d2abe
3 files changed
+50 -5

No files matched your search

+1
View File
@@ -24,6 +24,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
### Fixed
- Send the **Traefik Proxy Outdated** notification when a newer Traefik patch version of the running branch is available. Before, Coolify showed the patch update only on the proxy page and sent no notification. Coolify sends one notification for each new patch version, not one for each hourly check ([#9727](https://github.com/coollabsio/coolify/issues/9727))
- Fix **Copy logs** in the runtime and deployment logs on iPhone and iPad. iOS browsers accept a clipboard write only during the tap, and Coolify wrote the logs only after it loaded them from the server. The copy did not change the clipboard, but some browsers showed "Logs copied to clipboard." Coolify now starts the clipboard write during the tap and adds the logs when they load ([#9408](https://github.com/coollabsio/coolify/issues/9408))
- Open fewer SSH logins for the server connection check. The Docker and Docker Compose version checks now use the multiplexed SSH connection, so each check opens one new SSH login, not three. Each login makes a systemd-logind session on the server, and some systemd versions keep closed sessions in the `closing` state. After 8192 sessions the server refused new SSH logins with "Maximum number of sessions (8192) reached". To remove the stuck sessions, run `systemctl restart systemd-logind` on the server ([#9148](https://github.com/coollabsio/coolify/issues/9148))
- Fix the Docker install fallback on Ubuntu derivatives such as Pop!_OS and Linux Mint. `get.docker.com` does not support them, and the fallback used a Docker repository with the name of the distribution (`download.docker.com/linux/pop`), which does not exist, so the Docker install failed. The fallback now uses the Ubuntu repository with `UBUNTU_CODENAME` on these systems, and the Debian repository on Raspbian 13 (Trixie), because Docker has no Raspbian Trixie repository ([#9455](https://github.com/coollabsio/coolify/issues/9455))
+6 -4
View File
@@ -159,7 +159,7 @@ class CheckTraefikVersionForServerJob implements ShouldBeEncrypted, ShouldQueue
}
/**
* Store outdated information and notify for minor or major upgrades.
* Store outdated information and notify once per upgrade target or patch version.
*/
private function storeOutdatedInfo(string $current, string $latest, string $type, ?string $upgradeTarget = null): void
{
@@ -178,10 +178,12 @@ class CheckTraefikVersionForServerJob implements ShouldBeEncrypted, ShouldQueue
$this->server->update(['traefik_outdated_info' => $outdatedInfo]);
$isRepeatedUpgrade = ($previousOutdatedInfo['type'] ?? null) === $type
&& ($previousOutdatedInfo['upgrade_target'] ?? null) === $upgradeTarget;
$alreadyNotified = ($previousOutdatedInfo['type'] ?? null) === $type
&& ($type === 'minor_upgrade'
? ($previousOutdatedInfo['upgrade_target'] ?? null) === $upgradeTarget
: ($previousOutdatedInfo['latest'] ?? null) === $latest);
if ($type !== 'patch_update' && ! $isRepeatedUpgrade) {
if (! $alreadyNotified) {
$this->sendNotification($outdatedInfo);
}
@@ -167,7 +167,7 @@ it('sends immediate notifications when outdated traefik is detected', function (
expect($notification->servers->first()->outdatedInfo['type'])->toBe('patch_update');
});
it('does not notify about Traefik patch updates', function () {
it('notifies about a Traefik patch update', function () {
$team = Team::factory()->create();
$team->webhookNotificationSettings()->update([
'webhook_enabled' => true,
@@ -178,9 +178,51 @@ it('does not notify about Traefik patch updates', function () {
$job = new CheckTraefikVersionForServerJob($server, ['v3.7' => '3.7.13']);
(new ReflectionMethod($job, 'storeOutdatedInfo'))->invoke($job, '3.7.7', '3.7.13', 'patch_update');
Notification::assertSentTo($team, TraefikVersionOutdated::class);
});
it('does not repeat a Traefik patch update notification for the same latest version', function () {
$team = Team::factory()->create();
$team->webhookNotificationSettings()->update([
'webhook_enabled' => true,
'webhook_url' => 'https://example.com/webhook',
]);
$server = Server::factory()->create([
'team_id' => $team->id,
'traefik_outdated_info' => [
'current' => '3.7.7',
'latest' => '3.7.13',
'type' => 'patch_update',
],
]);
$job = new CheckTraefikVersionForServerJob($server, ['v3.7' => '3.7.13']);
(new ReflectionMethod($job, 'storeOutdatedInfo'))->invoke($job, '3.7.7', '3.7.13', 'patch_update');
Notification::assertNothingSent();
});
it('notifies again when a newer Traefik patch version is released', function () {
$team = Team::factory()->create();
$team->webhookNotificationSettings()->update([
'webhook_enabled' => true,
'webhook_url' => 'https://example.com/webhook',
]);
$server = Server::factory()->create([
'team_id' => $team->id,
'traefik_outdated_info' => [
'current' => '3.7.7',
'latest' => '3.7.13',
'type' => 'patch_update',
],
]);
$job = new CheckTraefikVersionForServerJob($server, ['v3.7' => '3.7.16']);
(new ReflectionMethod($job, 'storeOutdatedInfo'))->invoke($job, '3.7.7', '3.7.16', 'patch_update');
Notification::assertSentTo($team, TraefikVersionOutdated::class);
});
it('notifies about Traefik minor updates', function () {
$team = Team::factory()->create();
$team->webhookNotificationSettings()->update([