Another title: Explaining my home server in depth, just because I’m bored.

So I run a home server. Has been running for a while now, and at this point it hosts pretty much everything I use daily. This blog, my Discord bot, a mail server, a VPN, and a bunch of other stuff. Here is the breakdown.


Hardware

Nothing fancy. Just an old PC I repurposed after I got a laptop:

  • CPU: Intel Core i5-4590
  • RAM: 16 GiB DDR3
  • Storage: 1–2 TB
  • Network: 300 Mbps max bandwidth (home ISP)

The i5-4590 is a 2014 CPU. It’s old, it runs hot sometimes, and I’ve already had one motherboard die on me mid-session at 4 AM (that was “fun”). But it handles everything I throw at it fine.


Networking

Having a server at home means dealing with a dynamic IP that your ISP changes it periodically, which breaks everything if you’re pointing a domain at just the raw public IP.

DDNS it is. I use both No-IP and DuckDNS as fallbacks. A small script runs periodically to update the DNS record using Cloudflare API whenever the IP changes.

For my website, I just enable Cloudflare Proxies for assets.choomai.net.
It is a good thing that they handle DNS, DDoS protection, and the CDN layer with no cost at all.

SSL certificates are handled by Let’s Encrypt, obviously.


Web Servers

I use NGINX (and IIS, but that’s on my old PC, and I moved, so no more).

NGINX handles the Linux-side services, reverse proxying to Docker containers, serving static files, terminating SSL.
Each service gets its own server block with rate limiting configured. Exposing a port directly to the internet without a reverse proxy in front is, well, just dumb.

Also if you can, geo-block while you’re at it. Stopped a lot of bots & crawlers.
Btw I hate China, and you know what that means.


Services

Here’s everything currently running:

WordPress (wp.choomai.net): this blog. Self-hosted because I don’t want to pay for WordPress.com and I don’t trust third-party platforms with my data. Backed up regularly.

Discord bot (discord.choomai.net): a Node.js bot I’ve been building for a while. Runs in Docker alongside a MySQL 8 database and a Redis instance. Has slash commands for AFK timers, private voice channels, server status monitoring, Wake-on-LAN, and a few other things.

Mail server (main@choomai.net): custom mail server, probably the most painful thing I’ve ever set up. Luckily I found SMTP2GO, which offer free tier, plenty for personal use. There is a lot of moving parts and any misconfiguration gets your mail silently dropped or marked as spam. It works now. I don’t touch it.

Minecraft RCON (rcon.choomai.net): a PHP web console for sending RCON commands to a Minecraft server. Forked from an existing project. Useful for managing the server without SSH-ing in every time. (doesn’t work atm)

FNAC2 web port (fnac2.choomai.net): a web version of Five Nights at Candy’s 2 I built with SvelteKit. More of a fun project than anything serious. (doesn’t work atm)

VPN: WireGuard. Lets me access the local network securely when I’m away. Especially SSH.

Status page (status.choomai.net): monitors uptime for all the services. Publicly accessible so I can check if something’s down without opening a terminal. I found Better Stack offer the greatest service while being free.

Link shortener (l.choomai.net): simple redirect service for my own social links and sharing.

Assets CDN (assets.choomai.net): serves static assets (icons, images) for the other services, as mentions on Networking


CI/CD

The Discord bot has a full GitHub Actions pipeline. On every version bump it builds a Docker image, pushes it to the GitHub Container Registry (ghcr.io), and the server pulls the new image. No manual deployments. I also use conventional commits and commitlint to keep the commit history readable.

Kinda over-engineered for a personal project tbh.


What I’ve Learned

A few things nobody tells you upfront:

Fuck the ISP (or the router): My home router (Huawei HG-814515V5) don’t allow opening port 80 and 443 for some reason, but luckily there is DMZ. But since it is DMZ, I have to configure a firewall & VPN, for obvious reason. Learn the networking.

Backups are not optional. I learned this the hard way when a motherboard died. The server was down for days. Now everything important gets backed up offsite on AWS (I won’t talk about it here).

The mail server will break your brain. If you’re new to self-hosting, do everything else first and save mail for last.

Document your setup. Six months from now you will not remember why you wrote that NGINX rewrite rule or what that cron job does. Write it down.


Read more

If you didn’t notice it already. I used AI in order to write this long ass blog. I’m bad at, well, this writing content shit. Just look at this score.