From 0f8ccac77570352825207d17b0189319ec02521c Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 25 Sep 2023 17:41:35 +0200 Subject: [PATCH] fix: new service template layout --- app/Http/Controllers/ProjectController.php | 2 +- app/Http/Livewire/Project/New/Select.php | 30 ++++++++++++++-------- app/Models/Service.php | 6 ++--- app/Models/ServiceApplication.php | 7 +++-- examples/docker-compose-uptime.yaml | 5 ++++ examples/service-templates.json | 13 +++++++++- 6 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 examples/docker-compose-uptime.yaml diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index 54aad3454..26b90aa3f 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -67,7 +67,7 @@ public function new() } if ($type->startsWith('one-click-service-')) { $oneClickServiceName = $type->after('one-click-service-')->value(); - $oneClickService = data_get($services, $oneClickServiceName); + $oneClickService = data_get($services, "$oneClickServiceName.compose"); if ($oneClickService) { $service = Service::create([ 'name' => "$oneClickServiceName-" . Str::random(10), diff --git a/app/Http/Livewire/Project/New/Select.php b/app/Http/Livewire/Project/New/Select.php index db4574dae..dd9334e01 100644 --- a/app/Http/Livewire/Project/New/Select.php +++ b/app/Http/Livewire/Project/New/Select.php @@ -6,9 +6,9 @@ use Countable; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Http; use Livewire\Component; -use Illuminate\Support\Str; class Select extends Component { @@ -57,17 +57,27 @@ public function loadServices(bool $forceReload = false) if ($forceReload) { Cache::forget('services'); } - $cached = Cache::remember('services', 3600, function () { - $services = Http::get(config('constants.services.offical')); - if ($services->failed()) { - throw new \Exception($services->body()); - } + if (isDev()) { + $cached = Cache::remember('services', 3600, function () { + $services = File::get(base_path('examples/service-templates.json')); + $services = collect(json_decode($services)); + $this->emit('success', 'Successfully reloaded services from filesystem (development mode).'); + return $services; + }); + } else { + $cached = Cache::remember('services', 3600, function () { + $services = Http::get(config('constants.services.offical')); + if ($services->failed()) { + throw new \Exception($services->body()); + } - $services = collect($services->json()); - $this->emit('success', 'Successfully reloaded services from the internet.'); - return $services; - }); + $services = collect($services->json()); + $this->emit('success', 'Successfully reloaded services from the internet.'); + return $services; + }); + } $this->services = $cached; + } catch (\Throwable $e) { ray($e); return handleError($e, $this); diff --git a/app/Models/Service.php b/app/Models/Service.php index c773153d4..864251260 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -100,12 +100,13 @@ public function saveComposeConfigs() } private function generateFqdn($serviceVariables, $serviceName) { - if (Str::of($serviceVariables)->contains('SERVICE_FQDN') || Str::of($serviceVariables)->contains('SERVICE_URL')) { + // Add sslip.io to the service + // if (Str::of($serviceVariables)->contains('SERVICE_FQDN') || Str::of($serviceVariables)->contains('SERVICE_URL')) { $defaultUsableFqdn = "http://$serviceName-{$this->uuid}.{$this->server->ip}.sslip.io"; if (isDev()) { $defaultUsableFqdn = "http://$serviceName-{$this->uuid}.127.0.0.1.sslip.io"; } - } + // } return $defaultUsableFqdn ?? null; } public function parse(bool $isNew = false): Collection @@ -498,7 +499,6 @@ public function parse(bool $isNew = false): Collection data_forget($service, 'is_database'); data_set($service, 'restart', RESTART_MODE); data_set($service, 'container_name', $container_name); - data_forget($service, 'documentation'); data_forget($service, 'volumes.*.content'); return $service; }); diff --git a/app/Models/ServiceApplication.php b/app/Models/ServiceApplication.php index 626b413e4..2c3bc4f7c 100644 --- a/app/Models/ServiceApplication.php +++ b/app/Models/ServiceApplication.php @@ -3,7 +3,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Symfony\Component\Yaml\Yaml; +use Illuminate\Support\Facades\Cache; class ServiceApplication extends BaseModel { @@ -16,7 +16,10 @@ public function type() } public function documentation() { - return data_get(Yaml::parse($this->service->docker_compose_raw), "services.{$this->name}.documentation", 'https://coolify.io/docs'); + $services = Cache::get('services', []); + $service = data_get($services, $this->name, []); + ray($this->name); + return data_get($service, 'documentation', 'https://coolify.io/docs'); } public function service() { diff --git a/examples/docker-compose-uptime.yaml b/examples/docker-compose-uptime.yaml new file mode 100644 index 000000000..28e7c59bc --- /dev/null +++ b/examples/docker-compose-uptime.yaml @@ -0,0 +1,5 @@ +services: + uptime-kuma: + image: louislam/uptime-kuma:1 + volumes: + - uptime-kuma:/app/data diff --git a/examples/service-templates.json b/examples/service-templates.json index 3eb092f16..83f7b7ffa 100644 --- a/examples/service-templates.json +++ b/examples/service-templates.json @@ -1,3 +1,14 @@ { - "plausible-analytics": "dmVyc2lvbjogIjMuMyIKc2VydmljZXM6CiAgcGxhdXNpYmxlOgogICAgaW1hZ2U6IHBsYXVzaWJsZS9hbmFseXRpY3M6djIuMAogICAgY29tbWFuZDogc2ggLWMgInNsZWVwIDEwICYmIC9lbnRyeXBvaW50LnNoIGRiIGNyZWF0ZWRiICYmIC9lbnRyeXBvaW50LnNoIGRiIG1pZ3JhdGUgJiYgL2VudHJ5cG9pbnQuc2ggcnVuIgogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gREFUQUJBU0VfVVJMPXBvc3RncmVzOi8vcG9zdGdyZXM6JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNAcGxhdXNpYmxlX2RiL3BsYXVzaWJsZQogICAgICAtIEJBU0VfVVJMPSRTRVJWSUNFX0ZRRE5fUExBVVNJQkxFCiAgICAgIC0gU0VDUkVUX0tFWV9CQVNFPSRTRVJWSUNFX0JBU0U2NF82NF9QTEFVU0lCTEUKICAgIGRlcGVuZHNfb246CiAgICAgIC0gcGxhdXNpYmxlX2RiCiAgICAgIC0gcGxhdXNpYmxlX2V2ZW50c19kYgogICAgICAtIG1haWwKCiAgbWFpbDoKICAgIGltYWdlOiBieXRlbWFyay9zbXRwCgogIHBsYXVzaWJsZV9kYjoKICAgIGltYWdlOiBwb3N0Z3JlczoxNC1hbHBpbmUKICAgIHZvbHVtZXM6CiAgICAgIC0gZGItZGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGEKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPU1RHUkVTX0RCPXBsYXVzaWJsZQogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCgogIHBsYXVzaWJsZV9ldmVudHNfZGI6CiAgICBpbWFnZTogY2xpY2tob3VzZS9jbGlja2hvdXNlLXNlcnZlcjoyMy4zLjcuNS1hbHBpbmUKICAgIHZvbHVtZXM6CiAgICAgIC0gdHlwZTogdm9sdW1lCiAgICAgICAgc291cmNlOiBldmVudC1kYXRhCiAgICAgICAgdGFyZ2V0OiAvdmFyL2xpYi9jbGlja2hvdXNlCiAgICAgIC0gdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi9jbGlja2hvdXNlL2NsaWNraG91c2UtY29uZmlnLnhtbAogICAgICAgIHRhcmdldDogL2V0Yy9jbGlja2hvdXNlLXNlcnZlci9jb25maWcuZC9sb2dnaW5nLnhtbAogICAgICAgIHJlYWRfb25seTogdHJ1ZQogICAgICAgIGNvbnRlbnQ6ID4tCiAgICAgICAgICA8Y2xpY2tob3VzZT48cHJvZmlsZXM+PGRlZmF1bHQ+PGxvZ19xdWVyaWVzPjA8L2xvZ19xdWVyaWVzPjxsb2dfcXVlcnlfdGhyZWFkcz4wPC9sb2dfcXVlcnlfdGhyZWFkcz48L2RlZmF1bHQ+PC9wcm9maWxlcz48L2NsaWNraG91c2U+CiAgICAgIC0gdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi9jbGlja2hvdXNlL2NsaWNraG91c2UtdXNlci1jb25maWcueG1sCiAgICAgICAgdGFyZ2V0OiAvZXRjL2NsaWNraG91c2Utc2VydmVyL3VzZXJzLmQvbG9nZ2luZy54bWwKICAgICAgICByZWFkX29ubHk6IHRydWUKICAgICAgICBjb250ZW50OiA+LQogICAgICAgICAgPGNsaWNraG91c2U+PGxvZ2dlcj48bGV2ZWw+d2FybmluZzwvbGV2ZWw+PGNvbnNvbGU+dHJ1ZTwvY29uc29sZT48L2xvZ2dlcj48cXVlcnlfdGhyZWFkX2xvZwogICAgICAgICAgcmVtb3ZlPSJyZW1vdmUiLz48cXVlcnlfbG9nIHJlbW92ZT0icmVtb3ZlIi8+PHRleHRfbG9nCiAgICAgICAgICByZW1vdmU9InJlbW92ZSIvPjx0cmFjZV9sb2cgcmVtb3ZlPSJyZW1vdmUiLz48bWV0cmljX2xvZwogICAgICAgICAgcmVtb3ZlPSJyZW1vdmUiLz48YXN5bmNocm9ub3VzX21ldHJpY19sb2cKICAgICAgICAgIHJlbW92ZT0icmVtb3ZlIi8+PHNlc3Npb25fbG9nIHJlbW92ZT0icmVtb3ZlIi8+PHBhcnRfbG9nCiAgICAgICAgICByZW1vdmU9InJlbW92ZSIvPjwvY2xpY2tob3VzZT4KICAgIHVsaW1pdHM6CiAgICAgIG5vZmlsZToKICAgICAgICBzb2Z0OiAyNjIxNDQKICAgICAgICBoYXJkOiAyNjIxNDQK" + "plausible-analytics": { + "documentation": "https://plausible.io/docs", + "compose": "dmVyc2lvbjogIjMuMyIKc2VydmljZXM6CiAgcGxhdXNpYmxlLWFuYWx5dGljczoKICAgIGltYWdlOiBwbGF1c2libGUvYW5hbHl0aWNzOnYyLjAKICAgIGNvbW1hbmQ6IHNoIC1jICJzbGVlcCAxMCAmJiAvZW50cnlwb2ludC5zaCBkYiBjcmVhdGVkYiAmJiAvZW50cnlwb2ludC5zaCBkYiBtaWdyYXRlICYmIC9lbnRyeXBvaW50LnNoIHJ1biIKICAgIGVudmlyb25tZW50OgogICAgICAtIERBVEFCQVNFX1VSTD1wb3N0Z3JlczovL3Bvc3RncmVzOiRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTQHBsYXVzaWJsZV9kYi9wbGF1c2libGUKICAgICAgLSBCQVNFX1VSTD0kU0VSVklDRV9GUUROX1BMQVVTSUJMRQogICAgICAtIFNFQ1JFVF9LRVlfQkFTRT0kU0VSVklDRV9CQVNFNjRfNjRfUExBVVNJQkxFCiAgICBkZXBlbmRzX29uOgogICAgICAtIHBsYXVzaWJsZV9kYgogICAgICAtIHBsYXVzaWJsZV9ldmVudHNfZGIKICAgICAgLSBtYWlsCgogIG1haWw6CiAgICBpbWFnZTogYnl0ZW1hcmsvc210cAoKICBwbGF1c2libGVfZGI6CiAgICBpbWFnZTogcG9zdGdyZXM6MTQtYWxwaW5lCiAgICB2b2x1bWVzOgogICAgICAtIGRiLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBQT1NUR1JFU19EQj1wbGF1c2libGUKICAgICAgLSBQT1NUR1JFU19QQVNTV09SRD0kU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFUwoKICBwbGF1c2libGVfZXZlbnRzX2RiOgogICAgaW1hZ2U6IGNsaWNraG91c2UvY2xpY2tob3VzZS1zZXJ2ZXI6MjMuMy43LjUtYWxwaW5lCiAgICB2b2x1bWVzOgogICAgICAtIHR5cGU6IHZvbHVtZQogICAgICAgIHNvdXJjZTogZXZlbnQtZGF0YQogICAgICAgIHRhcmdldDogL3Zhci9saWIvY2xpY2tob3VzZQogICAgICAtIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vY2xpY2tob3VzZS9jbGlja2hvdXNlLWNvbmZpZy54bWwKICAgICAgICB0YXJnZXQ6IC9ldGMvY2xpY2tob3VzZS1zZXJ2ZXIvY29uZmlnLmQvbG9nZ2luZy54bWwKICAgICAgICByZWFkX29ubHk6IHRydWUKICAgICAgICBjb250ZW50OiA+LQogICAgICAgICAgPGNsaWNraG91c2U+PHByb2ZpbGVzPjxkZWZhdWx0Pjxsb2dfcXVlcmllcz4wPC9sb2dfcXVlcmllcz48bG9nX3F1ZXJ5X3RocmVhZHM+MDwvbG9nX3F1ZXJ5X3RocmVhZHM+PC9kZWZhdWx0PjwvcHJvZmlsZXM+PC9jbGlja2hvdXNlPgogICAgICAtIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vY2xpY2tob3VzZS9jbGlja2hvdXNlLXVzZXItY29uZmlnLnhtbAogICAgICAgIHRhcmdldDogL2V0Yy9jbGlja2hvdXNlLXNlcnZlci91c2Vycy5kL2xvZ2dpbmcueG1sCiAgICAgICAgcmVhZF9vbmx5OiB0cnVlCiAgICAgICAgY29udGVudDogPi0KICAgICAgICAgIDxjbGlja2hvdXNlPjxsb2dnZXI+PGxldmVsPndhcm5pbmc8L2xldmVsPjxjb25zb2xlPnRydWU8L2NvbnNvbGU+PC9sb2dnZXI+PHF1ZXJ5X3RocmVhZF9sb2cKICAgICAgICAgIHJlbW92ZT0icmVtb3ZlIi8+PHF1ZXJ5X2xvZyByZW1vdmU9InJlbW92ZSIvPjx0ZXh0X2xvZwogICAgICAgICAgcmVtb3ZlPSJyZW1vdmUiLz48dHJhY2VfbG9nIHJlbW92ZT0icmVtb3ZlIi8+PG1ldHJpY19sb2cKICAgICAgICAgIHJlbW92ZT0icmVtb3ZlIi8+PGFzeW5jaHJvbm91c19tZXRyaWNfbG9nCiAgICAgICAgICByZW1vdmU9InJlbW92ZSIvPjxzZXNzaW9uX2xvZyByZW1vdmU9InJlbW92ZSIvPjxwYXJ0X2xvZwogICAgICAgICAgcmVtb3ZlPSJyZW1vdmUiLz48L2NsaWNraG91c2U+CiAgICB1bGltaXRzOgogICAgICBub2ZpbGU6CiAgICAgICAgc29mdDogMjYyMTQ0CiAgICAgICAgaGFyZDogMjYyMTQ0Cg==" + }, + "uptime-kuma": { + "documentation": "https://github.com/louislam/uptime-kuma", + "compose": "c2VydmljZXM6CiAgdXB0aW1lLWt1bWE6CiAgICBpbWFnZTogbG91aXNsYW0vdXB0aW1lLWt1bWE6MQogICAgdm9sdW1lczoKICAgICAgLSB1cHRpbWUta3VtYTovYXBwL2RhdGEK" + }, + "uptime-kuma-with-database": { + "documentation": "https://github.com/louislam/uptime-kuma", + "compose": "c2VydmljZXM6CiAgdXB0aW1lLWt1bWE6CiAgICBpbWFnZTogbG91aXNsYW0vdXB0aW1lLWt1bWE6MQogICAgdm9sdW1lczoKICAgICAgLSB1cHRpbWUta3VtYTovYXBwL2RhdGEK" + } }