fix: add proxy to network with periodic check

This commit is contained in:
Andras Bacsai 2023-09-22 08:42:27 +02:00
parent e1a1490911
commit ebfc0bd1e1
4 changed files with 33 additions and 18 deletions

View File

@ -14,21 +14,12 @@ class StartProxy
use AsAction; use AsAction;
public function handle(Server $server, bool $async = true): Activity|string public function handle(Server $server, bool $async = true): Activity|string
{ {
$commands = collect([]);
$proxyType = $server->proxyType(); $proxyType = $server->proxyType();
if ($proxyType === 'none') { if ($proxyType === 'none') {
return 'OK'; return 'OK';
} }
$proxy_path = get_proxy_path(); $proxy_path = get_proxy_path();
$networks = collect($server->standaloneDockers)->map(function ($docker) {
return $docker['network'];
})->unique();
if ($networks->count() === 0) {
$networks = collect(['coolify']);
}
$create_networks_command = $networks->map(function ($network) {
return "docker network ls --format '{{.Name}}' | grep '^$network$' >/dev/null 2>&1 || docker network create --attachable $network > /dev/null 2>&1";
});
$configuration = CheckConfiguration::run($server); $configuration = CheckConfiguration::run($server);
if (!$configuration) { if (!$configuration) {
throw new \Exception("Configuration is not synced"); throw new \Exception("Configuration is not synced");
@ -36,13 +27,12 @@ public function handle(Server $server, bool $async = true): Activity|string
$docker_compose_yml_base64 = base64_encode($configuration); $docker_compose_yml_base64 = base64_encode($configuration);
$server->proxy->last_applied_settings = Str::of($docker_compose_yml_base64)->pipe('md5')->value; $server->proxy->last_applied_settings = Str::of($docker_compose_yml_base64)->pipe('md5')->value;
$server->save(); $server->save();
$commands = [
$commands = $commands->merge([
"command -v lsof >/dev/null || echo '####### Installing lsof...'", "command -v lsof >/dev/null || echo '####### Installing lsof...'",
"command -v lsof >/dev/null || apt-get update", "command -v lsof >/dev/null || apt-get update",
"command -v lsof >/dev/null || apt install -y lsof", "command -v lsof >/dev/null || apt install -y lsof",
"command -v lsof >/dev/null || command -v fuser >/dev/null || apt install -y psmisc", "command -v lsof >/dev/null || command -v fuser >/dev/null || apt install -y psmisc",
"echo '####### Creating required Docker networks...'",
...$create_networks_command,
"cd $proxy_path", "cd $proxy_path",
"echo '####### Creating Docker Compose file...'", "echo '####### Creating Docker Compose file...'",
"echo '####### Pulling docker image...'", "echo '####### Pulling docker image...'",
@ -60,7 +50,8 @@ public function handle(Server $server, bool $async = true): Activity|string
"echo '####### Starting coolify-proxy...'", "echo '####### Starting coolify-proxy...'",
'docker compose up -d --remove-orphans || docker-compose up -d --remove-orphans', 'docker compose up -d --remove-orphans || docker-compose up -d --remove-orphans',
"echo '####### Proxy installed successfully...'" "echo '####### Proxy installed successfully...'"
]; ]);
$commands = $commands->merge(connectProxyToNetworks($server));
if (!$async) { if (!$async) {
instant_remote_process($commands, $server); instant_remote_process($commands, $server);
return 'OK'; return 'OK';

View File

@ -89,11 +89,14 @@ public function handle(): void
} else { } else {
$this->server->proxy->status = data_get($foundProxyContainer, 'State.Status'); $this->server->proxy->status = data_get($foundProxyContainer, 'State.Status');
$this->server->save(); $this->server->save();
$connectProxyToDockerNetworks = connectProxyToNetworks($this->server);
instant_remote_process([$connectProxyToDockerNetworks], $this->server, false);
} }
$foundApplications = []; $foundApplications = [];
$foundApplicationPreviews = []; $foundApplicationPreviews = [];
$foundDatabases = []; $foundDatabases = [];
$foundServices = []; $foundServices = [];
foreach ($containers as $container) { foreach ($containers as $container) {
$containerStatus = data_get($container, 'State.Status'); $containerStatus = data_get($container, 'State.Status');
$labels = data_get($container, 'Config.Labels'); $labels = data_get($container, 'Config.Labels');
@ -202,7 +205,6 @@ public function handle(): void
// $this->server->team->notify(new ContainerStopped($containerName, $this->server, $url)); // $this->server->team->notify(new ContainerStopped($containerName, $this->server, $url));
// } // }
$notRunningApplications = $applications->pluck('id')->diff($foundApplications); $notRunningApplications = $applications->pluck('id')->diff($foundApplications);
foreach ($notRunningApplications as $applicationId) { foreach ($notRunningApplications as $applicationId) {
$application = $applications->where('id', $applicationId)->first(); $application = $applications->where('id', $applicationId)->first();

View File

@ -10,7 +10,23 @@ function get_proxy_path()
$proxy_path = "$base_path/proxy"; $proxy_path = "$base_path/proxy";
return $proxy_path; return $proxy_path;
} }
function connectProxyToNetworks(Server $server) {
$networks = collect($server->standaloneDockers)->map(function ($docker) {
return $docker['network'];
})->unique();
if ($networks->count() === 0) {
$networks = collect(['coolify']);
}
$commands = $networks->map(function ($network) {
return [
"echo '####### Connecting coolify-proxy to $network network...'",
"docker network ls --format '{{.Name}}' | grep '^$network$' >/dev/null 2>&1 || docker network create --attachable $network > /dev/null 2>&1",
"docker network connect $network coolify-proxy >/dev/null 2>&1 || true",
];
});
return $commands->flatten();
}
function generate_default_proxy_configuration(Server $server) function generate_default_proxy_configuration(Server $server)
{ {
$proxy_path = get_proxy_path(); $proxy_path = get_proxy_path();

View File

@ -16,7 +16,7 @@
use Spatie\Activitylog\Contracts\Activity; use Spatie\Activitylog\Contracts\Activity;
function remote_process( function remote_process(
array $command, Collection|array $command,
Server $server, Server $server,
?string $type = null, ?string $type = null,
?string $type_uuid = null, ?string $type_uuid = null,
@ -26,6 +26,9 @@ function remote_process(
if (is_null($type)) { if (is_null($type)) {
$type = ActivityTypes::INLINE->value; $type = ActivityTypes::INLINE->value;
} }
if ($command instanceof Collection) {
$command = $command->toArray();
}
$command_string = implode("\n", $command); $command_string = implode("\n", $command);
if (auth()->user()) { if (auth()->user()) {
$teams = auth()->user()->teams->pluck('id'); $teams = auth()->user()->teams->pluck('id');
@ -98,8 +101,11 @@ function generateSshCommand(Server $server, string $command, bool $isMux = true)
// ray($ssh_command); // ray($ssh_command);
return $ssh_command; return $ssh_command;
} }
function instant_remote_process(array $command, Server $server, $throwError = true) function instant_remote_process(Collection|array $command, Server $server, $throwError = true)
{ {
if ($command instanceof Collection) {
$command = $command->toArray();
}
$command_string = implode("\n", $command); $command_string = implode("\n", $command);
$ssh_command = generateSshCommand($server, $command_string); $ssh_command = generateSshCommand($server, $command_string);
$process = Process::run($ssh_command); $process = Process::run($ssh_command);