From 476abd30f40435997f14e8a2e0a27b28782a2c39 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 3 May 2023 09:24:40 +0200 Subject: [PATCH 1/7] check with sh --- .../prod-ssu/etc/s6-overlay/s6-rc.d/db-migration/up | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docker/prod-ssu/etc/s6-overlay/s6-rc.d/db-migration/up b/docker/prod-ssu/etc/s6-overlay/s6-rc.d/db-migration/up index 250d5d8b1..42594c737 100644 --- a/docker/prod-ssu/etc/s6-overlay/s6-rc.d/db-migration/up +++ b/docker/prod-ssu/etc/s6-overlay/s6-rc.d/db-migration/up @@ -1,2 +1,9 @@ -#!/command/execlineb -P -php /var/www/html/artisan migrate --force --isolated +#!/bin/sh +VERSION=$(php bootstrap/getVersion.php) + +if echo "$VERSION" | grep -q "nightly"; then + php /var/www/html/artisan migrate:fresh --force + php /var/www/html/artisan db:seed --class ProductionSeeder --force +else + php /var/www/html/artisan migrate --force --isolated +fi From 3e475d87eb2cafa51cab5c37defd2c2f7b7cd3d1 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 3 May 2023 09:27:00 +0200 Subject: [PATCH 2/7] ok it is not working --- .../prod-ssu/etc/s6-overlay/s6-rc.d/db-migration/up | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/docker/prod-ssu/etc/s6-overlay/s6-rc.d/db-migration/up b/docker/prod-ssu/etc/s6-overlay/s6-rc.d/db-migration/up index 42594c737..250d5d8b1 100644 --- a/docker/prod-ssu/etc/s6-overlay/s6-rc.d/db-migration/up +++ b/docker/prod-ssu/etc/s6-overlay/s6-rc.d/db-migration/up @@ -1,9 +1,2 @@ -#!/bin/sh -VERSION=$(php bootstrap/getVersion.php) - -if echo "$VERSION" | grep -q "nightly"; then - php /var/www/html/artisan migrate:fresh --force - php /var/www/html/artisan db:seed --class ProductionSeeder --force -else - php /var/www/html/artisan migrate --force --isolated -fi +#!/command/execlineb -P +php /var/www/html/artisan migrate --force --isolated From ad671cfcf117037fd1b3af9caa6918992a47f0e0 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 3 May 2023 09:38:53 +0200 Subject: [PATCH 3/7] use same args for remoteProcess and instantRemoteProcess --- .../Destination/New/StandaloneDocker.php | 2 +- app/Http/Livewire/ForceUpgrade.php | 13 ++++++------ .../Livewire/Project/Application/Deploy.php | 2 +- app/Http/Livewire/Server/Form.php | 20 +++++++++++++------ app/Jobs/ContainerStatusJob.php | 4 ++-- app/Jobs/DockerCleanupDanglingImagesJob.php | 2 +- bootstrap/helpers.php | 2 +- 7 files changed, 27 insertions(+), 18 deletions(-) diff --git a/app/Http/Livewire/Destination/New/StandaloneDocker.php b/app/Http/Livewire/Destination/New/StandaloneDocker.php index 5abf19a90..7b1c1089b 100644 --- a/app/Http/Livewire/Destination/New/StandaloneDocker.php +++ b/app/Http/Livewire/Destination/New/StandaloneDocker.php @@ -45,7 +45,7 @@ class StandaloneDocker extends Component $server = Server::find($this->server_id); - instantRemoteProcess($server, ['docker network create --attachable ' . $this->network], throwError: false); + instantRemoteProcess(['docker network create --attachable ' . $this->network], $server, throwError: false); return redirect()->route('destination.show', $docker->uuid); } } diff --git a/app/Http/Livewire/ForceUpgrade.php b/app/Http/Livewire/ForceUpgrade.php index bec3ee0f8..f73bf9cee 100644 --- a/app/Http/Livewire/ForceUpgrade.php +++ b/app/Http/Livewire/ForceUpgrade.php @@ -16,9 +16,9 @@ class ForceUpgrade extends Component if (!$server) { return; } - instantRemoteProcess($server, [ + instantRemoteProcess([ "sleep 2" - ]); + ], $server); remoteProcess([ "sleep 10" ], $server, ActivityTypes::INLINE->value); @@ -32,15 +32,16 @@ class ForceUpgrade extends Component return; } - instantRemoteProcess($server, [ + instantRemoteProcess([ "curl -fsSL $cdn/docker-compose.yml -o /data/coolify/source/docker-compose.yml", "curl -fsSL $cdn/docker-compose.prod.yml -o /data/coolify/source/docker-compose.prod.yml", "curl -fsSL $cdn/.env.production -o /data/coolify/source/.env.production", "curl -fsSL $cdn/upgrade.sh -o /data/coolify/source/upgrade.sh", - ]); - instantRemoteProcess($server, [ + ], $server); + + instantRemoteProcess([ "docker compose -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml pull", - ]); + ], $server); remoteProcess([ "bash /data/coolify/source/upgrade.sh $latestVersion" diff --git a/app/Http/Livewire/Project/Application/Deploy.php b/app/Http/Livewire/Project/Application/Deploy.php index ba31e4fbf..23d6bdbee 100644 --- a/app/Http/Livewire/Project/Application/Deploy.php +++ b/app/Http/Livewire/Project/Application/Deploy.php @@ -73,7 +73,7 @@ class Deploy extends Component } public function stop() { - instantRemoteProcess($this->destination->server, ["docker rm -f {$this->application->uuid}"]); + instantRemoteProcess(["docker rm -f {$this->application->uuid}"], $this->destination->server); if ($this->application->status != 'exited') { $this->application->status = 'exited'; $this->application->save(); diff --git a/app/Http/Livewire/Server/Form.php b/app/Http/Livewire/Server/Form.php index 08d2d7cf9..136d37b98 100644 --- a/app/Http/Livewire/Server/Form.php +++ b/app/Http/Livewire/Server/Form.php @@ -2,6 +2,7 @@ namespace App\Http\Livewire\Server; +use App\Enums\ActivityTypes; use App\Models\Server; use Illuminate\Support\Facades\Validator; use Livewire\Component; @@ -28,15 +29,22 @@ class Form extends Component public function installDocker() { $config = base64_encode('{ "live-restore": true }'); - instantRemoteProcess($this->server, [ - "curl https://releases.rancher.com/install-docker/23.0.sh | sh" - ]); + remoteProcess([ + "curl https://releases.rancher.com/install-docker/23.0.sh | sh", + "echo '{$config}' | base64 -d > /etc/docker/daemon.json", + "systemctl restart docker" + ], $this->server, ActivityTypes::INLINE->value); } public function checkServer() { - $this->uptime = instantRemoteProcess($this->server, ['uptime']); - $this->dockerVersion = instantRemoteProcess($this->server, ['docker version|head -2|grep -i version'], false); - $this->dockerComposeVersion = instantRemoteProcess($this->server, ['docker compose version|head -2|grep -i version'], false); + try { + + $this->uptime = instantRemoteProcess(['uptime'], $this->server); + $this->dockerVersion = instantRemoteProcess(['docker version|head -2|grep -i version'], $this->server, false); + $this->dockerComposeVersion = instantRemoteProcess(['docker compose version|head -2|grep -i version'], $this->server, false); + } catch (\Exception $e) { + $this->addError('server.ip', $e->getMessage()); + } } public function submit() { diff --git a/app/Jobs/ContainerStatusJob.php b/app/Jobs/ContainerStatusJob.php index 5924cae3a..bc05d6e0b 100644 --- a/app/Jobs/ContainerStatusJob.php +++ b/app/Jobs/ContainerStatusJob.php @@ -38,7 +38,7 @@ class ContainerStatusJob implements ShouldQueue $not_found_applications = $applications; $containers = collect(); foreach ($servers as $server) { - $output = instantRemoteProcess($server, ['docker ps -a -q --format \'{{json .}}\'']); + $output = instantRemoteProcess(['docker ps -a -q --format \'{{json .}}\''], $server); $containers = $containers->concat(formatDockerCmdOutputToJson($output)); } foreach ($containers as $container) { @@ -67,7 +67,7 @@ class ContainerStatusJob implements ShouldQueue return; } if ($application->destination->server) { - $container = instantRemoteProcess($application->destination->server, ["docker inspect --format '{{json .State}}' {$this->container_id}"]); + $container = instantRemoteProcess(["docker inspect --format '{{json .State}}' {$this->container_id}"], $application->destination->server); $container = formatDockerCmdOutputToJson($container); $application->status = $container[0]['Status']; $application->save(); diff --git a/app/Jobs/DockerCleanupDanglingImagesJob.php b/app/Jobs/DockerCleanupDanglingImagesJob.php index 0938b6bb8..256016330 100644 --- a/app/Jobs/DockerCleanupDanglingImagesJob.php +++ b/app/Jobs/DockerCleanupDanglingImagesJob.php @@ -31,7 +31,7 @@ class DockerCleanupDanglingImagesJob implements ShouldQueue try { $servers = Server::all(); foreach ($servers as $server) { - instantRemoteProcess($server, ['docker image prune -f']); + instantRemoteProcess(['docker image prune -f'], $server); } } catch (\Exception $e) { Log::error($e->getMessage()); diff --git a/bootstrap/helpers.php b/bootstrap/helpers.php index 49569d1a4..51aff79a7 100644 --- a/bootstrap/helpers.php +++ b/bootstrap/helpers.php @@ -120,7 +120,7 @@ if (!function_exists('formatDockerLabelsToJson')) { } } if (!function_exists('instantRemoteProcess')) { - function instantRemoteProcess(Server $server, array $command, $throwError = true) + function instantRemoteProcess(array $command, Server $server, $throwError = true) { $command_string = implode("\n", $command); $private_key_location = savePrivateKeyForServer($server); From 581930d8c65c9f0f3fe7df4777833a3637bf042b Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 3 May 2023 09:43:01 +0200 Subject: [PATCH 4/7] update server check --- app/Http/Livewire/Server/Form.php | 14 +++++++++++--- resources/views/livewire/server/form.blade.php | 11 +++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/Http/Livewire/Server/Form.php b/app/Http/Livewire/Server/Form.php index 136d37b98..8c75f887e 100644 --- a/app/Http/Livewire/Server/Form.php +++ b/app/Http/Livewire/Server/Form.php @@ -38,12 +38,20 @@ class Form extends Component public function checkServer() { try { - - $this->uptime = instantRemoteProcess(['uptime'], $this->server); + $this->uptime = instantRemoteProcess(['uptime'], $this->server, false); + if (!$this->uptime) { + $this->uptime = 'Server not reachable.'; + throw new \Exception('Server not reachable.'); + } $this->dockerVersion = instantRemoteProcess(['docker version|head -2|grep -i version'], $this->server, false); + if (!$this->dockerVersion) { + $this->dockerVersion = 'Not installed.'; + } $this->dockerComposeVersion = instantRemoteProcess(['docker compose version|head -2|grep -i version'], $this->server, false); + if (!$this->dockerComposeVersion) { + $this->dockerComposeVersion = 'Not installed.'; + } } catch (\Exception $e) { - $this->addError('server.ip', $e->getMessage()); } } public function submit() diff --git a/resources/views/livewire/server/form.blade.php b/resources/views/livewire/server/form.blade.php index 94689a045..77af63b9a 100644 --- a/resources/views/livewire/server/form.blade.php +++ b/resources/views/livewire/server/form.blade.php @@ -22,14 +22,17 @@ Submit - + {{-- --}} @isset($uptime) -

