
* feat(README): add InterviewPal sponsorship link and corresponding SVG icon
* chore(versions): update coolify version to 4.0.0-beta.413 and nightly version to 4.0.0-beta.414 in configuration files
* fix(terminal): enhance WebSocket client verification with authorized IPs in terminal server
* chore(versions): update realtime version to 1.0.8 in versions.json
* chore(versions): update realtime version to 1.0.8 in versions.json
* chore(docker): update soketi image version to 1.0.8 in production configuration files
* chore(versions): update coolify version to 4.0.0-beta.414 and nightly version to 4.0.0-beta.415 in configuration files
* fix(ApplicationDeploymentJob): ensure source is an object before checking GitHub app properties
* fix(ui): Disable livewire navigate feature (causing spam of setInterval())
* fix(ui): Remove required attribute from image input in service application view
* fix(ui): Change application image validation to be nullable in service application view
* fix(Server): Correct proxy path formatting for Traefik proxy type
* chore(versions): update coolify version to 4.0.0-beta.416 and nightly version to 4.0.0-beta.417 in configuration files; fix links in deployment view
* feat(Service): Add functionality to convert between applications and databases in docker-compose based applications
fix(ui): Fix service layout refresh on compose change
* fix(service): graceful shutdown of old container (#5731)
* refactor(Database): streamline container shutdown process and reduce timeout duration
* fix(ServerCheck): enhance proxy container check to ensure it is running before proceeding
* chore(seeder): update git branch from 'main' to 'v4.x' for multiple examples in ApplicationSeeder
* fix(applications): include pull_request_id in deployment queue check to prevent duplicate deployments
* refactor(core): streamline container stopping process and reduce timeout duration; update related methods for consistency
* fix(database): update label for image input field to improve clarity
* feat(migration): add 'is_migrated' and 'custom_type' columns to service_applications and service_databases tables
* feat(backup): implement custom database type selection and enhance scheduled backups management
* fix(ServerCheck): set default proxy status to 'exited' to handle missing container state
* fix(database): reduce container stop timeout from 300 to 30 seconds for improved responsiveness
* refactor(database): update DB facade usage for consistency across service files
* Update app/Livewire/Project/Service/Database.php
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* refactor(database): enhance application conversion logic and add existence checks for databases and applications
* refactor(actions): standardize method naming for network and configuration deletion across application and service classes
* refactor(logdrain): consolidate log drain stopping logic to reduce redundancy
* refactor(StandaloneMariadb): add type hint for destination method to improve code clarity
* refactor(DeleteResourceJob): streamline resource deletion logic and improve conditional checks for database types
* refactor(jobs): update middleware to prevent job release after expiration for CleanupInstanceStuffsJob, RestartProxyJob, and ServerCheckJob
* fix(ui): system theming for charts (#5740)
* chore(deps-dev): bump vite from 6.2.6 to 6.3.4 (#5743)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.6 to 6.3.4.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.3.4/packages/vite)
---
updated-dependencies:
- dependency-name: vite
dependency-version: 6.3.4
dependency-type: direct:development
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* fix(dev): mount points?!
* fix(dev): proxy mount point
* fix(ui): allow adding scheduled backups for non-migrated databases
* fix(DatabaseBackupJob): escape PostgreSQL password in backup command (#5759)
* fix(ui): correct closing div tag in service index view
* Revert "fix(dev): mount points?!"
This reverts commit 365bf3cbf0
.
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Jérémy <jeremy.derdaele@gmail.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Best Codes <106822363+The-Best-Codes@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: busybox <29630035+busybox11@users.noreply.github.com>
222 lines
7.6 KiB
PHP
222 lines
7.6 KiB
PHP
<?php
|
|
|
|
namespace App\Actions\Server;
|
|
|
|
use App\Models\Server;
|
|
use Lorisleiva\Actions\Concerns\AsAction;
|
|
|
|
class StartLogDrain
|
|
{
|
|
use AsAction;
|
|
|
|
public string $jobQueue = 'high';
|
|
|
|
public function handle(Server $server)
|
|
{
|
|
if ($server->settings->is_logdrain_newrelic_enabled) {
|
|
$type = 'newrelic';
|
|
} elseif ($server->settings->is_logdrain_highlight_enabled) {
|
|
$type = 'highlight';
|
|
} elseif ($server->settings->is_logdrain_axiom_enabled) {
|
|
$type = 'axiom';
|
|
} elseif ($server->settings->is_logdrain_custom_enabled) {
|
|
$type = 'custom';
|
|
} else {
|
|
$type = 'none';
|
|
}
|
|
if ($type !== 'none') {
|
|
StopLogDrain::run($server);
|
|
}
|
|
try {
|
|
if ($type === 'none') {
|
|
return 'No log drain is enabled.';
|
|
} elseif ($type === 'newrelic') {
|
|
if (! $server->settings->is_logdrain_newrelic_enabled) {
|
|
throw new \Exception('New Relic log drain is not enabled.');
|
|
}
|
|
$config = base64_encode("
|
|
[SERVICE]
|
|
Flush 5
|
|
Daemon off
|
|
Tag container_logs
|
|
Log_Level debug
|
|
Parsers_File parsers.conf
|
|
[INPUT]
|
|
Name forward
|
|
Buffer_Chunk_Size 1M
|
|
Buffer_Max_Size 6M
|
|
[FILTER]
|
|
Name grep
|
|
Match *
|
|
Exclude log 127.0.0.1
|
|
[FILTER]
|
|
Name modify
|
|
Match *
|
|
Set coolify.server_name {$server->name}
|
|
Rename COOLIFY_APP_NAME coolify.app_name
|
|
Rename COOLIFY_PROJECT_NAME coolify.project_name
|
|
Rename COOLIFY_SERVER_IP coolify.server_ip
|
|
Rename COOLIFY_ENVIRONMENT_NAME coolify.environment_name
|
|
[OUTPUT]
|
|
Name nrlogs
|
|
Match *
|
|
license_key \${LICENSE_KEY}
|
|
# https://log-api.eu.newrelic.com/log/v1 - EU
|
|
# https://log-api.newrelic.com/log/v1 - US
|
|
base_uri \${BASE_URI}
|
|
");
|
|
} elseif ($type === 'highlight') {
|
|
if (! $server->settings->is_logdrain_highlight_enabled) {
|
|
throw new \Exception('Highlight log drain is not enabled.');
|
|
}
|
|
$config = base64_encode('
|
|
[SERVICE]
|
|
Flush 5
|
|
Daemon off
|
|
Log_Level debug
|
|
Parsers_File parsers.conf
|
|
[INPUT]
|
|
Name forward
|
|
tag ${HIGHLIGHT_PROJECT_ID}
|
|
Buffer_Chunk_Size 1M
|
|
Buffer_Max_Size 6M
|
|
[OUTPUT]
|
|
Name forward
|
|
Match *
|
|
Host otel.highlight.io
|
|
Port 24224
|
|
');
|
|
} elseif ($type === 'axiom') {
|
|
if (! $server->settings->is_logdrain_axiom_enabled) {
|
|
throw new \Exception('Axiom log drain is not enabled.');
|
|
}
|
|
$config = base64_encode("
|
|
[SERVICE]
|
|
Flush 5
|
|
Daemon off
|
|
Log_Level debug
|
|
Parsers_File parsers.conf
|
|
[INPUT]
|
|
Name forward
|
|
Buffer_Chunk_Size 1M
|
|
Buffer_Max_Size 6M
|
|
[FILTER]
|
|
Name grep
|
|
Match *
|
|
Exclude log 127.0.0.1
|
|
[FILTER]
|
|
Name modify
|
|
Match *
|
|
Set coolify.server_name {$server->name}
|
|
Rename COOLIFY_APP_NAME coolify.app_name
|
|
Rename COOLIFY_PROJECT_NAME coolify.project_name
|
|
Rename COOLIFY_SERVER_IP coolify.server_ip
|
|
Rename COOLIFY_ENVIRONMENT_NAME coolify.environment_name
|
|
[OUTPUT]
|
|
Name http
|
|
Match *
|
|
Host api.axiom.co
|
|
Port 443
|
|
URI /v1/datasets/\${AXIOM_DATASET_NAME}/ingest
|
|
# Authorization Bearer should be an API token
|
|
Header Authorization Bearer \${AXIOM_API_KEY}
|
|
compress gzip
|
|
format json
|
|
json_date_key _time
|
|
json_date_format iso8601
|
|
tls On
|
|
");
|
|
} elseif ($type === 'custom') {
|
|
if (! $server->settings->is_logdrain_custom_enabled) {
|
|
throw new \Exception('Custom log drain is not enabled.');
|
|
}
|
|
$config = base64_encode($server->settings->logdrain_custom_config);
|
|
$parsers = base64_encode($server->settings->logdrain_custom_config_parser);
|
|
} else {
|
|
throw new \Exception('Unknown log drain type.');
|
|
}
|
|
if ($type !== 'custom') {
|
|
$parsers = base64_encode("
|
|
[PARSER]
|
|
Name empty_line_skipper
|
|
Format regex
|
|
Regex /^(?!\s*$).+/
|
|
");
|
|
}
|
|
$compose = base64_encode('
|
|
services:
|
|
coolify-log-drain:
|
|
image: cr.fluentbit.io/fluent/fluent-bit:2.0
|
|
container_name: coolify-log-drain
|
|
command: -c /fluent-bit.conf
|
|
env_file:
|
|
- .env
|
|
volumes:
|
|
- ./fluent-bit.conf:/fluent-bit.conf
|
|
- ./parsers.conf:/parsers.conf
|
|
ports:
|
|
- 127.0.0.1:24224:24224
|
|
labels:
|
|
- coolify.managed=true
|
|
restart: unless-stopped
|
|
');
|
|
$readme = base64_encode('# New Relic Log Drain
|
|
This log drain is based on [Fluent Bit](https://fluentbit.io/) and New Relic Log Forwarder.
|
|
|
|
Files:
|
|
- `fluent-bit.conf` - configuration file for Fluent Bit
|
|
- `docker-compose.yml` - docker-compose file to run Fluent Bit
|
|
- `.env` - environment variables for Fluent Bit
|
|
');
|
|
$license_key = $server->settings->logdrain_newrelic_license_key;
|
|
$base_uri = $server->settings->logdrain_newrelic_base_uri;
|
|
$base_path = config('constants.coolify.base_config_path');
|
|
|
|
$config_path = $base_path.'/log-drains';
|
|
$fluent_bit_config = $config_path.'/fluent-bit.conf';
|
|
$parsers_config = $config_path.'/parsers.conf';
|
|
$compose_path = $config_path.'/docker-compose.yml';
|
|
$readme_path = $config_path.'/README.md';
|
|
$command = [
|
|
"echo 'Saving configuration'",
|
|
"mkdir -p $config_path",
|
|
"echo '{$parsers}' | base64 -d | tee $parsers_config > /dev/null",
|
|
"echo '{$config}' | base64 -d | tee $fluent_bit_config > /dev/null",
|
|
"echo '{$compose}' | base64 -d | tee $compose_path > /dev/null",
|
|
"echo '{$readme}' | base64 -d | tee $readme_path > /dev/null",
|
|
"test -f $config_path/.env && rm $config_path/.env",
|
|
];
|
|
if ($type === 'newrelic') {
|
|
$add_envs_command = [
|
|
"echo LICENSE_KEY=$license_key >> $config_path/.env",
|
|
"echo BASE_URI=$base_uri >> $config_path/.env",
|
|
];
|
|
} elseif ($type === 'highlight') {
|
|
$add_envs_command = [
|
|
"echo HIGHLIGHT_PROJECT_ID={$server->settings->logdrain_highlight_project_id} >> $config_path/.env",
|
|
];
|
|
} elseif ($type === 'axiom') {
|
|
$add_envs_command = [
|
|
"echo AXIOM_DATASET_NAME={$server->settings->logdrain_axiom_dataset_name} >> $config_path/.env",
|
|
"echo AXIOM_API_KEY={$server->settings->logdrain_axiom_api_key} >> $config_path/.env",
|
|
];
|
|
} elseif ($type === 'custom') {
|
|
$add_envs_command = [
|
|
"touch $config_path/.env",
|
|
];
|
|
} else {
|
|
throw new \Exception('Unknown log drain type.');
|
|
}
|
|
$restart_command = [
|
|
"echo 'Starting Fluent Bit'",
|
|
"cd $config_path && docker compose up -d",
|
|
];
|
|
$command = array_merge($command, $add_envs_command, $restart_command);
|
|
|
|
return instant_remote_process($command, $server);
|
|
} catch (\Throwable $e) {
|
|
return handleError($e);
|
|
}
|
|
}
|
|
}
|