feat(database): add CA certificate generation for database servers
This commit is contained in:
		@@ -57,6 +57,17 @@ class StartDragonfly
 | 
				
			|||||||
            $server = $this->database->destination->server;
 | 
					            $server = $this->database->destination->server;
 | 
				
			||||||
            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
					            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $server->generateCaCertificate();
 | 
				
			||||||
 | 
					                $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $this->dispatch('error', 'No CA certificate found for this database. Please generate a CA certificate for this server in the server/advanced page.');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
					            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (! $this->ssl_certificate) {
 | 
					            if (! $this->ssl_certificate) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -58,6 +58,17 @@ class StartKeydb
 | 
				
			|||||||
            $server = $this->database->destination->server;
 | 
					            $server = $this->database->destination->server;
 | 
				
			||||||
            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
					            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $server->generateCaCertificate();
 | 
				
			||||||
 | 
					                $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $this->dispatch('error', 'No CA certificate found for this database. Please generate a CA certificate for this server in the server/advanced page.');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
					            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (! $this->ssl_certificate) {
 | 
					            if (! $this->ssl_certificate) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,17 @@ class StartMariadb
 | 
				
			|||||||
            $server = $this->database->destination->server;
 | 
					            $server = $this->database->destination->server;
 | 
				
			||||||
            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
					            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $server->generateCaCertificate();
 | 
				
			||||||
 | 
					                $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $this->dispatch('error', 'No CA certificate found for this database. Please generate a CA certificate for this server in the server/advanced page.');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
					            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (! $this->ssl_certificate) {
 | 
					            if (! $this->ssl_certificate) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -63,6 +63,16 @@ class StartMongodb
 | 
				
			|||||||
            $server = $this->database->destination->server;
 | 
					            $server = $this->database->destination->server;
 | 
				
			||||||
            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
					            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $server->generateCaCertificate();
 | 
				
			||||||
 | 
					                $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $this->dispatch('error', 'No CA certificate found for this database. Please generate a CA certificate for this server in the server/advanced page.');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
					            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (! $this->ssl_certificate) {
 | 
					            if (! $this->ssl_certificate) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,17 @@ class StartMysql
 | 
				
			|||||||
            $server = $this->database->destination->server;
 | 
					            $server = $this->database->destination->server;
 | 
				
			||||||
            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
					            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $server->generateCaCertificate();
 | 
				
			||||||
 | 
					                $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $this->dispatch('error', 'No CA certificate found for this database. Please generate a CA certificate for this server in the server/advanced page.');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
					            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (! $this->ssl_certificate) {
 | 
					            if (! $this->ssl_certificate) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -64,6 +64,17 @@ class StartPostgresql
 | 
				
			|||||||
            $server = $this->database->destination->server;
 | 
					            $server = $this->database->destination->server;
 | 
				
			||||||
            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
					            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $server->generateCaCertificate();
 | 
				
			||||||
 | 
					                $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $this->dispatch('error', 'No CA certificate found for this database. Please generate a CA certificate for this server in the server/advanced page.');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
					            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (! $this->ssl_certificate) {
 | 
					            if (! $this->ssl_certificate) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -58,6 +58,17 @@ class StartRedis
 | 
				
			|||||||
            $server = $this->database->destination->server;
 | 
					            $server = $this->database->destination->server;
 | 
				
			||||||
            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
					            $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $server->generateCaCertificate();
 | 
				
			||||||
 | 
					                $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $this->dispatch('error', 'No CA certificate found for this database. Please generate a CA certificate for this server in the server/advanced page.');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
					            $this->ssl_certificate = $this->database->sslCertificates()->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (! $this->ssl_certificate) {
 | 
					            if (! $this->ssl_certificate) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -214,10 +214,23 @@ class General extends Component
 | 
				
			|||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $caCert = SslCertificate::where('server_id', $existingCert->server_id)
 | 
					            $server = $this->database->destination->server;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $caCert = SslCertificate::where('server_id', $server->id)
 | 
				
			||||||
                ->where('is_ca_certificate', true)
 | 
					                ->where('is_ca_certificate', true)
 | 
				
			||||||
                ->first();
 | 
					                ->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $server->generateCaCertificate();
 | 
				
			||||||
 | 
					                $caCert = SslCertificate::where('server_id', $server->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (! $caCert) {
 | 
				
			||||||
 | 
					                $this->dispatch('error', 'No CA certificate found for this database. Please generate a CA certificate for this server in the server/advanced page.');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            SslHelper::generateSslCertificate(
 | 
					            SslHelper::generateSslCertificate(
 | 
				
			||||||
                commonName: $existingCert->commonName,
 | 
					                commonName: $existingCert->commonName,
 | 
				
			||||||
                subjectAlternativeNames: $existingCert->subjectAlternativeNames ?? [],
 | 
					                subjectAlternativeNames: $existingCert->subjectAlternativeNames ?? [],
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,9 @@ use App\Actions\Server\InstallDocker;
 | 
				
			|||||||
use App\Actions\Server\StartSentinel;
 | 
					use App\Actions\Server\StartSentinel;
 | 
				
			||||||
use App\Enums\ProxyTypes;
 | 
					use App\Enums\ProxyTypes;
 | 
				
			||||||
use App\Events\ServerReachabilityChanged;
 | 
					use App\Events\ServerReachabilityChanged;
 | 
				
			||||||
 | 
					use App\Helpers\SslHelper;
 | 
				
			||||||
use App\Jobs\CheckAndStartSentinelJob;
 | 
					use App\Jobs\CheckAndStartSentinelJob;
 | 
				
			||||||
 | 
					use App\Jobs\RegenerateSslCertJob;
 | 
				
			||||||
use App\Notifications\Server\Reachable;
 | 
					use App\Notifications\Server\Reachable;
 | 
				
			||||||
use App\Notifications\Server\Unreachable;
 | 
					use App\Notifications\Server\Unreachable;
 | 
				
			||||||
use App\Services\ConfigurationRepository;
 | 
					use App\Services\ConfigurationRepository;
 | 
				
			||||||
@@ -1337,4 +1339,41 @@ $schema://$host {
 | 
				
			|||||||
        $configRepository = app(ConfigurationRepository::class);
 | 
					        $configRepository = app(ConfigurationRepository::class);
 | 
				
			||||||
        $configRepository->disableSshMux();
 | 
					        $configRepository->disableSshMux();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function generateCaCertificate()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            ray('Generating CA certificate for server', $this->id);
 | 
				
			||||||
 | 
					            SslHelper::generateSslCertificate(
 | 
				
			||||||
 | 
					                commonName: 'Coolify CA Certificate',
 | 
				
			||||||
 | 
					                serverId: $this->id,
 | 
				
			||||||
 | 
					                isCaCertificate: true,
 | 
				
			||||||
 | 
					                validityDays: 10 * 365
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            $caCertificate = SslCertificate::where('server_id', $this->id)->where('is_ca_certificate', true)->first();
 | 
				
			||||||
 | 
					            ray('CA certificate generated', $caCertificate);
 | 
				
			||||||
 | 
					            if ($caCertificate) {
 | 
				
			||||||
 | 
					                $certificateContent = $caCertificate->ssl_certificate;
 | 
				
			||||||
 | 
					                $caCertPath = config('constants.coolify.base_config_path').'/ssl/';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                $commands = collect([
 | 
				
			||||||
 | 
					                    "mkdir -p $caCertPath",
 | 
				
			||||||
 | 
					                    "chown -R 9999:root $caCertPath",
 | 
				
			||||||
 | 
					                    "chmod -R 700 $caCertPath",
 | 
				
			||||||
 | 
					                    "rm -rf $caCertPath/coolify-ca.crt",
 | 
				
			||||||
 | 
					                    "echo '{$certificateContent}' > $caCertPath/coolify-ca.crt",
 | 
				
			||||||
 | 
					                    "chmod 644 $caCertPath/coolify-ca.crt",
 | 
				
			||||||
 | 
					                ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                instant_remote_process($commands, $this, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                dispatch(new RegenerateSslCertJob(
 | 
				
			||||||
 | 
					                    server_id: $this->id,
 | 
				
			||||||
 | 
					                    force_regeneration: true
 | 
				
			||||||
 | 
					                ));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } catch (\Throwable $e) {
 | 
				
			||||||
 | 
					            return handleError($e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user