Real errors, real fixes — the gotchas that eat hours, solved in minutes.
You installed the tool, but the shell insists it doesn't exist. Nine times out of ten it's a PATH problem — here's how to confirm it and fix it.
terraform plan or apply stops with 'Error acquiring the state lock'. Terraform locks state so two runs can't corrupt it — this means a lock is already held. Here's how to tell if it's real, and how to clear a stale one safely.
Terraform stops with 'Error: Inconsistent dependency lock file'. Your .terraform.lock.hcl doesn't match the providers your config now needs — often after adding a provider or running in CI. Here's the fix.
A script, CI job, or container ends with 'exit status 127'. That number has one specific meaning: the shell couldn't find the command it was told to run. Here's how to track down which command, and why.
git clone or push dies with 'fatal: repository not found' — but the repo clearly exists. For a private repo that message usually means access, not a missing repo. Here's how to tell which, and fix it.
You're root — or using sudo — and Linux still says 'Permission denied'. Root normally ignores file permissions, so this means something else is blocking you: a read-only mount, an immutable flag, or a security module. Here's how to find it.
A GitLab pipeline that sits on 'pending' forever isn't broken — no runner has picked up the job. There are only a few reasons a runner ignores a job, and tags are usually one of them.
A ValueError means the type was right but the value was wrong — like int('12a'), or unpacking three items into two variables. The function got something it can't work with. Here's how to fix the common cases.
A TypeError means you used a value of the wrong type for the operation — adding a string to an int, calling something that isn't callable, or passing the wrong number of arguments. The message says which.
'invalid syntax' means Python couldn't even parse your code, so nothing ran. The caret often points *after* the real mistake — which is usually a missing colon, bracket, or quote on the line above.
Pydantic's ValidationError looks noisy but it's the most helpful error you'll get — it lists every field that failed and why. Learn to read it once and you'll fix these in seconds.
A target showing DOWN on Prometheus's /targets page means the scrape failed — and the error next to it tells you which of a handful of reasons it was. Here's how to read each one.
A 422 from FastAPI is not a bug in your server — it's FastAPI telling you the request body or query didn't match your Pydantic model. The response JSON tells you exactly which field. Here's how to read it.
Your frontend calls your FastAPI backend and the browser blocks it with a CORS error. The API is fine — the browser is enforcing a rule your server hasn't opted into. The fix is one middleware.
A Grafana panel saying 'No data' almost never means the data is missing — it means the query, the time range, or the data source isn't lined up with it. Here's the order to check.
GitLab refuses to run the pipeline and shows a red 'yaml invalid' banner. It's almost always indentation or a missing script — and GitLab ships a linter that points at the exact line.
"The connection to the server localhost:8080 was refused" almost never means your cluster is down — it means kubectl has no kubeconfig and is guessing. Here's why, and the one-line fix.
CrashLoopBackOff isn't an error in itself — it's Kubernetes telling you your container keeps starting and then dying. The fix is never the pod; it's finding why the process exits. Here's the exact path.
ImagePullBackOff means Kubernetes never even got your container image — so nothing else can start. It's almost always a wrong name, a missing tag, or a private registry with no credentials. Here's how to tell which.
A 404 from your Ingress usually isn't your app answering — it's the ingress controller saying "no rule matched this request." The cause is almost always the host, the path, or a backend that has no endpoints.
A pod stuck in Pending hasn't been placed on any node yet — the scheduler looked and found nowhere to put it. The events tell you exactly why, and it's usually resources, taints, or an unbound volume.
Your Service exists but nothing answers on it. Nine times out of ten the Service's selector doesn't match your pods' labels, or the pods aren't Ready. Here's how to prove which in two commands.
Git warns you're in 'detached HEAD' state and it sounds alarming. It just means you're looking at a commit directly instead of a branch. Here's what it is and how to keep any work you do there.
A container or binary dies instantly with 'exec format error'. It almost always means the wrong CPU architecture — an amd64 image on an ARM machine, or vice versa. Here's how to spot and fix it.
Your very first commit fails with 'Please tell me who you are.' Git just needs a name and email to stamp on commits — you haven't set them yet. Two commands and you're done, for good.
Python throws 'list index out of range' — you asked for an item that isn't there. Usually it's an off-by-one, an empty list, or a hard-coded position. Here's how to find and fix each.
Docker greets you with 'Cannot connect to the Docker daemon. Is the docker daemon running?' Usually it isn't. This is about the engine being stopped — not permissions. Here's how to start it.
Python throws 'NoneType object has no attribute...' and points at a line that looks fine. The real cause is one step earlier: something you expected to hold a value is actually None. Here's how to find it.
SSH refuses to connect with 'Host key verification failed' and a scary warning about the remote identity changing. It's a security check doing its job. Here's how to tell a rebuilt server from a real problem.
Nginx serves a 403 Forbidden. Unlike a 404, the file is found — Nginx just won't hand it over. It's almost always file permissions or a missing index. Here's the short list to check.
Python raises a KeyError with a key name attached — you asked a dictionary for a key it doesn't have. Here's why it happens (often with JSON or config) and the clean ways to handle a missing key.
You run sudo and Linux says you're 'not in the sudoers file' — with an ominous note about being reported. It just means your account lacks admin rights. Here's how to grant them (from an account that has them).
apt refuses to install with 'Could not get lock /var/lib/dpkg/lock'. Another package process is already running. Usually you just wait a minute — here's how to confirm that, and what to do if it's truly stuck.
Nginx refuses to start with 'bind() to 0.0.0.0:80 failed (Address already in use)'. Something else already owns port 80 — often Apache, or another Nginx. Here's how to find and clear it.
A 504 from Nginx means your app was reached but took too long to answer. Unlike a 502, the app is alive — just slow. Here's how to tell a real timeout from a config that's too impatient.
systemctl says your service is 'failed' but not why. The answer is in the journal. Here's how to read systemd logs with journalctl and find the exact line that killed your service.
Fresh Docker install, and every command says permission denied on the daemon socket. It's not a bug — your user just isn't in the docker group yet. Here's the fix and why it works.
apt install fails with 'E: Unable to locate package' for something you know exists. Usually your package list is just stale, or the package lives in a repo you haven't enabled. Here's the fix order.
Git stopped mid-merge with 'CONFLICT' and strange <<<<<<< markers in your files. It's not broken — Git is asking you to choose. Here's how to read the markers and finish the merge calmly.
A build or pull dies with 'no space left on device', but df says you have room. Docker hoards old images, stopped containers, and volumes. Here's how to find and reclaim the space safely.
An upload fails with '413 Request Entity Too Large'. Nginx has a size limit on request bodies, and your file blew past it. Here's the one directive to change — and why the app never even saw the request.
pip install now refuses with 'externally-managed-environment' on modern Linux. It's a deliberate guardrail, not a bug — it's stopping you from breaking your system Python. Here's the right way around it.
Your container keeps dying with exit code 137 and 'OOMKilled'. That's the Linux out-of-memory killer, not a crash in your code. Here's how to confirm it and give the container the memory it needs.
Python throws IndentationError or TabError and the code looks perfectly lined up. The culprit is invisible: tabs and spaces mixed together. Here's how to see it and stop it for good.
Every git command answers with 'fatal: not a git repository'. Git isn't broken — you're just standing in a directory it doesn't track. Here's how to tell where the boundary is and fix it.
Your push is rejected with 'failed to push some refs' and a note about non-fast-forward. It means the remote has commits you don't. Here's how to pull them in safely and push again.
Your git push fails with 'Authentication failed' even though the password is right. GitHub stopped accepting passwords over HTTPS years ago. Here's how to use a token or SSH key instead.
"No space left on device" can take a server down. Here's how to quickly find the culprit and reclaim space safely.
"Connection refused" is precise, not mysterious. It tells you something specific — here's how to read it and act on it.
That "Not Secure" label scares users away. Here's what triggers it and the usual fixes to get the padlock back.
You pip-installed it, but Python swears the module doesn't exist. The cause is almost always which Python you're actually running.
The most common Linux error there is. Here's how to read it, fix it properly, and avoid the lazy 'just use sudo on everything' trap.
A 502 from Nginx almost always means one thing: it couldn't reach your app. Here's the short list of why, in the order to check them.
You run a container and it's gone a second later. Here's the systematic way to find out why, instead of guessing.
"Address already in use" means something is already sitting on your port. Here's how to find exactly what — and free it up safely.
The single most demoralising error for anyone new to servers. It's almost never random — here's the checklist that fixes it 95% of the time.