diff --git a/app/Actions/Service/StartService.php b/app/Actions/Service/StartService.php
index 7aef457a1..06d2e0efb 100644
--- a/app/Actions/Service/StartService.php
+++ b/app/Actions/Service/StartService.php
@@ -16,7 +16,7 @@ class StartService
$service->saveComposeConfigs();
$commands[] = 'cd '.$service->workdir();
$commands[] = "echo 'Saved configuration files to {$service->workdir()}.'";
- if($service->networks()->count() > 0){
+ if ($service->networks()->count() > 0) {
$commands[] = "echo 'Creating Docker network.'";
$commands[] = "docker network inspect $service->uuid >/dev/null 2>&1 || docker network create --attachable $service->uuid";
}
@@ -31,7 +31,7 @@ class StartService
$network = $service->destination->network;
$serviceNames = data_get(Yaml::parse($compose), 'services', []);
foreach ($serviceNames as $serviceName => $serviceConfig) {
- $commands[] = "docker network connect --alias {$serviceName}-{$service->uuid} $network {$serviceName}-{$service->uuid} || true";
+ $commands[] = "docker network connect --alias {$serviceName}-{$service->uuid} $network {$serviceName}-{$service->uuid} >/dev/null 2>&1 || true";
}
}
$activity = remote_process($commands, $service->server, type_uuid: $service->uuid, callEventOnFinish: 'ServiceStatusChanged');
diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php
index 4e8e11001..32db4ac32 100644
--- a/app/Jobs/ApplicationDeploymentJob.php
+++ b/app/Jobs/ApplicationDeploymentJob.php
@@ -514,7 +514,7 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
'hidden' => true,
'ignore_errors' => true,
], [
- "docker network connect {$networkId} coolify-proxy || true",
+ "docker network connect {$networkId} coolify-proxy >/dev/null 2>&1 || true",
'hidden' => true,
'ignore_errors' => true,
]);
diff --git a/app/Livewire/Project/Shared/ExecuteContainerCommand.php b/app/Livewire/Project/Shared/ExecuteContainerCommand.php
index bf34fec79..79f32ab8b 100644
--- a/app/Livewire/Project/Shared/ExecuteContainerCommand.php
+++ b/app/Livewire/Project/Shared/ExecuteContainerCommand.php
@@ -11,7 +11,7 @@ use Livewire\Component;
class ExecuteContainerCommand extends Component
{
- public string $container;
+ public $container;
public Collection $containers;
@@ -57,24 +57,13 @@ class ExecuteContainerCommand extends Component
if ($this->resource->destination->server->isFunctional()) {
$this->servers = $this->servers->push($this->resource->destination->server);
}
- $this->container = $this->resource->uuid;
- $this->containers->push($this->container);
} elseif (data_get($this->parameters, 'service_uuid')) {
$this->type = 'service';
$this->resource = Service::where('uuid', $this->parameters['service_uuid'])->firstOrFail();
- $this->resource->applications()->get()->each(function ($application) {
- $this->containers->push(data_get($application, 'name').'-'.data_get($this->resource, 'uuid'));
- });
- $this->resource->databases()->get()->each(function ($database) {
- $this->containers->push(data_get($database, 'name').'-'.data_get($this->resource, 'uuid'));
- });
if ($this->resource->server->isFunctional()) {
$this->servers = $this->servers->push($this->resource->server);
}
}
- if ($this->containers->count() > 0) {
- $this->container = $this->containers->first();
- }
}
public function loadContainers()
@@ -97,19 +86,42 @@ class ExecuteContainerCommand extends Component
];
$this->containers = $this->containers->push($payload);
}
+ } elseif (data_get($this->parameters, 'database_uuid')) {
+ if ($this->resource->isRunning()) {
+ $this->containers = $this->containers->push([
+ 'server' => $server,
+ 'container' => [
+ 'Names' => $this->resource->uuid,
+ ],
+ ]);
+ }
+ } elseif (data_get($this->parameters, 'service_uuid')) {
+ $this->resource->applications()->get()->each(function ($application) {
+ ray($application);
+ if ($application->isRunning()) {
+ $this->containers->push([
+ 'server' => $this->resource->server,
+ 'container' => [
+ 'Names' => data_get($application, 'name').'-'.data_get($this->resource, 'uuid'),
+ ],
+ ]);
+ }
+ });
+ $this->resource->databases()->get()->each(function ($database) {
+ if ($database->isRunning()) {
+ $this->containers->push([
+ 'server' => $this->resource->server,
+ 'container' => [
+ 'Names' => data_get($database, 'name').'-'.data_get($this->resource, 'uuid'),
+ ],
+ ]);
+ }
+ });
}
+
}
if ($this->containers->count() > 0) {
- if (data_get($this->parameters, 'application_uuid')) {
- $this->container = data_get($this->containers->first(), 'container.Names');
- } elseif (data_get($this->parameters, 'database_uuid')) {
- $this->container = $this->containers->first();
- } elseif (data_get($this->parameters, 'service_uuid')) {
- $this->container = $this->containers->first();
- }
- if ($this->containers->count() === 1) {
- $this->dispatch('connectToContainer');
- }
+ $this->container = $this->containers->first();
}
}
@@ -117,17 +129,13 @@ class ExecuteContainerCommand extends Component
public function connectToContainer()
{
try {
- if (data_get($this->parameters, 'application_uuid')) {
- $container = $this->containers->where('container.Names', $this->container)->first();
- $container_name = data_get($container, 'container.Names');
- if (is_null($container)) {
- throw new \RuntimeException('Container not found.');
- }
- $server = data_get($container, 'server');
- } else {
- $container_name = $this->container;
- $server = $this->servers->first();
+ $container_name = data_get($this->container, 'container.Names');
+ ray($this->container);
+ if (is_null($container_name)) {
+ throw new \RuntimeException('Container not found.');
}
+ $server = data_get($this->container, 'server');
+
if ($server->isForceDisabled()) {
throw new \RuntimeException('Server is disabled.');
}
diff --git a/app/Livewire/Project/Shared/Terminal.php b/app/Livewire/Project/Shared/Terminal.php
index de1df3844..7c23c291d 100644
--- a/app/Livewire/Project/Shared/Terminal.php
+++ b/app/Livewire/Project/Shared/Terminal.php
@@ -24,7 +24,7 @@ class Terminal extends Component
if ($isContainer) {
$status = getContainerStatus($server, $identifier);
if ($status !== 'running') {
- return handleError(new \Exception('Container is not running'), $this);
+ return;
}
$command = generateSshCommand($server, "docker exec -it {$identifier} sh -c 'if [ -f ~/.profile ]; then . ~/.profile; fi; if [ -n \"\$SHELL\" ]; then exec \$SHELL; else sh; fi'");
} else {
diff --git a/app/Models/ServiceApplication.php b/app/Models/ServiceApplication.php
index 6690f254e..d312fab96 100644
--- a/app/Models/ServiceApplication.php
+++ b/app/Models/ServiceApplication.php
@@ -32,6 +32,16 @@ class ServiceApplication extends BaseModel
return ServiceApplication::whereRelation('service.environment.project.team', 'id', $teamId)->orderBy('name');
}
+ public function isRunning()
+ {
+ return str($this->status)->contains('running');
+ }
+
+ public function isExited()
+ {
+ return str($this->status)->contains('exited');
+ }
+
public function isLogDrainEnabled()
{
return data_get($this, 'is_log_drain_enabled', false);
diff --git a/app/Models/ServiceDatabase.php b/app/Models/ServiceDatabase.php
index 4a749913e..6b96738e8 100644
--- a/app/Models/ServiceDatabase.php
+++ b/app/Models/ServiceDatabase.php
@@ -25,6 +25,16 @@ class ServiceDatabase extends BaseModel
remote_process(["docker restart {$container_id}"], $this->service->server);
}
+ public function isRunning()
+ {
+ return str($this->status)->contains('running');
+ }
+
+ public function isExited()
+ {
+ return str($this->status)->contains('exited');
+ }
+
public function isLogDrainEnabled()
{
return data_get($this, 'is_log_drain_enabled', false);
diff --git a/app/Models/StandaloneClickhouse.php b/app/Models/StandaloneClickhouse.php
index 4cd194cd8..ee5c3becc 100644
--- a/app/Models/StandaloneClickhouse.php
+++ b/app/Models/StandaloneClickhouse.php
@@ -75,6 +75,11 @@ class StandaloneClickhouse extends BaseModel
}
}
+ public function isRunning()
+ {
+ return (bool) str($this->status)->contains('running');
+ }
+
public function isExited()
{
return (bool) str($this->status)->startsWith('exited');
diff --git a/app/Models/StandaloneDragonfly.php b/app/Models/StandaloneDragonfly.php
index 8726b2546..361abf110 100644
--- a/app/Models/StandaloneDragonfly.php
+++ b/app/Models/StandaloneDragonfly.php
@@ -75,6 +75,11 @@ class StandaloneDragonfly extends BaseModel
}
}
+ public function isRunning()
+ {
+ return (bool) str($this->status)->contains('running');
+ }
+
public function isExited()
{
return (bool) str($this->status)->startsWith('exited');
diff --git a/app/Models/StandaloneKeydb.php b/app/Models/StandaloneKeydb.php
index 7ecb00348..e05879371 100644
--- a/app/Models/StandaloneKeydb.php
+++ b/app/Models/StandaloneKeydb.php
@@ -75,6 +75,11 @@ class StandaloneKeydb extends BaseModel
}
}
+ public function isRunning()
+ {
+ return (bool) str($this->status)->contains('running');
+ }
+
public function isExited()
{
return (bool) str($this->status)->startsWith('exited');
diff --git a/app/Models/StandaloneMariadb.php b/app/Models/StandaloneMariadb.php
index d88653e41..c1e6c85d7 100644
--- a/app/Models/StandaloneMariadb.php
+++ b/app/Models/StandaloneMariadb.php
@@ -75,6 +75,11 @@ class StandaloneMariadb extends BaseModel
}
}
+ public function isRunning()
+ {
+ return (bool) str($this->status)->contains('running');
+ }
+
public function isExited()
{
return (bool) str($this->status)->startsWith('exited');
diff --git a/app/Models/StandaloneMongodb.php b/app/Models/StandaloneMongodb.php
index f09e932bf..e5ed0a5f4 100644
--- a/app/Models/StandaloneMongodb.php
+++ b/app/Models/StandaloneMongodb.php
@@ -79,6 +79,11 @@ class StandaloneMongodb extends BaseModel
}
}
+ public function isRunning()
+ {
+ return (bool) str($this->status)->contains('running');
+ }
+
public function isExited()
{
return (bool) str($this->status)->startsWith('exited');
diff --git a/app/Models/StandaloneMysql.php b/app/Models/StandaloneMysql.php
index f4e56fab2..bd4a7abb7 100644
--- a/app/Models/StandaloneMysql.php
+++ b/app/Models/StandaloneMysql.php
@@ -76,6 +76,11 @@ class StandaloneMysql extends BaseModel
}
}
+ public function isRunning()
+ {
+ return (bool) str($this->status)->contains('running');
+ }
+
public function isExited()
{
return (bool) str($this->status)->startsWith('exited');
diff --git a/app/Models/StandalonePostgresql.php b/app/Models/StandalonePostgresql.php
index 311c09c36..db771c7cd 100644
--- a/app/Models/StandalonePostgresql.php
+++ b/app/Models/StandalonePostgresql.php
@@ -102,6 +102,11 @@ class StandalonePostgresql extends BaseModel
}
}
+ public function isRunning()
+ {
+ return (bool) str($this->status)->contains('running');
+ }
+
public function isExited()
{
return (bool) str($this->status)->startsWith('exited');
diff --git a/app/Models/StandaloneRedis.php b/app/Models/StandaloneRedis.php
index 8a202ea9e..c524d4d03 100644
--- a/app/Models/StandaloneRedis.php
+++ b/app/Models/StandaloneRedis.php
@@ -71,6 +71,11 @@ class StandaloneRedis extends BaseModel
}
}
+ public function isRunning()
+ {
+ return (bool) str($this->status)->contains('running');
+ }
+
public function isExited()
{
return (bool) str($this->status)->startsWith('exited');
diff --git a/bootstrap/helpers/docker.php b/bootstrap/helpers/docker.php
index 825668743..8dce52f15 100644
--- a/bootstrap/helpers/docker.php
+++ b/bootstrap/helpers/docker.php
@@ -229,12 +229,12 @@ function generateServiceSpecificFqdns(ServiceApplication|Application $resource)
}
if (is_null($MINIO_BROWSER_REDIRECT_URL?->value)) {
$MINIO_BROWSER_REDIRECT_URL?->update([
- 'value' => generateFqdn($server, 'console-'.$uuid),
+ 'value' => generateFqdn($server, 'console-'.$uuid, true),
]);
}
if (is_null($MINIO_SERVER_URL?->value)) {
$MINIO_SERVER_URL?->update([
- 'value' => generateFqdn($server, 'minio-'.$uuid),
+ 'value' => generateFqdn($server, 'minio-'.$uuid, true),
]);
}
$payload = collect([
diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php
index 4b81fc997..abfde7135 100644
--- a/bootstrap/helpers/shared.php
+++ b/bootstrap/helpers/shared.php
@@ -478,7 +478,7 @@ function data_get_str($data, $key, $default = null): Stringable
return str($str);
}
-function generateFqdn(Server $server, string $random): string
+function generateFqdn(Server $server, string $random, bool $forceHttps = false): string
{
$wildcard = data_get($server, 'settings.wildcard_domain');
if (is_null($wildcard) || $wildcard === '') {
@@ -488,6 +488,9 @@ function generateFqdn(Server $server, string $random): string
$host = $url->getHost();
$path = $url->getPath() === '/' ? '' : $url->getPath();
$scheme = $url->getScheme();
+ if ($forceHttps) {
+ $scheme = 'https';
+ }
$finalFqdn = "$scheme://{$random}.$host$path";
return $finalFqdn;
diff --git a/config/sentry.php b/config/sentry.php
index bae81659a..8fb0e5cdd 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.336',
+ 'release' => '4.0.0-beta.337',
// 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 bab78d59c..aac06d60d 100644
--- a/config/version.php
+++ b/config/version.php
@@ -1,3 +1,3 @@
>(tee -a $INSTALLATION_LOG_WITH_DATE) 2>&1
-CDN="https://cdn.coollabs.io/coolify-nightly"
+getAJoke() {
+ JOKES=$(curl -s --max-time 2 https://v2.jokeapi.dev/joke/Programming?format=txt&type=single&amount=1 || true)
+ if [ "$JOKES" != "" ]; then
+ echo -e " - Until then, here's a joke for you:\n"
+ echo -e "$JOKES\n"
+ fi
+}
OS_TYPE=$(grep -w "ID" /etc/os-release | cut -d "=" -f 2 | tr -d '"')
ENV_FILE="/data/coolify/source/.env"
@@ -202,6 +209,7 @@ fi
echo -e "3. Check Docker Installation. "
if ! [ -x "$(command -v docker)" ]; then
echo " - Docker is not installed. Installing Docker. It may take a while."
+ getAJoke
case "$OS_TYPE" in
"almalinux")
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo >/dev/null 2>&1
@@ -477,22 +485,14 @@ chmod -R 700 /data/coolify
echo -e "9. Installing Coolify ($LATEST_VERSION)"
echo -e " - It could take a while based on your server's performance, network speed, stars, etc."
echo -e " - Please wait."
-JOKES=$(curl -s https://v2.jokeapi.dev/joke/Programming?format=txt&type=single&amount=1 || true)
-if [ "$JOKES" != "" ]; then
- echo -e " - Until then, here's a joke for you:\n"
- echo -e "$JOKES\n"
-fi
+getAJoke
bash /data/coolify/source/upgrade.sh "${LATEST_VERSION:-latest}" "${LATEST_HELPER_VERSION:-latest}" >/dev/null 2>&1
echo " - Coolify installed successfully."
rm -f $ENV_FILE-$DATE
echo " - Waiting for 20 seconds for Coolify (database migrations) to be ready."
-JOKES=$(curl -s https://v2.jokeapi.dev/joke/Programming?format=txt&type=single&amount=1 || true)
-if [ "$JOKES" != "" ]; then
- echo -e " - Until then, here's a joke for you:\n"
- echo -e "$JOKES\n"
-fi
+getAJoke
sleep 20
echo -e "\033[0;35m
@@ -505,5 +505,5 @@ echo -e "\033[0;35m
\033[0m"
echo -e "\nYour instance is ready to use."
echo -e "Please visit http://$(curl -4s https://ifconfig.io):8000 to get started.\n"
-echo -e "WARNING: We recommend you backup your /data/coolify/source/.env file to a safe location, outside of this server."
+echo -e "WARNING: We recommend you to backup your /data/coolify/source/.env file to a safe location, outside of this server."
cp /data/coolify/source/.env /data/coolify/source/.env.backup
diff --git a/other/nightly/versions.json b/other/nightly/versions.json
index defd8ed26..cf7d13343 100644
--- a/other/nightly/versions.json
+++ b/other/nightly/versions.json
@@ -1,10 +1,10 @@
{
"coolify": {
"v4": {
- "version": "4.0.0-beta.336"
+ "version": "4.0.0-beta.337"
},
"nightly": {
- "version": "4.0.0-beta.337"
+ "version": "4.0.0-beta.338"
},
"helper": {
"version": "1.0.1"
diff --git a/resources/views/livewire/project/service/configuration.blade.php b/resources/views/livewire/project/service/configuration.blade.php
index 5c6fe87fd..c5ac0412f 100644
--- a/resources/views/livewire/project/service/configuration.blade.php
+++ b/resources/views/livewire/project/service/configuration.blade.php
@@ -3,8 +3,8 @@
{{ data_get_str($service, 'name')->limit(10) }} > Configuration | Coolify