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
rootafter a manual copy will 403 — the installer sets ownership correctly, so re-running./install.shfixes 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?