Merge pull request #3969 from coollabsio/jnovakdev/main

Discord notification updates
This commit is contained in:
Andras Bacsai
2024-10-21 22:42:25 +02:00
committed by GitHub
19 changed files with 106 additions and 125 deletions

View File

@@ -15,7 +15,6 @@ use App\Notifications\Application\DeploymentSuccess;
use App\Notifications\Application\StatusChanged;
use App\Notifications\Database\BackupFailed;
use App\Notifications\Database\BackupSuccess;
use App\Notifications\Database\DailyBackup;
use App\Notifications\Test;
use Exception;
use Illuminate\Console\Command;
@@ -121,23 +120,6 @@ class Emails extends Command
$this->mail = (new Test)->toMail();
$this->sendEmail();
break;
case 'database-backup-statuses-daily':
$scheduled_backups = ScheduledDatabaseBackup::all();
$databases = collect();
foreach ($scheduled_backups as $scheduled_backup) {
$last_days_backups = $scheduled_backup->get_last_days_backup_status();
if ($last_days_backups->isEmpty()) {
continue;
}
$failed = $last_days_backups->where('status', 'failed');
$database = $scheduled_backup->database;
$databases->put($database->name, [
'failed_count' => $failed->count(),
]);
}
$this->mail = (new DailyBackup($databases))->toMail();
$this->sendEmail();
break;
case 'application-deployment-success-daily':
$applications = Application::all();
foreach ($applications as $application) {

View File

@@ -101,4 +101,17 @@ class InstanceSettings extends Model implements SendsEmail
return "[{$instanceName}]";
}
// public function helperVersion(): Attribute
// {
// return Attribute::make(
// get: function ($value) {
// if (isDev()) {
// return 'latest';
// }
// return $value;
// }
// );
// }
}

View File

@@ -77,22 +77,38 @@ class DeploymentFailed extends Notification implements ShouldQueue
{
if ($this->preview) {
$message = new DiscordMessage(
title: 'Coolify: Deployment failed of pull request #'.$this->preview->pull_request_id.' of '.$this->application_name,
description: 'Check in the link below',
title: ':cross_mark: Deployment failed',
description: 'Pull request: '.$this->preview->pull_request_id,
color: DiscordMessage::errorColor(),
isCritical: true,
);
$message->addField('Deployment Logs', '[Here]('.$this->deployment_url.')');
$message->addField('Project', data_get($this->application, 'environment.project.name'), true);
$message->addField('Environment', $this->environment_name, true);
$message->addField('Name', $this->application_name, true);
$message->addField('Deployment Logs', '[Link]('.$this->deployment_url.')');
if ($this->fqdn) {
$message->addField('Domain', $this->fqdn, true);
}
} else {
if ($this->fqdn) {
$description = '[Open application]('.$this->fqdn.')';
} else {
$description = '';
}
$message = new DiscordMessage(
title: 'Coolify: Deployment failed of '.$this->application_name,
description: 'Check in the link below',
title: ':cross_mark: Deployment failed',
description: $description,
color: DiscordMessage::errorColor(),
isCritical: true,
);
$message->addField('Deployment Logs', '[Here]('.$this->deployment_url.')');
$message->addField('Project', data_get($this->application, 'environment.project.name'), true);
$message->addField('Environment', $this->environment_name, true);
$message->addField('Name', $this->application_name, true);
$message->addField('Deployment Logs', '[Link]('.$this->deployment_url.')');
}
return $message;

View File

@@ -83,28 +83,35 @@ class DeploymentSuccess extends Notification implements ShouldQueue
{
if ($this->preview) {
$message = new DiscordMessage(
title: "Coolify: New PR{$this->preview->pull_request_id} version successfully deployed of {$this->application_name}",
description: 'Check in the links below.',
title: ':white_check_mark: Preview deployment successful',
description: 'Pull request: '.$this->preview->pull_request_id,
color: DiscordMessage::successColor(),
);
if ($this->preview->fqdn) {
$message->addField('Open Application', '[Here]('.$this->preview->fqdn.')');
$message->addField('Application', '[Link]('.$this->preview->fqdn.')');
}
$message->addField('Deployment logs', '[Here]('.$this->deployment_url.')');
$message->addField('Project', data_get($this->application, 'environment.project.name'), true);
$message->addField('Environment', $this->environment_name, true);
$message->addField('Name', $this->application_name, true);
$message->addField('Deployment logs', '[Link]('.$this->deployment_url.')');
} else {
if ($this->fqdn) {
$description = '[Open application]('.$this->fqdn.')';
} else {
$description = '';
}
$message = new DiscordMessage(
title: "Coolify: New version successfully deployed of {$this->application_name}",
description: 'Check in the links below.',
title: ':white_check_mark: New version successfully deployed',
description: $description,
color: DiscordMessage::successColor(),
);
$message->addField('Project', data_get($this->application, 'environment.project.name'), true);
$message->addField('Environment', $this->environment_name, true);
$message->addField('Name', $this->application_name, true);
if ($this->fqdn) {
$message->addField('Open Application', '[Here]('.$this->fqdn.')');
}
$message->addField('Deployment logs', '[Here]('.$this->deployment_url.')');
$message->addField('Deployment logs', '[Link]('.$this->deployment_url.')');
}
return $message;

View File

@@ -59,14 +59,12 @@ class StatusChanged extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
$message = new DiscordMessage(
title: "Coolify: {$this->resource_name} has been stopped",
description: 'Check the application in Coolify',
title: ':cross_mark: Application stopped',
description: '[Open Application in Coolify]('.$this->resource_url.')',
color: DiscordMessage::errorColor(),
isCritical: true,
);
$message->addField('Link', '[Open Application in Coolify]('.$this->resource_url.')');
return $message;
}

View File

@@ -38,11 +38,15 @@ class ContainerRestarted extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
$message = new DiscordMessage(
title: "Coolify: A resource ({$this->name}) has been restarted automatically on {$this->server->name}",
description: 'Please check the output below for more information.',
title: ':warning: Resource restarted',
description: "{$this->name} has been restarted automatically on {$this->server->name}.",
color: DiscordMessage::infoColor(),
);
if ($this->url) {
$message->addField('Resource', '[Link]('.$this->url.')');
}
return $message;
}

