From eaefb3a6fb370bb1fdb41f684008c00e3678ea11 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 16 Aug 2024 11:53:27 +0200 Subject: [PATCH] fix: backup of password protected postgresql database --- app/Jobs/DatabaseBackupJob.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/app/Jobs/DatabaseBackupJob.php b/app/Jobs/DatabaseBackupJob.php index c8adf75ca..10ed79622 100644 --- a/app/Jobs/DatabaseBackupJob.php +++ b/app/Jobs/DatabaseBackupJob.php @@ -56,6 +56,8 @@ class DatabaseBackupJob implements ShouldBeEncrypted, ShouldQueue public ?string $backup_output = null; + public ?string $postgres_password = null; + public ?S3Storage $s3 = null; public function __construct($backup) @@ -134,6 +136,13 @@ public function handle(): void } else { $databasesToBackup = $this->database->postgres_user; } + $this->postgres_password = $envs->filter(function ($env) { + return str($env)->startsWith('POSTGRES_PASSWORD='); + })->first(); + if ($this->postgres_password) { + $this->postgres_password = str($this->postgres_password)->after('POSTGRES_PASSWORD=')->value(); + } + } elseif (str($databaseType)->contains('mysql')) { $this->container_name = "{$this->database->name}-$serviceUuid"; $this->directory_name = $serviceName.'-'.$this->container_name; @@ -381,7 +390,13 @@ private function backup_standalone_postgresql(string $database): void { try { $commands[] = 'mkdir -p '.$this->backup_dir; - $commands[] = "docker exec $this->container_name pg_dump --format=custom --no-acl --no-owner --username {$this->database->postgres_user} $database > $this->backup_location"; + $backupCommand = "docker exec"; + if ($this->postgres_password) { + $backupCommand .= " -e PGPASSWORD=$this->postgres_password"; + } + $backupCommand .= " $this->container_name pg_dump --format=custom --no-acl --no-owner --username {$this->database->postgres_user} $database > $this->backup_location"; + + $commands[] = $backupCommand; $this->backup_output = instant_remote_process($commands, $this->server); $this->backup_output = trim($this->backup_output); if ($this->backup_output === '') {