@@ -187,6 +187,7 @@ class Email extends Component
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            $this->validate([
 | 
					            $this->validate([
 | 
				
			||||||
 | 
					                'resendApiKey' => 'required',
 | 
				
			||||||
            ], [
 | 
					            ], [
 | 
				
			||||||
                'resendApiKey.required' => 'Resend API Key is required.',
 | 
					                'resendApiKey.required' => 'Resend API Key is required.',
 | 
				
			||||||
            ]);
 | 
					            ]);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,9 @@ class CloudflareTunnels extends Component
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            $this->server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail();
 | 
					            $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;
 | 
					            $this->isCloudflareTunnelsEnabled = $this->server->settings->is_cloudflare_tunnel;
 | 
				
			||||||
        } catch (\Throwable $e) {
 | 
					        } catch (\Throwable $e) {
 | 
				
			||||||
            return handleError($e, $this);
 | 
					            return handleError($e, $this);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -116,6 +116,7 @@ class Show extends Component
 | 
				
			|||||||
            $this->server->save();
 | 
					            $this->server->save();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $this->server->settings->is_swarm_manager = $this->isSwarmManager;
 | 
					            $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_swarm_worker = $this->isSwarmWorker;
 | 
				
			||||||
            $this->server->settings->is_build_server = $this->isBuildServer;
 | 
					            $this->server->settings->is_build_server = $this->isBuildServer;
 | 
				
			||||||
            $this->server->settings->is_metrics_enabled = $this->isMetricsEnabled;
 | 
					            $this->server->settings->is_metrics_enabled = $this->isMetricsEnabled;
 | 
				
			||||||
@@ -134,6 +135,7 @@ class Show extends Component
 | 
				
			|||||||
            $this->ip = $this->server->ip;
 | 
					            $this->ip = $this->server->ip;
 | 
				
			||||||
            $this->user = $this->server->user;
 | 
					            $this->user = $this->server->user;
 | 
				
			||||||
            $this->port = $this->server->port;
 | 
					            $this->port = $this->server->port;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $this->wildcardDomain = $this->server->settings->wildcard_domain;
 | 
					            $this->wildcardDomain = $this->server->settings->wildcard_domain;
 | 
				
			||||||
            $this->isReachable = $this->server->settings->is_reachable;
 | 
					            $this->isReachable = $this->server->settings->is_reachable;
 | 
				
			||||||
            $this->isUsable = $this->server->settings->is_usable;
 | 
					            $this->isUsable = $this->server->settings->is_usable;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ return [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // The release version of your application
 | 
					    // The release version of your application
 | 
				
			||||||
    // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
 | 
					    // 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
 | 
					    // When left empty or `null` the Laravel environment will be used
 | 
				
			||||||
    'environment' => config('app.env'),
 | 
					    'environment' => config('app.env'),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,3 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
return '4.0.0-beta.362';
 | 
					return '4.0.0-beta.363';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
					## $1 could be empty, so we need to disable this check
 | 
				
			||||||
#set -u # Treat unset variables as an error and exit
 | 
					#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
 | 
					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")
 | 
					DATE=$(date +"%Y%m%d-%H%M%S")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VERSION="1.6"
 | 
					VERSION="1.6"
 | 
				
			||||||
@@ -185,11 +185,51 @@ elif [ -x "$(command -v service)" ]; then
 | 
				
			|||||||
        SSH_DETECTED=true
 | 
					        SSH_DETECTED=true
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ "$SSH_DETECTED" = "false" ]; then
 | 
					if [ "$SSH_DETECTED" = "false" ]; then
 | 
				
			||||||
    echo "###############################################################################"
 | 
					    echo " - OpenSSH server not detected. Installing OpenSSH server."
 | 
				
			||||||
    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."
 | 
					    case "$OS_TYPE" in
 | 
				
			||||||
    echo -e "Please make sure it is set, otherwise Coolify cannot connect to the host system. \n"
 | 
					    arch)
 | 
				
			||||||
    echo "###############################################################################"
 | 
					        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
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Detect SSH PermitRootLogin
 | 
					# Detect SSH PermitRootLogin
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,11 @@
 | 
				
			|||||||
#!/bin/bash
 | 
					#!/bin/bash
 | 
				
			||||||
## Do not modify this file. You will lose the ability to autoupdate!
 | 
					## 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"
 | 
					CDN="https://cdn.coollabs.io/coolify-nightly"
 | 
				
			||||||
LATEST_IMAGE=${1:-latest}
 | 
					LATEST_IMAGE=${1:-latest}
 | 
				
			||||||
