wip: services

This commit is contained in:
Andras Bacsai
2023-09-22 12:08:51 +02:00
parent 9c2fea4b2e
commit c91f426af3
16 changed files with 103 additions and 242 deletions

View File

@@ -11,7 +11,7 @@ class StartService
public function handle(Service $service)
{
$workdir = service_configuration_dir() . "/{$service->uuid}";
$commands[] = "echo 'Starting service {$service->name} on {$service->server->name}'";
$commands[] = "echo 'Starting service {$service->name} on {$service->server->name}.'";
$commands[] = "mkdir -p $workdir";
$commands[] = "cd $workdir";
@@ -22,8 +22,11 @@ class StartService
foreach ($envs as $env) {
$commands[] = "echo '{$env->key}={$env->value}' >> .env";
}
$commands[] = "echo 'Pulling images and starting containers...'";
$commands[] = "docker compose pull";
$commands[] = "docker compose up -d";
$commands[] = "echo 'Waiting for containers to start...'";
$commands[] = "sleep 5";
$commands[] = "docker network connect $service->uuid coolify-proxy 2>/dev/null || true";
$activity = remote_process($commands, $service->server);
return $activity;

View File

@@ -2,20 +2,10 @@
namespace App\Http\Livewire\Project\New;
use App\Models\Application;
use App\Models\EnvironmentVariable;
use App\Models\GithubApp;
use App\Models\LocalPersistentVolume;
use App\Models\Project;
use App\Models\Service;
use App\Models\ServiceApplication;
use App\Models\ServiceDatabase;
use App\Models\StandaloneDocker;
use App\Models\SwarmDocker;
use Livewire\Component;
use Visus\Cuid2\Cuid2;
use Illuminate\Support\Str;
use Symfony\Component\Yaml\Yaml;
class DockerCompose extends Component
{
@@ -29,7 +19,7 @@ class DockerCompose extends Component
if (isDev()) {
$this->dockercompose = 'services:
ghost:
documentation: https://docs.ghost.org/docs/config
documentation: https://ghost.org/docs/config
image: ghost:5
volumes:
- ghost-content-data:/var/lib/ghost/content

View File

@@ -33,6 +33,7 @@ class Index extends Component
public function save() {
$this->service->save();
$this->service->parse();
$this->service->refresh();
$this->emit('refreshEnvs');
}

View File

@@ -98,6 +98,8 @@ class Service extends BaseModel
$services = collect($services)->map(function ($service, $serviceName) use ($composeVolumes, $composeNetworks, $definedNetwork, $envs, $volumes, $ports, $isNew) {
$container_name = "$serviceName-{$this->uuid}";
$isDatabase = false;
$serviceVariables = collect(data_get($service, 'environment', []));
// Decide if the service is a database
$image = data_get($service, 'image');
if ($image) {
@@ -114,10 +116,15 @@ class Service extends BaseModel
'service_id' => $this->id
]);
} else {
$defaultUsableFqdn = "http://$serviceName-{$this->uuid}.{$this->server->ip}.sslip.io";
if (isDev()) {
$defaultUsableFqdn = "http://$serviceName-{$this->uuid}.127.0.0.1.sslip.io";
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";
}
} else {
$defaultUsableFqdn = null;
}
$savedService = ServiceApplication::create([
'name' => $serviceName,
'fqdn' => $defaultUsableFqdn,
@@ -129,6 +136,16 @@ class Service extends BaseModel
$savedService = $this->databases()->whereName($serviceName)->first();
} else {
$savedService = $this->applications()->whereName($serviceName)->first();
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";
}
} else {
$defaultUsableFqdn = null;
}
$savedService->fqdn = $defaultUsableFqdn;
$savedService->save();
}
}
$fqdn = data_get($savedService, 'fqdn');
@@ -155,6 +172,7 @@ class Service extends BaseModel
// Collect volumes
$serviceVolumes = collect(data_get($service, 'volumes', []));
if ($serviceVolumes->count() > 0) {
LocalPersistentVolume::whereResourceId($savedService->id)->whereResourceType(get_class($savedService))->delete();
foreach ($serviceVolumes as $volume) {
if (is_string($volume)) {
$volumeName = Str::before($volume, ':');
@@ -189,7 +207,7 @@ class Service extends BaseModel
$composeVolumes->put($volumeName, null);
LocalPersistentVolume::updateOrCreate(
[
'mount_path' => $volumePath,
'name' => $volumeName,
'resource_id' => $savedService->id,
'resource_type' => get_class($savedService)
],
@@ -234,7 +252,6 @@ class Service extends BaseModel
// Get variables from the service
$serviceVariables = collect(data_get($service, 'environment', []));
foreach ($serviceVariables as $variable) {
$value = Str::after($variable, '=');
if (!Str::startsWith($value, '$SERVICE_') && !Str::startsWith($value, '${SERVICE_') && Str::startsWith($value, '$')) {

View File

@@ -4,6 +4,7 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Symfony\Component\Yaml\Yaml;
class ServiceApplication extends BaseModel
{
@@ -14,6 +15,14 @@ class ServiceApplication extends BaseModel
{
return 'service';
}
public function documentation()
{
return data_get(Yaml::parse($this->service->docker_compose_raw), "services.{$this->name}.documentation", 'https://coolify.io/docs');
}
public function service()
{
return $this->belongsTo(Service::class);
}
public function persistentStorages()
{
return $this->morphMany(LocalPersistentVolume::class, 'resource');

View File

@@ -3,6 +3,7 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Symfony\Component\Yaml\Yaml;
class ServiceDatabase extends BaseModel
{
@@ -13,6 +14,14 @@ class ServiceDatabase extends BaseModel
{
return 'service';
}
public function documentation()
{
return data_get(Yaml::parse($this->service->docker_compose_raw), "services.{$this->name}.documentation", 'https://coolify.io/docs');
}
public function service()
{
return $this->belongsTo(Service::class);
}
public function persistentStorages()
{
return $this->morphMany(LocalPersistentVolume::class, 'resource');

View File

@@ -0,0 +1,26 @@
<?php
namespace App\View\Components\Services;
use Closure;
use Illuminate\Contracts\View\View;
use Illuminate\View\Component;
class Explanation extends Component
{
/**
* Create a new component instance.
*/
public function __construct()
{
//
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
{
return view('components.services.explanation');
}
}