From 3cd185aa789cd191fee6ab599df71dfb5563af20 Mon Sep 17 00:00:00 2001 From: David Buday Date: Mon, 11 Nov 2024 10:26:24 +0100 Subject: [PATCH] chore: changed migrations, created registries, initial progress --- app/Jobs/ApplicationDeploymentJob.php | 10 ++-- app/Livewire/Project/Application/General.php | 23 +++++--- app/Livewire/Project/New/DockerImage.php | 43 +++++--------- app/Models/Application.php | 57 ++++++++++--------- app/Models/Registry.php | 39 +++++++++++++ ...43_add_registry_to_applications_table.php} | 10 +--- ...4_11_10_203115_create_registries_table.php | 38 +++++++++++++ .../project/application/general.blade.php | 20 +++---- 8 files changed, 152 insertions(+), 88 deletions(-) create mode 100644 app/Models/Registry.php rename database/migrations/{2024_11_08_084443_add_registry_auth_to_applications_table.php => 2024_11_08_084443_add_registry_to_applications_table.php} (60%) create mode 100644 database/migrations/2024_11_10_203115_create_registries_table.php diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php index ffc0a5051..e480a6fc7 100644 --- a/app/Jobs/ApplicationDeploymentJob.php +++ b/app/Jobs/ApplicationDeploymentJob.php @@ -2477,11 +2477,13 @@ COPY ./nginx.conf /etc/nginx/conf.d/default.conf"); private function handleRegistryAuth() { - $username = $this->application->docker_registry_username; - $registry = $this->application->docker_registry_url ?: 'docker.io'; - $token = escapeshellarg($this->application->docker_registry_token); + //$registry = $this->$application->registry; ?? + //$token = escapeshellarg($registry->token); ... + $token = escapeshellarg('test'); + $url = escapeshellarg('test'); + $username = escapeshellarg('test'); $this->application_deployment_queue->addLogEntry('Attempting to log into registry...'); - $command = "echo {{secrets.token}} | docker login {$registry} -u {$username} --password-stdin"; + $command = "echo {{secrets.token}} | docker login {$url} -u {$username} --password-stdin"; $this->execute_remote_command( [ diff --git a/app/Livewire/Project/Application/General.php b/app/Livewire/Project/Application/General.php index 6d9cd8765..d1e905dd9 100644 --- a/app/Livewire/Project/Application/General.php +++ b/app/Livewire/Project/Application/General.php @@ -4,6 +4,7 @@ namespace App\Livewire\Project\Application; use App\Actions\Application\GenerateConfig; use App\Models\Application; +use App\Models\Registry; use Illuminate\Support\Collection; use Livewire\Component; use Spatie\Url\Url; @@ -72,9 +73,7 @@ class General extends Component 'application.docker_registry_image_name' => 'nullable', 'application.docker_registry_image_tag' => 'nullable', 'application.docker_use_custom_registry' => 'boolean', - 'application.docker_registry_url' => 'nullable', - 'application.docker_registry_username' => 'nullable|required_if:application.docker_use_custom_registry,true', - 'application.docker_registry_token' => 'nullable|required_if:application.docker_use_custom_registry,true', + 'application.docker_registry_id' => 'nullable|required_if:application.docker_use_custom_registry,true', 'application.dockerfile_location' => 'nullable', 'application.docker_compose_location' => 'nullable', 'application.docker_compose' => 'nullable', @@ -116,10 +115,8 @@ class General extends Component 'application.dockerfile' => 'Dockerfile', 'application.docker_registry_image_name' => 'Docker registry image name', 'application.docker_registry_image_tag' => 'Docker registry image tag', - 'application.docker_use_custom_registry' => 'Docker use custom registry', - 'application.docker_registry_url' => 'Registry URL', - 'application.docker_registry_username' => 'Registry Username', - 'application.docker_registry_token' => 'Registry Token', + 'application.docker_use_custom_registry' => 'Use private registry', + 'application.docker_registry_id' => 'Registry', 'application.dockerfile_location' => 'Dockerfile location', 'application.docker_compose_location' => 'Docker compose location', 'application.docker_compose' => 'Docker compose', @@ -322,7 +319,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).'); @@ -381,6 +378,7 @@ class General extends Component if (data_get($this->application, 'build_pack') === 'dockerimage') { $this->validate([ 'application.docker_registry_image_name' => 'required', + 'application.docker_registry_id' => 'required_if:application.docker_use_custom_registry,true', ]); } @@ -439,7 +437,14 @@ class General extends Component echo $config; }, $fileName, [ 'Content-Type' => 'application/json', - 'Content-Disposition' => 'attachment; filename='.$fileName, + 'Content-Disposition' => 'attachment; filename=' . $fileName, + ]); + } + + public function render() + { + return view('livewire.project.application.general', [ + 'registries' => Registry::all(), ]); } } diff --git a/app/Livewire/Project/New/DockerImage.php b/app/Livewire/Project/New/DockerImage.php index 4e70a7e4b..936e22b5e 100644 --- a/app/Livewire/Project/New/DockerImage.php +++ b/app/Livewire/Project/New/DockerImage.php @@ -3,6 +3,7 @@ namespace App\Livewire\Project\New; use App\Models\Application; +use App\Models\Registry; use App\Models\Project; use App\Models\StandaloneDocker; use App\Models\SwarmDocker; @@ -12,18 +13,14 @@ use Visus\Cuid2\Cuid2; class DockerImage extends Component { public string $dockerImage = ''; - public ?string $registryUsername = null; - public ?string $registryToken = null; - public ?string $registryUrl = 'docker.io'; public bool $useCustomRegistry = false; + public ?int $selectedRegistry = null; public array $parameters; public array $query; protected $rules = [ 'dockerImage' => 'required|string', - 'registryUsername' => 'required_if:useCustomRegistry,true|string|nullable', - 'registryToken' => 'required_if:useCustomRegistry,true|string|nullable', - 'registryUrl' => 'nullable|string', + 'selectedRegistry' => 'nullable|required_if:useCustomRegistry,true', 'useCustomRegistry' => 'boolean' ]; @@ -31,27 +28,15 @@ class DockerImage extends Component { $this->parameters = get_route_parameters(); $this->query = request()->query(); - $this->registryUrl = 'docker.io'; } public function submit() { - $this->validate([ - 'dockerImage' => 'required', - 'registryUsername' => 'required_if:useCustomRegistry,true', - 'registryToken' => 'required_if:useCustomRegistry,true', - ]); - - // Only save registry settings if useCustomRegistry is true - if (!$this->useCustomRegistry) { - $this->registryUsername = null; - $this->registryToken = null; - $this->registryUrl = 'docker.io'; - } - + $this->validate(['dockerImage' => 'required',]); + $image = str($this->dockerImage)->before(':'); - $tag = str($this->dockerImage)->contains(':') ? - str($this->dockerImage)->after(':') : + $tag = str($this->dockerImage)->contains(':') ? + str($this->dockerImage)->after(':') : 'latest'; $destination_uuid = $this->query['destination']; @@ -68,7 +53,7 @@ class DockerImage extends Component $environment = $project->load(['environments'])->environments->where('name', $this->parameters['environment_name'])->first(); $application = Application::create([ - 'name' => 'docker-image-'.new Cuid2, + 'name' => 'docker-image-' . new Cuid2, 'repository_project_id' => 0, 'git_repository' => 'coollabsio/coolify', 'git_branch' => 'main', @@ -76,19 +61,17 @@ class DockerImage extends Component 'ports_exposes' => 80, 'docker_registry_image_name' => $image, 'docker_registry_image_tag' => $tag, + 'docker_use_custom_registry' => $this->useCustomRegistry, + 'docker_registry_id' => $this->selectedRegistry, 'environment_id' => $environment->id, 'destination_id' => $destination->id, 'destination_type' => $destination_class, 'health_check_enabled' => false, - 'docker_use_custom_registry' => $this->useCustomRegistry, - 'docker_registry_url' => $this->registryUrl, - 'docker_registry_username' => $this->registryUsername, - 'docker_registry_token' => $this->registryToken, ]); $fqdn = generateFqdn($destination->server, $application->uuid); $application->update([ - 'name' => 'docker-image-'.$application->uuid, + 'name' => 'docker-image-' . $application->uuid, 'fqdn' => $fqdn, ]); @@ -101,6 +84,8 @@ class DockerImage extends Component public function render() { - return view('livewire.project.new.docker-image'); + return view('livewire.project.new.docker-image', [ + 'registries' => Registry::all() + ]); } } diff --git a/app/Models/Application.php b/app/Models/Application.php index c377d2951..5cd1eb99b 100644 --- a/app/Models/Application.php +++ b/app/Models/Application.php @@ -36,9 +36,7 @@ use Visus\Cuid2\Cuid2; 'docker_registry_image_name' => ['type' => 'string', 'nullable' => true, 'description' => 'Docker registry image name.'], 'docker_registry_image_tag' => ['type' => 'string', 'nullable' => true, 'description' => 'Docker registry image tag.'], 'docker_use_custom_registry' => ['type' => 'boolean', 'description' => 'Use custom registry.'], - 'docker_registry_url' => ['type' => 'string', 'nullable' => true, 'description' => 'Registry URL.'], - 'docker_registry_username' => ['type' => 'string', 'nullable' => true, 'description' => 'Registry username.'], - 'docker_registry_token' => ['type' => 'string', 'nullable' => true, 'description' => 'Registry token.'], + 'docker_registry_id' => ['type' => 'integer', 'nullable' => true, 'description' => 'Docker registry identifier.'], 'build_pack' => ['type' => 'string', 'description' => 'Build pack.', 'enum' => ['nixpacks', 'static', 'dockerfile', 'dockercompose']], 'static_image' => ['type' => 'string', 'description' => 'Static image used when static site is deployed.'], 'install_command' => ['type' => 'string', 'description' => 'Install command.'], @@ -113,12 +111,10 @@ class Application extends BaseModel protected $guarded = []; - protected $casts = [ - 'docker_registry_token' => 'encrypted', - ]; - protected $appends = ['server_status']; + protected $with = ['registry']; + protected static function booted() { static::saving(function ($application) { @@ -243,7 +239,7 @@ class Application extends BaseModel $server = data_get($this, 'destination.server'); $workdir = $this->workdir(); if (str($workdir)->endsWith($this->uuid)) { - instant_remote_process(['rm -rf '.$this->workdir()], $server, false); + instant_remote_process(['rm -rf ' . $this->workdir()], $server, false); } } @@ -377,7 +373,7 @@ class Application extends BaseModel public function publishDirectory(): Attribute { return Attribute::make( - set: fn ($value) => $value ? '/'.ltrim($value, '/') : null, + set: fn($value) => $value ? '/' . ltrim($value, '/') : null, ); } @@ -459,7 +455,7 @@ class Application extends BaseModel $git_repository = str_replace('.git', '', $this->git_repository); $url = Url::fromString($git_repository); $url = $url->withUserInfo(''); - $url = $url->withPath($url->getPath().'/commits/'.$link); + $url = $url->withPath($url->getPath() . '/commits/' . $link); return $url->__toString(); } @@ -512,21 +508,21 @@ class Application extends BaseModel public function baseDirectory(): Attribute { return Attribute::make( - set: fn ($value) => '/'.ltrim($value, '/'), + set: fn($value) => '/' . ltrim($value, '/'), ); } public function portsMappings(): Attribute { return Attribute::make( - set: fn ($value) => $value === '' ? null : $value, + set: fn($value) => $value === '' ? null : $value, ); } public function portsMappingsArray(): Attribute { return Attribute::make( - get: fn () => is_null($this->ports_mappings) + get: fn() => is_null($this->ports_mappings) ? [] : explode(',', $this->ports_mappings), @@ -643,7 +639,7 @@ class Application extends BaseModel public function portsExposesArray(): Attribute { return Attribute::make( - get: fn () => is_null($this->ports_exposes) + get: fn() => is_null($this->ports_exposes) ? [] : explode(',', $this->ports_exposes) ); @@ -860,7 +856,7 @@ class Application extends BaseModel public function workdir() { - return application_configuration_dir()."/{$this->uuid}"; + return application_configuration_dir() . "/{$this->uuid}"; } public function isLogDrainEnabled() @@ -870,7 +866,7 @@ class Application extends BaseModel public function isConfigurationChanged(bool $save = false) { - $newConfigHash = $this->fqdn.$this->git_repository.$this->git_branch.$this->git_commit_sha.$this->build_pack.$this->static_image.$this->install_command.$this->build_command.$this->start_command.$this->ports_exposes.$this->ports_mappings.$this->base_directory.$this->publish_directory.$this->dockerfile.$this->dockerfile_location.$this->custom_labels.$this->custom_docker_run_options.$this->dockerfile_target_build.$this->redirect; + $newConfigHash = $this->fqdn . $this->git_repository . $this->git_branch . $this->git_commit_sha . $this->build_pack . $this->static_image . $this->install_command . $this->build_command . $this->start_command . $this->ports_exposes . $this->ports_mappings . $this->base_directory . $this->publish_directory . $this->dockerfile . $this->dockerfile_location . $this->custom_labels . $this->custom_docker_run_options . $this->dockerfile_target_build . $this->redirect; if ($this->pull_request_id === 0 || $this->pull_request_id === null) { $newConfigHash .= json_encode($this->environment_variables()->get('value')->sort()); } else { @@ -924,7 +920,7 @@ class Application extends BaseModel public function dirOnServer() { - return application_configuration_dir()."/{$this->uuid}"; + return application_configuration_dir() . "/{$this->uuid}"; } public function setGitImportSettings(string $deployment_uuid, string $git_clone_command, bool $public = false) @@ -1048,7 +1044,7 @@ class Application extends BaseModel } else { $commands->push("echo 'Checking out $branch'"); } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git fetch origin $branch && ".$this->buildGitCheckoutCommand($pr_branch_name); + $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git fetch origin $branch && " . $this->buildGitCheckoutCommand($pr_branch_name); } elseif ($git_type === 'github' || $git_type === 'gitea') { $branch = "pull/{$pull_request_id}/head:$pr_branch_name"; if ($exec_in_docker) { @@ -1056,14 +1052,14 @@ class Application extends BaseModel } else { $commands->push("echo 'Checking out $branch'"); } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git fetch origin $branch && ".$this->buildGitCheckoutCommand($pr_branch_name); + $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git fetch origin $branch && " . $this->buildGitCheckoutCommand($pr_branch_name); } elseif ($git_type === 'bitbucket') { if ($exec_in_docker) { $commands->push(executeInDocker($deployment_uuid, "echo 'Checking out $branch'")); } else { $commands->push("echo 'Checking out $branch'"); } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" ".$this->buildGitCheckoutCommand($commit); + $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" " . $this->buildGitCheckoutCommand($commit); } } @@ -1092,7 +1088,7 @@ class Application extends BaseModel } else { $commands->push("echo 'Checking out $branch'"); } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git fetch origin $branch && ".$this->buildGitCheckoutCommand($pr_branch_name); + $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git fetch origin $branch && " . $this->buildGitCheckoutCommand($pr_branch_name); } elseif ($git_type === 'github' || $git_type === 'gitea') { $branch = "pull/{$pull_request_id}/head:$pr_branch_name"; if ($exec_in_docker) { @@ -1100,14 +1096,14 @@ class Application extends BaseModel } else { $commands->push("echo 'Checking out $branch'"); } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git fetch origin $branch && ".$this->buildGitCheckoutCommand($pr_branch_name); + $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git fetch origin $branch && " . $this->buildGitCheckoutCommand($pr_branch_name); } elseif ($git_type === 'bitbucket') { if ($exec_in_docker) { $commands->push(executeInDocker($deployment_uuid, "echo 'Checking out $branch'")); } else { $commands->push("echo 'Checking out $branch'"); } - $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" ".$this->buildGitCheckoutCommand($commit); + $git_clone_command = "{$git_clone_command} && cd {$baseDir} && GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" " . $this->buildGitCheckoutCommand($commit); } } @@ -1160,7 +1156,7 @@ class Application extends BaseModel } if ($source->startsWith('.')) { $source = $source->after('.'); - $source = $workdir.$source; + $source = $workdir . $source; } $commands->push("mkdir -p $source > /dev/null 2>&1 || true"); } @@ -1171,7 +1167,7 @@ class Application extends BaseModel $labels->push('coolify.managed=true'); } if (! $labels->contains('coolify.applicationId')) { - $labels->push('coolify.applicationId='.$this->id); + $labels->push('coolify.applicationId=' . $this->id); } if (! $labels->contains('coolify.type')) { $labels->push('coolify.type=application'); @@ -1291,7 +1287,7 @@ class Application extends BaseModel public function fqdns(): Attribute { return Attribute::make( - get: fn () => is_null($this->fqdn) + get: fn() => is_null($this->fqdn) ? [] : explode(',', $this->fqdn), ); @@ -1352,10 +1348,10 @@ class Application extends BaseModel continue; } if (isset($healthcheckCommand) && str_contains($trimmedLine, '\\')) { - $healthcheckCommand .= ' '.trim($trimmedLine, '\\ '); + $healthcheckCommand .= ' ' . trim($trimmedLine, '\\ '); } if (isset($healthcheckCommand) && ! str_contains($trimmedLine, '\\') && ! empty($healthcheckCommand)) { - $healthcheckCommand .= ' '.$trimmedLine; + $healthcheckCommand .= ' ' . $trimmedLine; break; } } @@ -1537,4 +1533,9 @@ class Application extends BaseModel throw new \Exception('Failed to update application settings'); } } + + public function registry() + { + return $this->belongsTo(Registry::class); + } } diff --git a/app/Models/Registry.php b/app/Models/Registry.php new file mode 100644 index 000000000..8793815a2 --- /dev/null +++ b/app/Models/Registry.php @@ -0,0 +1,39 @@ + 'boolean', + 'token' => 'encrypted', + ]; + + public static function getTypes(): array + { + return [ + 'docker_hub' => 'Docker Hub', + 'gcr' => 'Google Container Registry', + 'ghcr' => 'GitHub Container Registry', + 'quay' => 'Quay.io', + 'custom' => 'Custom Registry' + ]; + } + + public function applications(): HasMany + { + return $this->hasMany(Application::class); + } +} diff --git a/database/migrations/2024_11_08_084443_add_registry_auth_to_applications_table.php b/database/migrations/2024_11_08_084443_add_registry_to_applications_table.php similarity index 60% rename from database/migrations/2024_11_08_084443_add_registry_auth_to_applications_table.php rename to database/migrations/2024_11_08_084443_add_registry_to_applications_table.php index 422503bfc..c01657efe 100644 --- a/database/migrations/2024_11_08_084443_add_registry_auth_to_applications_table.php +++ b/database/migrations/2024_11_08_084443_add_registry_to_applications_table.php @@ -8,9 +8,7 @@ return new class extends Migration { public function up(): void { Schema::table('applications', function (Blueprint $table) { - $table->string('docker_registry_username')->nullable(); - $table->text('docker_registry_token')->nullable(); - $table->string('docker_registry_url')->nullable(); + $table->foreignId('docker_registry_id')->nullable(); $table->boolean('docker_use_custom_registry')->default(false); }); } @@ -18,10 +16,8 @@ return new class extends Migration { public function down(): void { Schema::table('applications', function (Blueprint $table) { - $table->dropColumn('docker_registry_username'); - $table->dropColumn('docker_registry_token'); - $table->dropColumn('docker_registry_url'); + $table->dropColumn('docker_registry_id'); $table->dropColumn('docker_use_custom_registry'); }); } -}; \ No newline at end of file +}; diff --git a/database/migrations/2024_11_10_203115_create_registries_table.php b/database/migrations/2024_11_10_203115_create_registries_table.php new file mode 100644 index 000000000..01cb3e654 --- /dev/null +++ b/database/migrations/2024_11_10_203115_create_registries_table.php @@ -0,0 +1,38 @@ +id(); + $table->string('name'); + $table->string('type'); // docker_hub, gcr, ghcr, quay, custom + $table->string('url')->nullable(); + $table->string('username')->nullable(); + $table->text('token')->nullable(); + $table->boolean('is_default')->default(false); + $table->timestamps(); + }); + + // Add foreign key constraint + Schema::table('applications', function (Blueprint $table) { + $table->foreign('docker_registry_id') + ->references('id') + ->on('docker_registries') + ->nullOnDelete(); + }); + } + + public function down(): void + { + Schema::table('applications', function (Blueprint $table) { + $table->dropForeign(['docker_registry_id']); + }); + + Schema::dropIfExists('docker_registries'); + } +}; diff --git a/resources/views/livewire/project/application/general.blade.php b/resources/views/livewire/project/application/general.blade.php index 5beeb90e0..145c5575a 100644 --- a/resources/views/livewire/project/application/general.blade.php +++ b/resources/views/livewire/project/application/general.blade.php @@ -137,20 +137,18 @@ @if ($application->build_pack === 'dockerimage')
- +
@if ($application->docker_use_custom_registry) -
- - - +
+ + @foreach ($registries as $registry) + + @endforeach +
@endif @endif