diff --git a/.github/workflows/coolify-production-build.yml b/.github/workflows/coolify-production-build.yml index 531466cdc..79dfc3fc0 100644 --- a/.github/workflows/coolify-production-build.yml +++ b/.github/workflows/coolify-production-build.yml @@ -41,7 +41,7 @@ jobs: - name: Get Version id: version run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)"|xargs >> $GITHUB_OUTPUT] + echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)"|xargs >> $GITHUB_OUTPUT - name: Build and Push Image uses: docker/build-push-action@v6 @@ -76,7 +76,7 @@ jobs: - name: Get Version id: version run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)"|xargs >> $GITHUB_OUTPUT] + echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)"|xargs >> $GITHUB_OUTPUT - name: Build and Push Image uses: docker/build-push-action@v6 diff --git a/.github/workflows/coolify-realtime-next.yml b/.github/workflows/coolify-realtime-next.yml index 7e937d17a..ef247170f 100644 --- a/.github/workflows/coolify-realtime-next.yml +++ b/.github/workflows/coolify-realtime-next.yml @@ -8,6 +8,7 @@ on: - docker/coolify-realtime/Dockerfile - docker/coolify-realtime/terminal-server.js - docker/coolify-realtime/package.json + - docker/coolify-realtime/package-lock.json - docker/coolify-realtime/soketi-entrypoint.sh env: diff --git a/.github/workflows/coolify-realtime.yml b/.github/workflows/coolify-realtime.yml index 97bfd52eb..9654a21b0 100644 --- a/.github/workflows/coolify-realtime.yml +++ b/.github/workflows/coolify-realtime.yml @@ -8,6 +8,7 @@ on: - docker/coolify-realtime/Dockerfile - docker/coolify-realtime/terminal-server.js - docker/coolify-realtime/package.json + - docker/coolify-realtime/package-lock.json - docker/coolify-realtime/soketi-entrypoint.sh env: diff --git a/app/Actions/Docker/GetContainersStatus.php b/app/Actions/Docker/GetContainersStatus.php index 95c22efc1..a08056837 100644 --- a/app/Actions/Docker/GetContainersStatus.php +++ b/app/Actions/Docker/GetContainersStatus.php @@ -107,6 +107,8 @@ class GetContainersStatus $statusFromDb = $preview->status; if ($statusFromDb !== $containerStatus) { $preview->update(['status' => $containerStatus]); + } else { + $preview->update(['last_online_at' => now()]); } } else { //Notify user that this container should not be there. @@ -118,6 +120,8 @@ class GetContainersStatus $statusFromDb = $application->status; if ($statusFromDb !== $containerStatus) { $application->update(['status' => $containerStatus]); + } else { + $application->update(['last_online_at' => now()]); } } else { //Notify user that this container should not be there. @@ -160,7 +164,10 @@ class GetContainersStatus $statusFromDb = $database->status; if ($statusFromDb !== $containerStatus) { $database->update(['status' => $containerStatus]); + } else { + $database->update(['last_online_at' => now()]); } + if ($isPublic) { $foundTcpProxy = $this->containers->filter(function ($value, $key) use ($uuid) { if ($this->server->isSwarm()) { @@ -171,7 +178,7 @@ class GetContainersStatus })->first(); if (! $foundTcpProxy) { StartDatabaseProxy::run($database); - $this->server->team?->notify(new ContainerRestarted("TCP Proxy for {$database->name}", $this->server)); + // $this->server->team?->notify(new ContainerRestarted("TCP Proxy for {$database->name}", $this->server)); } } } else { @@ -202,6 +209,8 @@ class GetContainersStatus if ($statusFromDb !== $containerStatus) { // ray('Updating status: ' . $containerStatus); $service->update(['status' => $containerStatus]); + } else { + $service->update(['last_online_at' => now()]); } } } diff --git a/app/Actions/Server/ServerCheck.php b/app/Actions/Server/ServerCheck.php index d9de1464e..1dae03fd9 100644 --- a/app/Actions/Server/ServerCheck.php +++ b/app/Actions/Server/ServerCheck.php @@ -14,7 +14,7 @@ use App\Models\Service; use App\Models\ServiceApplication; use App\Models\ServiceDatabase; use App\Notifications\Container\ContainerRestarted; -use Arr; +use Illuminate\Support\Arr; use Lorisleiva\Actions\Concerns\AsAction; class ServerCheck @@ -259,7 +259,7 @@ class ServerCheck })->first(); if (! $foundTcpProxy) { StartDatabaseProxy::run($database); - $this->server->team?->notify(new ContainerRestarted("TCP Proxy for {$database->name}", $this->server)); + // $this->server->team?->notify(new ContainerRestarted("TCP Proxy for {$database->name}", $this->server)); } } } diff --git a/app/Livewire/Notifications/Email.php b/app/Livewire/Notifications/Email.php index b49638b48..56f07f3a9 100644 --- a/app/Livewire/Notifications/Email.php +++ b/app/Livewire/Notifications/Email.php @@ -50,22 +50,22 @@ class Email extends Component public ?int $smtpTimeout = null; #[Validate(['boolean'])] - public bool $smtpNotificationsTest; + public bool $smtpNotificationsTest = false; #[Validate(['boolean'])] - public bool $smtpNotificationsDeployments; + public bool $smtpNotificationsDeployments = false; #[Validate(['boolean'])] - public bool $smtpNotificationsStatusChanges; + public bool $smtpNotificationsStatusChanges = false; #[Validate(['boolean'])] - public bool $smtpNotificationsDatabaseBackups; + public bool $smtpNotificationsDatabaseBackups = false; #[Validate(['boolean'])] - public bool $smtpNotificationsScheduledTasks; + public bool $smtpNotificationsScheduledTasks = false; #[Validate(['boolean'])] - public bool $smtpNotificationsServerDiskUsage; + public bool $smtpNotificationsServerDiskUsage = false; #[Validate(['boolean'])] public bool $resendEnabled; @@ -187,6 +187,7 @@ class Email extends Component { try { $this->validate([ + 'resendApiKey' => 'required', ], [ 'resendApiKey.required' => 'Resend API Key is required.', ]); diff --git a/app/Livewire/Project/Application/Preview/Form.php b/app/Livewire/Project/Application/Preview/Form.php index c7b2e8184..edcab44c8 100644 --- a/app/Livewire/Project/Application/Preview/Form.php +++ b/app/Livewire/Project/Application/Preview/Form.php @@ -3,6 +3,7 @@ namespace App\Livewire\Project\Application\Preview; use App\Models\Application; +use Livewire\Attributes\Validate; use Livewire\Component; use Spatie\Url\Url; diff --git a/app/Livewire/Project/Database/BackupEdit.php b/app/Livewire/Project/Database/BackupEdit.php index bcf2f959e..b3a54f0ab 100644 --- a/app/Livewire/Project/Database/BackupEdit.php +++ b/app/Livewire/Project/Database/BackupEdit.php @@ -46,8 +46,8 @@ class BackupEdit extends Component #[Validate(['required', 'boolean'])] public bool $saveS3 = false; - #[Validate(['required', 'integer'])] - public int $s3StorageId = 1; + #[Validate(['nullable', 'integer'])] + public ?int $s3StorageId = 1; #[Validate(['nullable', 'string'])] public ?string $databasesToBackup = null; diff --git a/app/Livewire/Server/CloudflareTunnels.php b/app/Livewire/Server/CloudflareTunnels.php index 311196473..f69fc8655 100644 --- a/app/Livewire/Server/CloudflareTunnels.php +++ b/app/Livewire/Server/CloudflareTunnels.php @@ -17,6 +17,9 @@ class CloudflareTunnels extends Component { try { $this->server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail(); + if ($this->server->isLocalhost()) { + return redirect()->route('server.show', ['server_uuid' => $server_uuid]); + } $this->isCloudflareTunnelsEnabled = $this->server->settings->is_cloudflare_tunnel; } catch (\Throwable $e) { return handleError($e, $this); diff --git a/app/Livewire/Server/Show.php b/app/Livewire/Server/Show.php index 524e21908..bb9188f1c 100644 --- a/app/Livewire/Server/Show.php +++ b/app/Livewire/Server/Show.php @@ -5,6 +5,7 @@ namespace App\Livewire\Server; use App\Actions\Server\StartSentinel; use App\Actions\Server\StopSentinel; use App\Models\Server; +use Livewire\Attributes\Locked; use Livewire\Attributes\Validate; use Livewire\Component; @@ -16,7 +17,7 @@ class Show extends Component public string $name; #[Validate(['nullable'])] - public ?string $description; + public ?string $description = null; #[Validate(['required'])] public string $ip; @@ -31,7 +32,7 @@ class Show extends Component public ?string $validationLogs = null; #[Validate(['nullable', 'url'])] - public ?string $wildcardDomain; + public ?string $wildcardDomain = null; #[Validate(['required'])] public bool $isReachable; @@ -55,7 +56,7 @@ class Show extends Component public string $sentinelToken; #[Validate(['nullable'])] - public ?string $sentinelUpdatedAt; + public ?string $sentinelUpdatedAt = null; #[Validate(['required', 'integer', 'min:1'])] public int $sentinelMetricsRefreshRateSeconds; @@ -67,7 +68,7 @@ class Show extends Component public int $sentinelPushIntervalSeconds; #[Validate(['nullable', 'url'])] - public ?string $sentinelCustomUrl; + public ?string $sentinelCustomUrl = null; #[Validate(['required'])] public bool $isSentinelEnabled; @@ -78,6 +79,7 @@ class Show extends Component #[Validate(['required'])] public string $serverTimezone; + #[Locked] public array $timezones; public function getListeners() @@ -114,6 +116,7 @@ class Show extends Component $this->server->save(); $this->server->settings->is_swarm_manager = $this->isSwarmManager; + $this->server->settings->wildcard_domain = $this->wildcardDomain; $this->server->settings->is_swarm_worker = $this->isSwarmWorker; $this->server->settings->is_build_server = $this->isBuildServer; $this->server->settings->is_metrics_enabled = $this->isMetricsEnabled; @@ -132,6 +135,7 @@ class Show extends Component $this->ip = $this->server->ip; $this->user = $this->server->user; $this->port = $this->server->port; + $this->wildcardDomain = $this->server->settings->wildcard_domain; $this->isReachable = $this->server->settings->is_reachable; $this->isUsable = $this->server->settings->is_usable; diff --git a/app/Livewire/SettingsBackup.php b/app/Livewire/SettingsBackup.php index 6dc5d6ab3..1b0599ffe 100644 --- a/app/Livewire/SettingsBackup.php +++ b/app/Livewire/SettingsBackup.php @@ -99,6 +99,14 @@ class SettingsBackup extends Component $this->database->refresh(); $this->backup->refresh(); $this->s3s = S3Storage::whereTeamId(0)->get(); + + $this->uuid = $this->database->uuid; + $this->name = $this->database->name; + $this->description = $this->database->description; + $this->postgres_user = $this->database->postgres_user; + $this->postgres_password = $this->database->postgres_password; + $this->executions = $this->backup->executions; + } catch (\Exception $e) { return handleError($e, $this); } diff --git a/app/Livewire/SettingsEmail.php b/app/Livewire/SettingsEmail.php index 0ab5754f2..61f720b3a 100644 --- a/app/Livewire/SettingsEmail.php +++ b/app/Livewire/SettingsEmail.php @@ -63,6 +63,8 @@ class SettingsEmail extends Component $this->settings->smtp_username = $this->smtpUsername; $this->settings->smtp_password = $this->smtpPassword; $this->settings->smtp_timeout = $this->smtpTimeout; + $this->settings->smtp_from_address = $this->smtpFromAddress; + $this->settings->smtp_from_name = $this->smtpFromName; $this->settings->resend_enabled = $this->resendEnabled; $this->settings->resend_api_key = $this->resendApiKey; diff --git a/app/Livewire/Source/Github/Create.php b/app/Livewire/Source/Github/Create.php index 103c5c9fb..136d3525e 100644 --- a/app/Livewire/Source/Github/Create.php +++ b/app/Livewire/Source/Github/Create.php @@ -23,7 +23,7 @@ class Create extends Component public function mount() { - $this->name = substr(generate_random_name(), 0, 34); // GitHub Apps names can only be 34 characters long + $this->name = substr(generate_random_name(), 0, 30); } public function createGitHubApp() diff --git a/app/Models/Server.php b/app/Models/Server.php index 0fcfd89ab..3076308ad 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -1238,7 +1238,7 @@ $schema://$host { StartSentinel::run($this, true); } } catch (\Throwable $e) { - return handleError($e, $this); + return handleError($e); } } diff --git a/app/Models/ServerSetting.php b/app/Models/ServerSetting.php index e72c8c444..fc2c5a0f4 100644 --- a/app/Models/ServerSetting.php +++ b/app/Models/ServerSetting.php @@ -64,10 +64,10 @@ class ServerSetting extends Model static::creating(function ($setting) { try { if (str($setting->sentinel_token)->isEmpty()) { - $setting->generateSentinelToken(save: false); + $setting->generateSentinelToken(save: false, ignoreEvent: true); } if (str($setting->sentinel_custom_url)->isEmpty()) { - $setting->generateSentinelUrl(save: false); + $setting->generateSentinelUrl(save: false, ignoreEvent: true); } } catch (\Throwable $e) { Log::error('Error creating server setting: '.$e->getMessage()); @@ -89,7 +89,7 @@ class ServerSetting extends Model }); } - public function generateSentinelToken(bool $save = true) + public function generateSentinelToken(bool $save = true, bool $ignoreEvent = false) { $data = [ 'server_uuid' => $this->server->uuid, @@ -98,13 +98,17 @@ class ServerSetting extends Model $encrypted = encrypt($token); $this->sentinel_token = $encrypted; if ($save) { - $this->save(); + if ($ignoreEvent) { + $this->saveQuietly(); + } else { + $this->save(); + } } return $token; } - public function generateSentinelUrl(bool $save = true) + public function generateSentinelUrl(bool $save = true, bool $ignoreEvent = false) { $domain = null; $settings = InstanceSettings::get(); @@ -119,7 +123,11 @@ class ServerSetting extends Model } $this->sentinel_custom_url = $domain; if ($save) { - $this->save(); + if ($ignoreEvent) { + $this->saveQuietly(); + } else { + $this->save(); + } } return $domain; diff --git a/bootstrap/helpers/docker.php b/bootstrap/helpers/docker.php index 2e583b94d..40eacf5c8 100644 --- a/bootstrap/helpers/docker.php +++ b/bootstrap/helpers/docker.php @@ -359,8 +359,11 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_ $https_label = "https-{$loop}-{$uuid}-{$service_name}"; } if (str($image)->contains('ghost')) { - $labels->push("traefik.http.middlewares.redir-ghost.redirectregex.regex=^{$path}/(.*)"); - $labels->push('traefik.http.middlewares.redir-ghost.redirectregex.replacement=/$1'); + $labels->push("traefik.http.middlewares.redir-ghost-{$uuid}.redirectregex.regex=^{$path}/(.*)"); + $labels->push("traefik.http.middlewares.redir-ghost-{$uuid}.redirectregex.replacement=/$1"); + $labels->push("caddy_{$loop}.handle_path.{$loop}_redir-ghost-{$uuid}.handler=rewrite"); + $labels->push("caddy_{$loop}.handle_path.{$loop}_redir-ghost-{$uuid}.rewrite.regexp=^{$path}/(.*)"); + $labels->push("caddy_{$loop}.handle_path.{$loop}_redir-ghost-{$uuid}.rewrite.replacement=/$1"); } $to_www_name = "{$loop}-{$uuid}-to-www"; diff --git a/config/constants.php b/config/constants.php index 418326541..1bec2e3bf 100644 --- a/config/constants.php +++ b/config/constants.php @@ -19,7 +19,7 @@ return [ 'invitation' => [ 'link' => [ 'base_url' => '/invitations/', - 'expiration_days' => 0, + 'expiration_days' => 3, ], ], 'services' => [ diff --git a/config/sentry.php b/config/sentry.php index 33ae36c73..97488c6dd 100644 --- a/config/sentry.php +++ b/config/sentry.php @@ -7,7 +7,7 @@ return [ // The release version of your application // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')) - 'release' => '4.0.0-beta.361', + 'release' => '4.0.0-beta.364', // When left empty or `null` the Laravel environment will be used 'environment' => config('app.env'), diff --git a/config/version.php b/config/version.php index 0e83ff40e..79f788c51 100644 --- a/config/version.php +++ b/config/version.php @@ -1,3 +1,3 @@ settings->sentinel_token)->isEmpty()) { - $server->settings->generateSentinelToken(); + $server->settings->generateSentinelToken(ignoreEvent: true); } if (str($server->settings->sentinel_custom_url)->isEmpty()) { - $url = $server->settings->generateSentinelUrl(); + $url = $server->settings->generateSentinelUrl(ignoreEvent: true); if (str($url)->isEmpty()) { $server->settings->is_sentinel_enabled = false; $server->settings->save(); diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index b15a109c3..80555e377 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -113,7 +113,7 @@ services: retries: 10 timeout: 2s soketi: - image: 'ghcr.io/coollabsio/coolify-realtime:1.0.3' + image: 'ghcr.io/coollabsio/coolify-realtime:1.0.4' ports: - "${SOKETI_PORT:-6001}:6001" - "6002:6002" diff --git a/docker-compose.windows.yml b/docker-compose.windows.yml index ef2de82e9..d92dc6332 100644 --- a/docker-compose.windows.yml +++ b/docker-compose.windows.yml @@ -103,7 +103,7 @@ services: retries: 10 timeout: 2s soketi: - image: 'ghcr.io/coollabsio/coolify-realtime:1.0.0' + image: 'ghcr.io/coollabsio/coolify-realtime:1.0.4' pull_policy: always container_name: coolify-realtime restart: always diff --git a/docker/coolify-realtime/Dockerfile b/docker/coolify-realtime/Dockerfile index f0d6db906..9f94518f5 100644 --- a/docker/coolify-realtime/Dockerfile +++ b/docker/coolify-realtime/Dockerfile @@ -22,6 +22,4 @@ RUN /bin/sh -c "if [[ ${TARGETPLATFORM} == 'linux/arm64' ]]; then \ curl -L https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64 -o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared \ ;fi" - - ENTRYPOINT ["/bin/sh", "/soketi-entrypoint.sh"] diff --git a/other/nightly/install.sh b/other/nightly/install.sh index 29ce52b77..2371cca2c 100755 --- a/other/nightly/install.sh +++ b/other/nightly/install.sh @@ -5,7 +5,7 @@ set -e # Exit immediately if a command exits with a non-zero status ## $1 could be empty, so we need to disable this check #set -u # Treat unset variables as an error and exit set -o pipefail # Cause a pipeline to return the status of the last command that exited with a non-zero status -CDN="https://cdn.coollabs.io/coolify" +CDN="https://cdn.coollabs.io/coolify-nightly" DATE=$(date +"%Y%m%d-%H%M%S") VERSION="1.6" @@ -185,11 +185,51 @@ elif [ -x "$(command -v service)" ]; then SSH_DETECTED=true fi fi + + if [ "$SSH_DETECTED" = "false" ]; then - echo "###############################################################################" - echo "WARNING: Could not detect if OpenSSH server is installed and running - this does not mean that it is not installed, just that we could not detect it." - echo -e "Please make sure it is set, otherwise Coolify cannot connect to the host system. \n" - echo "###############################################################################" + echo " - OpenSSH server not detected. Installing OpenSSH server." + case "$OS_TYPE" in + arch) + pacman -Sy --noconfirm openssh >/dev/null + systemctl enable sshd >/dev/null 2>&1 + systemctl start sshd >/dev/null 2>&1 + ;; + alpine) + apk add openssh >/dev/null + rc-update add sshd default >/dev/null 2>&1 + service sshd start >/dev/null 2>&1 + ;; + ubuntu | debian | raspbian) + apt-get update -y >/dev/null + apt-get install -y openssh-server >/dev/null + systemctl enable ssh >/dev/null 2>&1 + systemctl start ssh >/dev/null 2>&1 + ;; + centos | fedora | rhel | ol | rocky | almalinux | amzn) + if [ "$OS_TYPE" = "amzn" ]; then + dnf install -y openssh-server >/dev/null + else + dnf install -y openssh-server >/dev/null + fi + systemctl enable sshd >/dev/null 2>&1 + systemctl start sshd >/dev/null 2>&1 + ;; + sles | opensuse-leap | opensuse-tumbleweed) + zypper install -y openssh >/dev/null + systemctl enable sshd >/dev/null 2>&1 + systemctl start sshd >/dev/null 2>&1 + ;; + *) + echo "###############################################################################" + echo "WARNING: Could not detect and install OpenSSH server - this does not mean that it is not installed or not running, just that we could not detect it." + echo -e "Please make sure it is installed and running, otherwise Coolify cannot connect to the host system. \n" + echo "###############################################################################" + exit 1 + ;; + esac + echo " - OpenSSH server installed successfully." + SSH_DETECTED=true fi # Detect SSH PermitRootLogin diff --git a/other/nightly/upgrade.sh b/other/nightly/upgrade.sh index 9aa3a5f9a..4a9049a5e 100644 --- a/other/nightly/upgrade.sh +++ b/other/nightly/upgrade.sh @@ -1,10 +1,11 @@ #!/bin/bash ## Do not modify this file. You will lose the ability to autoupdate! -VERSION="1.1" +VERSION="1.2" CDN="https://cdn.coollabs.io/coolify-nightly" LATEST_IMAGE=${1:-latest} LATEST_HELPER_VERSION=${2:-latest} +DATE=$(date +%Y-%m-%d-%H-%M-%S) 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 @@ -32,7 +33,7 @@ docker network create --attachable coolify 2>/dev/null if [ -f /data/coolify/source/docker-compose.custom.yml ]; then echo "docker-compose.custom.yml detected." - docker run -v /data/coolify/source:/data/coolify/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION:-latest} bash -c "LATEST_IMAGE=${1:-} docker compose --env-file /data/coolify/source/.env -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml -f /data/coolify/source/docker-compose.custom.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" + docker run -v /data/coolify/source:/data/coolify/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION:-latest} bash -c "LATEST_IMAGE=${1:-} docker compose --env-file /data/coolify/source/.env -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml -f /data/coolify/source/docker-compose.custom.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" > /data/coolify/source/upgrade-${DATE}.log 2>&1 else - docker run -v /data/coolify/source:/data/coolify/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION:-latest} bash -c "LATEST_IMAGE=${1:-} docker compose --env-file /data/coolify/source/.env -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" + docker run -v /data/coolify/source:/data/coolify/source -v /var/run/docker.sock:/var/run/docker.sock --rm ghcr.io/coollabsio/coolify-helper:${LATEST_HELPER_VERSION:-latest} bash -c "LATEST_IMAGE=${1:-} docker compose --env-file /data/coolify/source/.env -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml up -d --remove-orphans --force-recreate --wait --wait-timeout 60" > /data/coolify/source/upgrade-${DATE}.log 2>&1 fi diff --git a/other/nightly/versions.json b/other/nightly/versions.json index dbb295590..eeb9d77e9 100644 --- a/other/nightly/versions.json +++ b/other/nightly/versions.json @@ -1,10 +1,10 @@ { "coolify": { "v4": { - "version": "4.0.0-beta.360" + "version": "4.0.0-beta.363" }, "nightly": { - "version": "4.0.0-beta.362" + "version": "4.0.0-beta.364" }, "helper": { "version": "1.0.3" diff --git a/resources/views/components/navbar.blade.php b/resources/views/components/navbar.blade.php index 8a2f4d5d6..f635a6787 100644 --- a/resources/views/components/navbar.blade.php +++ b/resources/views/components/navbar.blade.php @@ -148,7 +148,7 @@