In Summer 2025, I started getting into homelabbing. I started small with an unused laptop, and then wanted to build a full server. It currently helps me share some of my media (e.g., recordings of my games with friends) and AI services (OpenWebUI, ComfyUI) with friends, keeps an up-to-date replica of my Obsidian vault, and hosts many services for household chores (groceries, inventory, finances). The purpose of this blog post is to show my current setup, and share some of the lessons I learned during this journey.
Note: All of my Docker compose files can be found here.
Below is a table of the components of my server, all of them bought from Amazon.
| Component | Reference |
|---|---|
| CPU (Processor) | AMD Ryzen 9 7900X |
| GPU (Graphics Card) | ASUS TUF Gaming NVIDIA GeForce RTX 3090 OC Edition |
| Motherboard | GIGABYTE B650 AORUS Elite AX |
| RAM (Memory) | 2x Crucial Pro 64GB DDR5 5600MHz (2x32GB) |
| Storage (SSD) | SAMSUNG 990 PRO SSD 2TB |
| Storage (HDD) | 3x Seagate IronWolf 8TB 7200 RPM |
| Power Supply (PSU) | be quiet! Pure Power 13 M 1000W 80+ Gold |
| CPU Cooler | Thermalright Phantom Spirit 120 EVO |
| Case | Fractal Design Define R5 |
Note: I originally started with a budget NVIDIA 5060 Ti to make sure everything worked before committing to the 3090.
Here is a list of the main software that I use:
docker compose.
As written in an earlier blog post, I use Obsidian a lot. I used to subscribe to Obsidian Sync to synchronize my notes across devices, but once I started building my server, I wanted something self-hosted. So now I use the “Self-hosted LiveSync” plugin and I have a copy of my vault always synchronized on my server. It uses two containers, one for the underlying database, and one for hosting a WebUI of Obsidian (Docker compose here). Beyond the redundancy, it allows me to use the MCP endpoint of my vault whenever I want (since it’s always online on the tailnet).
I use several isolated services for household-related stuff (each in their own LXC):
The last part of my stack is the AI-related services. I divided it into three sections: backend services, frontend services powered by the backend services, and the AI agent.
AI nowadays can write, listen, and speak (among other capabilities). While I could simply pay for good proprietary models (honestly, it might be cheaper at this scale), the ecosystem contains many great open-source solutions. To power my AI services, I use those three frameworks:
The AI models are all on my SSD (for faster load/unload), with the directory mounted directly into the container. I tinkered with Whisper and Chatterbox to set up a proxy to avoid having the models always on GPU, otherwise I wouldn’t be able to load LLMs. Because they come with custom files and cannot be contained in a compose file, only my Ollama compose is available here.
Beyond the backend, I host three AI services that are user-facing (Compose here):
Honestly, I don’t use them so much, but it was good to tinker with and it can be handy sometimes.
With all the hype around OpenClaw, I got interested in Claw-style projects. I tried many for a bit (OpenClaw, NanoBot, IronClaw, ZeroClaw…) but ended up settling for Hermes Agent. I have a dedicated VM running it.
I currently run three profiles (or agents), all connected to Discord as separate bots:
The agents all use my Whisper and Chatterbox services. For the underlying LLM, I mainly use OpenRouter, specifically Deepseek v4 Flash because it’s good and cheap (I spend less than 20$/month on OpenRouter credits). I found that the Ollama models with a 3090 weren’t quite that good and fast. My current rationale is that I pay for better models right now so that they can figure out edge cases and build the skills, scripts, and references. Then, a less capable local model can use them consistently.
I use the docker backend (i.e., any tool call is within a Docker container) and I add the Tailscale DNS to it (with the --dns flag). This is fairly overkill since it’s in a VM, but it’s good practice to sandbox the agents.
Fun Fact: The names are taken from one of my favorite games, Detroit: Become Human (Kara and Connor), and an anime that I like, Dr Stone (Senku).
After setting up my server, I started recording and uploading my game sessions to it. I use Jellyfin (and Jellystat for some statistics, full compose here). For example, I recorded all of our game sessions playing Abiotic Factor (see screenshot below). I also vibe-coded a simple “highlight” container that takes the recordings and generates highlights by looking at the transcript using Whisper and Ollama.
tailscale serve command to enable HTTPS (Tailscale traffic is encrypted, but I don’t like when my browser complains that it’s HTTP). Unfortunately, Tailscale does not support subdomains, so I keep most of the links ending with a port.
serve command, it is important to change the port (e.g., tailscale serve --bg --https=DIFFERENT_PORT http://localhost:PORT), otherwise a race condition may prevent the service from launching because the port is already taken by the command.https://host.tailnet.ts.net/SERVICE, but the main issue is that some services do not support changing the base path.docker network."127.0.0.1:PORT:OTHER_PORT" in ports), which makes Tailscale ACLs the source of truth. Indeed, if I left the default bind to 0.0.0.0, anyone would be able to access them from the LAN (e.g., through the Wifi), and it would be very bad if there was no authentication (like ComfyUI)!.run driver installer (NVIDIA-Linux-x86_64-595.71.05.run for example) from the website.--no-kernel-modules flag and rebootMy homelab journey took some time and effort to get to a point where it runs smoothly, but it definitely paid off. I think that I learned a lot by going through the process. As my primary research area is security, thinking (or rather, being paranoid) about the security of my setup helped me a lot to solidify my knowledge. I’d advise people who want to do research in a given area to just immerse themselves in the tech and tinker with it.
This whole setup is built upon free and/or open-source software. I thank all the maintainers and contributors to these projects, it’s great stuff!