diff --git a/app/Actions/CoolifyTask/PrepareCoolifyTask.php b/app/Actions/CoolifyTask/PrepareCoolifyTask.php index d4cdf64e2..686b60780 100644 --- a/app/Actions/CoolifyTask/PrepareCoolifyTask.php +++ b/app/Actions/CoolifyTask/PrepareCoolifyTask.php @@ -3,6 +3,7 @@ namespace App\Actions\CoolifyTask; use App\Data\CoolifyTaskArgs; +use App\Enums\ActivityTypes; use App\Jobs\CoolifyTask; use Spatie\Activitylog\Models\Activity; @@ -40,8 +41,18 @@ public function __construct(CoolifyTaskArgs $remoteProcessArgs) public function __invoke(): Activity { - $job = new CoolifyTask($this->activity, ignore_errors: $this->remoteProcessArgs->ignore_errors, call_event_on_finish: $this->remoteProcessArgs->call_event_on_finish, call_event_data: $this->remoteProcessArgs->call_event_data); - dispatch($job); + $job = new CoolifyTask( + activity: $this->activity, + ignore_errors: $this->remoteProcessArgs->ignore_errors, + call_event_on_finish: $this->remoteProcessArgs->call_event_on_finish, + call_event_data: $this->remoteProcessArgs->call_event_data, + ); + if ($this->remoteProcessArgs->type === ActivityTypes::COMMAND->value) { + ray('Dispatching a high priority job'); + dispatch($job)->onQueue('high'); + } else { + dispatch($job); + } $this->activity->refresh(); return $this->activity; diff --git a/app/Actions/CoolifyTask/RunRemoteProcess.php b/app/Actions/CoolifyTask/RunRemoteProcess.php index be986a76f..63e3afe2f 100644 --- a/app/Actions/CoolifyTask/RunRemoteProcess.php +++ b/app/Actions/CoolifyTask/RunRemoteProcess.php @@ -39,7 +39,7 @@ class RunRemoteProcess public function __construct(Activity $activity, bool $hide_from_output = false, bool $ignore_errors = false, $call_event_on_finish = null, $call_event_data = null) { - if ($activity->getExtraProperty('type') !== ActivityTypes::INLINE->value) { + if ($activity->getExtraProperty('type') !== ActivityTypes::INLINE->value && $activity->getExtraProperty('type') !== ActivityTypes::COMMAND->value) { throw new \RuntimeException('Incompatible Activity to run a remote command.'); } diff --git a/app/Actions/Database/StartClickhouse.php b/app/Actions/Database/StartClickhouse.php index d9518cd80..e97c55930 100644 --- a/app/Actions/Database/StartClickhouse.php +++ b/app/Actions/Database/StartClickhouse.php @@ -3,7 +3,6 @@ namespace App\Actions\Database; use App\Models\StandaloneClickhouse; -use Illuminate\Support\Str; use Lorisleiva\Actions\Concerns\AsAction; use Symfony\Component\Yaml\Yaml; @@ -155,11 +154,11 @@ private function generate_environment_variables() $environment_variables->push("$env->key=$env->real_value"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('CLICKHOUSE_ADMIN_USER'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('CLICKHOUSE_ADMIN_USER'))->isEmpty()) { $environment_variables->push("CLICKHOUSE_ADMIN_USER={$this->database->clickhouse_admin_user}"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('CLICKHOUSE_ADMIN_PASSWORD'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('CLICKHOUSE_ADMIN_PASSWORD'))->isEmpty()) { $environment_variables->push("CLICKHOUSE_ADMIN_PASSWORD={$this->database->clickhouse_admin_password}"); } diff --git a/app/Actions/Database/StartDragonfly.php b/app/Actions/Database/StartDragonfly.php index 19b1c5814..862fc54fc 100644 --- a/app/Actions/Database/StartDragonfly.php +++ b/app/Actions/Database/StartDragonfly.php @@ -3,7 +3,6 @@ namespace App\Actions\Database; use App\Models\StandaloneDragonfly; -use Illuminate\Support\Str; use Lorisleiva\Actions\Concerns\AsAction; use Symfony\Component\Yaml\Yaml; @@ -155,7 +154,7 @@ private function generate_environment_variables() $environment_variables->push("$env->key=$env->real_value"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('REDIS_PASSWORD'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('REDIS_PASSWORD'))->isEmpty()) { $environment_variables->push("REDIS_PASSWORD={$this->database->dragonfly_password}"); } diff --git a/app/Actions/Database/StartKeydb.php b/app/Actions/Database/StartKeydb.php index a632f6e8c..85cb89c1c 100644 --- a/app/Actions/Database/StartKeydb.php +++ b/app/Actions/Database/StartKeydb.php @@ -4,7 +4,6 @@ use App\Models\StandaloneKeydb; use Illuminate\Support\Facades\Storage; -use Illuminate\Support\Str; use Lorisleiva\Actions\Concerns\AsAction; use Symfony\Component\Yaml\Yaml; @@ -163,7 +162,7 @@ private function generate_environment_variables() $environment_variables->push("$env->key=$env->real_value"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('REDIS_PASSWORD'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('REDIS_PASSWORD'))->isEmpty()) { $environment_variables->push("REDIS_PASSWORD={$this->database->keydb_password}"); } diff --git a/app/Actions/Database/StartMariadb.php b/app/Actions/Database/StartMariadb.php index 31d3f0640..33948192b 100644 --- a/app/Actions/Database/StartMariadb.php +++ b/app/Actions/Database/StartMariadb.php @@ -3,7 +3,6 @@ namespace App\Actions\Database; use App\Models\StandaloneMariadb; -use Illuminate\Support\Str; use Lorisleiva\Actions\Concerns\AsAction; use Symfony\Component\Yaml\Yaml; @@ -157,18 +156,18 @@ private function generate_environment_variables() $environment_variables->push("$env->key=$env->real_value"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('MARIADB_ROOT_PASSWORD'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('MARIADB_ROOT_PASSWORD'))->isEmpty()) { $environment_variables->push("MARIADB_ROOT_PASSWORD={$this->database->mariadb_root_password}"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('MARIADB_DATABASE'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('MARIADB_DATABASE'))->isEmpty()) { $environment_variables->push("MARIADB_DATABASE={$this->database->mariadb_database}"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('MARIADB_USER'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('MARIADB_USER'))->isEmpty()) { $environment_variables->push("MARIADB_USER={$this->database->mariadb_user}"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('MARIADB_PASSWORD'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('MARIADB_PASSWORD'))->isEmpty()) { $environment_variables->push("MARIADB_PASSWORD={$this->database->mariadb_password}"); } diff --git a/app/Actions/Database/StartMongodb.php b/app/Actions/Database/StartMongodb.php index 8db34b20f..911054f5e 100644 --- a/app/Actions/Database/StartMongodb.php +++ b/app/Actions/Database/StartMongodb.php @@ -3,7 +3,6 @@ namespace App\Actions\Database; use App\Models\StandaloneMongodb; -use Illuminate\Support\Str; use Lorisleiva\Actions\Concerns\AsAction; use Symfony\Component\Yaml\Yaml; @@ -174,15 +173,15 @@ private function generate_environment_variables() $environment_variables->push("$env->key=$env->real_value"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('MONGO_INITDB_ROOT_USERNAME'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('MONGO_INITDB_ROOT_USERNAME'))->isEmpty()) { $environment_variables->push("MONGO_INITDB_ROOT_USERNAME={$this->database->mongo_initdb_root_username}"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('MONGO_INITDB_ROOT_PASSWORD'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('MONGO_INITDB_ROOT_PASSWORD'))->isEmpty()) { $environment_variables->push("MONGO_INITDB_ROOT_PASSWORD={$this->database->mongo_initdb_root_password}"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('MONGO_INITDB_DATABASE'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('MONGO_INITDB_DATABASE'))->isEmpty()) { $environment_variables->push("MONGO_INITDB_DATABASE={$this->database->mongo_initdb_database}"); } diff --git a/app/Actions/Database/StartMysql.php b/app/Actions/Database/StartMysql.php index 8280faa56..b55d9dead 100644 --- a/app/Actions/Database/StartMysql.php +++ b/app/Actions/Database/StartMysql.php @@ -3,7 +3,6 @@ namespace App\Actions\Database; use App\Models\StandaloneMysql; -use Illuminate\Support\Str; use Lorisleiva\Actions\Concerns\AsAction; use Symfony\Component\Yaml\Yaml; @@ -157,18 +156,18 @@ private function generate_environment_variables() $environment_variables->push("$env->key=$env->real_value"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('MYSQL_ROOT_PASSWORD'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('MYSQL_ROOT_PASSWORD'))->isEmpty()) { $environment_variables->push("MYSQL_ROOT_PASSWORD={$this->database->mysql_root_password}"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('MYSQL_DATABASE'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('MYSQL_DATABASE'))->isEmpty()) { $environment_variables->push("MYSQL_DATABASE={$this->database->mysql_database}"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('MYSQL_USER'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('MYSQL_USER'))->isEmpty()) { $environment_variables->push("MYSQL_USER={$this->database->mysql_user}"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('MYSQL_PASSWORD'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('MYSQL_PASSWORD'))->isEmpty()) { $environment_variables->push("MYSQL_PASSWORD={$this->database->mysql_password}"); } diff --git a/app/Actions/Database/StartPostgresql.php b/app/Actions/Database/StartPostgresql.php index 23b9742c7..909f4c893 100644 --- a/app/Actions/Database/StartPostgresql.php +++ b/app/Actions/Database/StartPostgresql.php @@ -3,7 +3,6 @@ namespace App\Actions\Database; use App\Models\StandalonePostgresql; -use Illuminate\Support\Str; use Lorisleiva\Actions\Concerns\AsAction; use Symfony\Component\Yaml\Yaml; @@ -179,18 +178,18 @@ private function generate_environment_variables() $environment_variables->push("$env->key=$env->real_value"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('POSTGRES_USER'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('POSTGRES_USER'))->isEmpty()) { $environment_variables->push("POSTGRES_USER={$this->database->postgres_user}"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('PGUSER'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('PGUSER'))->isEmpty()) { $environment_variables->push("PGUSER={$this->database->postgres_user}"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('POSTGRES_PASSWORD'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('POSTGRES_PASSWORD'))->isEmpty()) { $environment_variables->push("POSTGRES_PASSWORD={$this->database->postgres_password}"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('POSTGRES_DB'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('POSTGRES_DB'))->isEmpty()) { $environment_variables->push("POSTGRES_DB={$this->database->postgres_db}"); } diff --git a/app/Actions/Database/StartRedis.php b/app/Actions/Database/StartRedis.php index 065df5e52..f10afef5e 100644 --- a/app/Actions/Database/StartRedis.php +++ b/app/Actions/Database/StartRedis.php @@ -4,7 +4,6 @@ use App\Models\StandaloneRedis; use Illuminate\Support\Facades\Storage; -use Illuminate\Support\Str; use Lorisleiva\Actions\Concerns\AsAction; use Symfony\Component\Yaml\Yaml; @@ -167,7 +166,7 @@ private function generate_environment_variables() $environment_variables->push("$env->key=$env->real_value"); } - if ($environment_variables->filter(fn ($env) => Str::of($env)->contains('REDIS_PASSWORD'))->isEmpty()) { + if ($environment_variables->filter(fn ($env) => str($env)->contains('REDIS_PASSWORD'))->isEmpty()) { $environment_variables->push("REDIS_PASSWORD={$this->database->redis_password}"); } diff --git a/app/Actions/Proxy/CheckConfiguration.php b/app/Actions/Proxy/CheckConfiguration.php index 35374ba43..3cbd5669d 100644 --- a/app/Actions/Proxy/CheckConfiguration.php +++ b/app/Actions/Proxy/CheckConfiguration.php @@ -3,7 +3,6 @@ namespace App\Actions\Proxy; use App\Models\Server; -use Illuminate\Support\Str; use Lorisleiva\Actions\Concerns\AsAction; class CheckConfiguration @@ -24,7 +23,7 @@ public function handle(Server $server, bool $reset = false) $proxy_configuration = instant_remote_process($payload, $server, false); if ($reset || ! $proxy_configuration || is_null($proxy_configuration)) { - $proxy_configuration = Str::of(generate_default_proxy_configuration($server))->trim()->value; + $proxy_configuration = str(generate_default_proxy_configuration($server))->trim()->value; } if (! $proxy_configuration || is_null($proxy_configuration)) { throw new \Exception('Could not generate proxy configuration'); diff --git a/app/Actions/Proxy/SaveConfiguration.php b/app/Actions/Proxy/SaveConfiguration.php index 4c413ca36..f2de2b3f5 100644 --- a/app/Actions/Proxy/SaveConfiguration.php +++ b/app/Actions/Proxy/SaveConfiguration.php @@ -3,7 +3,6 @@ namespace App\Actions\Proxy; use App\Models\Server; -use Illuminate\Support\Str; use Lorisleiva\Actions\Concerns\AsAction; class SaveConfiguration @@ -18,7 +17,7 @@ public function handle(Server $server, ?string $proxy_settings = null) $proxy_path = $server->proxyPath(); $docker_compose_yml_base64 = base64_encode($proxy_settings); - $server->proxy->last_saved_settings = Str::of($docker_compose_yml_base64)->pipe('md5')->value; + $server->proxy->last_saved_settings = str($docker_compose_yml_base64)->pipe('md5')->value; $server->save(); return instant_remote_process([ diff --git a/app/Actions/Proxy/StartProxy.php b/app/Actions/Proxy/StartProxy.php index 710b5cdd8..341186bec 100644 --- a/app/Actions/Proxy/StartProxy.php +++ b/app/Actions/Proxy/StartProxy.php @@ -4,7 +4,6 @@ use App\Events\ProxyStarted; use App\Models\Server; -use Illuminate\Support\Str; use Lorisleiva\Actions\Concerns\AsAction; use Spatie\Activitylog\Models\Activity; @@ -27,7 +26,7 @@ public function handle(Server $server, bool $async = true): string|Activity } SaveConfiguration::run($server, $configuration); $docker_compose_yml_base64 = base64_encode($configuration); - $server->proxy->last_applied_settings = Str::of($docker_compose_yml_base64)->pipe('md5')->value; + $server->proxy->last_applied_settings = str($docker_compose_yml_base64)->pipe('md5')->value; $server->save(); if ($server->isSwarm()) { $commands = $commands->merge([ diff --git a/app/Actions/Server/RunCommand.php b/app/Actions/Server/RunCommand.php new file mode 100644 index 000000000..fce862eb0 --- /dev/null +++ b/app/Actions/Server/RunCommand.php @@ -0,0 +1,19 @@ +value); + + return $activity; + } +} diff --git a/app/Actions/Server/UpdateCoolify.php b/app/Actions/Server/UpdateCoolify.php index 0e97d2aed..a945670d4 100644 --- a/app/Actions/Server/UpdateCoolify.php +++ b/app/Actions/Server/UpdateCoolify.php @@ -25,7 +25,7 @@ public function handle($manual_update = false) if (! $this->server) { return; } - CleanupDocker::run($this->server, false); + CleanupDocker::dispatch($this->server, false)->onQueue('high'); $this->latestVersion = get_latest_version_of_coolify(); $this->currentVersion = config('version'); if (! $manual_update) { @@ -48,6 +48,7 @@ public function handle($manual_update = false) private function update() { if (isDev()) { + ray('Running in dev mode'); remote_process([ 'sleep 10', ], $this->server); diff --git a/app/Console/Commands/WaitlistInvite.php b/app/Console/Commands/WaitlistInvite.php index 88ff21d46..ff501cc1d 100644 --- a/app/Console/Commands/WaitlistInvite.php +++ b/app/Console/Commands/WaitlistInvite.php @@ -82,7 +82,7 @@ private function register_user() if (! $already_registered) { $this->password = Str::password(); User::create([ - 'name' => Str::of($this->next_patient->email)->before('@'), + 'name' => str($this->next_patient->email)->before('@'), 'email' => $this->next_patient->email, 'password' => Hash::make($this->password), 'force_password_reset' => true, diff --git a/app/Enums/ActivityTypes.php b/app/Enums/ActivityTypes.php index e2536a7f0..2d23cd98b 100644 --- a/app/Enums/ActivityTypes.php +++ b/app/Enums/ActivityTypes.php @@ -5,4 +5,5 @@ enum ActivityTypes: string { case INLINE = 'inline'; + case COMMAND = 'command'; } diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 3363d8164..38d9e2272 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -81,8 +81,8 @@ public function link() $token = request()->get('token'); if ($token) { $decrypted = Crypt::decryptString($token); - $email = Str::of($decrypted)->before('@@@'); - $password = Str::of($decrypted)->after('@@@'); + $email = str($decrypted)->before('@@@'); + $password = str($decrypted)->after('@@@'); $user = User::whereEmail($email)->first(); if (! $user) { return redirect()->route('login'); diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php index 2944b746d..b53c56d1c 100644 --- a/app/Jobs/ApplicationDeploymentJob.php +++ b/app/Jobs/ApplicationDeploymentJob.php @@ -965,6 +965,7 @@ private function laravel_finetunes() $nixpacks_php_fallback_path = new EnvironmentVariable(); $nixpacks_php_fallback_path->key = 'NIXPACKS_PHP_FALLBACK_PATH'; $nixpacks_php_fallback_path->value = '/index.php'; + $nixpacks_php_fallback_path->is_build_time = false; $nixpacks_php_fallback_path->application_id = $this->application->id; $nixpacks_php_fallback_path->save(); } @@ -972,6 +973,7 @@ private function laravel_finetunes() $nixpacks_php_root_dir = new EnvironmentVariable(); $nixpacks_php_root_dir->key = 'NIXPACKS_PHP_ROOT_DIR'; $nixpacks_php_root_dir->value = '/app/public'; + $nixpacks_php_root_dir->is_build_time = false; $nixpacks_php_root_dir->application_id = $this->application->id; $nixpacks_php_root_dir->save(); } @@ -1076,13 +1078,13 @@ private function health_check() $this->application_deployment_queue->addLogEntry("Healthcheck logs: {$health_check_logs} | Return code: {$health_check_return_code}"); } - if (Str::of($this->saved_outputs->get('health_check'))->replace('"', '')->value() === 'healthy') { + if (str($this->saved_outputs->get('health_check'))->replace('"', '')->value() === 'healthy') { $this->newVersionIsHealthy = true; $this->application->update(['status' => 'running']); $this->application_deployment_queue->addLogEntry('New container is healthy.'); break; } - if (Str::of($this->saved_outputs->get('health_check'))->replace('"', '')->value() === 'unhealthy') { + if (str($this->saved_outputs->get('health_check'))->replace('"', '')->value() === 'unhealthy') { $this->newVersionIsHealthy = false; $this->query_logs(); break; @@ -1094,7 +1096,7 @@ private function health_check() $sleeptime++; } } - if (Str::of($this->saved_outputs->get('health_check'))->replace('"', '')->value() === 'starting') { + if (str($this->saved_outputs->get('health_check'))->replace('"', '')->value() === 'starting') { $this->query_logs(); } } @@ -1535,7 +1537,7 @@ private function generate_compose_file() $this->execute_remote_command([ executeInDocker($this->deployment_uuid, "cat {$this->workdir}{$this->dockerfile_location}"), 'hidden' => true, 'save' => 'dockerfile_from_repo', 'ignore_errors' => true, ]); - $dockerfile = collect(Str::of($this->saved_outputs->get('dockerfile_from_repo'))->trim()->explode("\n")); + $dockerfile = collect(str($this->saved_outputs->get('dockerfile_from_repo'))->trim()->explode("\n")); $this->application->parseHealthcheckFromDockerfile($dockerfile); } $docker_compose = [ @@ -2107,7 +2109,7 @@ private function add_build_env_variables_to_dockerfile() $this->execute_remote_command([ executeInDocker($this->deployment_uuid, "cat {$this->workdir}{$this->dockerfile_location}"), 'hidden' => true, 'save' => 'dockerfile', ]); - $dockerfile = collect(Str::of($this->saved_outputs->get('dockerfile'))->trim()->explode("\n")); + $dockerfile = collect(str($this->saved_outputs->get('dockerfile'))->trim()->explode("\n")); if ($this->pull_request_id === 0) { foreach ($this->application->build_environment_variables as $env) { if (data_get($env, 'is_multiline') === true) { diff --git a/app/Jobs/CoolifyTask.php b/app/Jobs/CoolifyTask.php index 5418daa22..c3692c30b 100755 --- a/app/Jobs/CoolifyTask.php +++ b/app/Jobs/CoolifyTask.php @@ -20,9 +20,9 @@ class CoolifyTask implements ShouldBeEncrypted, ShouldQueue */ public function __construct( public Activity $activity, - public bool $ignore_errors = false, - public $call_event_on_finish = null, - public $call_event_data = null + public bool $ignore_errors, + public $call_event_on_finish, + public $call_event_data, ) {} /** diff --git a/app/Jobs/DatabaseBackupJob.php b/app/Jobs/DatabaseBackupJob.php index 07386988c..94e0ac3a3 100644 --- a/app/Jobs/DatabaseBackupJob.php +++ b/app/Jobs/DatabaseBackupJob.php @@ -98,7 +98,7 @@ public function handle(): void return; } - $status = Str::of(data_get($this->database, 'status')); + $status = str(data_get($this->database, 'status')); if (! $status->startsWith('running') && $this->database->id !== 0) { ray('database not running'); @@ -236,7 +236,7 @@ public function handle(): void return; } } - $this->backup_dir = backup_dir().'/databases/'.Str::of($this->team->name)->slug().'-'.$this->team->id.'/'.$this->directory_name; + $this->backup_dir = backup_dir().'/databases/'.str($this->team->name)->slug().'-'.$this->team->id.'/'.$this->directory_name; if ($this->database->name === 'coolify-db') { $databasesToBackup = ['coolify']; diff --git a/app/Livewire/Project/Application/General.php b/app/Livewire/Project/Application/General.php index 06ff7b1de..38eb4dce8 100644 --- a/app/Livewire/Project/Application/General.php +++ b/app/Livewire/Project/Application/General.php @@ -5,7 +5,6 @@ use App\Models\Application; use App\Models\LocalFileVolume; use Illuminate\Support\Collection; -use Illuminate\Support\Str; use Livewire\Component; use Visus\Cuid2\Cuid2; @@ -199,8 +198,8 @@ public function loadComposeFile($isInit = false) return str($volume)->startsWith('/data/coolify'); })->unique()->values(); foreach ($volumes as $volume) { - $source = Str::of($volume)->before(':'); - $target = Str::of($volume)->after(':')->beforeLast(':'); + $source = str($volume)->before(':'); + $target = str($volume)->after(':')->beforeLast(':'); LocalFileVolume::updateOrCreate( [ diff --git a/app/Livewire/Project/Application/Preview/Form.php b/app/Livewire/Project/Application/Preview/Form.php index cf5ab9c82..e4f100fcf 100644 --- a/app/Livewire/Project/Application/Preview/Form.php +++ b/app/Livewire/Project/Application/Preview/Form.php @@ -3,7 +3,6 @@ namespace App\Livewire\Project\Application\Preview; use App\Models\Application; -use Illuminate\Support\Str; use Livewire\Component; use Spatie\Url\Url; @@ -32,10 +31,10 @@ public function resetToDefault() public function generate_real_url() { if (data_get($this->application, 'fqdn')) { - $firstFqdn = Str::of($this->application->fqdn)->before(','); + $firstFqdn = str($this->application->fqdn)->before(','); $url = Url::fromString($firstFqdn); $host = $url->getHost(); - $this->preview_url_template = Str::of($this->application->preview_url_template)->replace('{{domain}}', $host); + $this->preview_url_template = str($this->application->preview_url_template)->replace('{{domain}}', $host); } } diff --git a/app/Livewire/Project/Application/Rollback.php b/app/Livewire/Project/Application/Rollback.php index 41fe598b1..ed0ac1cef 100644 --- a/app/Livewire/Project/Application/Rollback.php +++ b/app/Livewire/Project/Application/Rollback.php @@ -3,7 +3,6 @@ namespace App\Livewire\Project\Application; use App\Models\Application; -use Illuminate\Support\Str; use Livewire\Component; use Visus\Cuid2\Cuid2; @@ -50,16 +49,16 @@ public function loadImages($showToast = false) $output = instant_remote_process([ "docker inspect --format='{{.Config.Image}}' {$this->application->uuid}", ], $this->application->destination->server, throwError: false); - $current_tag = Str::of($output)->trim()->explode(':'); + $current_tag = str($output)->trim()->explode(':'); $this->current = data_get($current_tag, 1); $output = instant_remote_process([ "docker images --format '{{.Repository}}#{{.Tag}}#{{.CreatedAt}}'", ], $this->application->destination->server); - $this->images = Str::of($output)->trim()->explode("\n")->filter(function ($item) use ($image) { - return Str::of($item)->contains($image); + $this->images = str($output)->trim()->explode("\n")->filter(function ($item) use ($image) { + return str($item)->contains($image); })->map(function ($item) { - $item = Str::of($item)->explode('#'); + $item = str($item)->explode('#'); if ($item[1] === $this->current) { // $is_current = true; } diff --git a/app/Livewire/Project/New/DockerImage.php b/app/Livewire/Project/New/DockerImage.php index 65a98b37f..fdad052c7 100644 --- a/app/Livewire/Project/New/DockerImage.php +++ b/app/Livewire/Project/New/DockerImage.php @@ -6,7 +6,6 @@ use App\Models\Project; use App\Models\StandaloneDocker; use App\Models\SwarmDocker; -use Illuminate\Support\Str; use Livewire\Component; use Visus\Cuid2\Cuid2; @@ -29,9 +28,9 @@ public function submit() $this->validate([ 'dockerImage' => 'required', ]); - $image = Str::of($this->dockerImage)->before(':'); - if (Str::of($this->dockerImage)->contains(':')) { - $tag = Str::of($this->dockerImage)->after(':'); + $image = str($this->dockerImage)->before(':'); + if (str($this->dockerImage)->contains(':')) { + $tag = str($this->dockerImage)->after(':'); } else { $tag = 'latest'; } diff --git a/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php b/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php index 690149cc4..a35a92516 100644 --- a/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php +++ b/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php @@ -193,7 +193,7 @@ private function get_git_source() return; } - if (Str::of($this->repository_url)->startsWith('http')) { + if (str($this->repository_url)->startsWith('http')) { $this->git_host = $this->repository_url_parsed->getHost(); $this->git_repository = $this->repository_url_parsed->getSegment(1).'/'.$this->repository_url_parsed->getSegment(2); $this->git_repository = Str::finish("git@$this->git_host:$this->git_repository", '.git'); diff --git a/app/Livewire/Project/Service/EditCompose.php b/app/Livewire/Project/Service/EditCompose.php index c9bdf12fc..f67b95a8a 100644 --- a/app/Livewire/Project/Service/EditCompose.php +++ b/app/Livewire/Project/Service/EditCompose.php @@ -11,7 +11,7 @@ class EditCompose extends Component public $serviceId; - protected $listeners = ['refreshEnvs' => 'mount']; + protected $listeners = ['refreshEnvs', 'envsUpdated']; protected $rules = [ 'service.docker_compose_raw' => 'required', @@ -19,6 +19,17 @@ class EditCompose extends Component 'service.is_container_label_escape_enabled' => 'required', ]; + public function envsUpdated() + { + $this->dispatch('saveCompose', $this->service->docker_compose_raw); + $this->refreshEnvs(); + } + + public function refreshEnvs() + { + $this->service = Service::find($this->serviceId); + } + public function mount() { $this->service = Service::find($this->serviceId); diff --git a/app/Livewire/Project/Service/FileStorage.php b/app/Livewire/Project/Service/FileStorage.php index 201ebf58f..2eea0891f 100644 --- a/app/Livewire/Project/Service/FileStorage.php +++ b/app/Livewire/Project/Service/FileStorage.php @@ -14,7 +14,6 @@ use App\Models\StandaloneMysql; use App\Models\StandalonePostgresql; use App\Models\StandaloneRedis; -use Illuminate\Support\Str; use Livewire\Component; class FileStorage extends Component @@ -37,9 +36,9 @@ class FileStorage extends Component public function mount() { $this->resource = $this->fileStorage->service; - if (Str::of($this->fileStorage->fs_path)->startsWith('.')) { + if (str($this->fileStorage->fs_path)->startsWith('.')) { $this->workdir = $this->resource->service?->workdir(); - $this->fs_path = Str::of($this->fileStorage->fs_path)->after('.'); + $this->fs_path = str($this->fileStorage->fs_path)->after('.'); } else { $this->workdir = null; $this->fs_path = $this->fileStorage->fs_path; diff --git a/app/Livewire/Project/Shared/EnvironmentVariable/Show.php b/app/Livewire/Project/Shared/EnvironmentVariable/Show.php index e77c05d6b..c21d899e5 100644 --- a/app/Livewire/Project/Shared/EnvironmentVariable/Show.php +++ b/app/Livewire/Project/Shared/EnvironmentVariable/Show.php @@ -112,7 +112,7 @@ public function submit() $this->serialize(); $this->env->save(); $this->dispatch('success', 'Environment variable updated.'); - $this->dispatch('refreshEnvs'); + $this->dispatch('envsUpdated'); } catch (\Exception $e) { return handleError($e); } diff --git a/app/Livewire/RunCommand.php b/app/Livewire/RunCommand.php index fc7f1eefc..c2d3adeea 100644 --- a/app/Livewire/RunCommand.php +++ b/app/Livewire/RunCommand.php @@ -2,6 +2,7 @@ namespace App\Livewire; +use App\Actions\Server\RunCommand as ServerRunCommand; use App\Models\Server; use Livewire\Component; @@ -33,7 +34,7 @@ public function runCommand() { $this->validate(); try { - $activity = remote_process([$this->command], Server::where('uuid', $this->server)->first(), ignore_errors: true); + $activity = ServerRunCommand::run(server: Server::where('uuid', $this->server)->first(), command: $this->command); $this->dispatch('activityMonitor', $activity->id); } catch (\Throwable $e) { return handleError($e, $this); diff --git a/app/Livewire/Server/Proxy.php b/app/Livewire/Server/Proxy.php index 8d1ece1c6..a170ee029 100644 --- a/app/Livewire/Server/Proxy.php +++ b/app/Livewire/Server/Proxy.php @@ -6,7 +6,6 @@ use App\Actions\Proxy\SaveConfiguration; use App\Actions\Proxy\StartProxy; use App\Models\Server; -use Illuminate\Support\Str; use Livewire\Component; class Proxy extends Component @@ -79,7 +78,7 @@ public function loadProxyConfiguration() { try { $this->proxy_settings = CheckConfiguration::run($this->server); - if (Str::of($this->proxy_settings)->contains('--api.dashboard=true') && Str::of($this->proxy_settings)->contains('--api.insecure=true')) { + if (str($this->proxy_settings)->contains('--api.dashboard=true') && str($this->proxy_settings)->contains('--api.insecure=true')) { $this->dispatch('traefikDashboardAvailable', true); } else { $this->dispatch('traefikDashboardAvailable', false); diff --git a/app/Livewire/Team/InviteLink.php b/app/Livewire/Team/InviteLink.php index cc69e6650..0fa9e980c 100644 --- a/app/Livewire/Team/InviteLink.php +++ b/app/Livewire/Team/InviteLink.php @@ -52,7 +52,7 @@ private function generate_invite_link(bool $sendEmail = false) if (is_null($user)) { $password = Str::password(); $user = User::create([ - 'name' => Str::of($this->email)->before('@'), + 'name' => str($this->email)->before('@'), 'email' => $this->email, 'password' => Hash::make($password), 'force_password_reset' => true, diff --git a/app/Models/Application.php b/app/Models/Application.php index 50c7760ff..9c27fc938 100644 --- a/app/Models/Application.php +++ b/app/Models/Application.php @@ -28,11 +28,11 @@ protected static function booted() } $application->forceFill([ 'fqdn' => $application->fqdn, - 'install_command' => Str::of($application->install_command)->trim(), - 'build_command' => Str::of($application->build_command)->trim(), - 'start_command' => Str::of($application->start_command)->trim(), - 'base_directory' => Str::of($application->base_directory)->trim(), - 'publish_directory' => Str::of($application->publish_directory)->trim(), + 'install_command' => str($application->install_command)->trim(), + 'build_command' => str($application->build_command)->trim(), + 'start_command' => str($application->start_command)->trim(), + 'base_directory' => str($application->base_directory)->trim(), + 'publish_directory' => str($application->publish_directory)->trim(), ]); }); static::created(function ($application) { @@ -902,9 +902,9 @@ public function parseRawCompose() $type = null; $source = null; if (is_string($volume)) { - $source = Str::of($volume)->before(':'); + $source = str($volume)->before(':'); if ($source->startsWith('./') || $source->startsWith('/') || $source->startsWith('~')) { - $type = Str::of('bind'); + $type = str('bind'); } } elseif (is_array($volume)) { $type = data_get_str($volume, 'type'); diff --git a/app/Models/EnvironmentVariable.php b/app/Models/EnvironmentVariable.php index ff63bca5a..8731eab2d 100644 --- a/app/Models/EnvironmentVariable.php +++ b/app/Models/EnvironmentVariable.php @@ -174,7 +174,7 @@ private function get_real_environment_variables(?string $environment_variable = if (str($environment_variable)->startsWith('{{'.$type) && str($environment_variable)->endsWith('}}')) { $variable = Str::after($environment_variable, "{$type}."); $variable = Str::before($variable, '}}'); - $variable = Str::of($variable)->trim()->value; + $variable = str($variable)->trim()->value; if (! collect(SHARED_VARIABLE_TYPES)->contains($type)) { return $variable; } @@ -220,7 +220,7 @@ private function set_environment_variables(?string $environment_variable = null) protected function key(): Attribute { return Attribute::make( - set: fn (string $value) => Str::of($value)->trim(), + set: fn (string $value) => str($value)->trim(), ); } } diff --git a/app/Models/LocalPersistentVolume.php b/app/Models/LocalPersistentVolume.php index e48b8b405..68e476365 100644 --- a/app/Models/LocalPersistentVolume.php +++ b/app/Models/LocalPersistentVolume.php @@ -4,7 +4,6 @@ use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Str; class LocalPersistentVolume extends Model { @@ -33,14 +32,14 @@ public function standalone_postgresql() protected function name(): Attribute { return Attribute::make( - set: fn (string $value) => Str::of($value)->trim()->value, + set: fn (string $value) => str($value)->trim()->value, ); } protected function mountPath(): Attribute { return Attribute::make( - set: fn (string $value) => Str::of($value)->trim()->start('/')->value + set: fn (string $value) => str($value)->trim()->start('/')->value ); } @@ -49,7 +48,7 @@ protected function hostPath(): Attribute return Attribute::make( set: function (?string $value) { if ($value) { - return Str::of($value)->trim()->start('/')->value; + return str($value)->trim()->start('/')->value; } else { return $value; } diff --git a/app/Models/Server.php b/app/Models/Server.php index 7a99940fd..29eedd59f 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -11,7 +11,6 @@ use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Process; use Illuminate\Support\Facades\Storage; -use Illuminate\Support\Str; use Illuminate\Support\Stringable; use Spatie\SchemalessAttributes\Casts\SchemalessAttributes; use Spatie\SchemalessAttributes\SchemalessAttributesTrait; @@ -29,10 +28,10 @@ protected static function booted() static::saving(function ($server) { $payload = []; if ($server->user) { - $payload['user'] = Str::of($server->user)->trim(); + $payload['user'] = str($server->user)->trim(); } if ($server->ip) { - $payload['ip'] = Str::of($server->ip)->trim(); + $payload['ip'] = str($server->ip)->trim(); } $server->forceFill($payload); }); @@ -875,7 +874,7 @@ public function validateOS(): bool|Stringable $releaseLines = collect(explode("\n", $os_release)); $collectedData = collect([]); foreach ($releaseLines as $line) { - $item = Str::of($line)->trim(); + $item = str($line)->trim(); $collectedData->put($item->before('=')->value(), $item->after('=')->lower()->replace('"', '')->value()); } $ID = data_get($collectedData, 'ID'); diff --git a/app/Models/Service.php b/app/Models/Service.php index 05c380a4c..cc6a20749 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -839,33 +839,13 @@ public function saveComposeConfigs() $commands[] = "cd $workdir"; $json = Yaml::parse($this->docker_compose); - $envs_from_coolify = $this->environment_variables()->get(); - // foreach ($json['services'] as $service => $config) { - // if (data_get($config, 'environment') === null) { - // data_set($json, "services.$service.environment", []); - // $envs = collect([]); - // } else { - // $envs = collect($config['environment']); - // } - // // $envs->put('COOLIFY_CONTAINER_NAME', "$service-{$this->uuid}"); - // foreach ($envs_from_coolify as $env) { - // $envs = $envs->map(function ($value) use ($env) { - // if (str($value)->startsWith($env->key)) { - // return "{$env->key}={$env->real_value}"; - // } - - // return $value; - // }); - // } - // $envs = $envs->unique(); - // data_set($json, "services.$service.environment", $envs->toArray()); - // } $this->docker_compose = Yaml::dump($json, 10, 2, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK); $docker_compose_base64 = base64_encode($this->docker_compose); $commands[] = "echo $docker_compose_base64 | base64 -d | tee docker-compose.yml > /dev/null"; $commands[] = 'rm -f .env || true'; + $envs_from_coolify = $this->environment_variables()->get(); foreach ($envs_from_coolify as $env) { $commands[] = "echo '{$env->key}={$env->real_value}' >> .env"; } @@ -884,7 +864,6 @@ public function networks() { $networks = getTopLevelNetworks($this); - // ray($networks); return $networks; } } diff --git a/app/Notifications/Application/DeploymentFailed.php b/app/Notifications/Application/DeploymentFailed.php index 1858f31e0..a95629087 100644 --- a/app/Notifications/Application/DeploymentFailed.php +++ b/app/Notifications/Application/DeploymentFailed.php @@ -8,7 +8,6 @@ use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; -use Illuminate\Support\Str; class DeploymentFailed extends Notification implements ShouldQueue { @@ -41,8 +40,8 @@ public function __construct(Application $application, string $deployment_uuid, ? $this->project_uuid = data_get($application, 'environment.project.uuid'); $this->environment_name = data_get($application, 'environment.name'); $this->fqdn = data_get($application, 'fqdn'); - if (Str::of($this->fqdn)->explode(',')->count() > 1) { - $this->fqdn = Str::of($this->fqdn)->explode(',')->first(); + if (str($this->fqdn)->explode(',')->count() > 1) { + $this->fqdn = str($this->fqdn)->explode(',')->first(); } $this->deployment_url = base_url()."/project/{$this->project_uuid}/".urlencode($this->environment_name)."/application/{$this->application->uuid}/deployment/{$this->deployment_uuid}"; } diff --git a/app/Notifications/Application/DeploymentSuccess.php b/app/Notifications/Application/DeploymentSuccess.php index 0cac6cbab..c06d070d8 100644 --- a/app/Notifications/Application/DeploymentSuccess.php +++ b/app/Notifications/Application/DeploymentSuccess.php @@ -8,7 +8,6 @@ use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; -use Illuminate\Support\Str; class DeploymentSuccess extends Notification implements ShouldQueue { @@ -41,8 +40,8 @@ public function __construct(Application $application, string $deployment_uuid, ? $this->project_uuid = data_get($application, 'environment.project.uuid'); $this->environment_name = data_get($application, 'environment.name'); $this->fqdn = data_get($application, 'fqdn'); - if (Str::of($this->fqdn)->explode(',')->count() > 1) { - $this->fqdn = Str::of($this->fqdn)->explode(',')->first(); + if (str($this->fqdn)->explode(',')->count() > 1) { + $this->fqdn = str($this->fqdn)->explode(',')->first(); } $this->deployment_url = base_url()."/project/{$this->project_uuid}/".urlencode($this->environment_name)."/application/{$this->application->uuid}/deployment/{$this->deployment_uuid}"; } diff --git a/app/Notifications/Application/StatusChanged.php b/app/Notifications/Application/StatusChanged.php index baf508895..72442fcb3 100644 --- a/app/Notifications/Application/StatusChanged.php +++ b/app/Notifications/Application/StatusChanged.php @@ -7,7 +7,6 @@ use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; -use Illuminate\Support\Str; class StatusChanged extends Notification implements ShouldQueue { @@ -31,8 +30,8 @@ public function __construct(public Application $resource) $this->project_uuid = data_get($resource, 'environment.project.uuid'); $this->environment_name = data_get($resource, 'environment.name'); $this->fqdn = data_get($resource, 'fqdn', null); - if (Str::of($this->fqdn)->explode(',')->count() > 1) { - $this->fqdn = Str::of($this->fqdn)->explode(',')->first(); + if (str($this->fqdn)->explode(',')->count() > 1) { + $this->fqdn = str($this->fqdn)->explode(',')->first(); } $this->resource_url = base_url()."/project/{$this->project_uuid}/".urlencode($this->environment_name)."/application/{$this->resource->uuid}"; } diff --git a/app/Traits/ExecuteRemoteCommand.php b/app/Traits/ExecuteRemoteCommand.php index 0c6422f0c..9b58882eb 100644 --- a/app/Traits/ExecuteRemoteCommand.php +++ b/app/Traits/ExecuteRemoteCommand.php @@ -7,7 +7,6 @@ use Carbon\Carbon; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Process; -use Illuminate\Support\Str; trait ExecuteRemoteCommand { @@ -45,7 +44,7 @@ public function execute_remote_command(...$commands) } $remote_command = generateSshCommand($this->server, $command); $process = Process::timeout(3600)->idleTimeout(3600)->start($remote_command, function (string $type, string $output) use ($command, $hidden, $customType, $append) { - $output = Str::of($output)->trim(); + $output = str($output)->trim(); if ($output->startsWith('╔')) { $output = "\n".$output; } diff --git a/app/View/Components/Services/Links.php b/app/View/Components/Services/Links.php index 9baf0578d..0497aebae 100644 --- a/app/View/Components/Services/Links.php +++ b/app/View/Components/Services/Links.php @@ -6,7 +6,6 @@ use Closure; use Illuminate\Contracts\View\View; use Illuminate\Support\Collection; -use Illuminate\Support\Str; use Illuminate\View\Component; class Links extends Component @@ -26,16 +25,16 @@ public function __construct(public Service $service) $this->links = $this->links->merge($links); } else { if ($application->fqdn) { - $fqdns = collect(Str::of($application->fqdn)->explode(',')); + $fqdns = collect(str($application->fqdn)->explode(',')); $fqdns->map(function ($fqdn) { $this->links->push(getFqdnWithoutPort($fqdn)); }); } if ($application->ports) { - $portsCollection = collect(Str::of($application->ports)->explode(',')); + $portsCollection = collect(str($application->ports)->explode(',')); $portsCollection->map(function ($port) { - if (Str::of($port)->contains(':')) { - $hostPort = Str::of($port)->before(':'); + if (str($port)->contains(':')) { + $hostPort = str($port)->before(':'); } else { $hostPort = $port; } diff --git a/bootstrap/helpers/docker.php b/bootstrap/helpers/docker.php index 06416db24..21e946a9a 100644 --- a/bootstrap/helpers/docker.php +++ b/bootstrap/helpers/docker.php @@ -91,7 +91,7 @@ function format_docker_envs_to_json($rawOutput) } function checkMinimumDockerEngineVersion($dockerVersion) { - $majorDockerVersion = Str::of($dockerVersion)->before('.')->value(); + $majorDockerVersion = str($dockerVersion)->before('.')->value(); if ($majorDockerVersion <= 22) { $dockerVersion = null; } @@ -152,7 +152,7 @@ function get_port_from_dockerfile($dockerfile): ?int $dockerfile_array = explode("\n", $dockerfile); $found_exposed_port = null; foreach ($dockerfile_array as $line) { - $line_str = Str::of($line)->trim(); + $line_str = str($line)->trim(); if ($line_str->startsWith('EXPOSE')) { $found_exposed_port = $line_str->replace('EXPOSE', '')->trim(); break; @@ -534,7 +534,7 @@ function generateLabelsApplication(Application $application, ?ApplicationPreview $labels = collect([]); if ($pull_request_id === 0) { if ($application->fqdn) { - $domains = Str::of(data_get($application, 'fqdn'))->explode(','); + $domains = str(data_get($application, 'fqdn'))->explode(','); $labels = $labels->merge(fqdnLabelsForTraefik( uuid: $appUuid, domains: $domains, @@ -558,7 +558,7 @@ function generateLabelsApplication(Application $application, ?ApplicationPreview } } else { if (data_get($preview, 'fqdn')) { - $domains = Str::of(data_get($preview, 'fqdn'))->explode(','); + $domains = str(data_get($preview, 'fqdn'))->explode(','); } else { $domains = collect([]); } diff --git a/bootstrap/helpers/github.php b/bootstrap/helpers/github.php index d916dc9c8..98e405c74 100644 --- a/bootstrap/helpers/github.php +++ b/bootstrap/helpers/github.php @@ -85,7 +85,7 @@ function githubApi(GithubApp|GitlabApp|null $source, string $endpoint, string $m function get_installation_path(GithubApp $source) { $github = GithubApp::where('uuid', $source->uuid)->first(); - $name = Str::of(Str::kebab($github->name)); + $name = str(Str::kebab($github->name)); $installation_path = $github->html_url === 'https://github.com' ? 'apps' : 'github-apps'; return "$github->html_url/$installation_path/$name/installations/new"; @@ -93,7 +93,7 @@ function get_installation_path(GithubApp $source) function get_permissions_path(GithubApp $source) { $github = GithubApp::where('uuid', $source->uuid)->first(); - $name = Str::of(Str::kebab($github->name)); + $name = str(Str::kebab($github->name)); return "$github->html_url/settings/apps/$name/permissions"; } diff --git a/bootstrap/helpers/services.php b/bootstrap/helpers/services.php index 0cc4c51e7..ad2268a8e 100644 --- a/bootstrap/helpers/services.php +++ b/bootstrap/helpers/services.php @@ -4,7 +4,6 @@ use App\Models\EnvironmentVariable; use App\Models\ServiceApplication; use App\Models\ServiceDatabase; -use Illuminate\Support\Str; use Spatie\Url\Url; use Symfony\Component\Yaml\Yaml; @@ -38,7 +37,7 @@ function getFilesystemVolumesFromServer(ServiceApplication|ServiceDatabase|Appli ]); instant_remote_process($commands, $server); foreach ($fileVolumes as $fileVolume) { - $path = Str::of(data_get($fileVolume, 'fs_path')); + $path = str(data_get($fileVolume, 'fs_path')); $content = data_get($fileVolume, 'content'); if ($path->startsWith('.')) { $path = $path->after('.'); @@ -68,7 +67,7 @@ function getFilesystemVolumesFromServer(ServiceApplication|ServiceDatabase|Appli $fileVolume->is_directory = false; $fileVolume->save(); $content = base64_encode($content); - $dir = Str::of($fileLocation)->dirname(); + $dir = str($fileLocation)->dirname(); instant_remote_process([ "mkdir -p $dir", "echo '$content' | base64 -d | tee $fileLocation", @@ -106,7 +105,7 @@ function updateCompose(ServiceApplication|ServiceDatabase $resource) $resourceFqdns = str($resource->fqdn)->explode(','); if ($resourceFqdns->count() === 1) { $resourceFqdns = $resourceFqdns->first(); - $variableName = 'SERVICE_FQDN_'.Str::of($resource->name)->upper()->replace('-', ''); + $variableName = 'SERVICE_FQDN_'.str($resource->name)->upper()->replace('-', ''); $generatedEnv = EnvironmentVariable::where('service_id', $resource->service_id)->where('key', $variableName)->first(); $fqdn = Url::fromString($resourceFqdns); $port = $fqdn->getPort(); @@ -125,14 +124,14 @@ function updateCompose(ServiceApplication|ServiceDatabase $resource) $generatedEnv->save(); } } - $variableName = 'SERVICE_URL_'.Str::of($resource->name)->upper()->replace('-', ''); + $variableName = 'SERVICE_URL_'.str($resource->name)->upper()->replace('-', ''); $generatedEnv = EnvironmentVariable::where('service_id', $resource->service_id)->where('key', $variableName)->first(); $url = Url::fromString($fqdn); $port = $url->getPort(); $path = $url->getPath(); $url = $url->getHost(); if ($generatedEnv) { - $url = Str::of($fqdn)->after('://'); + $url = str($fqdn)->after('://'); $generatedEnv->value = $url.$path; $generatedEnv->save(); } @@ -175,7 +174,7 @@ function updateCompose(ServiceApplication|ServiceDatabase $resource) $port_env_url->save(); } } else { - $variableName = 'SERVICE_FQDN_'.Str::of($resource->name)->upper()->replace('-', ''); + $variableName = 'SERVICE_FQDN_'.str($resource->name)->upper()->replace('-', ''); $generatedEnv = EnvironmentVariable::where('service_id', $resource->service_id)->where('key', $variableName)->first(); $fqdn = Url::fromString($fqdn); $fqdn = $fqdn->getScheme().'://'.$fqdn->getHost().$fqdn->getPath(); @@ -183,12 +182,12 @@ function updateCompose(ServiceApplication|ServiceDatabase $resource) $generatedEnv->value = $fqdn; $generatedEnv->save(); } - $variableName = 'SERVICE_URL_'.Str::of($resource->name)->upper()->replace('-', ''); + $variableName = 'SERVICE_URL_'.str($resource->name)->upper()->replace('-', ''); $generatedEnv = EnvironmentVariable::where('service_id', $resource->service_id)->where('key', $variableName)->first(); $url = Url::fromString($fqdn); $url = $url->getHost().$url->getPath(); if ($generatedEnv) { - $url = Str::of($fqdn)->after('://'); + $url = str($fqdn)->after('://'); $generatedEnv->value = $url; $generatedEnv->save(); } diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index aef362491..fe51f78ac 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -469,7 +469,7 @@ function data_get_str($data, $key, $default = null): Stringable { $str = data_get($data, $key, $default) ?? $default; - return Str::of($str); + return str($str); } function generateFqdn(Server $server, string $random) @@ -933,12 +933,12 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal $content = null; $isDirectory = false; if (is_string($volume)) { - $source = Str::of($volume)->before(':'); - $target = Str::of($volume)->after(':')->beforeLast(':'); + $source = str($volume)->before(':'); + $target = str($volume)->after(':')->beforeLast(':'); if ($source->startsWith('./') || $source->startsWith('/') || $source->startsWith('~')) { - $type = Str::of('bind'); + $type = str('bind'); } else { - $type = Str::of('volume'); + $type = str('volume'); } } elseif (is_array($volume)) { $type = data_get_str($volume, 'type'); @@ -987,8 +987,8 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal $slugWithoutUuid = Str::slug($source, '-'); $name = "{$savedService->service->uuid}_{$slugWithoutUuid}"; if (is_string($volume)) { - $source = Str::of($volume)->before(':'); - $target = Str::of($volume)->after(':')->beforeLast(':'); + $source = str($volume)->before(':'); + $target = str($volume)->after(':')->beforeLast(':'); $source = $name; $volume = "$source:$target"; } elseif (is_array($volume)) { @@ -1032,7 +1032,7 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal // Get variables from the service foreach ($serviceVariables as $variableName => $variable) { if (is_numeric($variableName)) { - $variable = Str::of($variable); + $variable = str($variable); if ($variable->contains('=')) { // - SESSION_SECRET=123 // - SESSION_SECRET= @@ -1046,8 +1046,8 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal } else { // SESSION_SECRET: 123 // SESSION_SECRET: - $key = Str::of($variableName); - $value = Str::of($variable); + $key = str($variableName); + $value = str($variable); } if ($key->startsWith('SERVICE_FQDN')) { if ($isNew || $savedService->fqdn === null) { @@ -1137,7 +1137,7 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal 'key' => $key, 'service_id' => $resource->id, ])->first(); - $value = Str::of(replaceVariables($value)); + $value = str(replaceVariables($value)); $key = $value; if ($value->startsWith('SERVICE_')) { $foundEnv = EnvironmentVariable::where([ @@ -1170,7 +1170,7 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal // } } else { if ($command->value() === 'URL') { - $fqdn = Str::of($fqdn)->after('://')->value(); + $fqdn = str($fqdn)->after('://')->value(); } EnvironmentVariable::create([ 'key' => $key, @@ -1254,18 +1254,6 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal ]); } } - $envs_from_coolify = $resource->environment_variables()->get(); - $serviceVariables = $serviceVariables->map(function ($variable) use ($envs_from_coolify) { - $env_variable_key = str($variable)->before('='); - $env_variable_value = str($variable)->after('='); - $found_env = $envs_from_coolify->where('key', $env_variable_key)->first(); - if ($found_env) { - $env_variable_value = $found_env->value; - } - - return "$env_variable_key=$env_variable_value"; - }); - } // Add labels to the service if ($savedService->serviceType()) { @@ -1333,6 +1321,41 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal data_set($service, 'environment', $serviceVariables->toArray()); updateCompose($savedService); + return $service; + + }); + + $envs_from_coolify = $resource->environment_variables()->get(); + $services = collect($services)->map(function ($service, $serviceName) use ($resource, $envs_from_coolify) { + $serviceVariables = collect(data_get($service, 'environment', [])); + $parsedServiceVariables = collect([]); + foreach ($serviceVariables as $key => $value) { + if (is_numeric($key)) { + $value = str($value); + if ($value->contains('=')) { + $key = $value->before('=')->value(); + $value = $value->after('=')->value(); + } else { + $key = $value->value(); + $value = null; + } + $parsedServiceVariables->put($key, $value); + } else { + $parsedServiceVariables->put($key, $value); + } + } + $parsedServiceVariables->put('COOLIFY_CONTAINER_NAME', "$serviceName-{$resource->uuid}"); + $parsedServiceVariables = $parsedServiceVariables->map(function ($value, $key) use ($envs_from_coolify) { + $found_env = $envs_from_coolify->where('key', $key)->first(); + if ($found_env) { + return $found_env->value; + } + + return $value; + }); + + data_set($service, 'environment', $parsedServiceVariables->toArray()); + return $service; }); $finalServices = [ @@ -1637,7 +1660,7 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal // Get variables from the service foreach ($serviceVariables as $variableName => $variable) { if (is_numeric($variableName)) { - $variable = Str::of($variable); + $variable = str($variable); if ($variable->contains('=')) { // - SESSION_SECRET=123 // - SESSION_SECRET= @@ -1651,8 +1674,8 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal } else { // SESSION_SECRET: 123 // SESSION_SECRET: - $key = Str::of($variableName); - $value = Str::of($variable); + $key = str($variableName); + $value = str($variable); } if ($key->startsWith('SERVICE_FQDN')) { if ($isNew) { @@ -1696,7 +1719,7 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal 'application_id' => $resource->id, 'is_preview' => false, ])->first(); - $value = Str::of(replaceVariables($value)); + $value = str(replaceVariables($value)); $key = $value; if ($value->startsWith('SERVICE_')) { $foundEnv = EnvironmentVariable::where([ @@ -1718,7 +1741,7 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal $fqdn = data_get($foundEnv, 'value'); } else { if ($command?->value() === 'URL') { - $fqdn = Str::of($fqdn)->after('://')->value(); + $fqdn = str($fqdn)->after('://')->value(); } EnvironmentVariable::create([ 'key' => $key, diff --git a/config/sentry.php b/config/sentry.php index 17e51ddb7..feb09a387 100644 --- a/config/sentry.php +++ b/config/sentry.php @@ -7,7 +7,7 @@ // The release version of your application // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')) - 'release' => '4.0.0-beta.304', + 'release' => '4.0.0-beta.305', // When left empty or `null` the Laravel environment will be used 'environment' => config('app.env'), diff --git a/config/version.php b/config/version.php index 1221a8428..6f667b1db 100644 --- a/config/version.php +++ b/config/version.php @@ -1,3 +1,3 @@ {{ $application->destination->server->name }}.< @foreach (data_get($application, 'previews') as $previewName => $preview)
PR #{{ data_get($preview, 'pull_request_id') }} | - @if (Str::of(data_get($preview, 'status'))->startsWith('running')) + @if (str(data_get($preview, 'status'))->startsWith('running')) - @elseif(Str::of(data_get($preview, 'status'))->startsWith('restarting')) + @elseif(str(data_get($preview, 'status'))->startsWith('restarting')) @else diff --git a/resources/views/livewire/project/application/source.blade.php b/resources/views/livewire/project/application/source.blade.php index 595cb81d9..9a47566e5 100644 --- a/resources/views/livewire/project/application/source.blade.php +++ b/resources/views/livewire/project/application/source.blade.php @@ -27,7 +27,8 @@
- +
@@ -35,14 +36,14 @@ label="Commit SHA" />
- @if(data_get($application, 'private_key_id')) + @if (data_get($application, 'private_key_id'))

Deploy Key

Currently attached Private Key: {{ data_get($application, 'private_key.name') }}

Select another Private Key

-
+
@foreach ($private_keys as $key) {{ $key->name }} diff --git a/resources/views/livewire/project/database/backup-edit.blade.php b/resources/views/livewire/project/database/backup-edit.blade.php index 8df18cb45..462d696fa 100644 --- a/resources/views/livewire/project/database/backup-edit.blade.php +++ b/resources/views/livewire/project/database/backup-edit.blade.php @@ -4,7 +4,7 @@ Save - @if (Str::of($status)->startsWith('running')) + @if (str($status)->startsWith('running')) @endif @if ($backup->database_id !== 0) diff --git a/resources/views/livewire/project/service/configuration.blade.php b/resources/views/livewire/project/service/configuration.blade.php index 272de2f4f..ee627c56b 100644 --- a/resources/views/livewire/project/service/configuration.blade.php +++ b/resources/views/livewire/project/service/configuration.blade.php @@ -54,11 +54,11 @@
@foreach ($applications as $application)
Str::of( + 'border-l border-dashed border-red-500 ' => str( $application->status)->contains(['exited']), - 'border-l border-dashed border-success' => Str::of( + 'border-l border-dashed border-success' => str( $application->status)->contains(['running']), - 'border-l border-dashed border-warning' => Str::of( + 'border-l border-dashed border-warning' => str( $application->status)->contains(['starting']), 'flex gap-2 box-without-bg-without-border dark:bg-coolgray-100 bg-white dark:hover:text-neutral-300 group', ])> @@ -123,12 +123,12 @@ class="w-4 h-4 dark:text-warning text-coollabs" @endforeach @foreach ($databases as $database)
Str::of( - $database->status)->contains(['exited']), - 'border-l border-dashed border-success' => Str::of( - $database->status)->contains(['running']), - 'border-l border-dashed border-warning' => Str::of( - $database->status)->contains(['restarting']), + 'border-l border-dashed border-red-500' => str($database->status)->contains( + ['exited']), + 'border-l border-dashed border-success' => str($database->status)->contains( + ['running']), + 'border-l border-dashed border-warning' => str($database->status)->contains( + ['restarting']), 'flex gap-2 box-without-bg-without-border dark:bg-coolgray-100 bg-white dark:hover:text-neutral-300 group', ])>
diff --git a/resources/views/livewire/project/service/stack-form.blade.php b/resources/views/livewire/project/service/stack-form.blade.php index 0145c2baf..9d1454862 100644 --- a/resources/views/livewire/project/service/stack-form.blade.php +++ b/resources/views/livewire/project/service/stack-form.blade.php @@ -2,7 +2,7 @@

Service Stack

- Save + Save diff --git a/resources/views/livewire/upgrade.blade.php b/resources/views/livewire/upgrade.blade.php index d10ef8b45..59b3d718d 100644 --- a/resources/views/livewire/upgrade.blade.php +++ b/resources/views/livewire/upgrade.blade.php @@ -58,25 +58,26 @@ class="absolute top-0 right-0 flex items-center justify-center w-8 h-8 mt-5 mr-5

Are you sure you would like to upgrade your instance to {{ $latestVersion }}?


-

You can review the changelogs You can review the changelogs here.


If something goes wrong and you cannot upgrade your instance, You can check the following - guide on what to do.

@if ($showProgress)
-

Progress

+

Progress

@endif
-
+
@if (!$showProgress) Cancel +
Continue @endif @@ -98,6 +99,10 @@ class="w-24 dark:bg-coolgray-200 dark:hover:bg-coolgray-300">Cancel this.$wire.$call('upgrade') this.upgrade(); this.$wire.showProgress = true; + window.addEventListener('beforeunload', (event) => { + event.preventDefault(); + event.returnValue = ''; + }); }, revive() { if (checkHealthInterval) return true; diff --git a/versions.json b/versions.json index a7e5ed302..882af0103 100644 --- a/versions.json +++ b/versions.json @@ -1,7 +1,7 @@ { "coolify": { "v4": { - "version": "4.0.0-beta.304" + "version": "4.0.0-beta.305" } } -} \ No newline at end of file +}