The Blog

Practical PHP, Laravel, devops, and AI-assisted workflow notes from Md Zia Uddin.

All #self-hosted (43) #open-source (43) #deployment (42) #docker (42) #vps (42) #laravel (20) #php (15) #security (9) #sysadmin (6)
I put Ghost on a VPS and Nginx returned 502 until port 2368 was actually up
Featured

I put Ghost on a VPS and Nginx returned 502 until port 2368 was actually up

I wanted a publishing stack I control — posts, members, newsletters — not another hosted CMS. Ghost on Ubuntu 24.04 with Docker or Ghost-CLI is fine until Nginx 502s because nothing is listening on 2368, or Ghost-CLI refuses to install under /root. Here's that wall.

Jun 29, 2026 · 3 min read

Read article
Read I self-hosted FileBrowser Quantum on Ubuntu 24.04 — a missing config.yaml became a directory

I self-hosted FileBrowser Quantum on Ubuntu 24.04 — a missing config.yaml became a directory

I wanted a browser file manager after the original File Browser archive, not another Nextcloud. Quantum came up on Docker. A file bind for a missing config.yaml became a directory and the container never started. Host paths in sources left the UI empty. Loopback 8080, directory mount, /folder inside the container — that is the lab path.

Oct 19, 2026 · 9 min read

Read I self-hosted Headplane on Ubuntu 24.04 — cookie_secure ate the first login

I self-hosted Headplane on Ubuntu 24.04 — cookie_secure ate the first login

I wanted a browser UI for Headscale instead of another evening of docker exec. Headplane came up on Docker. cookie_secure defaults true, so http://IP:3000 never kept a session. Official Docker docs still pin Headscale 0.26.0, which 0.7.x dropped — /version 404s and the UI keeps retrying. Loopback 3000, Headscale 0.29.3, /admin behind Caddy — that is the lab path.

Oct 12, 2026 · 15 min read

Get new posts in your inbox

No spam. One short email per new article — practical PHP, Laravel, devops, and AI-assisted workflows.

Read I would not count an OOM as a thrown exception on 13.33 — Laravel 13.34 shipped CountCrashesAsExceptions

I would not count an OOM as a thrown exception on 13.33 — Laravel 13.34 shipped CountCrashesAsExceptions

13.34 lets a job opt in so a worker that dies (OOM, segfault, external kill) counts toward maxExceptions. Interruptible jobs receive SIGALRM before a timeout kill, and JobProcessed::$duration is milliseconds from the worker. queue:work --once and the sync driver still miss that timeout path. I would run composer show laravel/framework before I claim any of it.

Oct 7, 2026 · 9 min read

Read I self-hosted Tagr on Ubuntu 24.04 — the compose file left the library commented out

I self-hosted Tagr on Ubuntu 24.04 — the compose file left the library commented out

I wanted browser tag edits on the same VPS as Jellyfin, not another media server. Tagr came up on Docker. Official compose comments the /music binds and ships AUTH_SECRET as change-me. A scan with zero tracks is the missing mount. AUTH_URL left as your-domain.com sent logout to the wrong host. Loopback 3000, real bind, persisted /data — that is the lab path.

Oct 5, 2026 · 9 min read