System CLI: download-vendor command feedback #5225

Open
opened 2026-02-05 09:49:40 +03:00 by OVERLORD · 22 comments
Owner

Originally created by @ssddanbrown on GitHub (Mar 17, 2025).

As per our blogpost here: https://www.bookstackapp.com/blog/php-dependency-improvements/

This is a thread to collection feedback about use of the download-vendor System CLI action, available from BookStack v25.02.1.

Once we've had a few rounds of feedback and confirmation of stable use, our update & install guidance, including future scripts, can be updated to make use of this instead of composer.

Originally created by @ssddanbrown on GitHub (Mar 17, 2025). As per our blogpost here: https://www.bookstackapp.com/blog/php-dependency-improvements/ This is a thread to collection feedback about use of the [download-vendor System CLI](https://www.bookstackapp.com/docs/admin/system-cli/#download-vendor) action, available from BookStack v25.02.1. Once we've had a few rounds of feedback and confirmation of stable use, our update & install guidance, including future scripts, can be updated to make use of this instead of composer.
OVERLORD added the Open to discussion label 2026-02-05 09:49:40 +03:00
Author
Owner

@Kirrus-Indiestone commented on GitHub (Aug 29, 2025):

Just used to upgrade to v25.07.2 from .1. No problems encountered. It did warn Alpha API during upgrade

@Kirrus-Indiestone commented on GitHub (Aug 29, 2025): Just used to upgrade to v25.07.2 from .1. No problems encountered. It did warn Alpha API during upgrade
Author
Owner

@tjhart85 commented on GitHub (Sep 16, 2025):

I went from I believe 25.07 to 25.07.2 without a hitch.

The process felt very similar to the original method (I actually did one wiki using the old method and then a backup one using the alpha method) other than it warning of being alpha and seeing the bookstack URL.

All in all, I'd say it was pretty seamless.

The only way I could see it being better/easier is it it'd also clear the caches as part of the process (maybe as a selectable option):

  • php artisan cache:clear
  • php artisan config:clear
  • php artisan view:clear
@tjhart85 commented on GitHub (Sep 16, 2025): I went from I believe 25.07 to 25.07.2 without a hitch. The process felt very similar to the original method (I actually did one wiki using the old method and then a backup one using the alpha method) other than it warning of being alpha and seeing the bookstack URL. All in all, I'd say it was pretty seamless. The only way I could see it being better/easier is it it'd also clear the caches as part of the process (maybe as a selectable option): - php artisan cache:clear - php artisan config:clear - php artisan view:clear
Author
Owner

@brynmoorhouse commented on GitHub (Sep 17, 2025):

Just updated to 25.07.2 - worked fine.

@brynmoorhouse commented on GitHub (Sep 17, 2025): Just updated to 25.07.2 - worked fine.
Author
Owner

@theQuikest commented on GitHub (Oct 22, 2025):

Works great!
I do have a suggestion:
First check if there is anything to migrate, and if so, ask the question if you wish to migrate or not.
Now you get the question, it then checks and says "INFO Nothing to migrate."

@theQuikest commented on GitHub (Oct 22, 2025): Works great! I do have a suggestion: First check if there is anything to migrate, and if so, ask the question if you wish to migrate or not. Now you get the question, it then checks and says "INFO Nothing to migrate."
Author
Owner

@vrKiter commented on GitHub (Nov 13, 2025):

Updated successfully from 25.07.3 to 25.11.1 without issue. I do have a pretty basic Bookstack setup and all seems to be ok.

@vrKiter commented on GitHub (Nov 13, 2025): Updated successfully from 25.07.3 to 25.11.1 without issue. I do have a pretty basic Bookstack setup and all seems to be ok.
Author
Owner

@jr-timme commented on GitHub (Nov 21, 2025):

I also just wanted to let you know, that we've been using the new cli command for the last couple of version upgrades and did not have any problems.

I also agree with the others that moving the other 4 artisan commands into the cli or calling them through a single command could be an improvement, even if it's not strictly necessary

@jr-timme commented on GitHub (Nov 21, 2025): I also just wanted to let you know, that we've been using the new cli command for the last couple of version upgrades and did not have any problems. I also agree with the others that moving the other 4 artisan commands into the cli or calling them through a single command could be an improvement, even if it's not strictly necessary
Author
Owner

@ssddanbrown commented on GitHub (Nov 23, 2025):

Thanks all so far for the input.
I have started using this command in scripts, and it's being used in some other places (like docker image builds) to roll it out further.
I've noted this as an option in our update docs now, and will probably make it the default early next year, especially as I'll use it in the Ubuntu 26.04 install script.

