
A fixed triage order for a Docker Compose service that won't start: docker compose ps, logs --tail, the exit code, and the healthcheck status -- in that order, before restarting anything, plus how to tell a real crash loop from a slow first boot.
Author
151 articles
Milan Buha is the founder and editor of VoidInsider. Curious by default, he likes understanding things from the inside — the technology he depends on every day, the systems behind everyday money decisions, the fine print everyone else skips. He writes about what he's tried, checked, and actually uses, the way he'd explain it to a friend.

A fixed triage order for a Docker Compose service that won't start: docker compose ps, logs --tail, the exit code, and the healthcheck status -- in that order, before restarting anything, plus how to tell a real crash loop from a slow first boot.

Two things flip the old advice in 2026: Spotify now has real lossless audio, and Apple Music is cheaper on most tiers. A decision table routing you to the one factor that should decide it, plus links to the full sound-quality, price, and three-way breakdowns.

Spotify Family now costs $21.99/mo. A real cost and maintenance-time comparison against self-hosting Navidrome on hardware you already own, a dedicated Pi, or a cheap cloud VPS -- and when it's actually worth ditching streaming.

I pasted a fresh Postgres password straight into environment: on a new compose file, then stopped with my cursor over git add . That password was about to sit in plain text in a repo I push to self-hosted Gitea, not because I was careless, but because environment: is the path of least resistance.

I edited a Dockerfile, ran docker compose up -d, and the container came back up running the exact same code it had before. No error, no warning, just silence, and a service that looked started but was not the one I had just changed.

I ran docker compose stop expecting the stack to fully disappear. A few seconds later, docker compose ps still listed every container and the default network was still there, nothing had been removed, just stopped.

The power blipped, the host rebooted, and half the homelab stack came back up on its own — the other half just sat there, exited. Every container had a restart: line; they weren't all the same line.

Two containers on the same host could reach each other, and neither one was supposed to. Both had landed on Docker Compose's default bridge network — a network that doesn't ask permission before connecting things.

I ran docker compose down -v to force a clean restart, out of muscle memory from a different project where that flag was harmless. It wasn't harmless here — it deleted a named volume along with the containers.

Every self-hosted apps roundup is an unvetted list with no honest 'skip this one.' Six categories actually tested on a homelab — AI chatbot, music, automation, Reddit, Git, and CI/CD — with real hardware cost and one category that isn't worth it for most people.

Price and sound quality rarely keep people on Spotify -- years of playlists do. A real migration run with two transfer tools, tracking exactly what transferred, what needed manual fixing, and the real free-tier limits on each.

Gitea and Forgejo run on well under 1GB of RAM; GitLab CE documents a 4GB minimum. This comparison covers real resource footprint, CI runner maturity (Gitea/Forgejo Actions vs GitLab CI), and GitHub migration friction for homelab hardware.