View File

@@ -37,11 +37,17 @@ class ContainerStopped extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
return new DiscordMessage(
title: "Coolify: A resource ($this->name) has been stopped unexpectedly on {$this->server->name}",
description: 'Please check the output below for more information.',
$message = new DiscordMessage(
title: ':cross_mark: Resource stopped',
description: "{$this->name} has been stopped unexpectedly on {$this->server->name}.",
color: DiscordMessage::errorColor(),
);
if ($this->url) {
$message->addField('Resource', '[Link]('.$this->url.')');
}
return $message;
}
public function toTelegram(): array

View File

@@ -49,13 +49,13 @@ class BackupFailed extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
$message = new DiscordMessage(
title: "Coolify: Database backup for {$this->name} (db:{$this->database_name}) has FAILED.",
description: 'Please check the output below for more information.',
title: ':cross_mark: Database backup failed',
description: "Database backup for {$this->name} (db:{$this->database_name}) has FAILED.",
color: DiscordMessage::errorColor(),
isCritical: true,
);
$message->addField('Frequency', $this->frequency);
$message->addField('Frequency', $this->frequency, true);
$message->addField('Output', $this->output);
return $message;

View File

@@ -48,12 +48,12 @@ class BackupSuccess extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
$message = new DiscordMessage(
title: "Coolify: Database backup for {$this->name} (db:{$this->database_name}) was successful.",
description: 'Please check the output below for more information.',
title: ':white_check_mark: Database backup successful',
description: "Database backup for {$this->name} (db:{$this->database_name}) was successful.",
color: DiscordMessage::successColor(),
);
$message->addField('Frequency', $this->frequency);
$message->addField('Frequency', $this->frequency, true);
return $message;
}

View File

@@ -1,55 +0,0 @@
<?php
namespace App\Notifications\Database;
use App\Notifications\Channels\DiscordChannel;
use App\Notifications\Channels\TelegramChannel;
use App\Notifications\Dto\DiscordMessage;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Channels\MailChannel;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class DailyBackup extends Notification implements ShouldQueue
{
use Queueable;
public $tries = 1;
public function __construct(public $databases) {}
public function via(object $notifiable): array
{
return [DiscordChannel::class, TelegramChannel::class, MailChannel::class];
}
public function toMail(): MailMessage
{
$mail = new MailMessage;
$mail->subject('Coolify: Daily backup statuses');
$mail->view('emails.daily-backup', [
'databases' => $this->databases,
]);
return $mail;
}
public function toDiscord(): DiscordMessage
{
return new DiscordMessage(
title: 'Coolify: Daily backup statuses',
description: 'Nothing to report.',
color: DiscordMessage::infoColor(),
); // todo: is this necessary notification? what is the purpose of this notification?
}
public function toTelegram(): array
{
$message = 'Coolify: Daily backup statuses';
return [
'message' => $message,
];
}
}

View File

