Fix broken images, logos, or 403 errors on /storage

If your branding logo shows blank, or attachment and proofing thumbnails are broken with a 403 or 404 on a /storage/... URL, the cause is almost always the public storage link — and the fix is one command.

Why it happens

Uploaded files (logos, attachments, proofs) live under the app's storage volume. They're served to the browser through public/storage, which is a symlink to storage/app/public. If that symlink is missing — or the web server can't read the storage volume — every /storage/* URL returns 403/404 even though the file exists.

The fix

From inside your portal folder, recreate the link:

docker compose exec app php artisan storage:link

Then hard-refresh the page. Logos and thumbnails should return immediately.

If it's still broken

  • Permissions: the storage directory must be readable by the app. A storage tree owned by root after a manual copy will 403 — the installer sets ownership correctly, so re-running ./install.sh fixes it.
  • Web server can't see storage: the reverse proxy needs the storage volume mounted to serve /storage/* directly. A fresh install wires this up; if you've hand-edited the compose file, confirm the storage volume is still mounted on the web service.
Was this article helpful?