From 9ab5a1f7bdfdccfca3c8ca2a17b9f4c7ed04c0a3 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Sun, 1 Oct 2023 13:59:22 +0200 Subject: [PATCH] fix: services should have destination as well --- app/Actions/Service/StartService.php | 12 +++++-- app/Actions/Service/StopService.php | 6 ++-- app/Http/Controllers/ProjectController.php | 8 +++-- app/Models/Service.php | 33 ++++++++++++++++++- ...1815_add_destination_to_services_table.php | 28 ++++++++++++++++ 5 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 database/migrations/2023_09_23_111815_add_destination_to_services_table.php diff --git a/app/Actions/Service/StartService.php b/app/Actions/Service/StartService.php index 10aa885bf..a099d1445 100644 --- a/app/Actions/Service/StartService.php +++ b/app/Actions/Service/StartService.php @@ -13,14 +13,20 @@ public function handle(Service $service) $service->saveComposeConfigs(); $commands[] = "cd " . $service->workdir(); $commands[] = "echo '####### Saved configuration files to {$service->workdir()}.'"; - $commands[] = "echo '####### Creating Docker network.'"; - $commands[] = "docker network create --attachable {$service->uuid} >/dev/null 2>/dev/null || true"; + if (is_null($service->destination)) { + $dockerNetwork = $service->uuid; + $commands[] = "echo '####### Creating Docker network.'"; + $commands[] = "docker network create --attachable {$dockerNetwork} >/dev/null 2>/dev/null || true"; + } $commands[] = "echo '####### Starting service {$service->name} on {$service->server->name}.'"; $commands[] = "echo '####### Pulling images.'"; $commands[] = "docker compose pull"; $commands[] = "echo '####### Starting containers.'"; $commands[] = "docker compose up -d --remove-orphans --force-recreate"; - $commands[] = "docker network connect $service->uuid coolify-proxy 2>/dev/null || true"; + if (is_null($service->destination)) { + $commands[] = "echo '####### Connecting to proxy network.'"; + $commands[] = "docker network connect coolify-proxy {$dockerNetwork} 2>/dev/null || true"; + } $activity = remote_process($commands, $service->server); return $activity; } diff --git a/app/Actions/Service/StopService.php b/app/Actions/Service/StopService.php index 82128f47d..d6ec09de3 100644 --- a/app/Actions/Service/StopService.php +++ b/app/Actions/Service/StopService.php @@ -20,7 +20,9 @@ public function handle(Service $service) instant_remote_process(["docker rm -f {$db->name}-{$service->uuid}"], $service->server); $db->update(['status' => 'exited']); } - instant_remote_process(["docker network disconnect {$service->uuid} coolify-proxy 2>/dev/null"], $service->server, false); - instant_remote_process(["docker network rm {$service->uuid} 2>/dev/null"], $service->server, false); + if (is_null($service->destination)) { + instant_remote_process(["docker network disconnect {$service->uuid} coolify-proxy 2>/dev/null"], $service->server, false); + instant_remote_process(["docker network rm {$service->uuid} 2>/dev/null"], $service->server, false); + } } } diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index 0e4c0e2c7..77c979059 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -6,7 +6,7 @@ use App\Models\Project; use App\Models\Server; use App\Models\Service; -use Illuminate\Support\Facades\Cache; +use App\Models\StandaloneDocker; use Illuminate\Support\Str; class ProjectController extends Controller @@ -66,20 +66,22 @@ public function new() 'database_uuid' => $standalone_postgresql->uuid, ]); } - if ($type->startsWith('one-click-service-') && !is_null( (int)$server_id)) { + if ($type->startsWith('one-click-service-') && !is_null((int)$server_id)) { $oneClickServiceName = $type->after('one-click-service-')->value(); $oneClickService = data_get($services, "$oneClickServiceName.compose"); - ray($oneClickServiceName); $oneClickDotEnvs = data_get($services, "$oneClickServiceName.envs", null); if ($oneClickDotEnvs) { $oneClickDotEnvs = Str::of(base64_decode($oneClickDotEnvs))->split('/\r\n|\r|\n/'); } if ($oneClickService) { + $destination = StandaloneDocker::where('uuid', $destination_uuid)->first(); $service = Service::create([ 'name' => "$oneClickServiceName-" . Str::random(10), 'docker_compose_raw' => base64_decode($oneClickService), 'environment_id' => $environment->id, 'server_id' => (int) $server_id, + 'destination_id' => (int) $destination->id, + 'destination_type' => $destination->getMorphClass(), ]); $service->name = "$oneClickServiceName-" . $service->uuid; $service->save(); diff --git a/app/Models/Service.php b/app/Models/Service.php index 883a2a784..2fbd2ae16 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -59,6 +59,10 @@ public function applications() { return $this->hasMany(ServiceApplication::class); } + public function destination() + { + return $this->morphTo(); + } public function databases() { return $this->hasMany(ServiceDatabase::class); @@ -120,15 +124,23 @@ public function parse(bool $isNew = false): Collection throw new \Exception($e->getMessage()); } + if ($this->server->destinations()->count() === 1) { + $this->destination()->associate($this->server->destinations()->first()); + } $topLevelVolumes = collect(data_get($yaml, 'volumes', [])); $topLevelNetworks = collect(data_get($yaml, 'networks', [])); $dockerComposeVersion = data_get($yaml, 'version') ?? '3.8'; $services = data_get($yaml, 'services'); - $definedNetwork = $this->uuid; + if ($this->destination) { + $definedNetwork = $this->destination->network; + } else { + $definedNetwork = $this->uuid; + } $generatedServiceFQDNS = collect([]); $services = collect($services)->map(function ($service, $serviceName) use ($topLevelVolumes, $topLevelNetworks, $definedNetwork, $isNew, $generatedServiceFQDNS) { + $serviceName = Str::of($serviceName)->before("-$this->uuid")->value; $serviceVolumes = collect(data_get($service, 'volumes', [])); $servicePorts = collect(data_get($service, 'ports', [])); $serviceNetworks = collect(data_get($service, 'networks', [])); @@ -493,6 +505,25 @@ public function parse(bool $isNew = false): Collection data_set($service, 'environment', $withoutServiceEnvs->toArray()); return $service; }); + $services = $services->mapWithKeys(function ($service, $serviceName) { + if (!Str::of($serviceName)->contains($this->uuid)) { + $newServiceName = $serviceName . '-' . $this->uuid; + return [$newServiceName => $service]; + } + return [$serviceName => $service]; + }); + + $yaml = collect($yaml); + $yamlServices = collect(data_get($yaml, 'services', [])); + $yamlServices = $yamlServices->mapWithKeys(function ($service, $serviceName) { + if (!Str::of($serviceName)->contains($this->uuid)) { + $newServiceName = $serviceName . '-' . $this->uuid; + return [$newServiceName => $service]; + } + return [$serviceName => $service]; + }); + $yaml->put('services', $yamlServices->toArray()); + $yaml = $yaml->toArray(); $finalServices = [ 'version' => $dockerComposeVersion, 'services' => $services->toArray(), diff --git a/database/migrations/2023_09_23_111815_add_destination_to_services_table.php b/database/migrations/2023_09_23_111815_add_destination_to_services_table.php new file mode 100644 index 000000000..2ec71bfdb --- /dev/null +++ b/database/migrations/2023_09_23_111815_add_destination_to_services_table.php @@ -0,0 +1,28 @@ +nullableMorphs('destination'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('services', function (Blueprint $table) { + $table->dropMorphs('destination'); + }); + } +};