@@ -33,11 +33,12 @@ class DiscordMessage
return hexdec('4f545c');
}
public function addField(string $name, string $value): self
public function addField(string $name, string $value, bool $inline = false): self
{
$this->fields[] = [
'name' => $name,
'value' => $value,
'inline' => $inline,
];
return $this;
@@ -45,6 +46,10 @@ class DiscordMessage
public function toPayload(): array
{
$footerText = 'Coolify v'.config('version');
if (isCloud()) {
$footerText = 'Coolify Cloud';
}
$payload = [
'embeds' => [
[
@@ -52,10 +57,12 @@ class DiscordMessage
'description' => $this->description,
'color' => $this->color,
'fields' => $this->addTimestampToFields($this->fields),
'footer' => [
'text' => $footerText,
],
],
],
];
if ($this->isCritical) {
$payload['content'] = '@here';
}
@@ -68,6 +75,7 @@ class DiscordMessage
$fields[] = [
'name' => 'Time',
'value' => '<t:'.now()->timestamp.':R>',
'inline' => true,
];
return $fields;

View File

@@ -50,12 +50,14 @@ class TaskFailed extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
$message = new DiscordMessage(
title: "Coolify: Scheduled task ({$this->task->name}) failed.",
description: "Output: {$this->output}",
title: ':cross_mark: Scheduled task failed',
description: "Scheduled task ({$this->task->name}) failed.",
color: DiscordMessage::errorColor(),
);
$message->addField('Link', '[Open task in Coolify]('.$this->url.')');
if ($this->url) {
$message->addField('Scheduled task', '[Link]('.$this->url.')');
}
return $message;
}

View File

@@ -53,7 +53,7 @@ class DockerCleanup extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
return new DiscordMessage(
title: "Coolify: Server '{$this->server->name}' cleanup job done!",
title: ':white_check_mark: Server cleanup job done',
description: $this->message,
color: DiscordMessage::successColor(),
);

View File

@@ -54,12 +54,12 @@ class ForceDisabled extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
$message = new DiscordMessage(
title: "Coolify: Server ({$this->server->name}) disabled because it is not paid!",
description: 'All automations and integrations are stopped.',
title: ':cross_mark: Server disabled',
description: "Server ({$this->server->name}) disabled because it is not paid!",
color: DiscordMessage::errorColor(),
);
$message->addField('Link', 'Please update your subscription to enable the server again [here](https://app.coolify.io/subscriptions).');
$message->addField('Please update your subscription to enable the server again!', '[Link](https://app.coolify.io/subscriptions)');
return $message;
}

View File

@@ -54,8 +54,8 @@ class ForceEnabled extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
return new DiscordMessage(
title: "Coolify: Server '{$this->server->name}' enabled again!",
description: 'All automations and integrations are started.',
title: ':white_check_mark: Server enabled',
description: "Server '{$this->server->name}' enabled again!",
color: DiscordMessage::successColor(),
);
}

View File

@@ -56,14 +56,14 @@ class HighDiskUsage extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
$message = new DiscordMessage(
title: "Coolify: Server '{$this->server->name}' high disk usage detected!",
description: 'Please cleanup your disk to prevent data-loss.',
title: ':cross_mark: High disk usage detected',
description: "Server '{$this->server->name}' high disk usage detected!",
color: DiscordMessage::errorColor(),
);
$message->addField('Disk usage', "{$this->disk_usage}%");
$message->addField('Threshold', "{$this->docker_cleanup_threshold}%");
$message->addField('Link', 'Here are some tips: https://coolify.io/docs/knowledge-base/server/automated-cleanup.');
$message->addField('Tips', '[Link](https://coolify.io/docs/knowledge-base/server/automated-cleanup)');
return $message;
}

View File

@@ -76,7 +76,7 @@ class Revived extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
return new DiscordMessage(
title: "Coolify: Server '{$this->server->name}' revived.",
title: ":white_check_mark: Server '{$this->server->name}' revived",
description: 'All automations & integrations are turned on again!',
color: DiscordMessage::successColor(),
);

View File

@@ -67,8 +67,8 @@ class Unreachable extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
$message = new DiscordMessage(
title: "Coolify: Your server '{$this->server->name}' is unreachable.",
description: 'All automations & integrations are turned off! Please check your server!',
title: ':cross_mark: Server unreachable',
description: "Your server '{$this->server->name}' is unreachable.",
color: DiscordMessage::errorColor(),
);

View File

@@ -33,12 +33,12 @@ class Test extends Notification implements ShouldQueue
public function toDiscord(): DiscordMessage
{
$message = new DiscordMessage(
title: 'Coolify: This is a test Discord notification from Coolify.',
description: 'This is a test Discord notification from Coolify.',
title: ':white_check_mark: Test Success',
description: 'This is a test Discord notification from Coolify. :cross_mark: :warning: :information_source:',
color: DiscordMessage::successColor(),
);
$message->addField('Link', '[Go to your dashboard]('.base_url().')');
$message->addField(name: 'Dashboard', value: '[Link]('.base_url().')', inline: true);
return $message;
}