Bootstrap a VPS With Ansible in One Run Without Locking Yourself Out

A single Ansible run can take a blank VPS to a hardened, reproducible server. The hard part is not the tasks, it is the order. Here is the ordering that keeps you logged in, the failures that pass green and bite two weeks later, and how to make the second run as safe as the first.

Continue ReadingBootstrap a VPS With Ansible in One Run Without Locking Yourself Out

Nginx vs Apache vs Caddy: What Actually Decides It in Real Projects

Benchmarks pick the wrong winner. Here is how Nginx, Apache and Caddy actually differ in production: how each one fails under load, who owns certificate renewal, and where configuration lives when a developer needs to change it. Includes a decision procedure and the mistakes I see most.

Continue ReadingNginx vs Apache vs Caddy: What Actually Decides It in Real Projects

Automating Server Provisioning for New Clients Without Building a Snowflake Farm

Hand-built client servers fail quietly: you only find out they were never reproducible on the day you need to rebuild one. Here is how to automate server provisioning for new clients using cloud-init for first boot, Ansible for convergence, per-client secrets and a verification gate that refuses to hand over a half-built box.

Continue ReadingAutomating Server Provisioning for New Clients Without Building a Snowflake Farm

Docker Logs Ate My Disk: A Working Guide to Log Drivers and Rotation

Docker's default logging driver writes container output to a JSON file with no size limit and no rotation. This is a practical guide to Docker log rotation: what the defaults actually do, why your daemon.json change did nothing, why deleting the log file did not free any disk, and how to choose between json-file, local, journald and shipping logs off the box.

Continue ReadingDocker Logs Ate My Disk: A Working Guide to Log Drivers and Rotation

Docker Compose in Production: What Works and What Quietly Burns You

Running Docker Compose in production is a reasonable choice for a single host, but the defaults were chosen for a laptop. A walk through the failure families that actually bite: the deploy gap, unrotated logs filling the disk, anonymous volumes, published ports that bypass your firewall, secrets in environment variables, and health checks that report without acting.

Continue ReadingDocker Compose in Production: What Works and What Quietly Burns You

You Probably Didn’t Harden That Server: A VPS Setup and Hardening Checklist That Verifies Itself

You set PasswordAuthentication no, restarted SSH, and moved on. Months later the logs show successful password logins, because a vendor drop-in file sorted earlier and won. A VPS setup and hardening checklist where every step comes with the command that proves it worked.

Continue ReadingYou Probably Didn’t Harden That Server: A VPS Setup and Hardening Checklist That Verifies Itself

Your Deploy Key Is a Root Shell: GitHub Actions VPS Deployment Over SSH, Done Carefully

A deploy key in GitHub secrets is a shell on your production server, handed to a container you don't control, running code from maintainers you've never met. Here's how to build the pipeline so a leaked key isn't worth much: forced commands, scoped sudo, pinned actions and a real approval gate.

Continue ReadingYour Deploy Key Is a Root Shell: GitHub Actions VPS Deployment Over SSH, Done Carefully