I also agree with the others that moving the other 4 artisan commands into the cli or calling them through a single command could be an improvement, even if it's not strictly necessary

Within the system CLI there is already an update command which will run everything needed under-the-hood:
https://www.bookstackapp.com/docs/admin/system-cli/#update
This still uses composer though, so I'll add an issue to move that over to use download-vendor logic instead.

@ssddanbrown commented on GitHub (Nov 23, 2025): Thanks all so far for the input. I have started using this command in scripts, and it's being used in some other places (like docker image builds) to roll it out further. I've noted this as an option in our update docs now, and will probably make it the default early next year, especially as I'll use it in the Ubuntu 26.04 install script. > I also agree with the others that moving the other 4 artisan commands into the cli or calling them through a single command could be an improvement, even if it's not strictly necessary Within the system CLI there is already an update command which will run everything needed under-the-hood: https://www.bookstackapp.com/docs/admin/system-cli/#update This still uses composer though, so I'll add an issue to move that over to use download-vendor logic instead.
Author
Owner

@zinksa commented on GitHub (Nov 26, 2025):

Just used it to upgrade to version v25.11.4. Worked flawlessly. Thank you ;)

@zinksa commented on GitHub (Nov 26, 2025): Just used it to upgrade to version v25.11.4. Worked flawlessly. Thank you ;)
Author
Owner

@disposer-cloud commented on GitHub (Dec 15, 2025):

When running: ./bookstack-system-cli download-vendor I receive the following error message: Failed to download ZIP file from https://files.bookstackapp.com/vendor/v25.11.6.zip

@disposer-cloud commented on GitHub (Dec 15, 2025): When running: ./bookstack-system-cli download-vendor I receive the following error message: Failed to download ZIP file from https://files.bookstackapp.com/vendor/v25.11.6.zip
Author
Owner

@ssddanbrown commented on GitHub (Dec 15, 2025):

@disposer-cloud Are you able to access that link in the browser from where you are? From the server, are you able to wget https://files.bookstackapp.com/vendor/v25.11.6.zip without issue?

@ssddanbrown commented on GitHub (Dec 15, 2025): @disposer-cloud Are you able to access that link in the browser from where you are? From the server, are you able to `wget https://files.bookstackapp.com/vendor/v25.11.6.zip` without issue?
Author
Owner

@tjhart85 commented on GitHub (Dec 15, 2025):

FWIW, it worked for me this morning going from 25.11.3 to 25.11.6 without issue.

@tjhart85 commented on GitHub (Dec 15, 2025): FWIW, it worked for me this morning going from 25.11.3 to 25.11.6 without issue.
Author
Owner

@disposer-cloud commented on GitHub (Dec 15, 2025):

Thanks for the quick reply. I was thinking it was dns as it's always dns however it seems this time it was an egress geo block. I will re-run the update tonight and let you know!

@disposer-cloud commented on GitHub (Dec 15, 2025): Thanks for the quick reply. I was thinking it was dns as it's always dns however it seems this time it was an egress geo block. I will re-run the update tonight and let you know!
Author
Owner

@disposer-cloud commented on GitHub (Dec 16, 2025):

Should have known, the geo block was the issue. I was able to upgrade from 25.05.2 to v25.11.6 with no issues.

@disposer-cloud commented on GitHub (Dec 16, 2025): Should have known, the geo block was the issue. I was able to upgrade from 25.05.2 to v25.11.6 with no issues.
Author
Owner

@RobNoVA commented on GitHub (Dec 26, 2025):

Just upgraded from 25.11.6 to 25.12 with no issues. Thank you! Ubuntu 24.04.3 LTS with MariaDB 10.11.13, PHP 8.3.12.

@RobNoVA commented on GitHub (Dec 26, 2025): Just upgraded from 25.11.6 to 25.12 with no issues. Thank you! Ubuntu 24.04.3 LTS with MariaDB 10.11.13, PHP 8.3.12.
Author
Owner

@LoosGuccreen commented on GitHub (Jan 23, 2026):

Tried to upgrade from 25.02.2 and couldn't, got this error:

