fix: services should have destination as well

This commit is contained in:
Andras Bacsai 2023-10-01 13:59:22 +02:00
parent 23968e7886
commit 9ab5a1f7bd
5 changed files with 78 additions and 9 deletions

View File

@ -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;
}

View File

@ -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);
}
}
}

View File

@ -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();

View File

@ -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(),

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('services', function (Blueprint $table) {
$table->nullableMorphs('destination');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('services', function (Blueprint $table) {
$table->dropMorphs('destination');
});
}
};