From 44ddcb836ec0a236e9bceed45963e1d1cfb1f6d0 Mon Sep 17 00:00:00 2001 From: Rostislav Dugin Date: Tue, 31 Mar 2026 11:40:11 +0300 Subject: [PATCH] FIX (backups): Use system's temp directory instead of mounter directory to fix access permissions on TrueNAS --- .../backups/usecases/mariadb/create_backup_uc.go | 12 +++--------- .../backups/usecases/mysql/create_backup_uc.go | 12 +++--------- .../backups/usecases/postgresql/create_backup_uc.go | 12 +++--------- .../restores/usecases/mariadb/restore_backup_uc.go | 12 +++--------- .../restores/usecases/mysql/restore_backup_uc.go | 12 +++--------- .../usecases/postgresql/restore_backup_uc.go | 12 +++--------- 6 files changed, 18 insertions(+), 54 deletions(-) diff --git a/backend/internal/features/backups/backups/usecases/mariadb/create_backup_uc.go b/backend/internal/features/backups/backups/usecases/mariadb/create_backup_uc.go index ddccf62..a5d3615 100644 --- a/backend/internal/features/backups/backups/usecases/mariadb/create_backup_uc.go +++ b/backend/internal/features/backups/backups/usecases/mariadb/create_backup_uc.go @@ -281,15 +281,9 @@ func (uc *CreateMariadbBackupUsecase) createTempMyCnfFile( mdbConfig *mariadbtypes.MariadbDatabase, password string, ) (string, error) { - tempFolder := config.GetEnv().TempFolder - if err := os.MkdirAll(tempFolder, 0o700); err != nil { - return "", fmt.Errorf("failed to ensure temp folder exists: %w", err) - } - if err := os.Chmod(tempFolder, 0o700); err != nil { - return "", fmt.Errorf("failed to set temp folder permissions: %w", err) - } - - tempDir, err := os.MkdirTemp(tempFolder, "mycnf_"+uuid.New().String()) + // Credential files use OS temp dir (/tmp) because some filesystems + // (e.g. ZFS on TrueNAS) ignore chmod, causing "group or world access" errors. + tempDir, err := os.MkdirTemp(os.TempDir(), "mycnf_"+uuid.New().String()) if err != nil { return "", fmt.Errorf("failed to create temp directory: %w", err) } diff --git a/backend/internal/features/backups/backups/usecases/mysql/create_backup_uc.go b/backend/internal/features/backups/backups/usecases/mysql/create_backup_uc.go index 5dca193..9567eb8 100644 --- a/backend/internal/features/backups/backups/usecases/mysql/create_backup_uc.go +++ b/backend/internal/features/backups/backups/usecases/mysql/create_backup_uc.go @@ -300,15 +300,9 @@ func (uc *CreateMysqlBackupUsecase) createTempMyCnfFile( myConfig *mysqltypes.MysqlDatabase, password string, ) (string, error) { - tempFolder := config.GetEnv().TempFolder - if err := os.MkdirAll(tempFolder, 0o700); err != nil { - return "", fmt.Errorf("failed to ensure temp folder exists: %w", err) - } - if err := os.Chmod(tempFolder, 0o700); err != nil { - return "", fmt.Errorf("failed to set temp folder permissions: %w", err) - } - - tempDir, err := os.MkdirTemp(tempFolder, "mycnf_"+uuid.New().String()) + // Credential files use OS temp dir (/tmp) because some filesystems + // (e.g. ZFS on TrueNAS) ignore chmod, causing "group or world access" errors. + tempDir, err := os.MkdirTemp(os.TempDir(), "mycnf_"+uuid.New().String()) if err != nil { return "", fmt.Errorf("failed to create temp directory: %w", err) } diff --git a/backend/internal/features/backups/backups/usecases/postgresql/create_backup_uc.go b/backend/internal/features/backups/backups/usecases/postgresql/create_backup_uc.go index 3d4fafd..60961cf 100644 --- a/backend/internal/features/backups/backups/usecases/postgresql/create_backup_uc.go +++ b/backend/internal/features/backups/backups/usecases/postgresql/create_backup_uc.go @@ -747,15 +747,9 @@ func (uc *CreatePostgresqlBackupUsecase) createTempPgpassFile( escapedPassword, ) - tempFolder := config.GetEnv().TempFolder - if err := os.MkdirAll(tempFolder, 0o700); err != nil { - return "", fmt.Errorf("failed to ensure temp folder exists: %w", err) - } - if err := os.Chmod(tempFolder, 0o700); err != nil { - return "", fmt.Errorf("failed to set temp folder permissions: %w", err) - } - - tempDir, err := os.MkdirTemp(tempFolder, "pgpass_"+uuid.New().String()) + // Credential files use OS temp dir (/tmp) because some filesystems + // (e.g. ZFS on TrueNAS) ignore chmod, causing "group or world access" errors. + tempDir, err := os.MkdirTemp(os.TempDir(), "pgpass_"+uuid.New().String()) if err != nil { return "", fmt.Errorf("failed to create temporary directory: %w", err) } diff --git a/backend/internal/features/restores/usecases/mariadb/restore_backup_uc.go b/backend/internal/features/restores/usecases/mariadb/restore_backup_uc.go index 059e536..1897c38 100644 --- a/backend/internal/features/restores/usecases/mariadb/restore_backup_uc.go +++ b/backend/internal/features/restores/usecases/mariadb/restore_backup_uc.go @@ -287,15 +287,9 @@ func (uc *RestoreMariadbBackupUsecase) createTempMyCnfFile( mdbConfig *mariadbtypes.MariadbDatabase, password string, ) (string, error) { - tempFolder := config.GetEnv().TempFolder - if err := os.MkdirAll(tempFolder, 0o700); err != nil { - return "", fmt.Errorf("failed to ensure temp folder exists: %w", err) - } - if err := os.Chmod(tempFolder, 0o700); err != nil { - return "", fmt.Errorf("failed to set temp folder permissions: %w", err) - } - - tempDir, err := os.MkdirTemp(tempFolder, "mycnf_"+uuid.New().String()) + // Credential files use OS temp dir (/tmp) because some filesystems + // (e.g. ZFS on TrueNAS) ignore chmod, causing "group or world access" errors. + tempDir, err := os.MkdirTemp(os.TempDir(), "mycnf_"+uuid.New().String()) if err != nil { return "", fmt.Errorf("failed to create temp directory: %w", err) } diff --git a/backend/internal/features/restores/usecases/mysql/restore_backup_uc.go b/backend/internal/features/restores/usecases/mysql/restore_backup_uc.go index f0682fe..db605ad 100644 --- a/backend/internal/features/restores/usecases/mysql/restore_backup_uc.go +++ b/backend/internal/features/restores/usecases/mysql/restore_backup_uc.go @@ -278,15 +278,9 @@ func (uc *RestoreMysqlBackupUsecase) createTempMyCnfFile( myConfig *mysqltypes.MysqlDatabase, password string, ) (string, error) { - tempFolder := config.GetEnv().TempFolder - if err := os.MkdirAll(tempFolder, 0o700); err != nil { - return "", fmt.Errorf("failed to ensure temp folder exists: %w", err) - } - if err := os.Chmod(tempFolder, 0o700); err != nil { - return "", fmt.Errorf("failed to set temp folder permissions: %w", err) - } - - tempDir, err := os.MkdirTemp(tempFolder, "mycnf_"+uuid.New().String()) + // Credential files use OS temp dir (/tmp) because some filesystems + // (e.g. ZFS on TrueNAS) ignore chmod, causing "group or world access" errors. + tempDir, err := os.MkdirTemp(os.TempDir(), "mycnf_"+uuid.New().String()) if err != nil { return "", fmt.Errorf("failed to create temp directory: %w", err) } diff --git a/backend/internal/features/restores/usecases/postgresql/restore_backup_uc.go b/backend/internal/features/restores/usecases/postgresql/restore_backup_uc.go index b074d3e..7221aa6 100644 --- a/backend/internal/features/restores/usecases/postgresql/restore_backup_uc.go +++ b/backend/internal/features/restores/usecases/postgresql/restore_backup_uc.go @@ -995,15 +995,9 @@ func (uc *RestorePostgresqlBackupUsecase) createTempPgpassFile( escapedPassword, ) - tempFolder := config.GetEnv().TempFolder - if err := os.MkdirAll(tempFolder, 0o700); err != nil { - return "", fmt.Errorf("failed to ensure temp folder exists: %w", err) - } - if err := os.Chmod(tempFolder, 0o700); err != nil { - return "", fmt.Errorf("failed to set temp folder permissions: %w", err) - } - - tempDir, err := os.MkdirTemp(tempFolder, "pgpass_"+uuid.New().String()) + // Credential files use OS temp dir (/tmp) because some filesystems + // (e.g. ZFS on TrueNAS) ignore chmod, causing "group or world access" errors. + tempDir, err := os.MkdirTemp(os.TempDir(), "pgpass_"+uuid.New().String()) if err != nil { return "", fmt.Errorf("failed to create temporary directory: %w", err) }