Connection OK

Uptime: {{ $uptime }}

-

{{ $dockerVersion }}

-

{{ $dockerComposeVersion }}

+ @endisset + @isset($dockerVersion) +

Docker Engine: {{ $dockerVersion }}

+ @endisset + @isset($dockerComposeVersion) +

Docker Compose: {{ $dockerComposeVersion }}

@endisset From 97572f158c66d20ffde2ccca2f1de972c403e411 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 3 May 2023 09:45:18 +0200 Subject: [PATCH 5/7] add docker install script --- scripts/install-docker.sh | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 scripts/install-docker.sh diff --git a/scripts/install-docker.sh b/scripts/install-docker.sh new file mode 100644 index 000000000..292995fa1 --- /dev/null +++ b/scripts/install-docker.sh @@ -0,0 +1,5 @@ +#!/bin/bash +curl https://releases.rancher.com/install-docker/23.0.sh | sh +echo "Docker installed successfully" +echo '{ "live-restore": true }' >/etc/docker/daemon.json +systemctl restart docker From 8bfdcdbf440a09f15a9b62ef7e6f04bc2f87ab81 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 3 May 2023 09:57:06 +0200 Subject: [PATCH 6/7] update scripts --- app/Console/Commands/SyncBunny.php | 10 +++++++--- scripts/install.sh | 8 ++++---- scripts/run | 3 +-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/app/Console/Commands/SyncBunny.php b/app/Console/Commands/SyncBunny.php index 7757a7e6c..27d4a8b79 100644 --- a/app/Console/Commands/SyncBunny.php +++ b/app/Console/Commands/SyncBunny.php @@ -37,6 +37,7 @@ class SyncBunny extends Command $compose_file = "docker-compose.yml"; $compose_file_prod = "docker-compose.prod.yml"; $upgrade_script = "upgrade.sh"; + $docker_install_script = "install-docker.sh"; $production_env = ".env.production"; PendingRequest::macro('storage', function ($file) { @@ -53,8 +54,9 @@ class SyncBunny extends Command Http::pool(fn (Pool $pool) => [ $pool->storage(file: "$parent_dir/$compose_file")->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$compose_file"), $pool->storage(file: "$parent_dir/$compose_file_prod")->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$compose_file_prod"), - $pool->storage(file: "$parent_dir/scripts/$upgrade_script")->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$upgrade_script"), $pool->storage(file: "$parent_dir/$production_env")->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$production_env"), + $pool->storage(file: "$parent_dir/scripts/$upgrade_script")->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$upgrade_script"), + $pool->storage(file: "$parent_dir/scripts/$docker_install_script")->put("/$bunny_cdn_storage_name/$bunny_cdn_path/$docker_install_script"), ]); $res = Http::withHeaders([ @@ -64,13 +66,15 @@ class SyncBunny extends Command "url" => "$bunny_cdn/$bunny_cdn_path/$compose_file", "url" => "$bunny_cdn/$bunny_cdn_path/$compose_file_prod", "url" => "$bunny_cdn/$bunny_cdn_path/$upgrade_script", - "url" => "$bunny_cdn/$bunny_cdn_path/$production_env" + "url" => "$bunny_cdn/$bunny_cdn_path/$production_env", + "url" => "$bunny_cdn/$bunny_cdn_path/$docker_install_script" ]); if ($res->ok()) { echo "All files uploaded & purged...\n"; + return; } + throw new \Exception("Something went wrong."); } catch (\Exception $e) { - echo "Something went wrong.\n"; echo $e->getMessage(); } } diff --git a/scripts/install.sh b/scripts/install.sh index 4d512120a..8aa22b17e 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -2,10 +2,12 @@ ## Do not modify this file. You will lost the ability to installation and autoupdate! ########### -## Always run "php artisan app:sync-to-bunny-cdn --env=secrets" if you update this file. +## Always run "php artisan app:sync-to-bunny-cdn --env=secrets" or "scripts/run sync-bunny" if you update this file. ########### VERSION="1.0.0" +DOCKER_VERSION="23.0" + CDN="https://coolify-cdn.b-cdn.net/files" OS_TYPE=$(cat /etc/os-release | grep -w "ID" | cut -d "=" -f 2 | tr -d '"') OS_VERSION=$(cat /etc/os-release | grep -w "VERSION_ID" | cut -d "=" -f 2 | tr -d '"') @@ -18,9 +20,7 @@ fi if ! [ -x "$(command -v docker)" ]; then echo "Docker is not installed. Installing Docker..." - curl -fsSL https://get.docker.com -o get-docker.sh - sh get-docker.sh - rm get-docker.sh + curl https://releases.rancher.com/install-docker/${DOCKER_VERSION}.sh | sh echo "Docker installed successfully" fi diff --git a/scripts/run b/scripts/run index 9aad129ac..6c4cdcb5d 100755 --- a/scripts/run +++ b/scripts/run @@ -21,8 +21,7 @@ function help { compgen -A function | cat -n } function sync-bunny { - bash vendor/bin/spin exec -u webuser coolify php artisan sync:bunny --env=secret || - php artisan sync:bunny --env=secrets + php artisan sync:bunny --env=secrets } function queue { bash vendor/bin/spin exec -u webuser coolify php artisan queue:listen From 1ad7d885b3f22f307af2ae59d04e528d8217ce3a Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 3 May 2023 10:06:15 +0200 Subject: [PATCH 7/7] migrate on appservice boot --- app/Http/Livewire/ForceUpgrade.php | 1 - app/Providers/AppServiceProvider.php | 15 +++++---------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/app/Http/Livewire/ForceUpgrade.php b/app/Http/Livewire/ForceUpgrade.php index f73bf9cee..52c9a28ad 100644 --- a/app/Http/Livewire/ForceUpgrade.php +++ b/app/Http/Livewire/ForceUpgrade.php @@ -10,7 +10,6 @@ class ForceUpgrade extends Component { public function upgrade() { - //if (env('APP_ENV') === 'local') { if (config('app.env') === 'local') { $server = Server::where('ip', 'coolify-testing-host')->first(); if (!$server) { diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 9945221c8..ab8ad04c4 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -7,6 +7,7 @@ use Illuminate\Queue\Events\JobProcessed; use Illuminate\Support\Facades\Process; use Illuminate\Support\Facades\Queue; use Illuminate\Support\ServiceProvider; +use Illuminate\Support\Str; class AppServiceProvider extends ServiceProvider { @@ -15,14 +16,9 @@ class AppServiceProvider extends ServiceProvider */ public function register(): void { - // @TODO: Is this the best place to run the seeder? - // if (env('APP_ENV') === 'production') { - // dump('Seed default data.'); - // Process::run('php artisan db:seed --class=ProductionSeeder --force'); - // } else { - // dump('Not in production environment.'); - // } - // + if (config('app.env') === 'production' && Str::contains(config('coolify.version'), ['nightly'])) { + Process::run('php artisan migrate:fresh --force --seed --seeder=ProductionSeeder'); + } } /** @@ -31,9 +27,8 @@ class AppServiceProvider extends ServiceProvider public function boot(): void { Queue::after(function (JobProcessed $event) { - // @TODO: Remove `coolify-builder` container after the remoteProcess job is finishged and remoteProcess->type == `deployment`. + // @TODO: Remove `coolify-builder` container after the remoteProcess job is finishged and remoteProcess->type == `deployment`. if ($event->job->resolveName() === CoolifyTask::class) { - } }); }