snipe / snipe-it

A free open source IT asset/license management system
https://snipeitapp.com
GNU Affero General Public License v3.0
10.88k stars 3.14k forks source link

Error Spatie\DbDumper\DbDumper::setPort() on upgrade/backup when accessing database through socket #14374

Open JaegerMaSw opened 6 months ago

JaegerMaSw commented 6 months ago

Debug mode

Describe the bug

When upgrading from v6.3.1 to v6.3.2 using php upgrade.php, step 4 "Backing up database" fails with

TypeError

  Spatie\DbDumper\DbDumper::setPort(): Argument #1 ($port) must be of type int, string given, called in /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/DbDumperFactory.php on line 56

  at vendor/spatie/db-dumper/src/DbDumper.php:120
    116▕      * @param int $port
    117▕      *
    118▕      * @return $this
    119▕      */
  ➜ 120▕     public function setPort(int $port)
    121▕     {
    122▕         $this->port = $port;
    123▕
    124▕         return $this;

      +17 vendor frames
  18  app/Console/Commands/SystemBackup.php:50
      Illuminate\Console\Command::call()

      +13 vendor frames
  32  artisan:35
      Illuminate\Foundation\Console\Kernel::handle()

Our database is connected to Snipe-IT through a Unix Domain Socket and therefore only DB_SOCKET is filled in .env while DB_HOST and DB_PORT are empty.

# --------------------------------------------
# REQUIRED: DATABASE SETTINGS
# --------------------------------------------
DB_CONNECTION=mysql
DB_HOST=
DB_PORT=
DB_SOCKET=/mnt/mysqld/mysqld.sock
DB_DATABASE=snipeit
DB_USERNAME=snipeit
DB_PASSWORD=null
DB_PREFIX=null
DB_DUMP_PATH='/usr/bin'
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci

Since the error is about the database port, that looks like it's the issue.

Reproduction steps

  1. Set up Snipe-IT version 6.3.1 with the database configured with DB_SOCKET instead of host + port
  2. Run php upgrade.php

Expected behavior

The database backup during the upgrade is done by connecting to the database through the configured socket

Screenshots

No response

Snipe-IT Version

Version v6.3.1 - build 12672 (master)

Operating System

Ubuntu 22.04.3

Web Server

nginx unit

PHP Version

8.1.2

Operating System

No response

Browser

No response

Version

No response

Device

No response

Operating System

No response

Browser

No response

Version

No response

Error messages

[2024-03-05 22:11:44] debug.ERROR: TypeError: Spatie\DbDumper\DbDumper::setPort(): Argument #1 ($port) must be of type int, string given, called in /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/DbDumperFactory.php on line 56 and defined in /opt/snipeit/vendor/spatie/db-dumper/src/DbDumper.php:120
Stack trace:
#0 /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/DbDumperFactory.php(56): Spatie\DbDumper\DbDumper->setPort()
#1 /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJobFactory.php(30): Spatie\Backup\Tasks\Backup\DbDumperFactory::createFromConnection()
#2 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Collections/Collection.php(742): Spatie\Backup\Tasks\Backup\BackupJobFactory::Spatie\Backup\Tasks\Backup\{closure}()
#3 /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJobFactory.php(31): Illuminate\Support\Collection->mapWithKeys()
#4 /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJobFactory.php(15): Spatie\Backup\Tasks\Backup\BackupJobFactory::createDbDumpers()
#5 /opt/snipeit/vendor/spatie/laravel-backup/src/Commands/BackupCommand.php(31): Spatie\Backup\Tasks\Backup\BackupJobFactory::createFromArray()
#6 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Spatie\Backup\Commands\BackupCommand->handle()
#7 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#8 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure()
#9 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod()
#10 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\Container\BoundMethod::call()
#11 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\Container\Container->call()
#12 /opt/snipeit/vendor/symfony/console/Command/Command.php(298): Illuminate\Console\Command->execute()
#13 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\Component\Console\Command\Command->run()
#14 /opt/snipeit/vendor/spatie/laravel-backup/src/Commands/BaseCommand.php(16): Illuminate\Console\Command->run()
#15 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Concerns/CallsCommands.php(68): Spatie\Backup\Commands\BaseCommand->run()
#16 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Concerns/CallsCommands.php(28): Illuminate\Console\Command->runCommand()
#17 /opt/snipeit/app/Console/Commands/SystemBackup.php(50): Illuminate\Console\Command->call()
#18 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): App\Console\Commands\SystemBackup->handle()
#19 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#20 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure()
#21 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod()
#22 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\Container\BoundMethod::call()
#23 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\Container\Container->call()
#24 /opt/snipeit/vendor/symfony/console/Command/Command.php(298): Illuminate\Console\Command->execute()
#25 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\Component\Console\Command\Command->run()
#26 /opt/snipeit/vendor/symfony/console/Application.php(1040): Illuminate\Console\Command->run()
#27 /opt/snipeit/vendor/symfony/console/Application.php(301): Symfony\Component\Console\Application->doRunCommand()
#28 /opt/snipeit/vendor/symfony/console/Application.php(171): Symfony\Component\Console\Application->doRun()
#29 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\Component\Console\Application->run()
#30 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\Console\Application->run()
#31 /opt/snipeit/artisan(35): Illuminate\Foundation\Console\Kernel->handle()
#32 {main}
[2024-03-05 22:11:44] debug.ERROR: Spatie\DbDumper\DbDumper::setPort(): Argument #1 ($port) must be of type int, string given, called in /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/DbDumperFactory.php on line 56 {"exception":"[object] (TypeError(code: 0): Spatie\\DbDumper\\DbDumper::setPort(): Argument #1 ($port) must be of type int, string given, called in /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/DbDumperFactory.php on line 56 at /opt/snipeit/vendor/spatie/db-dumper/src/DbDumper.php:120)
[stacktrace]
#0 /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/DbDumperFactory.php(56): Spatie\\DbDumper\\DbDumper->setPort()
#1 /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJobFactory.php(30): Spatie\\Backup\\Tasks\\Backup\\DbDumperFactory::createFromConnection()
#2 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Collections/Collection.php(742): Spatie\\Backup\\Tasks\\Backup\\BackupJobFactory::Spatie\\Backup\\Tasks\\Backup\\{closure}()
#3 /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJobFactory.php(31): Illuminate\\Support\\Collection->mapWithKeys()
#4 /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJobFactory.php(15): Spatie\\Backup\\Tasks\\Backup\\BackupJobFactory::createDbDumpers()
#5 /opt/snipeit/vendor/spatie/laravel-backup/src/Commands/BackupCommand.php(31): Spatie\\Backup\\Tasks\\Backup\\BackupJobFactory::createFromArray()
#6 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Spatie\\Backup\\Commands\\BackupCommand->handle()
#7 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()
#8 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()
#9 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()
#10 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()
#11 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()
#12 /opt/snipeit/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()
#13 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()
#14 /opt/snipeit/vendor/spatie/laravel-backup/src/Commands/BaseCommand.php(16): Illuminate\\Console\\Command->run()
#15 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Concerns/CallsCommands.php(68): Spatie\\Backup\\Commands\\BaseCommand->run()
#16 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Concerns/CallsCommands.php(28): Illuminate\\Console\\Command->runCommand()
#17 /opt/snipeit/app/Console/Commands/SystemBackup.php(50): Illuminate\\Console\\Command->call()
#18 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): App\\Console\\Commands\\SystemBackup->handle()
#19 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()
#20 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()
#21 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()
#22 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\\Container\\BoundMethod::call()
#23 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()
#24 /opt/snipeit/vendor/symfony/console/Command/Command.php(298): Illuminate\\Console\\Command->execute()
#25 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()
#26 /opt/snipeit/vendor/symfony/console/Application.php(1040): Illuminate\\Console\\Command->run()
#27 /opt/snipeit/vendor/symfony/console/Application.php(301): Symfony\\Component\\Console\\Application->doRunCommand()
#28 /opt/snipeit/vendor/symfony/console/Application.php(171): Symfony\\Component\\Console\\Application->doRun()
#29 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\\Component\\Console\\Application->run()
#30 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()
#31 /opt/snipeit/artisan(35): Illuminate\\Foundation\\Console\\Kernel->handle()
#32 {main}
"}

Additional context

No response

welcome[bot] commented 6 months ago

👋 Thanks for opening your first issue here! If you're reporting a 🐞 bug, please make sure you include steps to reproduce it. We get a lot of issues on this repo, so please be patient and we will get back to you as soon as we can.

snipe commented 5 months ago

If you set DB_PORT=null (no quotes around null) does this affect anything?

snipe commented 5 months ago

Also can you show me the port line in the mysql section of your config/database.php file?

JaegerMaSw commented 5 months ago

With DB_PORT=null, the database backup still fails, however the upgrade continues and succeeds.

The new error in Step 4 is

-- Starting backup...
Dumping database snipeit...
Backup failed because Parameter `host` cannot be empty..
#0 /opt/snipeit/vendor/spatie/db-dumper/src/Databases/MySql.php(330): Spatie\DbDumper\Exceptions\CannotStartDump::emptyParameter()
#1 /opt/snipeit/vendor/spatie/db-dumper/src/Databases/MySql.php(194): Spatie\DbDumper\Databases\MySql->guardAgainstIncompleteCredentials()
#2 /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJob.php(260): Spatie\DbDumper\Databases\MySql->dumpToFile()
#3 [internal function]: Spatie\Backup\Tasks\Backup\BackupJob->Spatie\Backup\Tasks\Backup\{closure}()
#4 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Collections/Collection.php(695): array_map()
#5 /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJob.php(263): Illuminate\Support\Collection->map()
#6 /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJob.php(171): Spatie\Backup\Tasks\Backup\BackupJob->dumpDatabases()
#7 /opt/snipeit/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJob.php(147): Spatie\Backup\Tasks\Backup\BackupJob->createBackupManifest()
#8 /opt/snipeit/vendor/spatie/laravel-backup/src/Commands/BackupCommand.php(56): Spatie\Backup\Tasks\Backup\BackupJob->run()
#9 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Spatie\Backup\Commands\BackupCommand->handle()
#10 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#11 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure()
#12 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod()
#13 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\Container\BoundMethod::call()
#14 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\Container\Container->call()
#15 /opt/snipeit/vendor/symfony/console/Command/Command.php(298): Illuminate\Console\Command->execute()
#16 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\Component\Console\Command\Command->run()
#17 /opt/snipeit/vendor/spatie/laravel-backup/src/Commands/BaseCommand.php(16): Illuminate\Console\Command->run()
#18 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Concerns/CallsCommands.php(68): Spatie\Backup\Commands\BaseCommand->run()
#19 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Concerns/CallsCommands.php(28): Illuminate\Console\Command->runCommand()
#20 /opt/snipeit/app/Console/Commands/SystemBackup.php(50): Illuminate\Console\Command->call()
#21 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): App\Console\Commands\SystemBackup->handle()
#22 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#23 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure()
#24 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod()
#25 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\Container\BoundMethod::call()
#26 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\Container\Container->call()
#27 /opt/snipeit/vendor/symfony/console/Command/Command.php(298): Illuminate\Console\Command->execute()
#28 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\Component\Console\Command\Command->run()
#29 /opt/snipeit/vendor/symfony/console/Application.php(1040): Illuminate\Console\Command->run()
#30 /opt/snipeit/vendor/symfony/console/Application.php(301): Symfony\Component\Console\Application->doRunCommand()
#31 /opt/snipeit/vendor/symfony/console/Application.php(171): Symfony\Component\Console\Application->doRun()
#32 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\Component\Console\Application->run()
#33 /opt/snipeit/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\Console\Application->run()
#34 /opt/snipeit/artisan(35): Illuminate\Foundation\Console\Kernel->handle()
#35 {main}
Backup failed because: Parameter `host` cannot be empty..

config/database.php:

'mysql' => [
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'port'      => env('DB_PORT', 3306),
            'database'  => env('DB_DATABASE', 'forge'),
            'username'  => env('DB_USERNAME', 'forge'),
            'password'  => env('DB_PASSWORD', ''),
snipe commented 5 months ago

@uberbrady how did we used to handle this when we were using sockets?