@@ -6,7 +6,7 @@ APP_KEY=
|
|||||||
APP_URL=http://localhost
|
APP_URL=http://localhost
|
||||||
APP_PORT=8000
|
APP_PORT=8000
|
||||||
APP_DEBUG=true
|
APP_DEBUG=true
|
||||||
MUX_ENABLED=false
|
SSH_MUX_ENABLED=false
|
||||||
|
|
||||||
# PostgreSQL Database Configuration
|
# PostgreSQL Database Configuration
|
||||||
DB_DATABASE=coolify
|
DB_DATABASE=coolify
|
||||||
|
@@ -282,7 +282,7 @@ uZx9iFkCELtxrh31QJ68AAAAEXNhaWxANzZmZjY2ZDJlMmRkAQIDBA==
|
|||||||
public function validateServer()
|
public function validateServer()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
config()->set('coolify.mux_enabled', false);
|
config()->set('constants.ssh.mux_enabled', false);
|
||||||
|
|
||||||
// EC2 does not have `uptime` command, lol
|
// EC2 does not have `uptime` command, lol
|
||||||
instant_remote_process(['ls /'], $this->createdServer, true);
|
instant_remote_process(['ls /'], $this->createdServer, true);
|
||||||
|
@@ -24,7 +24,11 @@ class Form extends Component
|
|||||||
|
|
||||||
public $timezones;
|
public $timezones;
|
||||||
|
|
||||||
protected $listeners = ['serverInstalled', 'revalidate' => '$refresh'];
|
protected $listeners = [
|
||||||
|
'serverInstalled',
|
||||||
|
'refreshServerShow' => 'serverInstalled',
|
||||||
|
'revalidate' => '$refresh',
|
||||||
|
];
|
||||||
|
|
||||||
protected $rules = [
|
protected $rules = [
|
||||||
'server.name' => 'required',
|
'server.name' => 'required',
|
||||||
|
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
namespace App\Livewire\Server\New;
|
namespace App\Livewire\Server\New;
|
||||||
|
|
||||||
use App\Enums\ProxyStatus;
|
|
||||||
use App\Enums\ProxyTypes;
|
use App\Enums\ProxyTypes;
|
||||||
use App\Models\Server;
|
use App\Models\Server;
|
||||||
use App\Models\Team;
|
use App\Models\Team;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
use Livewire\Component;
|
use Livewire\Component;
|
||||||
|
|
||||||
class ByIp extends Component
|
class ByIp extends Component
|
||||||
@@ -40,7 +40,7 @@ class ByIp extends Component
|
|||||||
|
|
||||||
public bool $is_build_server = false;
|
public bool $is_build_server = false;
|
||||||
|
|
||||||
public $swarm_managers = [];
|
public Collection $swarm_managers;
|
||||||
|
|
||||||
protected $rules = [
|
protected $rules = [
|
||||||
'name' => 'required|string',
|
'name' => 'required|string',
|
||||||
@@ -102,11 +102,6 @@ class ByIp extends Component
|
|||||||
'port' => $this->port,
|
'port' => $this->port,
|
||||||
'team_id' => currentTeam()->id,
|
'team_id' => currentTeam()->id,
|
||||||
'private_key_id' => $this->private_key_id,
|
'private_key_id' => $this->private_key_id,
|
||||||
'proxy' => [
|
|
||||||
// set default proxy type to traefik v2
|
|
||||||
'type' => ProxyTypes::TRAEFIK->value,
|
|
||||||
'status' => ProxyStatus::EXITED->value,
|
|
||||||
],
|
|
||||||
];
|
];
|
||||||
if ($this->is_swarm_worker) {
|
if ($this->is_swarm_worker) {
|
||||||
$payload['swarm_cluster'] = $this->selected_swarm_cluster;
|
$payload['swarm_cluster'] = $this->selected_swarm_cluster;
|
||||||
@@ -115,6 +110,9 @@ class ByIp extends Component
|
|||||||
data_forget($payload, 'proxy');
|
data_forget($payload, 'proxy');
|
||||||
}
|
}
|
||||||
$server = Server::create($payload);
|
$server = Server::create($payload);
|
||||||
|
$server->proxy->set('status', 'exited');
|
||||||
|
$server->proxy->set('type', ProxyTypes::TRAEFIK->value);
|
||||||
|
$server->save();
|
||||||
if ($this->is_build_server) {
|
if ($this->is_build_server) {
|
||||||
$this->is_swarm_manager = false;
|
$this->is_swarm_manager = false;
|
||||||
$this->is_swarm_worker = false;
|
$this->is_swarm_worker = false;
|
||||||
|
@@ -14,7 +14,7 @@ class Show extends Component
|
|||||||
|
|
||||||
public $parameters = [];
|
public $parameters = [];
|
||||||
|
|
||||||
protected $listeners = ['refreshServerShow' => '$refresh'];
|
protected $listeners = ['refreshServerShow'];
|
||||||
|
|
||||||
public function mount()
|
public function mount()
|
||||||
{
|
{
|
||||||
@@ -29,6 +29,12 @@ class Show extends Component
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function refreshServerShow()
|
||||||
|
{
|
||||||
|
$this->server->refresh();
|
||||||
|
$this->dispatch('$refresh');
|
||||||
|
}
|
||||||
|
|
||||||
public function submit()
|
public function submit()
|
||||||
{
|
{
|
||||||
$this->dispatch('serverRefresh', false);
|
$this->dispatch('serverRefresh', false);
|
||||||
|
@@ -967,7 +967,7 @@ $schema://$host {
|
|||||||
|
|
||||||
public function validateConnection()
|
public function validateConnection()
|
||||||
{
|
{
|
||||||
config()->set('coolify.mux_enabled', false);
|
config()->set('constants.ssh.mux_enabled', false);
|
||||||
|
|
||||||
$server = Server::find($this->id);
|
$server = Server::find($this->id);
|
||||||
if (! $server) {
|
if (! $server) {
|
||||||
|
@@ -98,12 +98,10 @@ function generateScpCommand(Server $server, string $source, string $dest)
|
|||||||
$muxPersistTime = config('constants.ssh.mux_persist_time');
|
$muxPersistTime = config('constants.ssh.mux_persist_time');
|
||||||
|
|
||||||
$scp_command = "timeout $timeout scp ";
|
$scp_command = "timeout $timeout scp ";
|
||||||
// Check if multiplexing is enabled
|
$muxEnabled = config('constants.ssh.mux_enabled', true) && config('coolify.is_windows_docker_desktop') == false;
|
||||||
$muxEnabled = config('constants.ssh.mux_enabled', true);
|
|
||||||
// ray('SSH Multiplexing Enabled:', $muxEnabled)->blue();
|
// ray('SSH Multiplexing Enabled:', $muxEnabled)->blue();
|
||||||
|
|
||||||
if ($muxEnabled) {
|
if ($muxEnabled) {
|
||||||
// Always use multiplexing when enabled
|
|
||||||
$muxSocket = "/var/www/html/storage/app/ssh/mux/{$server->muxFilename()}";
|
$muxSocket = "/var/www/html/storage/app/ssh/mux/{$server->muxFilename()}";
|
||||||
$scp_command .= "-o ControlMaster=auto -o ControlPath=$muxSocket -o ControlPersist={$muxPersistTime} ";
|
$scp_command .= "-o ControlMaster=auto -o ControlPath=$muxSocket -o ControlPersist={$muxPersistTime} ";
|
||||||
ensureMultiplexedConnection($server);
|
ensureMultiplexedConnection($server);
|
||||||
@@ -163,10 +161,8 @@ function generateSshCommand(Server $server, string $command)
|
|||||||
|
|
||||||
$ssh_command = "timeout $timeout ssh ";
|
$ssh_command = "timeout $timeout ssh ";
|
||||||
|
|
||||||
// Check if multiplexing is enabled
|
$muxEnabled = config('constants.ssh.mux_enabled') && config('coolify.is_windows_docker_desktop') == false;
|
||||||
$muxEnabled = config('constants.ssh.mux_enabled', true);
|
|
||||||
// ray('SSH Multiplexing Enabled:', $muxEnabled)->blue();
|
// ray('SSH Multiplexing Enabled:', $muxEnabled)->blue();
|
||||||
|
|
||||||
if ($muxEnabled) {
|
if ($muxEnabled) {
|
||||||
// Always use multiplexing when enabled
|
// Always use multiplexing when enabled
|
||||||
$muxSocket = "/var/www/html/storage/app/ssh/mux/{$server->muxFilename()}";
|
$muxSocket = "/var/www/html/storage/app/ssh/mux/{$server->muxFilename()}";
|
||||||
@@ -201,6 +197,10 @@ function generateSshCommand(Server $server, string $command)
|
|||||||
|
|
||||||
function ensureMultiplexedConnection(Server $server)
|
function ensureMultiplexedConnection(Server $server)
|
||||||
{
|
{
|
||||||
|
if (! (config('constants.ssh.mux_enabled') && config('coolify.is_windows_docker_desktop') == false)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
static $ensuredConnections = [];
|
static $ensuredConnections = [];
|
||||||
|
|
||||||
if (isset($ensuredConnections[$server->id])) {
|
if (isset($ensuredConnections[$server->id])) {
|
||||||
@@ -212,7 +212,11 @@ function ensureMultiplexedConnection(Server $server)
|
|||||||
}
|
}
|
||||||
|
|
||||||
$muxSocket = "/var/www/html/storage/app/ssh/mux/{$server->muxFilename()}";
|
$muxSocket = "/var/www/html/storage/app/ssh/mux/{$server->muxFilename()}";
|
||||||
$checkCommand = "ssh -O check -o ControlPath=$muxSocket {$server->user}@{$server->ip} 2>/dev/null";
|
$checkCommand = "ssh -O check -o ControlPath=$muxSocket ";
|
||||||
|
if (data_get($server, 'settings.is_cloudflare_tunnel')) {
|
||||||
|
$checkCommand .= '-o ProxyCommand="/usr/local/bin/cloudflared access ssh --hostname %h" ';
|
||||||
|
}
|
||||||
|
$checkCommand .= " {$server->user}@{$server->ip}";
|
||||||
|
|
||||||
$process = Process::run($checkCommand);
|
$process = Process::run($checkCommand);
|
||||||
|
|
||||||
@@ -233,8 +237,12 @@ function ensureMultiplexedConnection(Server $server)
|
|||||||
$serverInterval = config('constants.ssh.server_interval');
|
$serverInterval = config('constants.ssh.server_interval');
|
||||||
$muxPersistTime = config('constants.ssh.mux_persist_time');
|
$muxPersistTime = config('constants.ssh.mux_persist_time');
|
||||||
|
|
||||||
$establishCommand = "ssh -fNM -o ControlMaster=auto -o ControlPath=$muxSocket -o ControlPersist={$muxPersistTime} "
|
$establishCommand = "ssh -fNM -o ControlMaster=auto -o ControlPath=$muxSocket -o ControlPersist={$muxPersistTime} ";
|
||||||
."-i {$privateKeyLocation} "
|
|
||||||
|
if (data_get($server, 'settings.is_cloudflare_tunnel')) {
|
||||||
|
$establishCommand .= '-o ProxyCommand="/usr/local/bin/cloudflared access ssh --hostname %h" ';
|
||||||
|
}
|
||||||
|
$establishCommand .= "-i {$privateKeyLocation} "
|
||||||
.'-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null '
|
.'-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null '
|
||||||
.'-o PasswordAuthentication=no '
|
.'-o PasswordAuthentication=no '
|
||||||
."-o ConnectTimeout=$connectionTimeout "
|
."-o ConnectTimeout=$connectionTimeout "
|
||||||
@@ -260,6 +268,10 @@ function ensureMultiplexedConnection(Server $server)
|
|||||||
|
|
||||||
function shouldResetMultiplexedConnection(Server $server)
|
function shouldResetMultiplexedConnection(Server $server)
|
||||||
{
|
{
|
||||||
|
if (! (config('constants.ssh.mux_enabled') && config('coolify.is_windows_docker_desktop') == false)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static $ensuredConnections = [];
|
static $ensuredConnections = [];
|
||||||
|
|
||||||
if (! isset($ensuredConnections[$server->id])) {
|
if (! isset($ensuredConnections[$server->id])) {
|
||||||
@@ -275,6 +287,10 @@ function shouldResetMultiplexedConnection(Server $server)
|
|||||||
|
|
||||||
function resetMultiplexedConnection(Server $server)
|
function resetMultiplexedConnection(Server $server)
|
||||||
{
|
{
|
||||||
|
if (! (config('constants.ssh.mux_enabled') && config('coolify.is_windows_docker_desktop') == false)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
static $ensuredConnections = [];
|
static $ensuredConnections = [];
|
||||||
|
|
||||||
if (isset($ensuredConnections[$server->id])) {
|
if (isset($ensuredConnections[$server->id])) {
|
||||||
|
@@ -6,7 +6,8 @@ return [
|
|||||||
'contact' => 'https://coolify.io/docs/contact',
|
'contact' => 'https://coolify.io/docs/contact',
|
||||||
],
|
],
|
||||||
'ssh' => [
|
'ssh' => [
|
||||||
'mux_enabled' => env('SSH_MUX_ENABLED', true),
|
// Using MUX
|
||||||
|
'mux_enabled' => env('MUX_ENABLED', env('SSH_MUX_ENABLED', true), true),
|
||||||
'mux_persist_time' => env('SSH_MUX_PERSIST_TIME', '1h'),
|
'mux_persist_time' => env('SSH_MUX_PERSIST_TIME', '1h'),
|
||||||
'connection_timeout' => 10,
|
'connection_timeout' => 10,
|
||||||
'server_interval' => 20,
|
'server_interval' => 20,
|
||||||
|
@@ -7,7 +7,6 @@ return [
|
|||||||
'self_hosted' => env('SELF_HOSTED', true),
|
'self_hosted' => env('SELF_HOSTED', true),
|
||||||
'waitlist' => env('WAITLIST', false),
|
'waitlist' => env('WAITLIST', false),
|
||||||
'license_url' => 'https://licenses.coollabs.io',
|
'license_url' => 'https://licenses.coollabs.io',
|
||||||
'mux_enabled' => env('MUX_ENABLED', true),
|
|
||||||
'dev_webhook' => env('SERVEO_URL'),
|
'dev_webhook' => env('SERVEO_URL'),
|
||||||
'is_windows_docker_desktop' => env('IS_WINDOWS_DOCKER_DESKTOP', false),
|
'is_windows_docker_desktop' => env('IS_WINDOWS_DOCKER_DESKTOP', false),
|
||||||
'base_config_path' => env('BASE_CONFIG_PATH', '/data/coolify'),
|
'base_config_path' => env('BASE_CONFIG_PATH', '/data/coolify'),
|
||||||
|
@@ -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.334',
|
'release' => '4.0.0-beta.335',
|
||||||
// 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.334';
|
return '4.0.0-beta.335';
|
||||||
|
@@ -48,6 +48,7 @@ services:
|
|||||||
- PUSHER_APP_SECRET
|
- PUSHER_APP_SECRET
|
||||||
- AUTOUPDATE
|
- AUTOUPDATE
|
||||||
- SELF_HOSTED
|
- SELF_HOSTED
|
||||||
|
- SSH_MUX_ENABLED
|
||||||
- SSH_MUX_PERSIST_TIME
|
- SSH_MUX_PERSIST_TIME
|
||||||
- FEEDBACK_DISCORD_WEBHOOK
|
- FEEDBACK_DISCORD_WEBHOOK
|
||||||
- WAITLIST
|
- WAITLIST
|
||||||
|
@@ -45,7 +45,7 @@ services:
|
|||||||
- PUSHER_APP_SECRET
|
- PUSHER_APP_SECRET
|
||||||
- AUTOUPDATE=true
|
- AUTOUPDATE=true
|
||||||
- SELF_HOSTED=true
|
- SELF_HOSTED=true
|
||||||
- MUX_ENABLED=false
|
- SSH_MUX_ENABLED=false
|
||||||
- IS_WINDOWS_DOCKER_DESKTOP=true
|
- IS_WINDOWS_DOCKER_DESKTOP=true
|
||||||
ports:
|
ports:
|
||||||
- "${APP_PORT:-8000}:80"
|
- "${APP_PORT:-8000}:80"
|
||||||
|
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"coolify": {
|
"coolify": {
|
||||||
"v4": {
|
"v4": {
|
||||||
"version": "4.0.0-beta.334"
|
"version": "4.0.0-beta.335"
|
||||||
},
|
},
|
||||||
"nightly": {
|
"nightly": {
|
||||||
"version": "4.0.0-beta.335"
|
"version": "4.0.0-beta.336"
|
||||||
},
|
},
|
||||||
"helper": {
|
"helper": {
|
||||||
"version": "1.0.1"
|
"version": "1.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user