diff --git a/app/Livewire/Notifications/Email.php b/app/Livewire/Notifications/Email.php
index 28267331a3..56f07f3a91 100644
--- a/app/Livewire/Notifications/Email.php
+++ b/app/Livewire/Notifications/Email.php
@@ -187,6 +187,7 @@ public function instantSaveResend()
{
try {
$this->validate([
+ 'resendApiKey' => 'required',
], [
'resendApiKey.required' => 'Resend API Key is required.',
]);
diff --git a/app/Livewire/Server/CloudflareTunnels.php b/app/Livewire/Server/CloudflareTunnels.php
index 3111964732..f69fc86557 100644
--- a/app/Livewire/Server/CloudflareTunnels.php
+++ b/app/Livewire/Server/CloudflareTunnels.php
@@ -17,6 +17,9 @@ public function mount(string $server_uuid)
{
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 aea07efe01..bb9188f1c8 100644
--- a/app/Livewire/Server/Show.php
+++ b/app/Livewire/Server/Show.php
@@ -116,6 +116,7 @@ public function syncData(bool $toModel = false)
$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;
@@ -134,6 +135,7 @@ public function syncData(bool $toModel = false)
$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/config/sentry.php b/config/sentry.php
index f0717020c5..8ff3c354a0 100644
--- a/config/sentry.php
+++ b/config/sentry.php
@@ -7,7 +7,7 @@
// 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.362',
+ 'release' => '4.0.0-beta.363',
// 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 ba46a47277..abee59dbcf 100644
--- a/config/version.php
+++ b/config/version.php
@@ -1,3 +1,3 @@
/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 9aa3a5f9ae..4a9049a5ef 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 3ae51e8cb8..eeb9d77e97 100644
--- a/other/nightly/versions.json
+++ b/other/nightly/versions.json
@@ -1,10 +1,10 @@
{
"coolify": {
"v4": {
- "version": "4.0.0-beta.362"
+ "version": "4.0.0-beta.363"
},
"nightly": {
- "version": "4.0.0-beta.363"
+ "version": "4.0.0-beta.364"
},
"helper": {
"version": "1.0.3"
diff --git a/resources/views/components/server/sidebar.blade.php b/resources/views/components/server/sidebar.blade.php
index 68ff3729be..c873b8aa28 100644
--- a/resources/views/components/server/sidebar.blade.php
+++ b/resources/views/components/server/sidebar.blade.php
@@ -10,9 +10,11 @@
href="{{ route('server.private-key', ['server_uuid' => $server->uuid]) }}">Private Key
@if ($server->isFunctional())
- Cloudflare
- Tunnels
+ @if (!$server->isLocalhost())
+ Cloudflare
+ Tunnels
+ @endif
Destinations
diff --git a/resources/views/livewire/server/cloudflare-tunnels.blade.php b/resources/views/livewire/server/cloudflare-tunnels.blade.php
index 4cb7fc2ec4..45a69bb5a7 100644
--- a/resources/views/livewire/server/cloudflare-tunnels.blade.php
+++ b/resources/views/livewire/server/cloudflare-tunnels.blade.php
@@ -12,8 +12,7 @@