Self-Hosting & Homelab
Running your own services: home labs, NAS, Proxmox, Docker, self-hosted apps, networking and privacy.

Self-Host n8n on a VPS with Docker, PostgreSQL, and Caddy (2026)
Build a production n8n on a VPS with Docker Compose, PostgreSQL, and Caddy for automatic HTTPS, then harden and upgrade it safely. Verified end to end on n8n 2.36 and Postgres 16.

Setting Up Your Own VPS: A Secure Starting Point
Turn a fresh VPS into a secure base for self-hosting: non-root user, key-only SSH, a default-deny UFW firewall, auto updates, and the Docker firewall gotcha.

Put SSH Behind Tailscale and Close Port 22
Move SSH onto a private Tailscale network and close port 22. Includes the key-expiry step that prevents lockouts, the UFW rules, and a recovery path.

Install Docker on macOS, Windows (WSL2), and Linux: One Guide, Three Paths
Get a working Docker Engine on macOS, Windows with WSL2, and Linux, then verify with docker run hello-world. Real captured output, the post-install docker group and rootless steps, and the gotchas each OS actually needs.

Run Your First Containers: docker run, ps, logs, exec, stop, rm
Drive the everyday Docker container lifecycle on a real nginx server: run, ps, logs, exec, stop, start, and rm, plus the image-versus-container mental model. Real captured output on Docker Engine 29.8.0.

Docker Compose: Run a Multi-Service Stack (Web + Postgres + Redis)
Build and run a real three-service stack with Docker Compose: a Node API, Postgres, and Redis wired together with one docker compose up. Real captured output, service-to-service networking, and the depends_on readiness gotcha.

Lean Docker Images: Multi-Stage Builds and Layer Caching
Build the same Node app two ways and measure it: a naive 1.62GB image versus a 233MB multi-stage Alpine image. Real numbers for image size, layer caching, and docker history, with a working Dockerfile you can copy.

Where Your Data Lives: Docker Volumes, Bind Mounts, and Networks
Make container data survive restarts and let containers talk to each other: named volumes vs bind mounts, backing up and restoring a volume, and user-defined networks with DNS by name. Real captured output.

Operating Containers: Healthchecks, Resource Limits, Restart Policies, and Env Config
Make Docker containers behave in production: healthchecks and health-gated startup, memory and CPU limits (and the OOM exit 137), restart policies that self-heal, and clean env config. Real captured output.

Docker Security Basics: Non-Root, Read-Only, Image Scanning, and Secrets
Harden a Docker container without breaking it: scan for CVEs with Trivy, run as non-root, make the root filesystem read-only, drop Linux capabilities, and keep secrets out of the image. Real captured output.

Fix: Permission Denied on the Docker Daemon Socket
Got 'permission denied while trying to connect to the Docker daemon socket' on Linux? Here is why it happens, the one-line fix to keep working now, the permanent docker-group fix, and the insecure chmod you should never copy. Real captured output.

Docker Images vs Containers, Explained
Confused by Docker images versus containers? An image is the read-only template; a container is a running copy of it. See it proven with real output: one image, three containers, each with its own writable layer, plus what image layers actually are.

Docker vs Podman: A Hands-On Comparison and Migration
Docker vs Podman on one real Linux box: daemonless and rootless by default, the bind-mount ownership and privileged-port differences, running the same Compose file with podman-compose, and rootless systemd with Quadlet. Real captured output, plus a migration checklist.

Capstone: Dockerize Your Own App End to End
The Docker Foundations capstone: take a real Express + Postgres app from source to a live HTTPS URL. A lean multi-stage image, a hardened production Compose stack (healthchecks, limits, read-only, non-root), a GitHub Actions build that pushes to GHCR, and a Caddy deploy with automatic HTTPS via sslip.io. Real captured output.

Docker Foundations: The Complete Hands-On Series (Install to Production)
The complete Docker Foundations series in one place: a hands-on path from installing Docker to building, hardening, and deploying your own app over HTTPS. Every guide is a real, tested lab, linked in order, with runnable code in the companion repo.