This guide will help you install the latest version of Browsershot on a new Ubuntu 20.04 or 22.04 server provisioned by Laravel Forge.

Step 1.

First, update the servers sources to use the latest version of Node (currently 18):

curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -

If that doesn't work, check out our How to upgrade NodeJS article.

Step 2.

Next, install all required packages:

sudo apt-get install -y nodejs gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget libgbm-dev

Step 3.

Next, make sure the installed Headless Chrome has correct permissions:

sudo chmod -R o+rx /home/forge/project-path/node_modules/puppeteer/.local-chromium/ (your path will be different)

If you instead installed puppeteer globally, you should instead run sudo npm install --global --unsafe-perm puppeteer && sudo chmod -R o+rx /usr/lib/node_modules/puppeteer/.local-chromium

Step 4.

Verify that all necessary modules are installed:

  • cd /home/forge/project-path/node_modules/puppeteer/.local-chromium/linux-901912/chrome-linux
  • ldd chrome | grep not

If nothing is outputted, everything should work fine, If not, try to install all dependencies again (can happen when you paste all dependencies and something goes wrong).

Step 5.

Test Browsershot with tinker:

  • php artisan tinker
  • Spatie\Browsershot\Browsershot::url('https://google.se')->save('example.png');

Troubleshooting

Broken images

If your images in a rendered PDF are broken, there is something preventing the images to load over HTTP, most probably a htpasswd restriction or similar.

Cannot save file (empty output)

If you for some reason get an error saying that the file could not be saved, or that the output is empty (e.g. a CouldNotTakeBrowsershot exception), you probably must set some options to the Browsershot instance. Try adding these options:

    ->setOption('args', ['--disable-web-security'])
    ->ignoreHttpsErrors()
    ->noSandbox()