diff --git a/.dockerignore b/.dockerignore
index d6abd1451..3a0ec49f7 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -22,3 +22,4 @@ yarn-error.log
/_data
.rnd
/.ssh
+.ignition.json
diff --git a/.gitignore b/.gitignore
index ac8a1e090..09504afee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,3 +32,4 @@ _ide_helper_models.php
.rnd
/.ssh
scripts/load-test/*
+.ignition.json
diff --git a/app/Actions/Application/GenerateConfig.php b/app/Actions/Application/GenerateConfig.php
new file mode 100644
index 000000000..69365f921
--- /dev/null
+++ b/app/Actions/Application/GenerateConfig.php
@@ -0,0 +1,17 @@
+clearAll();
+ return $application->generateConfig(is_json: $is_json);
+ }
+}
diff --git a/app/Console/Commands/ServicesGenerate.php b/app/Console/Commands/ServicesGenerate.php
index da04cefce..9720e81ac 100644
--- a/app/Console/Commands/ServicesGenerate.php
+++ b/app/Console/Commands/ServicesGenerate.php
@@ -39,8 +39,8 @@ class ServicesGenerate extends Command
$serviceTemplatesJson[$name] = $parsed;
}
}
- $serviceTemplatesJson = json_encode($serviceTemplatesJson);
- file_put_contents(base_path('templates/service-templates.json'), $serviceTemplatesJson);
+ $serviceTemplatesJson = json_encode($serviceTemplatesJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
+ file_put_contents(base_path('templates/service-templates.json'), $serviceTemplatesJson.PHP_EOL);
}
private function process_file($file)
diff --git a/app/Enums/StaticImageTypes.php b/app/Enums/StaticImageTypes.php
new file mode 100644
index 000000000..5f5304bf8
--- /dev/null
+++ b/app/Enums/StaticImageTypes.php
@@ -0,0 +1,8 @@
+ ['type' => 'string', 'description' => 'The docker registry image name.'],
'docker_registry_image_tag' => ['type' => 'string', 'description' => 'The docker registry image tag.'],
'is_static' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application is static.'],
+ 'static_image' => ['type' => 'string', 'enum' => ['nginx:alpine'], 'description' => 'The static image.'],
'install_command' => ['type' => 'string', 'description' => 'The install command.'],
'build_command' => ['type' => 'string', 'description' => 'The build command.'],
'start_command' => ['type' => 'string', 'description' => 'The start command.'],
@@ -236,6 +237,7 @@ class ApplicationsController extends Controller
'docker_registry_image_name' => ['type' => 'string', 'description' => 'The docker registry image name.'],
'docker_registry_image_tag' => ['type' => 'string', 'description' => 'The docker registry image tag.'],
'is_static' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application is static.'],
+ 'static_image' => ['type' => 'string', 'enum' => ['nginx:alpine'], 'description' => 'The static image.'],
'install_command' => ['type' => 'string', 'description' => 'The install command.'],
'build_command' => ['type' => 'string', 'description' => 'The build command.'],
'start_command' => ['type' => 'string', 'description' => 'The start command.'],
@@ -339,6 +341,7 @@ class ApplicationsController extends Controller
'docker_registry_image_name' => ['type' => 'string', 'description' => 'The docker registry image name.'],
'docker_registry_image_tag' => ['type' => 'string', 'description' => 'The docker registry image tag.'],
'is_static' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application is static.'],
+ 'static_image' => ['type' => 'string', 'enum' => ['nginx:alpine'], 'description' => 'The static image.'],
'install_command' => ['type' => 'string', 'description' => 'The install command.'],
'build_command' => ['type' => 'string', 'description' => 'The build command.'],
'start_command' => ['type' => 'string', 'description' => 'The start command.'],
@@ -633,7 +636,7 @@ class ApplicationsController extends Controller
private function create_application(Request $request, $type)
{
- $allowedFields = ['project_uuid', 'environment_name', 'server_uuid', 'destination_uuid', 'type', 'name', 'description', 'is_static', 'domains', 'git_repository', 'git_branch', 'git_commit_sha', 'private_key_uuid', 'docker_registry_image_name', 'docker_registry_image_tag', 'build_pack', 'install_command', 'build_command', 'start_command', 'ports_exposes', 'ports_mappings', 'base_directory', 'publish_directory', 'health_check_enabled', 'health_check_path', 'health_check_port', 'health_check_host', 'health_check_method', 'health_check_return_code', 'health_check_scheme', 'health_check_response_text', 'health_check_interval', 'health_check_timeout', 'health_check_retries', 'health_check_start_period', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'custom_labels', 'custom_docker_run_options', 'post_deployment_command', 'post_deployment_command_container', 'pre_deployment_command', 'pre_deployment_command_container', 'manual_webhook_secret_github', 'manual_webhook_secret_gitlab', 'manual_webhook_secret_bitbucket', 'manual_webhook_secret_gitea', 'redirect', 'github_app_uuid', 'instant_deploy', 'dockerfile', 'docker_compose_location', 'docker_compose_raw', 'docker_compose_custom_start_command', 'docker_compose_custom_build_command', 'docker_compose_domains', 'watch_paths', 'use_build_server'];
+ $allowedFields = ['project_uuid', 'environment_name', 'server_uuid', 'destination_uuid', 'type', 'name', 'description', 'is_static', 'domains', 'git_repository', 'git_branch', 'git_commit_sha', 'private_key_uuid', 'docker_registry_image_name', 'docker_registry_image_tag', 'build_pack', 'install_command', 'build_command', 'start_command', 'ports_exposes', 'ports_mappings', 'base_directory', 'publish_directory', 'health_check_enabled', 'health_check_path', 'health_check_port', 'health_check_host', 'health_check_method', 'health_check_return_code', 'health_check_scheme', 'health_check_response_text', 'health_check_interval', 'health_check_timeout', 'health_check_retries', 'health_check_start_period', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'custom_labels', 'custom_docker_run_options', 'post_deployment_command', 'post_deployment_command_container', 'pre_deployment_command', 'pre_deployment_command_container', 'manual_webhook_secret_github', 'manual_webhook_secret_gitlab', 'manual_webhook_secret_bitbucket', 'manual_webhook_secret_gitea', 'redirect', 'github_app_uuid', 'instant_deploy', 'dockerfile', 'docker_compose_location', 'docker_compose_raw', 'docker_compose_custom_start_command', 'docker_compose_custom_build_command', 'docker_compose_domains', 'watch_paths', 'use_build_server', 'static_image'];
$teamId = getTeamIdFromToken();
if (is_null($teamId)) {
return invalidTokenResponse();
@@ -672,6 +675,7 @@ class ApplicationsController extends Controller
$instantDeploy = $request->instant_deploy;
$githubAppUuid = $request->github_app_uuid;
$useBuildServer = $request->use_build_server;
+ $isStatic = $request->is_static;
$project = Project::whereTeamId($teamId)->whereUuid($request->project_uuid)->first();
if (! $project) {
@@ -700,8 +704,7 @@ class ApplicationsController extends Controller
if ($request->build_pack === 'dockercompose') {
$request->offsetSet('ports_exposes', '80');
}
- $validator = customApiValidator($request->all(), [
- sharedDataApplications(),
+ $validationRules = [
'git_repository' => 'string|required',
'git_branch' => 'string|required',
'build_pack' => ['required', Rule::enum(BuildPackTypes::class)],
@@ -709,19 +712,21 @@ class ApplicationsController extends Controller
'docker_compose_location' => 'string',
'docker_compose_raw' => 'string|nullable',
'docker_compose_domains' => 'array|nullable',
- 'docker_compose_custom_start_command' => 'string|nullable',
- 'docker_compose_custom_build_command' => 'string|nullable',
- ]);
+ ];
+ $validationRules = array_merge($validationRules, sharedDataApplications());
+ $validator = customApiValidator($request->all(), $validationRules);
if ($validator->fails()) {
return response()->json([
'message' => 'Validation failed.',
'errors' => $validator->errors(),
], 422);
}
+
$return = $this->validateDataApplications($request, $server);
if ($return instanceof \Illuminate\Http\JsonResponse) {
return $return;
}
+
$application = new Application;
removeUnnecessaryFieldsFromRequest($request);
@@ -744,11 +749,15 @@ class ApplicationsController extends Controller
$application->destination_id = $destination->id;
$application->destination_type = $destination->getMorphClass();
$application->environment_id = $environment->id;
+ $application->save();
+ if (isset($isStatic)) {
+ $application->settings->is_static = $isStatic;
+ $application->settings->save();
+ }
if (isset($useBuildServer)) {
$application->settings->is_build_server_enabled = $useBuildServer;
$application->settings->save();
}
- $application->save();
$application->refresh();
if (! $application->settings->is_container_label_readonly_enabled) {
$application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
@@ -782,8 +791,7 @@ class ApplicationsController extends Controller
if ($request->build_pack === 'dockercompose') {
$request->offsetSet('ports_exposes', '80');
}
- $validator = customApiValidator($request->all(), [
- sharedDataApplications(),
+ $validationRules = [
'git_repository' => 'string|required',
'git_branch' => 'string|required',
'build_pack' => ['required', Rule::enum(BuildPackTypes::class)],
@@ -792,10 +800,10 @@ class ApplicationsController extends Controller
'watch_paths' => 'string|nullable',
'docker_compose_location' => 'string',
'docker_compose_raw' => 'string|nullable',
- 'docker_compose_domains' => 'array|nullable',
- 'docker_compose_custom_start_command' => 'string|nullable',
- 'docker_compose_custom_build_command' => 'string|nullable',
- ]);
+ ];
+ $validationRules = array_merge($validationRules, sharedDataApplications());
+
+ $validator = customApiValidator($request->all(), $validationRules);
if ($validator->fails()) {
return response()->json([
'message' => 'Validation failed.',
@@ -882,8 +890,8 @@ class ApplicationsController extends Controller
if ($request->build_pack === 'dockercompose') {
$request->offsetSet('ports_exposes', '80');
}
- $validator = customApiValidator($request->all(), [
- sharedDataApplications(),
+
+ $validationRules = [
'git_repository' => 'string|required',
'git_branch' => 'string|required',
'build_pack' => ['required', Rule::enum(BuildPackTypes::class)],
@@ -892,10 +900,10 @@ class ApplicationsController extends Controller
'watch_paths' => 'string|nullable',
'docker_compose_location' => 'string',
'docker_compose_raw' => 'string|nullable',
- 'docker_compose_domains' => 'array|nullable',
- 'docker_compose_custom_start_command' => 'string|nullable',
- 'docker_compose_custom_build_command' => 'string|nullable',
- ]);
+ ];
+
+ $validationRules = array_merge($validationRules, sharedDataApplications());
+ $validator = customApiValidator($request->all(), $validationRules);
if ($validator->fails()) {
return response()->json([
@@ -975,10 +983,13 @@ class ApplicationsController extends Controller
if (! $request->has('name')) {
$request->offsetSet('name', 'dockerfile-'.new Cuid2);
}
- $validator = customApiValidator($request->all(), [
- sharedDataApplications(),
+
+ $validationRules = [
'dockerfile' => 'string|required',
- ]);
+ ];
+ $validationRules = array_merge($validationRules, sharedDataApplications());
+ $validator = customApiValidator($request->all(), $validationRules);
+
if ($validator->fails()) {
return response()->json([
'message' => 'Validation failed.',
@@ -1057,12 +1068,14 @@ class ApplicationsController extends Controller
if (! $request->has('name')) {
$request->offsetSet('name', 'docker-image-'.new Cuid2);
}
- $validator = customApiValidator($request->all(), [
- sharedDataApplications(),
+ $validationRules = [
'docker_registry_image_name' => 'string|required',
'docker_registry_image_tag' => 'string',
'ports_exposes' => 'string|regex:/^(\d+)(,\d+)*$/|required',
- ]);
+ ];
+ $validationRules = array_merge($validationRules, sharedDataApplications());
+ $validator = customApiValidator($request->all(), $validationRules);
+
if ($validator->fails()) {
return response()->json([
'message' => 'Validation failed.',
@@ -1135,10 +1148,12 @@ class ApplicationsController extends Controller
if (! $request->has('name')) {
$request->offsetSet('name', 'service'.new Cuid2);
}
- $validator = customApiValidator($request->all(), [
- sharedDataApplications(),
+ $validationRules = [
'docker_compose_raw' => 'string|required',
- ]);
+ ];
+ $validationRules = array_merge($validationRules, sharedDataApplications());
+ $validator = customApiValidator($request->all(), $validationRules);
+
if ($validator->fails()) {
return response()->json([
'message' => 'Validation failed.',
@@ -1488,8 +1503,7 @@ class ApplicationsController extends Controller
$server = $application->destination->server;
$allowedFields = ['name', 'description', 'is_static', 'domains', 'git_repository', 'git_branch', 'git_commit_sha', 'docker_registry_image_name', 'docker_registry_image_tag', 'build_pack', 'static_image', 'install_command', 'build_command', 'start_command', 'ports_exposes', 'ports_mappings', 'base_directory', 'publish_directory', 'health_check_enabled', 'health_check_path', 'health_check_port', 'health_check_host', 'health_check_method', 'health_check_return_code', 'health_check_scheme', 'health_check_response_text', 'health_check_interval', 'health_check_timeout', 'health_check_retries', 'health_check_start_period', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'custom_labels', 'custom_docker_run_options', 'post_deployment_command', 'post_deployment_command_container', 'pre_deployment_command', 'pre_deployment_command_container', 'watch_paths', 'manual_webhook_secret_github', 'manual_webhook_secret_gitlab', 'manual_webhook_secret_bitbucket', 'manual_webhook_secret_gitea', 'docker_compose_location', 'docker_compose_raw', 'docker_compose_custom_start_command', 'docker_compose_custom_build_command', 'docker_compose_domains', 'redirect', 'instant_deploy', 'use_build_server'];
- $validator = customApiValidator($request->all(), [
- sharedDataApplications(),
+ $validationRules = [
'name' => 'string|max:255',
'description' => 'string|nullable',
'static_image' => 'string',
@@ -1499,7 +1513,9 @@ class ApplicationsController extends Controller
'docker_compose_domains' => 'array|nullable',
'docker_compose_custom_start_command' => 'string|nullable',
'docker_compose_custom_build_command' => 'string|nullable',
- ]);
+ ];
+ $validationRules = array_merge($validationRules, sharedDataApplications());
+ $validator = customApiValidator($request->all(), $validationRules);
// Validate ports_exposes
if ($request->has('ports_exposes')) {
diff --git a/app/Livewire/Project/Application/General.php b/app/Livewire/Project/Application/General.php
index d2700f444..2e327d80f 100644
--- a/app/Livewire/Project/Application/General.php
+++ b/app/Livewire/Project/Application/General.php
@@ -2,9 +2,11 @@
namespace App\Livewire\Project\Application;
+use App\Actions\Application\GenerateConfig;
use App\Models\Application;
use Illuminate\Support\Collection;
use Livewire\Component;
+use Spatie\Url\Url;
use Visus\Cuid2\Cuid2;
class General extends Component
@@ -182,9 +184,7 @@ class General extends Component
$storage->save();
});
}
-
}
-
}
public function loadComposeFile($isInit = false)
@@ -241,16 +241,6 @@ class General extends Component
}
}
- public function updatedApplicationFqdn()
- {
- $this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim();
- $this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim();
- $this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
- return str($domain)->trim()->lower();
- });
- $this->application->fqdn = $this->application->fqdn->unique()->implode(',');
- $this->resetDefaultLabels();
- }
public function updatedApplicationBuildPack()
{
@@ -287,18 +277,22 @@ class General extends Component
public function resetDefaultLabels()
{
- if ($this->application->settings->is_container_label_readonly_enabled) {
- return;
+ try {
+ if ($this->application->settings->is_container_label_readonly_enabled) {
+ return;
+ }
+ $this->customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n");
+ $this->ports_exposes = $this->application->ports_exposes;
+ $this->is_container_label_escape_enabled = $this->application->settings->is_container_label_escape_enabled;
+ $this->application->custom_labels = base64_encode($this->customLabels);
+ $this->application->save();
+ if ($this->application->build_pack === 'dockercompose') {
+ $this->loadComposeFile();
+ }
+ $this->dispatch('configurationChanged');
+ } catch (\Throwable $e) {
+ return handleError($e, $this);
}
- $this->customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n");
- $this->ports_exposes = $this->application->ports_exposes;
- $this->is_container_label_escape_enabled = $this->application->settings->is_container_label_escape_enabled;
- $this->application->custom_labels = base64_encode($this->customLabels);
- $this->application->save();
- if ($this->application->build_pack === 'dockercompose') {
- $this->loadComposeFile();
- }
- $this->dispatch('configurationChanged');
}
public function checkFqdns($showToaster = true)
@@ -320,7 +314,7 @@ class General extends Component
public function set_redirect()
{
try {
- $has_www = collect($this->application->fqdns)->filter(fn ($fqdn) => str($fqdn)->contains('www.'))->count();
+ $has_www = collect($this->application->fqdns)->filter(fn($fqdn) => str($fqdn)->contains('www.'))->count();
if ($has_www === 0 && $this->application->redirect === 'www') {
$this->dispatch('error', 'You want to redirect to www, but you do not have a www domain set.
Please add www to your domain list and as an A DNS record (if applicable).');
@@ -337,15 +331,18 @@ class General extends Component
public function submit($showToaster = true)
{
try {
- if ($this->application->isDirty('redirect')) {
- $this->set_redirect();
- }
$this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim();
$this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim();
$this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
+ Url::fromString($domain, ['http', 'https']);
return str($domain)->trim()->lower();
});
$this->application->fqdn = $this->application->fqdn->unique()->implode(',');
+ $this->resetDefaultLabels();
+
+ if ($this->application->isDirty('redirect')) {
+ $this->set_redirect();
+ }
$this->checkFqdns();
@@ -408,9 +405,25 @@ class General extends Component
$this->application->save();
$showToaster && $this->dispatch('success', 'Application settings updated!');
} catch (\Throwable $e) {
+ $originalFqdn = $this->application->getOriginal('fqdn');
+ if ($originalFqdn !== $this->application->fqdn) {
+ $this->application->fqdn = $originalFqdn;
+ }
return handleError($e, $this);
} finally {
$this->dispatch('configurationChanged');
}
}
+ public function downloadConfig()
+ {
+ $config = GenerateConfig::run($this->application, true);
+ $fileName = str($this->application->name)->slug()->append('_config.json');
+
+ return response()->streamDownload(function () use ($config) {
+ echo $config;
+ }, $fileName, [
+ 'Content-Type' => 'application/json',
+ 'Content-Disposition' => 'attachment; filename=' . $fileName,
+ ]);
+ }
}
diff --git a/app/Livewire/Project/Application/Preview/Form.php b/app/Livewire/Project/Application/Preview/Form.php
index e4f100fcf..9a0b9b851 100644
--- a/app/Livewire/Project/Application/Preview/Form.php
+++ b/app/Livewire/Project/Application/Preview/Form.php
@@ -31,10 +31,14 @@ class Form extends Component
public function generate_real_url()
{
if (data_get($this->application, 'fqdn')) {
- $firstFqdn = str($this->application->fqdn)->before(',');
- $url = Url::fromString($firstFqdn);
- $host = $url->getHost();
- $this->preview_url_template = str($this->application->preview_url_template)->replace('{{domain}}', $host);
+ try {
+ $firstFqdn = str($this->application->fqdn)->before(',');
+ $url = Url::fromString($firstFqdn);
+ $host = $url->getHost();
+ $this->preview_url_template = str($this->application->preview_url_template)->replace('{{domain}}', $host);
+ } catch (\Exception $e) {
+ $this->dispatch('error', 'Invalid FQDN.');
+ }
}
}
diff --git a/app/Livewire/Project/New/PublicGitRepository.php b/app/Livewire/Project/New/PublicGitRepository.php
index b5c5cb1db..971d4700b 100644
--- a/app/Livewire/Project/New/PublicGitRepository.php
+++ b/app/Livewire/Project/New/PublicGitRepository.php
@@ -31,10 +31,12 @@ class PublicGitRepository extends Component
public bool $isStatic = false;
+ public bool $checkCoolifyConfig = true;
+
public ?string $publish_directory = null;
// In case of docker compose
- public ?string $base_directory = null;
+ public string $base_directory = '/';
public ?string $docker_compose_location = '/docker-compose.yaml';
// End of docker compose
@@ -97,6 +99,7 @@ class PublicGitRepository extends Component
$this->base_directory = '/'.$this->base_directory;
}
}
+
}
public function updatedDockerComposeLocation()
@@ -275,6 +278,7 @@ class PublicGitRepository extends Component
'destination_id' => $destination->id,
'destination_type' => $destination_class,
'build_pack' => $this->build_pack,
+ 'base_directory' => $this->base_directory,
];
} else {
$application_init = [
@@ -289,6 +293,7 @@ class PublicGitRepository extends Component
'source_id' => $this->git_source->id,
'source_type' => $this->git_source->getMorphClass(),
'build_pack' => $this->build_pack,
+ 'base_directory' => $this->base_directory,
];
}
@@ -303,11 +308,15 @@ class PublicGitRepository extends Component
$application->settings->is_static = $this->isStatic;
$application->settings->save();
-
$fqdn = generateFqdn($destination->server, $application->uuid);
$application->fqdn = $fqdn;
$application->save();
-
+ if ($this->checkCoolifyConfig) {
+ // $config = loadConfigFromGit($this->repository_url, $this->git_branch, $this->base_directory, $this->query['server_id'], auth()->user()->currentTeam()->id);
+ // if ($config) {
+ // $application->setConfig($config);
+ // }
+ }
return redirect()->route('project.application.configuration', [
'application_uuid' => $application->uuid,
'environment_name' => $environment->name,
diff --git a/app/Livewire/Project/Service/EditDomain.php b/app/Livewire/Project/Service/EditDomain.php
index 70e8006c7..4138f720e 100644
--- a/app/Livewire/Project/Service/EditDomain.php
+++ b/app/Livewire/Project/Service/EditDomain.php
@@ -4,6 +4,7 @@ namespace App\Livewire\Project\Service;
use App\Models\ServiceApplication;
use Livewire\Component;
+use Spatie\Url\Url;
class EditDomain extends Component
{
@@ -20,21 +21,16 @@ class EditDomain extends Component
{
$this->application = ServiceApplication::find($this->applicationId);
}
-
- public function updatedApplicationFqdn()
- {
- $this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim();
- $this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim();
- $this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
- return str($domain)->trim()->lower();
- });
- $this->application->fqdn = $this->application->fqdn->unique()->implode(',');
- $this->application->save();
- }
-
public function submit()
{
try {
+ $this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim();
+ $this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim();
+ $this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
+ Url::fromString($domain, ['http', 'https']);
+ return str($domain)->trim()->lower();
+ });
+ $this->application->fqdn = $this->application->fqdn->unique()->implode(',');
check_domain_usage(resource: $this->application);
$this->validate();
$this->application->save();
@@ -44,12 +40,15 @@ class EditDomain extends Component
} else {
$this->dispatch('success', 'Service saved.');
}
- } catch (\Throwable $e) {
- return handleError($e, $this);
- } finally {
$this->application->service->parse();
$this->dispatch('refresh');
$this->dispatch('configurationChanged');
+ } catch (\Throwable $e) {
+ $originalFqdn = $this->application->getOriginal('fqdn');
+ if ($originalFqdn !== $this->application->fqdn) {
+ $this->application->fqdn = $originalFqdn;
+ }
+ return handleError($e, $this);
}
}
diff --git a/app/Livewire/Project/Service/Navbar.php b/app/Livewire/Project/Service/Navbar.php
index 70b3b5db6..fa76ee26f 100644
--- a/app/Livewire/Project/Service/Navbar.php
+++ b/app/Livewire/Project/Service/Navbar.php
@@ -39,6 +39,7 @@ class Navbar extends Component
return [
"echo-private:user.{$userId},ServiceStatusChanged" => 'serviceStarted',
+ "envsUpdated" => '$refresh',
];
}
diff --git a/app/Livewire/Project/Service/ServiceApplicationView.php b/app/Livewire/Project/Service/ServiceApplicationView.php
index 56b506043..ba37313fd 100644
--- a/app/Livewire/Project/Service/ServiceApplicationView.php
+++ b/app/Livewire/Project/Service/ServiceApplicationView.php
@@ -6,6 +6,7 @@ use App\Models\ServiceApplication;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Livewire\Component;
+use Spatie\Url\Url;
class ServiceApplicationView extends Component
{
@@ -31,13 +32,7 @@ class ServiceApplicationView extends Component
public function updatedApplicationFqdn()
{
- $this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim();
- $this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim();
- $this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
- return str($domain)->trim()->lower();
- });
- $this->application->fqdn = $this->application->fqdn->unique()->implode(',');
- $this->application->save();
+
}
public function instantSave()
@@ -83,6 +78,14 @@ class ServiceApplicationView extends Component
public function submit()
{
try {
+ $this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim();
+ $this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim();
+ $this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
+ Url::fromString($domain, ['http', 'https']);
+ return str($domain)->trim()->lower();
+ });
+ $this->application->fqdn = $this->application->fqdn->unique()->implode(',');
+
check_domain_usage(resource: $this->application);
$this->validate();
$this->application->save();
@@ -92,10 +95,13 @@ class ServiceApplicationView extends Component
} else {
$this->dispatch('success', 'Service saved.');
}
- } catch (\Throwable $e) {
- return handleError($e, $this);
- } finally {
$this->dispatch('generateDockerCompose');
+ } catch (\Throwable $e) {
+ $originalFqdn = $this->application->getOriginal('fqdn');
+ if ($originalFqdn !== $this->application->fqdn) {
+ $this->application->fqdn = $originalFqdn;
+ }
+ return handleError($e, $this);
}
}
diff --git a/app/Livewire/Project/Service/StackForm.php b/app/Livewire/Project/Service/StackForm.php
index 7f2416e3e..2c751aa92 100644
--- a/app/Livewire/Project/Service/StackForm.php
+++ b/app/Livewire/Project/Service/StackForm.php
@@ -34,6 +34,7 @@ class StackForm extends Component
$value = data_get($field, 'value');
$rules = data_get($field, 'rules', 'nullable');
$isPassword = data_get($field, 'isPassword', false);
+ $customHelper = data_get($field, 'customHelper', false);
$this->fields->put($key, [
'serviceName' => $serviceName,
'key' => $key,
@@ -41,6 +42,7 @@ class StackForm extends Component
'value' => $value,
'isPassword' => $isPassword,
'rules' => $rules,
+ 'customHelper' => $customHelper,
]);
$this->rules["fields.$key.value"] = $rules;
diff --git a/app/Livewire/Project/Shared/EnvironmentVariable/Show.php b/app/Livewire/Project/Shared/EnvironmentVariable/Show.php
index 463ceecad..0538a6bdb 100644
--- a/app/Livewire/Project/Shared/EnvironmentVariable/Show.php
+++ b/app/Livewire/Project/Shared/EnvironmentVariable/Show.php
@@ -37,6 +37,7 @@ class Show extends Component
'env.is_literal' => 'required|boolean',
'env.is_shown_once' => 'required|boolean',
'env.real_value' => 'nullable',
+ 'env.is_required' => 'required|boolean',
];
protected $validationAttributes = [
@@ -46,6 +47,7 @@ class Show extends Component
'env.is_multiline' => 'Multiline',
'env.is_literal' => 'Literal',
'env.is_shown_once' => 'Shown Once',
+ 'env.is_required' => 'Required',
];
public function refresh()
@@ -109,14 +111,14 @@ class Show extends Component
} else {
$this->validate();
}
- // if (str($this->env->value)->startsWith('{{') && str($this->env->value)->endsWith('}}')) {
- // $type = str($this->env->value)->after('{{')->before('.')->value;
- // if (! collect(SHARED_VARIABLE_TYPES)->contains($type)) {
- // $this->dispatch('error', 'Invalid shared variable type.', 'Valid types are: team, project, environment.');
- // return;
- // }
- // }
+ if ($this->env->is_required && str($this->env->real_value)->isEmpty()) {
+ $oldValue = $this->env->getOriginal('value');
+ $this->env->value = $oldValue;
+ $this->dispatch('error', 'Required environment variable cannot be empty.');
+
+ return;
+ }
$this->serialize();
$this->env->save();
$this->dispatch('success', 'Environment variable updated.');
diff --git a/app/Livewire/Project/Shared/UploadConfig.php b/app/Livewire/Project/Shared/UploadConfig.php
new file mode 100644
index 000000000..dea842651
--- /dev/null
+++ b/app/Livewire/Project/Shared/UploadConfig.php
@@ -0,0 +1,41 @@
+config = '{
+ "build_pack": "nixpacks",
+ "base_directory": "/nodejs",
+ "publish_directory": "/",
+ "ports_exposes": "3000",
+ "settings": {
+ "is_static": false
+ }
+}';
+ }
+ }
+ public function uploadConfig()
+ {
+ try {
+ $application = Application::findOrFail($this->applicationId);
+ $application->setConfig($this->config);
+ $this->dispatch('success', 'Application settings updated');
+ } catch (\Exception $e) {
+ $this->dispatch('error', $e->getMessage());
+ return;
+ }
+
+ }
+ public function render()
+ {
+ return view('livewire.project.shared.upload-config');
+ }
+}
diff --git a/app/Livewire/Server/Form.php b/app/Livewire/Server/Form.php
index c4f25c79d..fe7fc6020 100644
--- a/app/Livewire/Server/Form.php
+++ b/app/Livewire/Server/Form.php
@@ -245,7 +245,6 @@ class Form extends Component
$newTimezone = $this->server->settings->server_timezone;
if ($currentTimezone !== $newTimezone || $currentTimezone === '') {
$this->server->settings->server_timezone = $newTimezone;
- $this->server->settings->save();
}
$this->server->settings->save();
$this->server->save();
@@ -255,14 +254,6 @@ class Form extends Component
return handleError($e, $this);
}
}
-
- public function updatedServerSettingsServerTimezone($value)
- {
- $this->server->settings->server_timezone = $value;
- $this->server->settings->save();
- $this->dispatch('success', 'Server timezone updated.');
- }
-
public function manualCleanup()
{
try {
diff --git a/app/Livewire/Settings/Index.php b/app/Livewire/Settings/Index.php
index 754f0929b..eb492e691 100644
--- a/app/Livewire/Settings/Index.php
+++ b/app/Livewire/Settings/Index.php
@@ -28,6 +28,7 @@ class Index extends Component
protected string $dynamic_config_path = '/data/coolify/proxy/dynamic';
protected Server $server;
+ public $timezones;
protected $rules = [
'settings.fqdn' => 'nullable',
@@ -53,9 +54,9 @@ class Index extends Component
'settings.is_auto_update_enabled' => 'Auto Update Enabled',
'auto_update_frequency' => 'Auto Update Frequency',
'update_check_frequency' => 'Update Check Frequency',
+ 'settings.instance_timezone' => 'Instance Timezone',
];
- public $timezones;
public function mount()
{
@@ -170,12 +171,6 @@ class Index extends Component
}
}
- public function updatedSettingsInstanceTimezone($value)
- {
- $this->settings->instance_timezone = $value;
- $this->settings->save();
- $this->dispatch('success', 'Instance timezone updated.');
- }
public function render()
{
diff --git a/app/Models/Application.php b/app/Models/Application.php
index e4ab3918a..07aeb4c5b 100644
--- a/app/Models/Application.php
+++ b/app/Models/Application.php
@@ -9,6 +9,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Process\InvokedProcess;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Process;
+use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use OpenApi\Attributes as OA;
use RuntimeException;
@@ -1427,4 +1428,67 @@ class Application extends BaseModel
return $parsedCollection->toArray();
}
}
+
+ public function generateConfig($is_json = false)
+ {
+ $config = collect([]);
+ if ($this->build_pack = 'nixpacks') {
+ $config = collect([
+ 'build_pack' => 'nixpacks',
+ 'docker_registry_image_name' => $this->docker_registry_image_name,
+ 'docker_registry_image_tag' => $this->docker_registry_image_tag,
+ 'install_command' => $this->install_command,
+ 'build_command' => $this->build_command,
+ 'start_command' => $this->start_command,
+ 'base_directory' => $this->base_directory,
+ 'publish_directory' => $this->publish_directory,
+ 'custom_docker_run_options' => $this->custom_docker_run_options,
+ 'ports_exposes' => $this->ports_exposes,
+ 'ports_mappings' => $this->ports_mapping,
+ 'settings' => collect([
+ 'is_static' => $this->settings->is_static,
+ ]),
+ ]);
+ }
+ $config = $config->filter(function ($value) {
+ return str($value)->isNotEmpty();
+ });
+ if ($is_json) {
+ return json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
+ }
+
+ return $config;
+ }
+ public function setConfig($config) {
+
+ $config = $config;
+ $validator = Validator::make(['config' => $config], [
+ 'config' => 'required|json',
+ ]);
+ if ($validator->fails()) {
+ throw new \Exception('Invalid JSON format');
+ }
+ $config = json_decode($config, true);
+
+ $deepValidator = Validator::make(['config' => $config], [
+ 'config.build_pack' => 'required|string',
+ 'config.base_directory' => 'required|string',
+ 'config.publish_directory' => 'required|string',
+ 'config.ports_exposes' => 'required|string',
+ 'config.settings.is_static' => 'required|boolean',
+ ]);
+ if ($deepValidator->fails()) {
+ throw new \Exception('Invalid data');
+ }
+ $config = $deepValidator->validated()['config'];
+
+ try {
+ $settings = data_get($config, 'settings', []);
+ data_forget($config, 'settings');
+ $this->update($config);
+ $this->settings()->update($settings);
+ } catch (\Exception $e) {
+ throw new \Exception('Failed to update application settings');
+ }
+ }
}
diff --git a/app/Models/EnvironmentVariable.php b/app/Models/EnvironmentVariable.php
index 9f8e4b342..531c8fa40 100644
--- a/app/Models/EnvironmentVariable.php
+++ b/app/Models/EnvironmentVariable.php
@@ -44,7 +44,7 @@ class EnvironmentVariable extends Model
'version' => 'string',
];
- protected $appends = ['real_value', 'is_shared'];
+ protected $appends = ['real_value', 'is_shared', 'is_really_required'];
protected static function booted()
{
@@ -130,6 +130,13 @@ class EnvironmentVariable extends Model
);
}
+ protected function isReallyRequired(): Attribute
+ {
+ return Attribute::make(
+ get: fn () => $this->is_required && str($this->real_value)->isEmpty(),
+ );
+ }
+
protected function isShared(): Attribute
{
return Attribute::make(
diff --git a/app/Models/ScheduledDatabaseBackup.php b/app/Models/ScheduledDatabaseBackup.php
index ce5d3a87f..3921e32e4 100644
--- a/app/Models/ScheduledDatabaseBackup.php
+++ b/app/Models/ScheduledDatabaseBackup.php
@@ -39,13 +39,19 @@ class ScheduledDatabaseBackup extends BaseModel
public function server()
{
if ($this->database) {
- if ($this->database->destination && $this->database->destination->server) {
- $server = $this->database->destination->server;
-
+ if ($this->database instanceof ServiceDatabase) {
+ $destination = data_get($this->database->service, 'destination');
+ $server = data_get($destination, 'server');
+ } else {
+ $destination = data_get($this->database, 'destination');
+ $server = data_get($destination, 'server');
+ }
+ if ($server) {
return $server;
}
}
+
return null;
}
}
diff --git a/app/Models/Server.php b/app/Models/Server.php
index 8864deef1..0eca3c168 100644
--- a/app/Models/Server.php
+++ b/app/Models/Server.php
@@ -209,10 +209,13 @@ respond 404
1 => 'https',
],
'service' => 'noop',
- 'rule' => 'HostRegexp(`{catchall:.*}`)',
+ 'rule' => 'HostRegexp(`.+`)',
+ 'tls' => [
+ 'certResolver' => 'letsencrypt',
+ ],
'priority' => 1,
'middlewares' => [
- 0 => 'redirect-regexp@file',
+ 0 => 'redirect-regexp',
],
],
],
diff --git a/app/Models/Service.php b/app/Models/Service.php
index bcdb74f8c..16e11ecb6 100644
--- a/app/Models/Service.php
+++ b/app/Models/Service.php
@@ -288,6 +288,21 @@ class Service extends BaseModel
continue;
}
switch ($image) {
+ case $image->contains('castopod'):
+ $data = collect([]);
+ $disable_https = $this->environment_variables()->where('key', 'CP_DISABLE_HTTPS')->first();
+ if ($disable_https) {
+ $data = $data->merge([
+ 'Disable HTTPS' => [
+ 'key' => 'CP_DISABLE_HTTPS',
+ 'value' => data_get($disable_https, 'value'),
+ 'rules' => 'required',
+ 'customHelper' => "If you want to use https, set this to 0. Variable name: CP_DISABLE_HTTPS",
+ ],
+ ]);
+ }
+ $fields->put('Castopod', $data->toArray());
+ break;
case $image->contains('label-studio'):
$data = collect([]);
$username = $this->environment_variables()->where('key', 'LABEL_STUDIO_USERNAME')->first();
@@ -304,7 +319,7 @@ class Service extends BaseModel
if ($password) {
$data = $data->merge([
'Password' => [
- 'key' => 'LABEL_STUDIO_PASSWORD',
+ 'key' => data_get($password, 'key'),
'value' => data_get($password, 'value'),
'rules' => 'required',
'isPassword' => true,
@@ -344,7 +359,7 @@ class Service extends BaseModel
if ($email) {
$data = $data->merge([
'Admin Email' => [
- 'key' => 'LANGFUSE_INIT_USER_EMAIL',
+ 'key' => data_get($email, 'key'),
'value' => data_get($email, 'value'),
'rules' => 'required|email',
],
@@ -355,7 +370,7 @@ class Service extends BaseModel
if ($password) {
$data = $data->merge([
'Admin Password' => [
- 'key' => 'LANGFUSE_INIT_USER_PASSWORD',
+ 'key' => data_get($password, 'key'),
'value' => data_get($password, 'value'),
'rules' => 'required',
'isPassword' => true,
@@ -369,7 +384,7 @@ class Service extends BaseModel
$email = $this->environment_variables()->where('key', 'IN_USER_EMAIL')->first();
$data = $data->merge([
'Email' => [
- 'key' => 'IN_USER_EMAIL',
+ 'key' => data_get($email, 'key'),
'value' => data_get($email, 'value'),
'rules' => 'required|email',
],
@@ -377,7 +392,7 @@ class Service extends BaseModel
$password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_INVOICENINJAUSER')->first();
$data = $data->merge([
'Password' => [
- 'key' => 'IN_PASSWORD',
+ 'key' => data_get($password, 'key'),
'value' => data_get($password, 'value'),
'rules' => 'required',
'isPassword' => true,
@@ -472,7 +487,7 @@ class Service extends BaseModel
if ($admin_password) {
$data = $data->merge([
'Admin Password' => [
- 'key' => 'SERVICE_PASSWORD_TOLGEE',
+ 'key' => data_get($admin_password, 'key'),
'value' => data_get($admin_password, 'value'),
'rules' => 'required',
'isPassword' => true,
@@ -519,7 +534,7 @@ class Service extends BaseModel
if ($admin_password) {
$data = $data->merge([
'Admin Password' => [
- 'key' => 'SERVICE_PASSWORD_UNLEASH',
+ 'key' => data_get($admin_password, 'key'),
'value' => data_get($admin_password, 'value'),
'rules' => 'required',
'isPassword' => true,
@@ -542,7 +557,7 @@ class Service extends BaseModel
if ($admin_password) {
$data = $data->merge([
'Admin Password' => [
- 'key' => 'GF_SECURITY_ADMIN_PASSWORD',
+ 'key' => data_get($admin_password, 'key'),
'value' => data_get($admin_password, 'value'),
'rules' => 'required',
'isPassword' => true,
@@ -904,7 +919,7 @@ class Service extends BaseModel
if ($admin_user) {
$data = $data->merge([
'User' => [
- 'key' => 'SERVICE_USER_ADMIN',
+ 'key' => data_get($admin_user, 'key'),
'value' => data_get($admin_user, 'value', 'admin'),
'readonly' => true,
'rules' => 'required',
@@ -914,7 +929,7 @@ class Service extends BaseModel
if ($admin_password) {
$data = $data->merge([
'Password' => [
- 'key' => 'SERVICE_PASSWORD_ADMIN',
+ 'key' => data_get($admin_password, 'key'),
'value' => data_get($admin_password, 'value'),
'rules' => 'required',
'isPassword' => true,
@@ -924,7 +939,7 @@ class Service extends BaseModel
if ($admin_email) {
$data = $data->merge([
'Email' => [
- 'key' => 'ADMIN_EMAIL',
+ 'key' => data_get($admin_email, 'key'),
'value' => data_get($admin_email, 'value'),
'rules' => 'required|email',
],
@@ -982,8 +997,8 @@ class Service extends BaseModel
break;
case $image->contains('mysql'):
$userVariables = ['SERVICE_USER_MYSQL', 'SERVICE_USER_WORDPRESS', 'MYSQL_USER'];
- $passwordVariables = ['SERVICE_PASSWORD_MYSQL', 'SERVICE_PASSWORD_WORDPRESS', 'MYSQL_PASSWORD'];
- $rootPasswordVariables = ['SERVICE_PASSWORD_MYSQLROOT', 'SERVICE_PASSWORD_ROOT'];
+ $passwordVariables = ['SERVICE_PASSWORD_MYSQL', 'SERVICE_PASSWORD_WORDPRESS', 'MYSQL_PASSWORD','SERVICE_PASSWORD_64_MYSQL'];
+ $rootPasswordVariables = ['SERVICE_PASSWORD_MYSQLROOT', 'SERVICE_PASSWORD_ROOT','SERVICE_PASSWORD_64_MYSQLROOT'];
$dbNameVariables = ['MYSQL_DATABASE'];
$mysql_user = $this->environment_variables()->whereIn('key', $userVariables)->first();
$mysql_password = $this->environment_variables()->whereIn('key', $passwordVariables)->first();
@@ -1093,6 +1108,7 @@ class Service extends BaseModel
foreach ($fields as $field) {
$key = data_get($field, 'key');
$value = data_get($field, 'value');
+ ray($key, $value);
$found = $this->environment_variables()->where('key', $key)->first();
if ($found) {
$found->value = $value;
@@ -1216,7 +1232,6 @@ class Service extends BaseModel
public function environment_variables(): HasMany
{
-
return $this->hasMany(EnvironmentVariable::class)->orderByRaw("LOWER(key) LIKE LOWER('SERVICE%') DESC, LOWER(key) ASC");
}
@@ -1300,4 +1315,20 @@ class Service extends BaseModel
return $networks;
}
+
+ protected function isDeployable(): Attribute
+ {
+ return Attribute::make(
+ get: function () {
+ $envs = $this->environment_variables()->where('is_required', true)->get();
+ foreach ($envs as $env) {
+ if ($env->is_really_required) {
+ return false;
+ }
+ }
+ return true;
+ }
+ );
+ }
+
}
diff --git a/bootstrap/helpers/api.php b/bootstrap/helpers/api.php
index 006b095cf..d7c16b607 100644
--- a/bootstrap/helpers/api.php
+++ b/bootstrap/helpers/api.php
@@ -2,6 +2,7 @@
use App\Enums\BuildPackTypes;
use App\Enums\RedirectTypes;
+use App\Enums\StaticImageTypes;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
@@ -89,6 +90,7 @@ function sharedDataApplications()
'git_branch' => 'string',
'build_pack' => Rule::enum(BuildPackTypes::class),
'is_static' => 'boolean',
+ 'static_image' => Rule::enum(StaticImageTypes::class),
'domains' => 'string',
'redirect' => Rule::enum(RedirectTypes::class),
'git_commit_sha' => 'string',
@@ -176,4 +178,5 @@ function removeUnnecessaryFieldsFromRequest(Request $request)
$request->offsetUnset('github_app_uuid');
$request->offsetUnset('private_key_uuid');
$request->offsetUnset('use_build_server');
+ $request->offsetUnset('is_static');
}
diff --git a/bootstrap/helpers/constants.php b/bootstrap/helpers/constants.php
index d8dc26a48..303fcab8e 100644
--- a/bootstrap/helpers/constants.php
+++ b/bootstrap/helpers/constants.php
@@ -40,6 +40,7 @@ const DATABASE_DOCKER_IMAGES = [
];
const SPECIFIC_SERVICES = [
'quay.io/minio/minio',
+ 'minio/minio',
'svhd/logto',
];
diff --git a/bootstrap/helpers/proxy.php b/bootstrap/helpers/proxy.php
index 5d1ad5390..309ccee4a 100644
--- a/bootstrap/helpers/proxy.php
+++ b/bootstrap/helpers/proxy.php
@@ -164,6 +164,7 @@ function generate_default_proxy_configuration(Server $server)
'ports' => [
'80:80',
'443:443',
+ '443:443/udp',
'8080:8080',
],
'healthcheck' => [
@@ -187,6 +188,7 @@ function generate_default_proxy_configuration(Server $server)
'--entryPoints.http.http2.maxConcurrentStreams=50',
'--entrypoints.https.http.encodequerysemicolons=true',
'--entryPoints.https.http2.maxConcurrentStreams=50',
+ '--entrypoints.https.http3',
'--providers.docker.exposedbydefault=false',
'--providers.file.directory=/traefik/dynamic/',
'--providers.file.watch=true',
diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php
index 65fe3322d..ea9d6ff3c 100644
--- a/bootstrap/helpers/shared.php
+++ b/bootstrap/helpers/shared.php
@@ -1174,10 +1174,10 @@ function check_domain_usage(ServiceApplication|Application|null $resource = null
if ($domains->contains($naked_domain)) {
if (data_get($resource, 'uuid')) {
if ($resource->uuid !== $app->uuid) {
- throw new \RuntimeException("Domain $naked_domain is already in use by another resource called:
{$app->name}.");
+ throw new \RuntimeException("Domain $naked_domain is already in use by another resource:
Link: {$app->name}");
}
} elseif ($domain) {
- throw new \RuntimeException("Domain $naked_domain is already in use by another resource called:
{$app->name}.");
+ throw new \RuntimeException("Domain $naked_domain is already in use by another resource:
Link: {$app->name}");
}
}
}
@@ -1193,10 +1193,10 @@ function check_domain_usage(ServiceApplication|Application|null $resource = null
if ($domains->contains($naked_domain)) {
if (data_get($resource, 'uuid')) {
if ($resource->uuid !== $app->uuid) {
- throw new \RuntimeException("Domain $naked_domain is already in use by another resource called:
{$app->name}.");
+ throw new \RuntimeException("Domain $naked_domain is already in use by another resource:
Link: {$app->service->name}");
}
} elseif ($domain) {
- throw new \RuntimeException("Domain $naked_domain is already in use by another resource called:
{$app->name}.");
+ throw new \RuntimeException("Domain $naked_domain is already in use by another resource:
Link: {$app->service->name}");
}
}
}
@@ -3181,6 +3181,7 @@ function newParser(Application|Service $resource, int $pull_request_id = 0, ?int
} elseif ($isService) {
$fqdn = generateFqdn($server, "$fqdnFor-$uuid");
}
+ $fqdn = str($fqdn)->replace('http://', '')->replace('https://', '');
$resource->environment_variables()->where('key', $key->value())->where($nameOfId, $resource->id)->firstOrCreate([
'key' => $key->value(),
$nameOfId => $resource->id,
@@ -3568,6 +3569,7 @@ function newParser(Application|Service $resource, int $pull_request_id = 0, ?int
]);
} else {
if ($value->startsWith('$')) {
+ $isRequired = false;
if ($value->contains(':-')) {
$value = replaceVariables($value);
$key = $value->before(':');
@@ -3582,11 +3584,13 @@ function newParser(Application|Service $resource, int $pull_request_id = 0, ?int
$key = $value->before(':');
$value = $value->after(':?');
+ $isRequired = true;
} elseif ($value->contains('?')) {
$value = replaceVariables($value);
$key = $value->before('?');
$value = $value->after('?');
+ $isRequired = true;
}
if ($originalValue->value() === $value->value()) {
// This means the variable does not have a default value, so it needs to be created in Coolify
@@ -3597,6 +3601,7 @@ function newParser(Application|Service $resource, int $pull_request_id = 0, ?int
], [
'is_build_time' => false,
'is_preview' => false,
+ 'is_required' => $isRequired,
]);
// Add the variable to the environment so it will be shown in the deployable compose file
$environment[$parsedKeyValue->value()] = $resource->environment_variables()->where('key', $parsedKeyValue)->where($nameOfId, $resource->id)->first()->value;
@@ -3610,6 +3615,7 @@ function newParser(Application|Service $resource, int $pull_request_id = 0, ?int
'value' => $value,
'is_build_time' => false,
'is_preview' => false,
+ 'is_required' => $isRequired,
]);
}
@@ -3895,6 +3901,8 @@ function isAssociativeArray($array)
*/
function add_coolify_default_environment_variables(StandaloneRedis|StandalonePostgresql|StandaloneMongodb|StandaloneMysql|StandaloneMariadb|StandaloneKeydb|StandaloneDragonfly|StandaloneClickhouse|Application|Service $resource, Collection &$where_to_add, ?Collection $where_to_check = null)
{
+ // Currently disabled
+ return;
if ($resource instanceof Service) {
$ip = $resource->server->ip;
} else {
@@ -3981,3 +3989,31 @@ function instanceSettings()
{
return InstanceSettings::get();
}
+
+function loadConfigFromGit(string $repository, string $branch, string $base_directory, int $server_id, int $team_id) {
+
+ $server = Server::find($server_id)->where('team_id', $team_id)->first();
+ if (!$server) {
+ return;
+ }
+ $uuid = new Cuid2();
+ $cloneCommand = "git clone --no-checkout -b $branch $repository .";
+ $workdir = rtrim($base_directory, '/');
+ $fileList = collect([".$workdir/coolify.json"]);
+ $commands = collect([
+ "rm -rf /tmp/{$uuid}",
+ "mkdir -p /tmp/{$uuid}",
+ "cd /tmp/{$uuid}",
+ $cloneCommand,
+ 'git sparse-checkout init --cone',
+ "git sparse-checkout set {$fileList->implode(' ')}",
+ 'git read-tree -mu HEAD',
+ "cat .$workdir/coolify.json",
+ 'rm -rf /tmp/{$uuid}',
+ ]);
+ try {
+ return instant_remote_process($commands, $server);
+ } catch (\Exception $e) {
+ // continue
+ }
+}
diff --git a/composer.json b/composer.json
index 03adf9823..fbd77d0cf 100644
--- a/composer.json
+++ b/composer.json
@@ -14,7 +14,7 @@
"guzzlehttp/guzzle": "^7.5.0",
"laravel/fortify": "^v1.16.0",
"laravel/framework": "^v11",
- "laravel/horizon": "^5.27.1",
+ "laravel/horizon": "^5.29.1",
"laravel/prompts": "^0.1.6",
"laravel/sanctum": "^v4.0",
"laravel/socialite": "^v5.14.0",
diff --git a/composer.lock b/composer.lock
index 420d87ec0..0b8da82d0 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "42c28ab141b70fcabf75b51afa96c670",
+ "content-hash": "c47adf3684eb727e22503937435c0914",
"packages": [
{
"name": "amphp/amp",
@@ -317,16 +317,16 @@
},
{
"name": "amphp/parallel",
- "version": "v2.2.9",
+ "version": "v2.3.0",
"source": {
"type": "git",
"url": "https://github.com/amphp/parallel.git",
- "reference": "73d293f1fc4df1bebc3c4fce1432e82dd7032238"
+ "reference": "9777db1460d1535bc2a843840684fb1205225b87"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/amphp/parallel/zipball/73d293f1fc4df1bebc3c4fce1432e82dd7032238",
- "reference": "73d293f1fc4df1bebc3c4fce1432e82dd7032238",
+ "url": "https://api.github.com/repos/amphp/parallel/zipball/9777db1460d1535bc2a843840684fb1205225b87",
+ "reference": "9777db1460d1535bc2a843840684fb1205225b87",
"shasum": ""
},
"require": {
@@ -389,7 +389,7 @@
],
"support": {
"issues": "https://github.com/amphp/parallel/issues",
- "source": "https://github.com/amphp/parallel/tree/v2.2.9"
+ "source": "https://github.com/amphp/parallel/tree/v2.3.0"
},
"funding": [
{
@@ -397,7 +397,7 @@
"type": "github"
}
],
- "time": "2024-03-24T18:27:44+00:00"
+ "time": "2024-09-14T19:16:14+00:00"
},
{
"name": "amphp/parser",
@@ -921,16 +921,16 @@
},
{
"name": "aws/aws-sdk-php",
- "version": "3.321.9",
+ "version": "3.324.0",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "5de5099cfe0e17cb3eb2fe51de0101c99bc9442a"
+ "reference": "b258712f0d986e00e1143d55246b6f9e344c7184"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5de5099cfe0e17cb3eb2fe51de0101c99bc9442a",
- "reference": "5de5099cfe0e17cb3eb2fe51de0101c99bc9442a",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b258712f0d986e00e1143d55246b6f9e344c7184",
+ "reference": "b258712f0d986e00e1143d55246b6f9e344c7184",
"shasum": ""
},
"require": {
@@ -1013,22 +1013,22 @@
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues",
- "source": "https://github.com/aws/aws-sdk-php/tree/3.321.9"
+ "source": "https://github.com/aws/aws-sdk-php/tree/3.324.0"
},
- "time": "2024-09-11T18:15:49+00:00"
+ "time": "2024-10-10T18:06:36+00:00"
},
{
"name": "bacon/bacon-qr-code",
- "version": "v3.0.0",
+ "version": "v3.0.1",
"source": {
"type": "git",
"url": "https://github.com/Bacon/BaconQrCode.git",
- "reference": "510de6eca6248d77d31b339d62437cc995e2fb41"
+ "reference": "f9cc1f52b5a463062251d666761178dbdb6b544f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/510de6eca6248d77d31b339d62437cc995e2fb41",
- "reference": "510de6eca6248d77d31b339d62437cc995e2fb41",
+ "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/f9cc1f52b5a463062251d666761178dbdb6b544f",
+ "reference": "f9cc1f52b5a463062251d666761178dbdb6b544f",
"shasum": ""
},
"require": {
@@ -1067,9 +1067,9 @@
"homepage": "https://github.com/Bacon/BaconQrCode",
"support": {
"issues": "https://github.com/Bacon/BaconQrCode/issues",
- "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.0"
+ "source": "https://github.com/Bacon/BaconQrCode/tree/v3.0.1"
},
- "time": "2024-04-18T11:16:25+00:00"
+ "time": "2024-10-01T13:55:55+00:00"
},
{
"name": "brick/math",
@@ -1518,16 +1518,16 @@
},
{
"name": "doctrine/dbal",
- "version": "3.9.1",
+ "version": "3.9.3",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
- "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7"
+ "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/dbal/zipball/d7dc08f98cba352b2bab5d32c5e58f7e745c11a7",
- "reference": "d7dc08f98cba352b2bab5d32c5e58f7e745c11a7",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/61446f07fcb522414d6cfd8b1c3e5f9e18c579ba",
+ "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba",
"shasum": ""
},
"require": {
@@ -1543,7 +1543,7 @@
"doctrine/coding-standard": "12.0.0",
"fig/log-test": "^1",
"jetbrains/phpstorm-stubs": "2023.1",
- "phpstan/phpstan": "1.12.0",
+ "phpstan/phpstan": "1.12.6",
"phpstan/phpstan-strict-rules": "^1.6",
"phpunit/phpunit": "9.6.20",
"psalm/plugin-phpunit": "0.18.4",
@@ -1611,7 +1611,7 @@
],
"support": {
"issues": "https://github.com/doctrine/dbal/issues",
- "source": "https://github.com/doctrine/dbal/tree/3.9.1"
+ "source": "https://github.com/doctrine/dbal/tree/3.9.3"
},
"funding": [
{
@@ -1627,7 +1627,7 @@
"type": "tidelift"
}
],
- "time": "2024-09-01T13:49:23+00:00"
+ "time": "2024-10-10T17:56:43+00:00"
},
{
"name": "doctrine/deprecations",
@@ -1937,16 +1937,16 @@
},
{
"name": "dragonmantank/cron-expression",
- "version": "v3.3.3",
+ "version": "v3.4.0",
"source": {
"type": "git",
"url": "https://github.com/dragonmantank/cron-expression.git",
- "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a"
+ "reference": "8c784d071debd117328803d86b2097615b457500"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a",
- "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500",
+ "reference": "8c784d071debd117328803d86b2097615b457500",
"shasum": ""
},
"require": {
@@ -1959,10 +1959,14 @@
"require-dev": {
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^1.0",
- "phpstan/phpstan-webmozart-assert": "^1.0",
"phpunit/phpunit": "^7.0|^8.0|^9.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
"Cron\\": "src/Cron/"
@@ -1986,7 +1990,7 @@
],
"support": {
"issues": "https://github.com/dragonmantank/cron-expression/issues",
- "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3"
+ "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0"
},
"funding": [
{
@@ -1994,7 +1998,7 @@
"type": "github"
}
],
- "time": "2023-08-10T19:36:49+00:00"
+ "time": "2024-10-09T13:47:03+00:00"
},
{
"name": "egulias/email-validator",
@@ -2789,16 +2793,16 @@
},
{
"name": "laravel/fortify",
- "version": "v1.24.1",
+ "version": "v1.24.2",
"source": {
"type": "git",
"url": "https://github.com/laravel/fortify.git",
- "reference": "8158ba0960bb5f4aae509d01d74a95e16e30de20"
+ "reference": "42695c45087e5abb3e173725b4f1ef4956a7b47d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/fortify/zipball/8158ba0960bb5f4aae509d01d74a95e16e30de20",
- "reference": "8158ba0960bb5f4aae509d01d74a95e16e30de20",
+ "url": "https://api.github.com/repos/laravel/fortify/zipball/42695c45087e5abb3e173725b4f1ef4956a7b47d",
+ "reference": "42695c45087e5abb3e173725b4f1ef4956a7b47d",
"shasum": ""
},
"require": {
@@ -2850,20 +2854,20 @@
"issues": "https://github.com/laravel/fortify/issues",
"source": "https://github.com/laravel/fortify"
},
- "time": "2024-09-03T10:02:14+00:00"
+ "time": "2024-09-16T19:20:52+00:00"
},
{
"name": "laravel/framework",
- "version": "v11.23.2",
+ "version": "v11.27.2",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "d38bf0fd3a8936e1cb9ca8eb8d7304a564f790f3"
+ "reference": "a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/d38bf0fd3a8936e1cb9ca8eb8d7304a564f790f3",
- "reference": "d38bf0fd3a8936e1cb9ca8eb8d7304a564f790f3",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9",
+ "reference": "a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9",
"shasum": ""
},
"require": {
@@ -2882,7 +2886,7 @@
"fruitcake/php-cors": "^1.3",
"guzzlehttp/guzzle": "^7.8",
"guzzlehttp/uri-template": "^1.0",
- "laravel/prompts": "^0.1.18",
+ "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0",
"laravel/serializable-closure": "^1.3",
"league/commonmark": "^2.2.1",
"league/flysystem": "^3.8.0",
@@ -2968,7 +2972,7 @@
"league/flysystem-sftp-v3": "^3.0",
"mockery/mockery": "^1.6",
"nyholm/psr7": "^1.2",
- "orchestra/testbench-core": "^9.4.0",
+ "orchestra/testbench-core": "^9.5",
"pda/pheanstalk": "^5.0",
"phpstan/phpstan": "^1.11.5",
"phpunit/phpunit": "^10.5|^11.0",
@@ -3027,6 +3031,7 @@
"src/Illuminate/Filesystem/functions.php",
"src/Illuminate/Foundation/helpers.php",
"src/Illuminate/Log/functions.php",
+ "src/Illuminate/Support/functions.php",
"src/Illuminate/Support/helpers.php"
],
"psr-4": {
@@ -3058,20 +3063,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2024-09-11T21:59:23+00:00"
+ "time": "2024-10-09T04:17:35+00:00"
},
{
"name": "laravel/horizon",
- "version": "v5.28.1",
+ "version": "v5.29.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/horizon.git",
- "reference": "9d2c4eaeb11408384401f8a7d1b0ea4c76554f3f"
+ "reference": "9f482f21c23ed01c2366d1157843165165579c23"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/horizon/zipball/9d2c4eaeb11408384401f8a7d1b0ea4c76554f3f",
- "reference": "9d2c4eaeb11408384401f8a7d1b0ea4c76554f3f",
+ "url": "https://api.github.com/repos/laravel/horizon/zipball/9f482f21c23ed01c2366d1157843165165579c23",
+ "reference": "9f482f21c23ed01c2366d1157843165165579c23",
"shasum": ""
},
"require": {
@@ -3135,9 +3140,9 @@
],
"support": {
"issues": "https://github.com/laravel/horizon/issues",
- "source": "https://github.com/laravel/horizon/tree/v5.28.1"
+ "source": "https://github.com/laravel/horizon/tree/v5.29.1"
},
- "time": "2024-09-04T14:06:50+00:00"
+ "time": "2024-10-08T18:23:02+00:00"
},
{
"name": "laravel/prompts",
@@ -3199,16 +3204,16 @@
},
{
"name": "laravel/sanctum",
- "version": "v4.0.2",
+ "version": "v4.0.3",
"source": {
"type": "git",
"url": "https://github.com/laravel/sanctum.git",
- "reference": "9cfc0ce80cabad5334efff73ec856339e8ec1ac1"
+ "reference": "54aea9d13743ae8a6cdd3c28dbef128a17adecab"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/sanctum/zipball/9cfc0ce80cabad5334efff73ec856339e8ec1ac1",
- "reference": "9cfc0ce80cabad5334efff73ec856339e8ec1ac1",
+ "url": "https://api.github.com/repos/laravel/sanctum/zipball/54aea9d13743ae8a6cdd3c28dbef128a17adecab",
+ "reference": "54aea9d13743ae8a6cdd3c28dbef128a17adecab",
"shasum": ""
},
"require": {
@@ -3259,20 +3264,20 @@
"issues": "https://github.com/laravel/sanctum/issues",
"source": "https://github.com/laravel/sanctum"
},
- "time": "2024-04-10T19:39:58+00:00"
+ "time": "2024-09-27T14:55:41+00:00"
},
{
"name": "laravel/serializable-closure",
- "version": "v1.3.4",
+ "version": "v1.3.5",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
- "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81"
+ "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/61b87392d986dc49ad5ef64e75b1ff5fee24ef81",
- "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81",
+ "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c",
+ "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c",
"shasum": ""
},
"require": {
@@ -3320,7 +3325,7 @@
"issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure"
},
- "time": "2024-08-02T07:48:17+00:00"
+ "time": "2024-09-23T13:33:08+00:00"
},
{
"name": "laravel/socialite",
@@ -3465,16 +3470,16 @@
},
{
"name": "laravel/tinker",
- "version": "v2.9.0",
+ "version": "v2.10.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/tinker.git",
- "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe"
+ "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe",
- "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe",
+ "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5",
+ "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5",
"shasum": ""
},
"require": {
@@ -3525,9 +3530,9 @@
],
"support": {
"issues": "https://github.com/laravel/tinker/issues",
- "source": "https://github.com/laravel/tinker/tree/v2.9.0"
+ "source": "https://github.com/laravel/tinker/tree/v2.10.0"
},
- "time": "2024-01-04T16:10:04+00:00"
+ "time": "2024-09-23T13:32:56+00:00"
},
{
"name": "laravel/ui",
@@ -3594,38 +3599,38 @@
},
{
"name": "lcobucci/jwt",
- "version": "5.3.0",
+ "version": "5.4.0",
"source": {
"type": "git",
"url": "https://github.com/lcobucci/jwt.git",
- "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83"
+ "reference": "aac4fd512681fd5cb4b77d2105ab7ec700c72051"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/lcobucci/jwt/zipball/08071d8d2c7f4b00222cc4b1fb6aa46990a80f83",
- "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83",
+ "url": "https://api.github.com/repos/lcobucci/jwt/zipball/aac4fd512681fd5cb4b77d2105ab7ec700c72051",
+ "reference": "aac4fd512681fd5cb4b77d2105ab7ec700c72051",
"shasum": ""
},
"require": {
"ext-openssl": "*",
"ext-sodium": "*",
- "php": "~8.1.0 || ~8.2.0 || ~8.3.0",
+ "php": "~8.2.0 || ~8.3.0 || ~8.4.0",
"psr/clock": "^1.0"
},
"require-dev": {
- "infection/infection": "^0.27.0",
- "lcobucci/clock": "^3.0",
+ "infection/infection": "^0.29",
+ "lcobucci/clock": "^3.2",
"lcobucci/coding-standard": "^11.0",
- "phpbench/phpbench": "^1.2.9",
+ "phpbench/phpbench": "^1.2",
"phpstan/extension-installer": "^1.2",
"phpstan/phpstan": "^1.10.7",
"phpstan/phpstan-deprecation-rules": "^1.1.3",
"phpstan/phpstan-phpunit": "^1.3.10",
"phpstan/phpstan-strict-rules": "^1.5.0",
- "phpunit/phpunit": "^10.2.6"
+ "phpunit/phpunit": "^11.1"
},
"suggest": {
- "lcobucci/clock": ">= 3.0"
+ "lcobucci/clock": ">= 3.2"
},
"type": "library",
"autoload": {
@@ -3651,7 +3656,7 @@
],
"support": {
"issues": "https://github.com/lcobucci/jwt/issues",
- "source": "https://github.com/lcobucci/jwt/tree/5.3.0"
+ "source": "https://github.com/lcobucci/jwt/tree/5.4.0"
},
"funding": [
{
@@ -3663,7 +3668,7 @@
"type": "patreon"
}
],
- "time": "2024-04-11T23:07:54+00:00"
+ "time": "2024-10-08T22:06:45+00:00"
},
{
"name": "league/commonmark",
@@ -3855,16 +3860,16 @@
},
{
"name": "league/flysystem",
- "version": "3.28.0",
+ "version": "3.29.1",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
- "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c"
+ "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c",
- "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319",
+ "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319",
"shasum": ""
},
"require": {
@@ -3932,22 +3937,22 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
- "source": "https://github.com/thephpleague/flysystem/tree/3.28.0"
+ "source": "https://github.com/thephpleague/flysystem/tree/3.29.1"
},
- "time": "2024-05-22T10:09:12+00:00"
+ "time": "2024-10-08T08:58:34+00:00"
},
{
"name": "league/flysystem-aws-s3-v3",
- "version": "3.28.0",
+ "version": "3.29.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
- "reference": "22071ef1604bc776f5ff2468ac27a752514665c8"
+ "reference": "c6ff6d4606e48249b63f269eba7fabdb584e76a9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/22071ef1604bc776f5ff2468ac27a752514665c8",
- "reference": "22071ef1604bc776f5ff2468ac27a752514665c8",
+ "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/c6ff6d4606e48249b63f269eba7fabdb584e76a9",
+ "reference": "c6ff6d4606e48249b63f269eba7fabdb584e76a9",
"shasum": ""
},
"require": {
@@ -3987,22 +3992,22 @@
"storage"
],
"support": {
- "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.28.0"
+ "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.29.0"
},
- "time": "2024-05-06T20:05:52+00:00"
+ "time": "2024-08-17T13:10:48+00:00"
},
{
"name": "league/flysystem-local",
- "version": "3.28.0",
+ "version": "3.29.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-local.git",
- "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40"
+ "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40",
- "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40",
+ "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27",
+ "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27",
"shasum": ""
},
"require": {
@@ -4036,22 +4041,22 @@
"local"
],
"support": {
- "source": "https://github.com/thephpleague/flysystem-local/tree/3.28.0"
+ "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0"
},
- "time": "2024-05-06T20:05:52+00:00"
+ "time": "2024-08-09T21:24:39+00:00"
},
{
"name": "league/flysystem-sftp-v3",
- "version": "3.28.0",
+ "version": "3.29.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-sftp-v3.git",
- "reference": "abedadd3c64d4f0e276d6ecc796ec8194d136b41"
+ "reference": "ce9b209e2fbe33122c755ffc18eb4d5bd256f252"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem-sftp-v3/zipball/abedadd3c64d4f0e276d6ecc796ec8194d136b41",
- "reference": "abedadd3c64d4f0e276d6ecc796ec8194d136b41",
+ "url": "https://api.github.com/repos/thephpleague/flysystem-sftp-v3/zipball/ce9b209e2fbe33122c755ffc18eb4d5bd256f252",
+ "reference": "ce9b209e2fbe33122c755ffc18eb4d5bd256f252",
"shasum": ""
},
"require": {
@@ -4085,22 +4090,22 @@
"sftp"
],
"support": {
- "source": "https://github.com/thephpleague/flysystem-sftp-v3/tree/3.28.0"
+ "source": "https://github.com/thephpleague/flysystem-sftp-v3/tree/3.29.0"
},
- "time": "2024-05-06T20:05:52+00:00"
+ "time": "2024-08-14T19:35:54+00:00"
},
{
"name": "league/mime-type-detection",
- "version": "1.15.0",
+ "version": "1.16.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/mime-type-detection.git",
- "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301"
+ "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301",
- "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301",
+ "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9",
+ "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9",
"shasum": ""
},
"require": {
@@ -4131,7 +4136,7 @@
"description": "Mime-type detection for Flysystem",
"support": {
"issues": "https://github.com/thephpleague/mime-type-detection/issues",
- "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0"
+ "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0"
},
"funding": [
{
@@ -4143,7 +4148,7 @@
"type": "tidelift"
}
],
- "time": "2024-01-28T23:22:08+00:00"
+ "time": "2024-09-21T08:32:55+00:00"
},
{
"name": "league/oauth1-client",
@@ -4955,24 +4960,24 @@
},
{
"name": "nette/schema",
- "version": "v1.3.0",
+ "version": "v1.3.2",
"source": {
"type": "git",
"url": "https://github.com/nette/schema.git",
- "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188"
+ "reference": "da801d52f0354f70a638673c4a0f04e16529431d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188",
- "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188",
+ "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d",
+ "reference": "da801d52f0354f70a638673c4a0f04e16529431d",
"shasum": ""
},
"require": {
"nette/utils": "^4.0",
- "php": "8.1 - 8.3"
+ "php": "8.1 - 8.4"
},
"require-dev": {
- "nette/tester": "^2.4",
+ "nette/tester": "^2.5.2",
"phpstan/phpstan-nette": "^1.0",
"tracy/tracy": "^2.8"
},
@@ -5011,9 +5016,9 @@
],
"support": {
"issues": "https://github.com/nette/schema/issues",
- "source": "https://github.com/nette/schema/tree/v1.3.0"
+ "source": "https://github.com/nette/schema/tree/v1.3.2"
},
- "time": "2023-12-11T11:54:22+00:00"
+ "time": "2024-10-06T23:10:23+00:00"
},
{
"name": "nette/utils",
@@ -5103,16 +5108,16 @@
},
{
"name": "nikic/php-parser",
- "version": "v5.1.0",
+ "version": "v5.3.1",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1"
+ "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1",
- "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b",
+ "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b",
"shasum": ""
},
"require": {
@@ -5155,9 +5160,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1"
},
- "time": "2024-07-01T20:03:41+00:00"
+ "time": "2024-10-08T18:51:32+00:00"
},
{
"name": "nubs/random-name-generator",
@@ -5897,16 +5902,16 @@
},
{
"name": "phpseclib/phpseclib",
- "version": "3.0.41",
+ "version": "3.0.42",
"source": {
"type": "git",
"url": "https://github.com/phpseclib/phpseclib.git",
- "reference": "621c73f7dcb310b61de34d1da4c4204e8ace6ceb"
+ "reference": "db92f1b1987b12b13f248fe76c3a52cadb67bb98"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/621c73f7dcb310b61de34d1da4c4204e8ace6ceb",
- "reference": "621c73f7dcb310b61de34d1da4c4204e8ace6ceb",
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/db92f1b1987b12b13f248fe76c3a52cadb67bb98",
+ "reference": "db92f1b1987b12b13f248fe76c3a52cadb67bb98",
"shasum": ""
},
"require": {
@@ -5987,7 +5992,7 @@
],
"support": {
"issues": "https://github.com/phpseclib/phpseclib/issues",
- "source": "https://github.com/phpseclib/phpseclib/tree/3.0.41"
+ "source": "https://github.com/phpseclib/phpseclib/tree/3.0.42"
},
"funding": [
{
@@ -6003,20 +6008,20 @@
"type": "tidelift"
}
],
- "time": "2024-08-12T00:13:54+00:00"
+ "time": "2024-09-16T03:06:04+00:00"
},
{
"name": "phpstan/phpdoc-parser",
- "version": "1.30.1",
+ "version": "1.32.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
- "reference": "51b95ec8670af41009e2b2b56873bad96682413e"
+ "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/51b95ec8670af41009e2b2b56873bad96682413e",
- "reference": "51b95ec8670af41009e2b2b56873bad96682413e",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4",
+ "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4",
"shasum": ""
},
"require": {
@@ -6048,22 +6053,22 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
- "source": "https://github.com/phpstan/phpdoc-parser/tree/1.30.1"
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/1.32.0"
},
- "time": "2024-09-07T20:13:05+00:00"
+ "time": "2024-09-26T07:23:32+00:00"
},
{
"name": "phpstan/phpstan",
- "version": "1.12.3",
+ "version": "1.12.6",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "0fcbf194ab63d8159bb70d9aa3e1350051632009"
+ "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0fcbf194ab63d8159bb70d9aa3e1350051632009",
- "reference": "0fcbf194ab63d8159bb70d9aa3e1350051632009",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc4d2f145a88ea7141ae698effd64d9df46527ae",
+ "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae",
"shasum": ""
},
"require": {
@@ -6108,7 +6113,7 @@
"type": "github"
}
],
- "time": "2024-09-09T08:10:35+00:00"
+ "time": "2024-10-06T15:03:59+00:00"
},
{
"name": "pion/laravel-chunk-upload",
@@ -6814,16 +6819,16 @@
},
{
"name": "purplepixie/phpdns",
- "version": "2.1.1",
+ "version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/purplepixie/phpdns.git",
- "reference": "18cd3a43fadcfd16e2789e3c78a264945f6cbfad"
+ "reference": "2b77de5bb218bc4e5d9c4a4a12bd18fe80a6ab4d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/purplepixie/phpdns/zipball/18cd3a43fadcfd16e2789e3c78a264945f6cbfad",
- "reference": "18cd3a43fadcfd16e2789e3c78a264945f6cbfad",
+ "url": "https://api.github.com/repos/purplepixie/phpdns/zipball/2b77de5bb218bc4e5d9c4a4a12bd18fe80a6ab4d",
+ "reference": "2b77de5bb218bc4e5d9c4a4a12bd18fe80a6ab4d",
"shasum": ""
},
"require": {
@@ -6856,9 +6861,9 @@
"description": "PHP DNS Direct Query Module",
"support": {
"issues": "https://github.com/purplepixie/phpdns/issues",
- "source": "https://github.com/purplepixie/phpdns/tree/2.1.1"
+ "source": "https://github.com/purplepixie/phpdns/tree/2.2.0"
},
- "time": "2024-05-27T13:27:50+00:00"
+ "time": "2024-09-26T14:39:58+00:00"
},
{
"name": "pusher/pusher-php-server",
@@ -7148,21 +7153,21 @@
},
{
"name": "rector/rector",
- "version": "1.2.5",
+ "version": "1.2.6",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
- "reference": "e98aa793ca3fcd17e893cfaf9103ac049775d339"
+ "reference": "6ca85da28159dbd3bb36211c5104b7bc91278e99"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/rectorphp/rector/zipball/e98aa793ca3fcd17e893cfaf9103ac049775d339",
- "reference": "e98aa793ca3fcd17e893cfaf9103ac049775d339",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/6ca85da28159dbd3bb36211c5104b7bc91278e99",
+ "reference": "6ca85da28159dbd3bb36211c5104b7bc91278e99",
"shasum": ""
},
"require": {
"php": "^7.2|^8.0",
- "phpstan/phpstan": "^1.12.2"
+ "phpstan/phpstan": "^1.12.5"
},
"conflict": {
"rector/rector-doctrine": "*",
@@ -7195,7 +7200,7 @@
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
- "source": "https://github.com/rectorphp/rector/tree/1.2.5"
+ "source": "https://github.com/rectorphp/rector/tree/1.2.6"
},
"funding": [
{
@@ -7203,7 +7208,7 @@
"type": "github"
}
],
- "time": "2024-09-08T17:43:24+00:00"
+ "time": "2024-10-03T08:56:44+00:00"
},
{
"name": "resend/resend-laravel",
@@ -7494,16 +7499,16 @@
},
{
"name": "sentry/sentry-laravel",
- "version": "4.8.0",
+ "version": "4.9.0",
"source": {
"type": "git",
"url": "https://github.com/getsentry/sentry-laravel.git",
- "reference": "2bbcb7e81097993cf64d5b296eaa6d396cddd5a7"
+ "reference": "73078e1f26d57f7a10e3bee2a2f543a02f6493c3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/2bbcb7e81097993cf64d5b296eaa6d396cddd5a7",
- "reference": "2bbcb7e81097993cf64d5b296eaa6d396cddd5a7",
+ "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/73078e1f26d57f7a10e3bee2a2f543a02f6493c3",
+ "reference": "73078e1f26d57f7a10e3bee2a2f543a02f6493c3",
"shasum": ""
},
"require": {
@@ -7567,7 +7572,7 @@
],
"support": {
"issues": "https://github.com/getsentry/sentry-laravel/issues",
- "source": "https://github.com/getsentry/sentry-laravel/tree/4.8.0"
+ "source": "https://github.com/getsentry/sentry-laravel/tree/4.9.0"
},
"funding": [
{
@@ -7579,7 +7584,7 @@
"type": "custom"
}
],
- "time": "2024-08-15T19:03:01+00:00"
+ "time": "2024-09-19T12:58:53+00:00"
},
{
"name": "socialiteproviders/manager",
@@ -8580,16 +8585,16 @@
},
{
"name": "symfony/console",
- "version": "v7.1.4",
+ "version": "v7.1.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "1eed7af6961d763e7832e874d7f9b21c3ea9c111"
+ "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/1eed7af6961d763e7832e874d7f9b21c3ea9c111",
- "reference": "1eed7af6961d763e7832e874d7f9b21c3ea9c111",
+ "url": "https://api.github.com/repos/symfony/console/zipball/0fa539d12b3ccf068a722bbbffa07ca7079af9ee",
+ "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee",
"shasum": ""
},
"require": {
@@ -8653,7 +8658,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.1.4"
+ "source": "https://github.com/symfony/console/tree/v7.1.5"
},
"funding": [
{
@@ -8669,7 +8674,7 @@
"type": "tidelift"
}
],
- "time": "2024-08-15T22:48:53+00:00"
+ "time": "2024-09-20T08:28:38+00:00"
},
{
"name": "symfony/css-selector",
@@ -9100,16 +9105,16 @@
},
{
"name": "symfony/http-foundation",
- "version": "v7.1.3",
+ "version": "v7.1.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "f602d5c17d1fa02f8019ace2687d9d136b7f4a1a"
+ "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f602d5c17d1fa02f8019ace2687d9d136b7f4a1a",
- "reference": "f602d5c17d1fa02f8019ace2687d9d136b7f4a1a",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e30ef73b1e44eea7eb37ba69600a354e553f694b",
+ "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b",
"shasum": ""
},
"require": {
@@ -9157,7 +9162,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v7.1.3"
+ "source": "https://github.com/symfony/http-foundation/tree/v7.1.5"
},
"funding": [
{
@@ -9173,20 +9178,20 @@
"type": "tidelift"
}
],
- "time": "2024-07-26T12:41:01+00:00"
+ "time": "2024-09-20T08:28:38+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v7.1.4",
+ "version": "v7.1.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "6efcbd1b3f444f631c386504fc83eeca25963747"
+ "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6efcbd1b3f444f631c386504fc83eeca25963747",
- "reference": "6efcbd1b3f444f631c386504fc83eeca25963747",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/44204d96150a9df1fc57601ec933d23fefc2d65b",
+ "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b",
"shasum": ""
},
"require": {
@@ -9271,7 +9276,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v7.1.4"
+ "source": "https://github.com/symfony/http-kernel/tree/v7.1.5"
},
"funding": [
{
@@ -9287,20 +9292,20 @@
"type": "tidelift"
}
],
- "time": "2024-08-30T17:02:28+00:00"
+ "time": "2024-09-21T06:09:21+00:00"
},
{
"name": "symfony/mailer",
- "version": "v7.1.2",
+ "version": "v7.1.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
- "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee"
+ "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mailer/zipball/8fcff0af9043c8f8a8e229437cea363e282f9aee",
- "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/bbf21460c56f29810da3df3e206e38dfbb01e80b",
+ "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b",
"shasum": ""
},
"require": {
@@ -9351,7 +9356,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/mailer/tree/v7.1.2"
+ "source": "https://github.com/symfony/mailer/tree/v7.1.5"
},
"funding": [
{
@@ -9367,20 +9372,20 @@
"type": "tidelift"
}
],
- "time": "2024-06-28T08:00:31+00:00"
+ "time": "2024-09-08T12:32:26+00:00"
},
{
"name": "symfony/mime",
- "version": "v7.1.4",
+ "version": "v7.1.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
- "reference": "ccaa6c2503db867f472a587291e764d6a1e58758"
+ "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/ccaa6c2503db867f472a587291e764d6a1e58758",
- "reference": "ccaa6c2503db867f472a587291e764d6a1e58758",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff",
+ "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff",
"shasum": ""
},
"require": {
@@ -9435,7 +9440,7 @@
"mime-type"
],
"support": {
- "source": "https://github.com/symfony/mime/tree/v7.1.4"
+ "source": "https://github.com/symfony/mime/tree/v7.1.5"
},
"funding": [
{
@@ -9451,7 +9456,7 @@
"type": "tidelift"
}
],
- "time": "2024-08-13T14:28:19+00:00"
+ "time": "2024-09-20T08:28:38+00:00"
},
{
"name": "symfony/options-resolver",
@@ -10238,16 +10243,16 @@
},
{
"name": "symfony/process",
- "version": "v7.1.3",
+ "version": "v7.1.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "7f2f542c668ad6c313dc4a5e9c3321f733197eca"
+ "reference": "5c03ee6369281177f07f7c68252a280beccba847"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/7f2f542c668ad6c313dc4a5e9c3321f733197eca",
- "reference": "7f2f542c668ad6c313dc4a5e9c3321f733197eca",
+ "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847",
+ "reference": "5c03ee6369281177f07f7c68252a280beccba847",
"shasum": ""
},
"require": {
@@ -10279,7 +10284,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v7.1.3"
+ "source": "https://github.com/symfony/process/tree/v7.1.5"
},
"funding": [
{
@@ -10295,7 +10300,7 @@
"type": "tidelift"
}
],
- "time": "2024-07-26T12:44:47+00:00"
+ "time": "2024-09-19T21:48:23+00:00"
},
{
"name": "symfony/psr-http-message-bridge",
@@ -10608,16 +10613,16 @@
},
{
"name": "symfony/string",
- "version": "v7.1.4",
+ "version": "v7.1.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "6cd670a6d968eaeb1c77c2e76091c45c56bc367b"
+ "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/6cd670a6d968eaeb1c77c2e76091c45c56bc367b",
- "reference": "6cd670a6d968eaeb1c77c2e76091c45c56bc367b",
+ "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306",
+ "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306",
"shasum": ""
},
"require": {
@@ -10675,7 +10680,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.1.4"
+ "source": "https://github.com/symfony/string/tree/v7.1.5"
},
"funding": [
{
@@ -10691,20 +10696,20 @@
"type": "tidelift"
}
],
- "time": "2024-08-12T09:59:40+00:00"
+ "time": "2024-09-20T08:28:38+00:00"
},
{
"name": "symfony/translation",
- "version": "v7.1.3",
+ "version": "v7.1.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1"
+ "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/8d5e50c813ba2859a6dfc99a0765c550507934a1",
- "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea",
+ "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea",
"shasum": ""
},
"require": {
@@ -10769,7 +10774,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/translation/tree/v7.1.3"
+ "source": "https://github.com/symfony/translation/tree/v7.1.5"
},
"funding": [
{
@@ -10785,7 +10790,7 @@
"type": "tidelift"
}
],
- "time": "2024-07-26T12:41:01+00:00"
+ "time": "2024-09-16T06:30:38+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -10867,16 +10872,16 @@
},
{
"name": "symfony/uid",
- "version": "v7.1.4",
+ "version": "v7.1.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/uid.git",
- "reference": "82177535395109075cdb45a70533aa3d7a521cdf"
+ "reference": "8c7bb8acb933964055215d89f9a9871df0239317"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/uid/zipball/82177535395109075cdb45a70533aa3d7a521cdf",
- "reference": "82177535395109075cdb45a70533aa3d7a521cdf",
+ "url": "https://api.github.com/repos/symfony/uid/zipball/8c7bb8acb933964055215d89f9a9871df0239317",
+ "reference": "8c7bb8acb933964055215d89f9a9871df0239317",
"shasum": ""
},
"require": {
@@ -10921,7 +10926,7 @@
"uuid"
],
"support": {
- "source": "https://github.com/symfony/uid/tree/v7.1.4"
+ "source": "https://github.com/symfony/uid/tree/v7.1.5"
},
"funding": [
{
@@ -10937,20 +10942,20 @@
"type": "tidelift"
}
],
- "time": "2024-08-12T09:59:40+00:00"
+ "time": "2024-09-17T09:16:35+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v7.1.4",
+ "version": "v7.1.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "a5fa7481b199090964d6fd5dab6294d5a870c7aa"
+ "reference": "e20e03889539fd4e4211e14d2179226c513c010d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a5fa7481b199090964d6fd5dab6294d5a870c7aa",
- "reference": "a5fa7481b199090964d6fd5dab6294d5a870c7aa",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d",
+ "reference": "e20e03889539fd4e4211e14d2179226c513c010d",
"shasum": ""
},
"require": {
@@ -11004,7 +11009,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v7.1.4"
+ "source": "https://github.com/symfony/var-dumper/tree/v7.1.5"
},
"funding": [
{
@@ -11020,20 +11025,20 @@
"type": "tidelift"
}
],
- "time": "2024-08-30T16:12:47+00:00"
+ "time": "2024-09-16T10:07:02+00:00"
},
{
"name": "symfony/yaml",
- "version": "v6.4.11",
+ "version": "v6.4.12",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "be37e7f13195e05ab84ca5269365591edd240335"
+ "reference": "762ee56b2649659380e0ef4d592d807bc17b7971"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/be37e7f13195e05ab84ca5269365591edd240335",
- "reference": "be37e7f13195e05ab84ca5269365591edd240335",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/762ee56b2649659380e0ef4d592d807bc17b7971",
+ "reference": "762ee56b2649659380e0ef4d592d807bc17b7971",
"shasum": ""
},
"require": {
@@ -11076,7 +11081,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/yaml/tree/v6.4.11"
+ "source": "https://github.com/symfony/yaml/tree/v6.4.12"
},
"funding": [
{
@@ -11092,7 +11097,7 @@
"type": "tidelift"
}
],
- "time": "2024-08-12T09:55:28+00:00"
+ "time": "2024-09-17T12:47:12+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@@ -11742,16 +11747,16 @@
},
{
"name": "zircote/swagger-php",
- "version": "4.10.6",
+ "version": "4.11.0",
"source": {
"type": "git",
"url": "https://github.com/zircote/swagger-php.git",
- "reference": "e462ff5269ea0ec91070edd5d51dc7215bdea3b6"
+ "reference": "3b6f3800f4fd6544ada4dce180c6b69eaead7c7c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zircote/swagger-php/zipball/e462ff5269ea0ec91070edd5d51dc7215bdea3b6",
- "reference": "e462ff5269ea0ec91070edd5d51dc7215bdea3b6",
+ "url": "https://api.github.com/repos/zircote/swagger-php/zipball/3b6f3800f4fd6544ada4dce180c6b69eaead7c7c",
+ "reference": "3b6f3800f4fd6544ada4dce180c6b69eaead7c7c",
"shasum": ""
},
"require": {
@@ -11765,7 +11770,7 @@
"require-dev": {
"composer/package-versions-deprecated": "^1.11",
"doctrine/annotations": "^1.7 || ^2.0",
- "friendsofphp/php-cs-fixer": "^2.17 || ^3.47.1",
+ "friendsofphp/php-cs-fixer": "^2.17 || 3.62.0",
"phpstan/phpstan": "^1.6",
"phpunit/phpunit": ">=8",
"vimeo/psalm": "^4.23"
@@ -11817,31 +11822,31 @@
],
"support": {
"issues": "https://github.com/zircote/swagger-php/issues",
- "source": "https://github.com/zircote/swagger-php/tree/4.10.6"
+ "source": "https://github.com/zircote/swagger-php/tree/4.11.0"
},
- "time": "2024-07-26T03:04:43+00:00"
+ "time": "2024-10-09T03:11:12+00:00"
}
],
"packages-dev": [
{
"name": "barryvdh/laravel-debugbar",
- "version": "v3.13.5",
+ "version": "v3.14.3",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-debugbar.git",
- "reference": "92d86be45ee54edff735e46856f64f14b6a8bb07"
+ "reference": "c0bee7c08ae2429e4a9ed2bc75679b012db6e3bd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/92d86be45ee54edff735e46856f64f14b6a8bb07",
- "reference": "92d86be45ee54edff735e46856f64f14b6a8bb07",
+ "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/c0bee7c08ae2429e4a9ed2bc75679b012db6e3bd",
+ "reference": "c0bee7c08ae2429e4a9ed2bc75679b012db6e3bd",
"shasum": ""
},
"require": {
"illuminate/routing": "^9|^10|^11",
"illuminate/session": "^9|^10|^11",
"illuminate/support": "^9|^10|^11",
- "maximebf/debugbar": "~1.22.0",
+ "maximebf/debugbar": "~1.23.0",
"php": "^8.0",
"symfony/finder": "^6|^7"
},
@@ -11854,7 +11859,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.13-dev"
+ "dev-master": "3.14-dev"
},
"laravel": {
"providers": [
@@ -11893,7 +11898,7 @@
],
"support": {
"issues": "https://github.com/barryvdh/laravel-debugbar/issues",
- "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.13.5"
+ "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.3"
},
"funding": [
{
@@ -11905,7 +11910,7 @@
"type": "github"
}
],
- "time": "2024-04-12T11:20:37+00:00"
+ "time": "2024-10-02T09:17:49+00:00"
},
{
"name": "brianium/paratest",
@@ -12127,26 +12132,26 @@
},
{
"name": "filp/whoops",
- "version": "2.15.4",
+ "version": "2.16.0",
"source": {
"type": "git",
"url": "https://github.com/filp/whoops.git",
- "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546"
+ "reference": "befcdc0e5dce67252aa6322d82424be928214fa2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546",
- "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2",
+ "reference": "befcdc0e5dce67252aa6322d82424be928214fa2",
"shasum": ""
},
"require": {
- "php": "^5.5.9 || ^7.0 || ^8.0",
+ "php": "^7.1 || ^8.0",
"psr/log": "^1.0.1 || ^2.0 || ^3.0"
},
"require-dev": {
- "mockery/mockery": "^0.9 || ^1.0",
- "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
- "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3",
+ "symfony/var-dumper": "^4.0 || ^5.0"
},
"suggest": {
"symfony/var-dumper": "Pretty print complex values better with var-dumper available",
@@ -12186,7 +12191,7 @@
],
"support": {
"issues": "https://github.com/filp/whoops/issues",
- "source": "https://github.com/filp/whoops/tree/2.15.4"
+ "source": "https://github.com/filp/whoops/tree/2.16.0"
},
"funding": [
{
@@ -12194,7 +12199,7 @@
"type": "github"
}
],
- "time": "2023-11-03T12:00:00+00:00"
+ "time": "2024-09-25T12:00:00+00:00"
},
{
"name": "hamcrest/hamcrest-php",
@@ -12249,16 +12254,16 @@
},
{
"name": "laravel/dusk",
- "version": "v8.2.5",
+ "version": "v8.2.8",
"source": {
"type": "git",
"url": "https://github.com/laravel/dusk.git",
- "reference": "e641800393ce4ad39f0a47133f51aae67ceb01ad"
+ "reference": "5bff1e8dd87ec653a2202475377152e5d14fde40"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/dusk/zipball/e641800393ce4ad39f0a47133f51aae67ceb01ad",
- "reference": "e641800393ce4ad39f0a47133f51aae67ceb01ad",
+ "url": "https://api.github.com/repos/laravel/dusk/zipball/5bff1e8dd87ec653a2202475377152e5d14fde40",
+ "reference": "5bff1e8dd87ec653a2202475377152e5d14fde40",
"shasum": ""
},
"require": {
@@ -12315,22 +12320,22 @@
],
"support": {
"issues": "https://github.com/laravel/dusk/issues",
- "source": "https://github.com/laravel/dusk/tree/v8.2.5"
+ "source": "https://github.com/laravel/dusk/tree/v8.2.8"
},
- "time": "2024-08-26T12:34:33+00:00"
+ "time": "2024-10-04T14:02:20+00:00"
},
{
"name": "laravel/pint",
- "version": "v1.17.3",
+ "version": "v1.18.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/pint.git",
- "reference": "9d77be916e145864f10788bb94531d03e1f7b482"
+ "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/pint/zipball/9d77be916e145864f10788bb94531d03e1f7b482",
- "reference": "9d77be916e145864f10788bb94531d03e1f7b482",
+ "url": "https://api.github.com/repos/laravel/pint/zipball/35c00c05ec43e6b46d295efc0f4386ceb30d50d9",
+ "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9",
"shasum": ""
},
"require": {
@@ -12383,20 +12388,20 @@
"issues": "https://github.com/laravel/pint/issues",
"source": "https://github.com/laravel/pint"
},
- "time": "2024-09-03T15:00:28+00:00"
+ "time": "2024-09-24T17:22:50+00:00"
},
{
"name": "maximebf/debugbar",
- "version": "v1.22.5",
+ "version": "v1.23.2",
"source": {
"type": "git",
"url": "https://github.com/maximebf/php-debugbar.git",
- "reference": "1b5cabe0ce013134cf595bfa427bbf2f6abcd989"
+ "reference": "689720d724c771ac4add859056744b7b3f2406da"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/1b5cabe0ce013134cf595bfa427bbf2f6abcd989",
- "reference": "1b5cabe0ce013134cf595bfa427bbf2f6abcd989",
+ "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/689720d724c771ac4add859056744b7b3f2406da",
+ "reference": "689720d724c771ac4add859056744b7b3f2406da",
"shasum": ""
},
"require": {
@@ -12418,7 +12423,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.22-dev"
+ "dev-master": "1.23-dev"
}
},
"autoload": {
@@ -12449,9 +12454,9 @@
],
"support": {
"issues": "https://github.com/maximebf/php-debugbar/issues",
- "source": "https://github.com/maximebf/php-debugbar/tree/v1.22.5"
+ "source": "https://github.com/maximebf/php-debugbar/tree/v1.23.2"
},
- "time": "2024-09-09T08:05:55+00:00"
+ "time": "2024-09-16T11:23:09+00:00"
},
{
"name": "mockery/mockery",
@@ -14892,16 +14897,16 @@
},
{
"name": "symfony/http-client",
- "version": "v6.4.11",
+ "version": "v6.4.12",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client.git",
- "reference": "4c92046bb788648ff1098cc66da69aa7eac8cb65"
+ "reference": "fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-client/zipball/4c92046bb788648ff1098cc66da69aa7eac8cb65",
- "reference": "4c92046bb788648ff1098cc66da69aa7eac8cb65",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56",
+ "reference": "fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56",
"shasum": ""
},
"require": {
@@ -14965,7 +14970,7 @@
"http"
],
"support": {
- "source": "https://github.com/symfony/http-client/tree/v6.4.11"
+ "source": "https://github.com/symfony/http-client/tree/v6.4.12"
},
"funding": [
{
@@ -14981,7 +14986,7 @@
"type": "tidelift"
}
],
- "time": "2024-08-26T06:30:21+00:00"
+ "time": "2024-09-20T08:21:33+00:00"
},
{
"name": "symfony/http-client-contracts",
diff --git a/config/sentry.php b/config/sentry.php
index 25cf7e423..e8b6ab098 100644
--- a/config/sentry.php
+++ b/config/sentry.php
@@ -7,7 +7,8 @@ return [
// 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.357',
+ 'release' => '4.0.0-beta.361',
+
// 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 ee8ab588e..0e83ff40e 100644
--- a/config/version.php
+++ b/config/version.php
@@ -1,3 +1,3 @@
dropUnique(['fqdn']);
+ });
+ Schema::table('applications', function (Blueprint $table) {
+ $table->dropUnique(['fqdn']);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('service_applications', function (Blueprint $table) {
+ $table->unique('fqdn');
+ });
+ Schema::table('applications', function (Blueprint $table) {
+ $table->unique('fqdn');
+ });
+ }
+};
diff --git a/database/migrations/2024_10_11_114331_add_required_env_variables.php b/database/migrations/2024_10_11_114331_add_required_env_variables.php
new file mode 100644
index 000000000..4fde0c2bb
--- /dev/null
+++ b/database/migrations/2024_10_11_114331_add_required_env_variables.php
@@ -0,0 +1,28 @@
+boolean('is_required')->default(false);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('environment_variables', function (Blueprint $table) {
+ $table->dropColumn('is_required');
+ });
+ }
+};
diff --git a/docker/coolify-realtime/package.json b/docker/coolify-realtime/package.json
index 90d4f77db..146e6b90a 100644
--- a/docker/coolify-realtime/package.json
+++ b/docker/coolify-realtime/package.json
@@ -4,7 +4,7 @@
"dependencies": {
"@xterm/addon-fit": "^0.10.0",
"@xterm/xterm": "^5.5.0",
- "cookie": "^0.6.0",
+ "cookie": "^0.7.0",
"axios": "1.7.5",
"dotenv": "^16.4.5",
"node-pty": "^1.0.0",
diff --git a/lang/ar.json b/lang/ar.json
index c5ec96c8d..4b9afbe99 100644
--- a/lang/ar.json
+++ b/lang/ar.json
@@ -26,5 +26,12 @@
"input.code": "الرمز لمرة واحدة",
"input.recovery_code": "رمز الاسترداد",
"button.save": "حفظ",
- "repository.url": "أمثلة
للمستودعات العامة، استخدم https://....
للمستودعات الخاصة، استخدم git@....
سيتم تحديد الفرع main لـ https://github.com/coollabsio/coolify-examples
سيتم تحديد الفرع nodejs-fastify لـ https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify
سيتم تحديد الفرع main لـ https://gitea.com/sedlav/expressjs.git
سيتم تحديد الفرع main لـ https://gitlab.com/andrasbacsai/nodejs-example.git."
+ "repository.url": "أمثلة
للمستودعات العامة، استخدم https://....
للمستودعات الخاصة، استخدم git@....
سيتم تحديد الفرع main لـ https://github.com/coollabsio/coolify-examples
سيتم تحديد الفرع nodejs-fastify لـ https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify
سيتم تحديد الفرع main لـ https://gitea.com/sedlav/expressjs.git
سيتم تحديد الفرع main لـ https://gitlab.com/andrasbacsai/nodejs-example.git.",
+ "service.stop": "سيتم إيقاف هذه الخدمة.",
+ "resource.docker_cleanup": "قم بتشغيل Docker Cleanup (قم بإزالة الصور غير المستخدمة وذاكرة التخزين المؤقت للمنشئ).",
+ "resource.non_persistent": "سيتم حذف جميع البيانات غير الدائمة.",
+ "resource.delete_volumes": "حذف جميع المجلدات والملفات المرتبطة بهذا المورد بشكل دائم.",
+ "resource.delete_connected_networks": "حذف جميع الشبكات غير المحددة مسبقًا والمرتبطة بهذا المورد بشكل دائم.",
+ "resource.delete_configurations": "حذف جميع ملفات التعريف من الخادم بشكل دائم.",
+ "database.delete_backups_locally": "حذف كافة النسخ الاحتياطية نهائيًا من التخزين المحلي."
}
diff --git a/lang/fr.json b/lang/fr.json
index cb089812e..dbd5a1bf7 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -1,30 +1,37 @@
{
- "auth.login": "Connexion",
- "auth.login.azure": "Connexion avec Microsoft",
- "auth.login.bitbucket": "Connexion avec Bitbucket",
- "auth.login.github": "Connexion avec GitHub",
- "auth.login.gitlab": "Connexion avec Gitlab",
- "auth.login.google": "Connexion avec Google",
- "auth.already_registered": "Déjà enregistré ?",
- "auth.confirm_password": "Confirmer le mot de passe",
- "auth.forgot_password": "Mot de passe oublié",
- "auth.forgot_password_send_email": "Envoyer l'email de réinitialisation de mot de passe",
- "auth.register_now": "S'enregistrer",
- "auth.logout": "Déconnexion",
- "auth.register": "S'enregistrer",
- "auth.registration_disabled": "L'enregistrement est désactivé. Merci de contacter l'administateur.",
- "auth.reset_password": "Réinitialiser le mot de passe",
- "auth.failed": "Aucune correspondance n'a été trouvée pour les informations d'identification renseignées.",
- "auth.failed.callback": "Erreur lors du processus de retour de la plateforme de connexion.",
- "auth.failed.password": "Le mot de passe renseigné est incorrect.",
- "auth.failed.email": "Aucun utilisateur avec cette adresse email n'a été trouvé.",
- "auth.throttle": "Trop de tentatives de connexion. Merci de réessayer dans :seconds secondes.",
- "input.name": "Nom",
- "input.email": "Email",
- "input.password": "Mot de passe",
- "input.password.again": "Mot de passe identique",
- "input.code": "Code à usage unique",
- "input.recovery_code": "Code de récupération",
- "button.save": "Sauvegarder",
- "repository.url": "Exemples
Pour les dépôts publiques, utilisez https://....
Pour les dépôts privés, utilisez git@....
https://github.com/coollabsio/coolify-examples main sera la branche selectionnée
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify sera la branche selectionnée.
https://gitea.com/sedlav/expressjs.git main sera la branche selectionnée.
https://gitlab.com/andrasbacsai/nodejs-example.git main sera la branche selectionnée."
+ "auth.login": "Connexion",
+ "auth.login.azure": "Connexion avec Microsoft",
+ "auth.login.bitbucket": "Connexion avec Bitbucket",
+ "auth.login.github": "Connexion avec GitHub",
+ "auth.login.gitlab": "Connexion avec Gitlab",
+ "auth.login.google": "Connexion avec Google",
+ "auth.already_registered": "Déjà enregistré ?",
+ "auth.confirm_password": "Confirmer le mot de passe",
+ "auth.forgot_password": "Mot de passe oublié",
+ "auth.forgot_password_send_email": "Envoyer l'email de réinitialisation de mot de passe",
+ "auth.register_now": "S'enregistrer",
+ "auth.logout": "Déconnexion",
+ "auth.register": "S'enregistrer",
+ "auth.registration_disabled": "L'enregistrement est désactivé. Merci de contacter l'administrateur.",
+ "auth.reset_password": "Réinitialiser le mot de passe",
+ "auth.failed": "Aucune correspondance n'a été trouvée pour les informations d'identification renseignées.",
+ "auth.failed.callback": "Erreur lors du processus de retour de la plateforme de connexion.",
+ "auth.failed.password": "Le mot de passe renseigné est incorrect.",
+ "auth.failed.email": "Aucun utilisateur avec cette adresse email n'a été trouvé.",
+ "auth.throttle": "Trop de tentatives de connexion. Merci de réessayer dans :seconds secondes.",
+ "input.name": "Nom",
+ "input.email": "Email",
+ "input.password": "Mot de passe",
+ "input.password.again": "Mot de passe identique",
+ "input.code": "Code à usage unique",
+ "input.recovery_code": "Code de récupération",
+ "button.save": "Sauvegarder",
+ "repository.url": "Exemples
Pour les dépôts publiques, utilisez https://....
Pour les dépôts privés, utilisez git@....
https://github.com/coollabsio/coolify-examples main sera la branche selectionnée
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify sera la branche selectionnée.
https://gitea.com/sedlav/expressjs.git main sera la branche selectionnée.
https://gitlab.com/andrasbacsai/nodejs-example.git main sera la branche selectionnée.",
+ "service.stop": "Ce service sera arrêté.",
+ "resource.docker_cleanup": "Exécuter le nettoyage Docker (supprimer les images inutilisées et le cache du builder).",
+ "resource.non_persistent": "Toutes les données non persistantes seront supprimées.",
+ "resource.delete_volumes": "Supprimer définitivement tous les volumes associés à cette ressource.",
+ "resource.delete_connected_networks": "Supprimer définitivement tous les réseaux non-prédéfinis associés à cette ressource.",
+ "resource.delete_configurations": "Supprimer définitivement tous les fichiers de configuration du serveur.",
+ "database.delete_backups_locally": "Toutes les sauvegardes seront définitivement supprimées du stockage local."
}
diff --git a/lang/ro.json b/lang/ro.json
new file mode 100644
index 000000000..db1aa85db
--- /dev/null
+++ b/lang/ro.json
@@ -0,0 +1,37 @@
+{
+ "auth.login": "Autentificare",
+ "auth.login.azure": "Autentificare prin Microsoft",
+ "auth.login.bitbucket": "Autentificare prin Bitbucket",
+ "auth.login.github": "Autentificare prin GitHub",
+ "auth.login.gitlab": "Autentificare prin Gitlab",
+ "auth.login.google": "Autentificare prin Google",
+ "auth.already_registered": "Sunteți deja înregistrat?",
+ "auth.confirm_password": "Confirmați parola",
+ "auth.forgot_password": "Ați uitat parola",
+ "auth.forgot_password_send_email": "Trimiteți e-mail-ul pentru resetarea parolei",
+ "auth.register_now": "Înregistrare",
+ "auth.logout": "Deconectare",
+ "auth.register": "Înregistrare",
+ "auth.registration_disabled": "Înregistrarea este dezactivată. Vă rugăm să contactați administratorul site-ului.",
+ "auth.reset_password": "Resetare parolă",
+ "auth.failed": "Autentificare nereușită. Vă rugăm să verificați datele introduse.",
+ "auth.failed.callback": "A apărut o eroare în timpul autentificării cu furnizorul extern.",
+ "auth.failed.password": "Parola furnizată este incorectă.",
+ "auth.failed.email": "Nu putem găsi un utilizator cu această adresă de e-mail.",
+ "auth.throttle": "Prea multe încercări de autentificare. Vă rugăm să încercați din nou în :seconds secunde.",
+ "input.name": "Nume",
+ "input.email": "E-mail",
+ "input.password": "Parolă",
+ "input.password.again": "Repetați parola",
+ "input.code": "Cod de unică folosință",
+ "input.recovery_code": "Cod de recuperare",
+ "button.save": "Salvare",
+ "repository.url": "Exemple
Pentru depozite publice, utilizați https://....
Pentru depozite private, utilizați git@....
https://github.com/coollabsio/coolify-examples va fi selectată ramura main
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify va fi selectată ramura nodejs-fastify.
https://gitea.com/sedlav/expressjs.git va fi selectată ramura main.
https://gitlab.com/andrasbacsai/nodejs-example.git va fi selectată ramura main.",
+ "service.stop": "Acest serviciu va fi oprit.",
+ "resource.docker_cleanup": "Executați curățarea Docker (eliminați imaginile neutilizate și memoria cache a constructorului).",
+ "resource.non_persistent": "Toate datele nepersistente vor fi șterse.",
+ "resource.delete_volumes": "Ștergeți definitiv toate volumele asociate cu această resursă.",
+ "resource.delete_connected_networks": "Ștergeți definitiv toate rețelele non-predefinite asociate cu această resursă.",
+ "resource.delete_configurations": "Ștergeți definitiv toate fișierele de configurare de pe server.",
+ "database.delete_backups_locally": "Toate copiile de rezervă vor fi șterse definitiv din stocarea locală."
+}
diff --git a/public/svgs/affine.svg b/public/svgs/affine.svg
new file mode 100644
index 000000000..d8063e920
--- /dev/null
+++ b/public/svgs/affine.svg
@@ -0,0 +1,88 @@
+
diff --git a/public/svgs/audiobookshelf.svg b/public/svgs/audiobookshelf.svg
new file mode 100644
index 000000000..d641b765b
--- /dev/null
+++ b/public/svgs/audiobookshelf.svg
@@ -0,0 +1,25 @@
+
\ No newline at end of file
diff --git a/public/svgs/azimutt.png b/public/svgs/azimutt.png
new file mode 100644
index 000000000..ef69062cd
Binary files /dev/null and b/public/svgs/azimutt.png differ
diff --git a/public/svgs/bookstack.png b/public/svgs/bookstack.png
new file mode 100644
index 000000000..d10b3ca43
Binary files /dev/null and b/public/svgs/bookstack.png differ
diff --git a/public/svgs/castopod.svg b/public/svgs/castopod.svg
new file mode 100644
index 000000000..c73008400
--- /dev/null
+++ b/public/svgs/castopod.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/public/svgs/cloudbeaver.svg b/public/svgs/cloudbeaver.svg
new file mode 100644
index 000000000..4a7634766
--- /dev/null
+++ b/public/svgs/cloudbeaver.svg
@@ -0,0 +1,7 @@
+
diff --git a/public/svgs/cryptgeon.png b/public/svgs/cryptgeon.png
new file mode 100644
index 000000000..be121cfd0
Binary files /dev/null and b/public/svgs/cryptgeon.png differ
diff --git a/public/svgs/dify.png b/public/svgs/dify.png
new file mode 100644
index 000000000..326acf789
Binary files /dev/null and b/public/svgs/dify.png differ
diff --git a/public/svgs/flowise.png b/public/svgs/flowise.png
new file mode 100644
index 000000000..6b0be0d2a
Binary files /dev/null and b/public/svgs/flowise.png differ
diff --git a/public/svgs/forgejo.svg b/public/svgs/forgejo.svg
new file mode 100644
index 000000000..804b05e28
--- /dev/null
+++ b/public/svgs/forgejo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/svgs/freshrss.png b/public/svgs/freshrss.png
new file mode 100644
index 000000000..d1a75118f
Binary files /dev/null and b/public/svgs/freshrss.png differ
diff --git a/public/svgs/heyform.svg b/public/svgs/heyform.svg
new file mode 100644
index 000000000..ff29ca654
--- /dev/null
+++ b/public/svgs/heyform.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/svgs/homebox.svg b/public/svgs/homebox.svg
new file mode 100644
index 000000000..08670bbb9
--- /dev/null
+++ b/public/svgs/homebox.svg
@@ -0,0 +1,11 @@
+
diff --git a/public/svgs/immich.svg b/public/svgs/immich.svg
new file mode 100644
index 000000000..9d844a772
--- /dev/null
+++ b/public/svgs/immich.svg
@@ -0,0 +1,66 @@
+
+
+
diff --git a/public/svgs/joplin.png b/public/svgs/joplin.png
new file mode 100644
index 000000000..d17a1d2c1
Binary files /dev/null and b/public/svgs/joplin.png differ
diff --git a/public/svgs/keycloak.svg b/public/svgs/keycloak.svg
new file mode 100644
index 000000000..849ac2759
--- /dev/null
+++ b/public/svgs/keycloak.svg
@@ -0,0 +1,55 @@
+
\ No newline at end of file
diff --git a/public/svgs/kimai.svg b/public/svgs/kimai.svg
new file mode 100644
index 000000000..35b146972
--- /dev/null
+++ b/public/svgs/kimai.svg
@@ -0,0 +1,67 @@
+
\ No newline at end of file
diff --git a/public/svgs/libretranslate.svg b/public/svgs/libretranslate.svg
new file mode 100644
index 000000000..103d47d60
--- /dev/null
+++ b/public/svgs/libretranslate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/svgs/litequeen.svg b/public/svgs/litequeen.svg
new file mode 100644
index 000000000..aa0b8e038
--- /dev/null
+++ b/public/svgs/litequeen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/svgs/mattermost.svg b/public/svgs/mattermost.svg
new file mode 100644
index 000000000..b01d38eb7
--- /dev/null
+++ b/public/svgs/mattermost.svg
@@ -0,0 +1,6 @@
+
+