What's new
New articles, tools, cheat sheets and features on OhSudo, day by day, newest first. New articles also come by RSS.
- Feature
Six ordered paths through the lessons, SQL exercises, articles and tools: Linux, nginx and HTTPS, Docker, Kubernetes, SQL and PostgreSQL, and Git. Mark steps as done; your progress stays in your browser.
3 new articles
- Feature
- Feature
Not sure what the error is? Start from what you see, answer a few questions, and get the likely cause, the command that confirms it, and the article with the fix. Six of them: website down, SSH, Docker containers, Kubernetes pods, databases, and disk or memory.
3 new articles
- Feature
- Feature
The short answer now sits in a box at the top, numbered fixes are laid out as steps, the line with your error is marked in red in the output, and diagrams show where the chain breaks (nginx 502, DNS, certificates, image pulls, exit code 137).
- Feature
Press Ctrl K (or /) and start typing: tools, pages, lessons and articles come up as you type, and so do the 500+ commands from the cheat sheets, each one opening at its section. Try "git reset" or "kubectl logs".
- Feature
- Feature
Follow every new article, or only the topics you care about, in your feed reader. All the feeds, and how to follow them, on one page.
- Feature
Press Save on any article to keep it in a list in your browser, to read later. No account needed.
- Feature
Paste an error message on the home page or in search: the articles about that exact error come first, even with your own paths, users and dates in it.
- Feature
Articles we run on the real programs say so under their title, with the software and the month of the last passing check.
- Feature
- Tool
Full and compressed forms, ranges, the number of /64 networks, address types, reverse DNS names and splitting into smaller networks.
- Feature
SQL blocks in PostgreSQL and SQLite articles get a Run button: the example runs right there, in your browser, on the real engine.
- Tool
- Tool
Docker Compose in the Terminal Playground
A simulated docker compose: up, down, ps, logs and config, volumes holding a PostgreSQL database, and healthchecks.
3 new articles
- Tool
- Tool
kubectl in the Terminal Playground
A simulated Kubernetes cluster: Deployments and Pods, Services and Ingress, Secrets and ConfigMaps, RBAC, and pods stuck in Pending or CrashLoopBackOff.
- Tool
- Tool
Docker and git in the Terminal Playground
A simulated Docker (images, containers, ports, memory limits) and a real git repository model, each with practice scenarios linked to their articles.
- Tool
Practice queries on real PostgreSQL and SQLite in your browser, with instant checking of your results.
3 new articles
- Tool
- Tool
Step-by-step Linux challenges in the browser terminal, with automatic checking and saved progress.
- Tool
Test a regular expression on your own text, see what each part does, and get the matching grep and sed commands.
- Tool
Paste the output of curl -I to check security headers, CORS, cookies, caching and redirects, with the nginx lines to fix them.
- Cheat sheets
Git, kubectl, systemctl and journalctl, find, grep, sed and awk, tmux, and Vim.
34 new articles
- Docker & ContainersAlpine "not found" for a binary that's right there: glibc vs musl
- Infrastructure as CodeAnsible "Missing sudo password": give it the password safely, or allow the user properly
- Linuxapt "GPG error: NO_PUBKEY": add the key the right way, without apt-key
- CloudAzure and Entra ID "AADSTS" errors: what the most common codes mean, and how to fix them
- WindowsDISM error 0x800f081f "The source files could not be found": give Windows a matching source
- Docker & ContainersDocker "exec format error": the wrong CPU architecture, or a script with no shebang
and 28 more
- Docker & ContainersDocker "port is already allocated" and "ports are not available": find who has the port
- Linuxapt "E: Unable to locate package": update, enable the component, or find its real name
- DatabasesElasticsearch "flood-stage watermark" and read-only indices: free the disk, then check the block
- Linux"error while loading shared libraries" and "GLIBC_2.xx not found": what the loader is telling you
- CI/CDGit "error: src refspec main does not match any": commit first, or use the right branch name
- CI/CDGitLab CI "This job is stuck": why no runner picks it up, and how to fix it
- WindowsIIS "HTTP Error 500.19" and "503 Service Unavailable": read the code, then fix web.config or the app pool
- KubernetesKubernetes CreateContainerConfigError: a missing Secret or ConfigMap, and how to find it
- KubernetesKubernetes pods "Evicted": find the pressure on the node, and stop it from coming back
- DatabasesMySQL "Deadlock found when trying to get lock": read the report, retry, and stop the cycle
- DatabasesMySQL "Incorrect string value": store emoji and everything else with utf8mb4
- NetworkingNginx "403 Forbidden": read the error log, then fix the index, permissions or SELinux
- NetworkingNginx for Laravel with PHP-FPM: production config, permissions and queues
- NetworkingNginx for a React or Vite single-page app: routes, caching and an API proxy
- NetworkingNginx and Gunicorn for Django: production config, static files and HTTPS
- NetworkingNginx reverse proxy with Docker Compose: in a container or on the host
- NetworkingNginx reverse proxy for FastAPI and Uvicorn, with HTTPS and WebSockets
- NetworkingNginx reverse proxy for Ghost: HTTPS, the url setting and redirect loops
- NetworkingNginx for Next.js: a production config with HTTPS, caching and standalone builds
- NetworkingNginx reverse proxy for Node.js and Express, with HTTPS and WebSockets
- NetworkingNginx for WordPress with PHP-FPM: a complete, safe config
- DatabasesOracle "ORA-12541: no listener": start it, or connect to the address it really uses
- DatabasesPostgreSQL "Peer authentication failed for user": connect the right way, or change pg_hba.conf
- DatabasesRedis "NOAUTH Authentication required": send the password, the right way for your client
- DatabasesSQL Server "The transaction log for database is full" (error 9002): read log_reuse_wait_desc
- Linux"umount: target is busy": find what holds the filesystem, and when umount -l is safe
- WindowsWindows "System error 53" and "System error 5" with net use: the network path, and access denied
- macOSmacOS "zsh: command not found: brew": add Homebrew to your PATH
- Tool
- Tool
Strong random passwords, passphrases and hex or Base64 tokens, generated in your browser and never sent anywhere.
30 new articles
- NetworkingApache "AH00558: Could not reliably determine the server's fully qualified domain name": what it means, and the fix
- CloudAWS S3 "403 Access Denied": a checklist for every layer that can refuse you
- Docker & Containers"Cannot connect to the Docker daemon. Is the docker daemon running?": every cause
- SecurityCertbot "failed to authenticate some domains": read the Type, then fix DNS, port 80 or the path
- NetworkingERR_TOO_MANY_REDIRECTS with Nginx and Cloudflare: find the loop and break it
- CI/CDGit "fatal: refusing to merge unrelated histories": when the flag is safe, and when it isn't
and 24 more
- CI/CDGitHub Actions "Resource not accessible by integration": give the token the right permission
- SecurityJWT "jwt expired" and "invalid signature": how to find out what is wrong with a token
- Kuberneteskubectl "The connection to the server localhost:8080 was refused": your kubeconfig is missing
- macOSmacOS "App is damaged and can't be opened": what it really means, and the safe fix
- macOSmacOS "xcrun: error: invalid active developer path": fix it after a macOS update
- DatabasesMongoDB "connect ECONNREFUSED 127.0.0.1:27017": why it refuses, and how to fix it
- DatabasesMongoDB "E11000 duplicate key error": read which index, and which value
- DatabasesMySQL "Can't connect to local MySQL server through socket": find out why (ERROR 2002)
- DatabasesMySQL "ERROR 1064: You have an error in your SQL syntax": how to read it and fix it
- DatabasesMySQL "ERROR 2003: Can't connect to MySQL server": read the number in brackets
- NetworkingNginx "504 Gateway Time-out": find out what's slow before raising the timeout
- Linuxnpm "EACCES: permission denied": fix it without sudo
- DatabasesOracle "ORA-00942: table or view does not exist": when the table is right there
- DatabasesOracle "ORA-12154: TNS:could not resolve the connect identifier specified": how to fix it
- DatabasesPostgreSQL "FATAL: sorry, too many clients already": find who holds the connections
- WindowsPowerShell "running scripts is disabled on this system": fix the execution policy safely
- WindowsRDP "An authentication error has occurred": CredSSP encryption oracle and other causes
- DatabasesSQL Server "Login failed for user" (error 18456): the state tells you why
- DatabasesSQL Server "A network-related or instance-specific error" (error 40, error 26): how to fix it
- Infrastructure as CodeTerraform "Inconsistent dependency lock file": what to run, and what to commit
- Linux"user is not in the sudoers file": how to get sudo back, even without the root password
- WindowsWindows "The RPC server is unavailable" (0x800706BA): how to find what blocks it
- WindowsWindows "The trust relationship between this workstation and the primary domain failed": fix it without rejoining
- WindowsWSL "WslRegisterDistribution failed with error: 0x80370102": turn on virtualization
- Tool
- Tool
GitHub Actions and GitLab CI pipelines: build, test, push images and deploy.
5 new articles
- Networking"Connection timed out" vs "Connection refused": what each one tells you, and how to fix it
- Docker & ContainersDocker build "failed to compute cache key: … not found": why COPY can't see your file
- CI/CD.gitignore not working: why Git still tracks the file, and how to fix it
- KubernetesKubernetes "container has runAsNonRoot and image will run as root": fix the image or the pod
- LinuxSSH "Too many authentication failures": your agent offers too many keys
- Tool
- Tool
Multi-stage Dockerfiles for Node, Python, Go and Java, running as a non-root user.
- Tool
Deployment, Service, Ingress, ConfigMap, Secret and autoscaling YAML from a form.
- Tool
A tidy ~/.ssh/config with hosts, keys and jump hosts.
- Tool
.gitignore & .dockerignore Generator
Ignore files for your stack, in one click.
- Tool
What usually runs on port 5432, 6443 or 9090 — and what to check if it’s open.
- Tool
Service and timer units with restart policies, users and hardening options.
- Tool
YAML ↔ JSON Converter & Validator
Validate YAML and JSON and convert between them, with clear error messages.
- Tool
Encode and decode Base64 and URLs, and calculate MD5 and SHA hashes locally.
- Tool
Inspect a JSON Web Token’s header, payload and expiry without sending it anywhere.
- Tool
Epoch seconds and milliseconds to dates in any time zone, and back.
- Tool
- Tool
Reverse proxy, TLS, redirects, caching and security headers for Nginx.
28 new articles
- Infrastructure as CodeAnsible "UNREACHABLE! Failed to connect to the host via ssh": find the real SSH error
- Linux"Argument list too long": delete or move thousands of files on Linux
- CloudAWS "is not authorized to perform … because no identity-based policy allows": read the error, find the missing permission
- Linux"E: Could not get lock /var/lib/dpkg/lock-frontend": what is holding apt, and what to do
- LinuxCron job not running? Find the reason in the log, PATH and environment
- Docker & ContainersDocker: "connection refused" to localhost from a container — how to reach the host
and 22 more
- Docker & ContainersDocker: "permission denied while trying to connect to the Docker daemon socket"
- CI/CDGit "fatal: detected dubious ownership in repository": fix it without turning the check off
- CI/CDGit "! [rejected] main -> main (fetch first)": why the push failed and how to fix it safely
- Linux"Job for nginx.service failed because the control process exited with error code": how to find the cause
- KubernetesKubernetes ImagePullBackOff and ErrImagePull: find out why the image won’t pull
- KubernetesKubernetes pod stuck in Pending: "0/3 nodes are available: Insufficient cpu"
- LinuxLinux process "Killed" with no error: find the OOM killer and stop it happening again
- DatabasesMySQL "ERROR 1040: Too many connections": get in, find who holds them, fix it
- NetworkingNginx "413 Request Entity Too Large": raise the upload limit in the right place
- Linuxpip "error: externally-managed-environment": install Python packages the right way
- DatabasesPostgreSQL "column must appear in the GROUP BY clause or be used in an aggregate function"
- DatabasesPostgreSQL "Connection refused … Is the server running?": find out why nothing answers on 5432
- DatabasesPostgreSQL "invalid input syntax for type integer": find the bad value and handle it
- DatabasesPostgreSQL "FATAL: password authentication failed for user": find the real reason
- Linux"Read-only file system" on Linux: why the disk went read-only, and how to fix it safely
- DatabasesRedis "MISCONF Redis is configured to save RDB snapshots": why writes stopped
- SecuritySSH "WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!": check it, then fix known_hosts
- Security"SSL certificate problem: unable to get local issuer certificate": fix the chain, not the check
- Linux"sudo: unable to resolve host": fix /etc/hosts after a hostname change
- Networking"Temporary failure in name resolution": fix DNS on a Linux server
- Infrastructure as CodeTerraform "Error acquiring the state lock": who holds it, and when force-unlock is safe
- Linux"Too many open files" on Linux: raise the right limit, or find the leak
- Tool
- Launch
The site opens with the Terminal Playground, the SQL Playground, the first generators and calculators, and the first articles and cheat sheets.
10 new articles
- Networking"Address already in use": find who is using port 80 (or any port)
- Docker & ContainersDocker "exited with code 137": OOM kill or a stop that took too long
- KubernetesKubernetes CrashLoopBackOff: 7 causes and how to find yours
- DatabasesMySQL ERROR 1045 (28000): Access denied for user — find which part is wrong
- NetworkingNginx "502 Bad Gateway": find the cause in the error log
- LinuxNo space left on device: find what is filling your Linux disk
- Launch