Checking app version...
Downloading ZIP from files.bookstackapp.com...
Validating downloaded ZIP...
Deleting existing vendor/ directory...
Extracting ZIP into BookStack instance...
PHP Fatal error:  Uncaught Error: Undefined constant ZipArchive::RDONLY in phar:///(...)/bookstack-system-cli/src/Services/VendorDownloader.php:77
Stack trace:
#0 phar:///(…)/bookstack-system-cli/src/Services/VendorDownloader.php(43): Cli\Services\VendorDownloader->extractZip('/tmp/bs-cli-ven...')
#1 phar:///(…)/bookstack-system-cli/src/Commands/DownloadVendorCommand.php(30): Cli\Services\VendorDownloader->download()
#2 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Command/Command.php(326): Cli\Commands\DownloadVendorCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#3 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Application.php(1083): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#4 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Application.php(324): Symfony\Component\Console\Application->doRunCommand(Object(Cli\Commands\DownloadVendorCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#5 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Application.php(175): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#6 phar:///(…)/bookstack-system-cli/run.php(32): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#7 /(…)/bookstack-system-cli(10): include('phar:///home/cl...')
#8 {main}
  thrown in phar:///(…)/bookstack-system-cli/src/Services/VendorDownloader.php on line 77

Fatal error: Uncaught Error: Undefined constant ZipArchive::RDONLY in phar:///(…)/bookstack-system-cli/src/Services/VendorDownloader.php:77
Stack trace:
#0 phar:///(…)/bookstack-system-cli/src/Services/VendorDownloader.php(43): Cli\Services\VendorDownloader->extractZip('/tmp/bs-cli-ven...')
#1 phar:///(…)/bookstack-system-cli/src/Commands/DownloadVendorCommand.php(30): Cli\Services\VendorDownloader->download()
#2 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Command/Command.php(326): Cli\Commands\DownloadVendorCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#3 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Application.php(1083): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#4 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Application.php(324): Symfony\Component\Console\Application->doRunCommand(Object(Cli\Commands\DownloadVendorCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#5 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Application.php(175): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#6 phar:///(…)/bookstack-system-cli/run.php(32): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#7 /(…)/bookstack-system-cli(10): include('phar:///home/cl...')
#8 {main}
  thrown in phar:///(…)/bookstack-system-cli/src/Services/VendorDownloader.php on line 77
@LoosGuccreen commented on GitHub (Jan 23, 2026): Tried to upgrade from 25.02.2 and couldn't, got this error: ``` Checking app version... Downloading ZIP from files.bookstackapp.com... Validating downloaded ZIP... Deleting existing vendor/ directory... Extracting ZIP into BookStack instance... PHP Fatal error: Uncaught Error: Undefined constant ZipArchive::RDONLY in phar:///(...)/bookstack-system-cli/src/Services/VendorDownloader.php:77 Stack trace: #0 phar:///(…)/bookstack-system-cli/src/Services/VendorDownloader.php(43): Cli\Services\VendorDownloader->extractZip('/tmp/bs-cli-ven...') #1 phar:///(…)/bookstack-system-cli/src/Commands/DownloadVendorCommand.php(30): Cli\Services\VendorDownloader->download() #2 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Command/Command.php(326): Cli\Commands\DownloadVendorCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #3 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Application.php(1083): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #4 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Application.php(324): Symfony\Component\Console\Application->doRunCommand(Object(Cli\Commands\DownloadVendorCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #5 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Application.php(175): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #6 phar:///(…)/bookstack-system-cli/run.php(32): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #7 /(…)/bookstack-system-cli(10): include('phar:///home/cl...') #8 {main} thrown in phar:///(…)/bookstack-system-cli/src/Services/VendorDownloader.php on line 77 Fatal error: Uncaught Error: Undefined constant ZipArchive::RDONLY in phar:///(…)/bookstack-system-cli/src/Services/VendorDownloader.php:77 Stack trace: #0 phar:///(…)/bookstack-system-cli/src/Services/VendorDownloader.php(43): Cli\Services\VendorDownloader->extractZip('/tmp/bs-cli-ven...') #1 phar:///(…)/bookstack-system-cli/src/Commands/DownloadVendorCommand.php(30): Cli\Services\VendorDownloader->download() #2 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Command/Command.php(326): Cli\Commands\DownloadVendorCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #3 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Application.php(1083): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #4 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Application.php(324): Symfony\Component\Console\Application->doRunCommand(Object(Cli\Commands\DownloadVendorCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #5 phar:///(…)/bookstack-system-cli/vendor/symfony/console/Application.php(175): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #6 phar:///(…)/bookstack-system-cli/run.php(32): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #7 /(…)/bookstack-system-cli(10): include('phar:///home/cl...') #8 {main} thrown in phar:///(…)/bookstack-system-cli/src/Services/VendorDownloader.php on line 77 ```
Author
Owner

@Kirrus-Indiestone commented on GitHub (Jan 23, 2026):

Do you have php-zip installed?

@Kirrus-Indiestone commented on GitHub (Jan 23, 2026): Do you have php-zip installed?
Author
Owner

@LoosGuccreen commented on GitHub (Jan 23, 2026):

AFAIK it is installed (it's a shared hosting so I didn't do the install)

