Trying the Ghostty terminal, I hit a problem over SSH to a Synology NAS: arrow-key history recall and clear don’t work, because Ghostty sets TERM to xterm-ghostty and Synology lacks the matching terminfo. The practical fix is overriding TERM to xterm-256color via an ssh config SetEnv entry, which can be wildcarded across multiple hosts. The terminfo installation method Ghostty officially recommends fails on Synology’s minimal DSM...
After the Porkbun DNS plugin for Nginx Proxy Manager stopped working, my homelab Let’s Encrypt certificates no longer renewed automatically, so I now download certificate bundles directly from Porkbun and install them manually. Along the way there’s background on SSL, DNS challenges, and securing internal services that aren’t reachable from the public internet. The manual approach requires repeating the renewal process every 90 days...
Using ntfy.sh, shell commands can trigger a push notification to a phone or watch via curl when they finish. I demonstrate chaining long-running commands like rsync with && and || to send success or failure messages, running everything in the background with nohup, and redirecting the curl output to a log file...
I walk through self-hosting Enclosed on a VPS as a secure alternative to emailing password-protected zip files. I cover the Docker Compose setup behind Nginx Proxy Manager, along with configuring authenticated logins, a step the official docs leave under-explained, so only I can upload files while recipients download them without an account...
Using NGINX basic auth as a lightweight alternative to building authentication for my side projects. For a standard NGINX setup, the authenticated username is passed to a Node app in an X-Username header and checked against a user list for access rights. I then cover replicating this in NGINX Proxy Manager, using access lists and the locations tab to set the header...
After abandoning an overly complicated LXD-based file transfer setup, I walk through using command-line rsync to sync files directly between two Synology NASes, including over Tailscale. I cover setting up passwordless SSH without ssh-copy-id, working around DSM 7’s restriction on Tailscale outbound connections and its lack of Magic DNS, enabling rsync in the Synology interface, excluding metadata and recycle bin directories, fixing permissions, throttling bandwidth, deleting remote files in one-way syncs, and running the job in the background with nohup...
Running NGINX Proxy Manager in a Docker container breaks the usual habit of pointing proxies at 127.0.0.1, since localhost now refers to inside the container rather than the host. I explain why, cover the confusing exception of NPM’s own admin interface, and show how joining service containers to NPM’s Docker network lets the proxy reach them by container name via DNS, with no ports exposed to the host...
I explain why I use Docker bind mounts instead of named Docker volumes in my homelab, keeping each container’s compose file and data together in a single directory for easier backups and migration. I weigh the tradeoffs of this approach and walk through migrating an Uptime Kuma container from a named volume to a bind mount by locating the volume’s files with docker inspect and copying them directly while the container is stopped, contrary to more complicated methods suggested elsewhere online...
Upgrading Forgejo from 1.21 to 7.0.0 takes more than the usual pull on an existing tag, because the container tag changes with the minor version. After explaining how container image tags work, I update my docker-compose.yml to pin Forgejo 7.0 and run the usual backup, down, pull, up, and test steps...
My VPS runs NGINX Proxy Manager, which offers no way to serve static virtual hosts, so I walk through running Static Web Server—a lightweight Rust-based web server—in Docker alongside it. I cover the directory layout, a docker-compose setup, and the config.toml virtual host entries, with the result verified using Tailscale addresses as stand-in hostnames...
I take a look at using NGINX as a reverse proxy in front of self-hosted services, and at NGINX Proxy Manager, a project that adds a web GUI to the process and simplifies obtaining Let’s Encrypt certificates. I cover setup via Docker, along with a brief comparison of alternatives such as HAProxy, Caddy, and Traefik...
When setting up self-hosted LimeSurvey, I find no official Docker image, so I work through how to decide which third-party container image to trust. I lay out rough criteria, such as known maintainers, popularity, update frequency, and inspectable build files, then compare several LimeSurvey images on Docker Hub and trace their provenance before settling on one...
I describe my standard, reproducible homelab setup: a Proxmox-based system of three machines with nightly backups to a Synology NAS, where most apps run as Docker containers managed by docker compose inside LXCs cloned from a prepared template. An upgrade of Forgejo from 1.21.1 to 1.21.8 demonstrates how quick and low-risk maintenance has become under this arrangement, involving a container backup, an image pull, a restart, and some brief testing...
I walk through turning my small Node.js Markdown server into a Docker image, explaining the Dockerfile line by line, building the image locally, and pushing it to Docker Hub. I finish with a sample docker-compose file so self-hosters can deploy the app with a single command...
I walk through hosting a private Docker registry on my homelab network using Docker’s official registry image, motivated by the free tier’s single-repository limit and Docker Hub’s pull/push rate limits. I cover setting up the registry with docker-compose, building a small test image, and pushing it to the registry without TLS by adding an insecure-registries exception to daemon.json. A third machine pulls and runs the image to confirm it all works...
Because my Uptime Kuma monitoring instance runs on a home network sharing the same flaky 4G connection as the VPS sites it watches, I consider Uptime Robot before deploying a second instance on Fly.io’s free tier. Setting it up as a Docker container proves simple, and to fold the remote status back into my local instance I discover Uptime Kuma already exposes an SVG status badge usable with keyword monitoring, avoiding a custom scraping endpoint...
A rundown of the tech courses and tutorials I started but never finished, including Udemy purchases, 100 Days of SwiftUI, MIT’s Missing Semester lectures, and Stanford’s CS193p, with brief notes on why each was abandoned. I argue that quitting a course in favor of building real projects is usually a good trade, since courses are mainly valuable for discovering tools and concepts you didn’t know you needed...
A guide to automating the setup of new self-hosted services on Proxmox by converting a fully configured LXC container into a reusable template. I cover preparing the base container with standard software such as Docker and Tailscale, addressing clone-specific issues like host names, machine IDs, and SSH host keys, then cloning the template to spin up new containers quickly...
My routine quarterly disaster-recovery test in my Proxmox homelab—shutting down the production node and restoring its backups onto a second machine—turned up a few minor issues: the backup node ran out of disk space, was still on an old Proxmox version, and was missing a config fix for backing up LXCs to NFS. The exercise also prompted me to reflect on sticking with Proxmox, Synology’s reliability, and the Uptime Kuma and ntfy monitoring that confirmed services came back up...
A security vulnerability announced for Forgejo, which also affects Gitea and Gogs, prompted me to look into the fork history behind my self-hosted Gogs setup: Gitea split from Gogs in 2016 over project management disagreements, and Forgejo forked from Gitea in 2022 after its trademarks moved to a company. Impressed by Forgejo’s handling of the issue and only lightly invested in Gogs, I’m considering a switch. The takeaway is that project governance matters alongside features, and security announcements for the tools you rely on are worth following...