LATEST_HELPER_VERSION=${2:-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.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/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
 | 
					if [ -f /data/coolify/source/docker-compose.custom.yml ]; then
 | 
				
			||||||
    echo "docker-compose.custom.yml detected."
 | 
					    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
 | 
					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
 | 
					fi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,10 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "coolify": {
 | 
					    "coolify": {
 | 
				
			||||||
        "v4": {
 | 
					        "v4": {
 | 
				
			||||||
            "version": "4.0.0-beta.362"
 | 
					            "version": "4.0.0-beta.363"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "nightly": {
 | 
					        "nightly": {
 | 
				
			||||||
            "version": "4.0.0-beta.363"
 | 
					            "version": "4.0.0-beta.364"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "helper": {
 | 
					        "helper": {
 | 
				
			||||||
            "version": "1.0.3"
 | 
					            "version": "1.0.3"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,9 +10,11 @@
 | 
				
			|||||||
        href="{{ route('server.private-key', ['server_uuid' => $server->uuid]) }}">Private Key
 | 
					        href="{{ route('server.private-key', ['server_uuid' => $server->uuid]) }}">Private Key
 | 
				
			||||||
    </a>
 | 
					    </a>
 | 
				
			||||||
    @if ($server->isFunctional())
 | 
					    @if ($server->isFunctional())
 | 
				
			||||||
        <a class="menu-item {{ $activeMenu === 'cloudflare-tunnels' ? 'menu-item-active' : '' }}"
 | 
					        @if (!$server->isLocalhost())
 | 
				
			||||||
            href="{{ route('server.cloudflare-tunnels', ['server_uuid' => $server->uuid]) }}">Cloudflare
 | 
					            <a class="menu-item {{ $activeMenu === 'cloudflare-tunnels' ? 'menu-item-active' : '' }}"
 | 
				
			||||||
            Tunnels</a>
 | 
					                href="{{ route('server.cloudflare-tunnels', ['server_uuid' => $server->uuid]) }}">Cloudflare
 | 
				
			||||||
 | 
					                Tunnels</a>
 | 
				
			||||||
 | 
					        @endif
 | 
				
			||||||
        <a class="menu-item {{ $activeMenu === 'destinations' ? 'menu-item-active' : '' }}"
 | 
					        <a class="menu-item {{ $activeMenu === 'destinations' ? 'menu-item-active' : '' }}"
 | 
				
			||||||
            href="{{ route('server.destinations', ['server_uuid' => $server->uuid]) }}">Destinations
 | 
					            href="{{ route('server.destinations', ['server_uuid' => $server->uuid]) }}">Destinations
 | 
				
			||||||
        </a>
 | 
					        </a>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,8 +12,7 @@
 | 
				
			|||||||
                    <x-helper class="inline-flex"
 | 
					                    <x-helper class="inline-flex"
 | 
				
			||||||
                        helper="If you are using Cloudflare Tunnels, enable this. It will proxy all SSH requests to your server through Cloudflare.<br> You then can close your server's SSH port in the firewall of your hosting provider.<br><span class='dark:text-warning'>If you choose manual configuration, Coolify does not install or set up Cloudflare (cloudflared) on your server.</span>" />
 | 
					                        helper="If you are using Cloudflare Tunnels, enable this. It will proxy all SSH requests to your server through Cloudflare.<br> You then can close your server's SSH port in the firewall of your hosting provider.<br><span class='dark:text-warning'>If you choose manual configuration, Coolify does not install or set up Cloudflare (cloudflared) on your server.</span>" />
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
                <div>Secure your servers with Cloudflare Tunnels</div>
 | 
					                <div>Secure your servers with Cloudflare Tunnels.</div>
 | 
				
			||||||
 | 
					 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="flex flex-col gap-2 pt-6">
 | 
					            <div class="flex flex-col gap-2 pt-6">
 | 
				
			||||||
                @if ($isCloudflareTunnelsEnabled)
 | 
					                @if ($isCloudflareTunnelsEnabled)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,11 @@
 | 
				
			|||||||
#!/bin/bash
 | 
					#!/bin/bash
 | 
				
			||||||
## Do not modify this file. You will lose the ability to autoupdate!
 | 
					## Do not modify this file. You will lose the ability to autoupdate!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VERSION="1.1"
 | 
					VERSION="1.2"
 | 
				
			||||||
CDN="https://cdn.coollabs.io/coolify"
 | 
					CDN="https://cdn.coollabs.io/coolify"
 | 
				
			||||||
LATEST_IMAGE=${1:-latest}
 | 
					LATEST_IMAGE=${1:-latest}
 | 
				
			||||||
LATEST_HELPER_VERSION=${2:-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.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/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
 | 
					if [ -f /data/coolify/source/docker-compose.custom.yml ]; then
 | 
				
			||||||
    echo "docker-compose.custom.yml detected."
 | 
					    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
 | 
					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
 | 
					fi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,10 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "coolify": {
 | 
					    "coolify": {
 | 
				
			||||||
        "v4": {
 | 
					        "v4": {
 | 
				
			||||||
            "version": "4.0.0-beta.362"
 | 
					            "version": "4.0.0-beta.363"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "nightly": {
 | 
					        "nightly": {
 | 
				
			||||||
            "version": "4.0.0-beta.363"
 | 
					            "version": "4.0.0-beta.364"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "helper": {
 | 
					        "helper": {
 | 
				
			||||||
            "version": "1.0.3"
 | 
					            "version": "1.0.3"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user