php -m |grep zip
zip

Unless "zip" and "php-zip" are two different things

@LoosGuccreen commented on GitHub (Jan 23, 2026): AFAIK it is installed (it's a shared hosting so I didn't do the install) ``` php -m |grep zip zip ``` Unless "zip" and "php-zip" are two different things
Author
Owner

@ssddanbrown commented on GitHub (Jan 24, 2026):

@LoosGuccreen What's the output of running php -i | grep zip?

@ssddanbrown commented on GitHub (Jan 24, 2026): @LoosGuccreen What's the output of running `php -i | grep zip`?
Author
Owner

@LoosGuccreen commented on GitHub (Jan 26, 2026):

@ssddanbrown I get this:

php -i | grep zip
/opt/php8.2/etc/conf.d/50_zip.ini,
Registered PHP Streams => https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp, zip
Registered Stream Filters => zlib.*, bzip2.*, convert.iconv.*, string.rot13, string.toupper, string.tolower, convert.*, consumed, dechunk, mcrypt.*, mdecrypt.*, http.*
Stream Wrapper support => compress.bzip2://
Stream Filter support => bzip2.decompress, bzip2.compress
gzip compression => enabled
bzip2 compression => enabled
zip
Libzip version => 0.11.2
@LoosGuccreen commented on GitHub (Jan 26, 2026): @ssddanbrown I get this: ``` php -i | grep zip /opt/php8.2/etc/conf.d/50_zip.ini, Registered PHP Streams => https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp, zip Registered Stream Filters => zlib.*, bzip2.*, convert.iconv.*, string.rot13, string.toupper, string.tolower, convert.*, consumed, dechunk, mcrypt.*, mdecrypt.*, http.* Stream Wrapper support => compress.bzip2:// Stream Filter support => bzip2.decompress, bzip2.compress gzip compression => enabled bzip2 compression => enabled zip Libzip version => 0.11.2 ```
Author
Owner

@ssddanbrown commented on GitHub (Jan 26, 2026):

@LoosGuccreen Okay, thanks, that confirms why that error is showing.

ZipArchive::RDONLY is only available when PHP is built against libzip >= 1.0.0. Your PHP version has been built against libzip 0.11.2.

Libzip 0.11.2 is from December 2013, so a 12 year old library at this point.
Libzip 1.0 was released in 2015.

Maybe we could add better handling for this constant not being available, but to be honest I think expecting usage of libraries less than 10 years old is reasonable, and that the main issue here is that your environment is making use of very old libraries. This is something I'd maybe raise with your hosting provider. If they offer different PHP versions, you can maybe try some newer ones in the hopes that they've been built using more recent libzip versions.

@ssddanbrown commented on GitHub (Jan 26, 2026): @LoosGuccreen Okay, thanks, that confirms why that error is showing. `ZipArchive::RDONLY` is only [available](https://www.php.net/manual/en/zip.constants.php#ziparchive.constants.rdonly) when PHP is built against libzip >= 1.0.0. Your PHP version has been built against libzip `0.11.2`. Libzip 0.11.2 is [from December 2013](https://libzip.org/news/release-0.11.2.html), so a 12 year old library at this point. Libzip 1.0 [was released](https://libzip.org/news/release-1.0.html) in 2015. Maybe we could add better handling for this constant not being available, but to be honest I think expecting usage of libraries less than 10 years old is reasonable, and that the main issue here is that your environment is making use of very old libraries. This is something I'd maybe raise with your hosting provider. If they offer different PHP versions, you can maybe try some newer ones in the hopes that they've been built using more recent libzip versions.
Author
Owner

@Ionys320 commented on GitHub (Jan 29, 2026):

Hi,
It should be indicated somewhere (or checked by the CLI?) that, to download the ZIP using @fopen($targetUrl, 'rb');, the allow_url_fopen PHP filesystem variable must be set to On.

Actually, if it's Off, the download will just fail without telling why.

@Ionys320 commented on GitHub (Jan 29, 2026): Hi, It should be indicated somewhere (or checked by the CLI?) that, to download the ZIP using `@fopen($targetUrl, 'rb');`, the `allow_url_fopen` PHP filesystem variable must be set to `On`. Actually, if it's `Off`, the download will just fail without telling why.
Author
Owner

@ssddanbrown commented on GitHub (Jan 31, 2026):

Thanks @Ionys320, I've opened an issue to improve this: https://codeberg.org/bookstack/system-cli/issues/25

@ssddanbrown commented on GitHub (Jan 31, 2026): Thanks @Ionys320, I've opened an issue to improve this: https://codeberg.org/bookstack/system-cli/issues/25
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/BookStack#5225