π§± Home Server Chronicles: My Docker-Powered Ecosystem β Part 1
π‘ Welcome to My Home Lab
This is Part 1 of an ongoing series where I document my self-hosted infrastructure journeyβsetting up, securing, and scaling an efficient and modular Docker ecosystem on my home server. Iβll take you through the choices I made, services I run, and challenges I solved.
For context: I'm running this system on a π₯οΈ Beelink SER8 mini PC, equipped with:
- AMD Ryzen 7 8745HS
- 32GB DDR5 RAM
- 1TB NVMe SSD
- Ubuntu Server OS
This machine replaced my Mac mini for Docker workloads and now acts as the heart of my home cloud, developer platform, and AI lab.
π¦ Why Docker?
I chose Docker for the following reasons:
- π§± Isolation: Each service runs in its own container
- π Reproducibility: No more βit works on my machineβ issues
- π Portability: Move the stack between devices
- π Declarative Configuration: All setup lives in
docker-compose
files
π§ Design Principles
My goal was to keep things modular, composable, and resilient. Hereβs what that looked like:
- πΉ Split Compose files into roles:
core.yml
,media.yml
,infra.yml
,extras.yml
- πΉ Avoid monolithic configurations
- πΉ Use external networks defined in a central
networks.yml
- πΉ Enable restart policies and volume mapping for persistence
- πΉ Log and monitor every service via Netdata
Each service is deployed headlessly, accessed either via browser, REST APIs, or reverse proxy.
ποΈ Overview of the Series
| Part | Title | |------|-------| | 1οΈβ£ | Intro & Architecture (you are here) | | 2οΈβ£ | Core Services: Nginx, Authelia, Tailscale | | 3οΈβ£ | Infra Layer: Portainer, VS Code, Cron, Backups | | 4οΈβ£ | Media Stack: Jellyfin, Sonarr, Radarr, Lidarr | | 5οΈβ£ | Productivity: Nextcloud, Uptime Kuma, Vaultwarden | | 6οΈβ£ | AI Lab: Ollama, OpenWebUI, LLM-powered Bots | | 7οΈβ£ | Network Ops: Pi-hole, DNS, Nginx Proxy Manager | | 8οΈβ£ | Hardening & Automation: Secrets, 2FA, Watchtower |
Letβs begin with the big pictureβhow itβs all wired together.
π§± Architecture
Here's a birdβs eye view of my setup:
+-----------------------+
| Beelink SER8 (Host) |
+-----------------------+
|
+------------------------+-------------------------+
| | |
Docker Compose External Access VPN Tunnel
(core.yml + others) (NPM, Authelia) (Tailscale)
|
+--------------+---------------------+
| | |
Core Stack Media Stack AI Stack
(Nginx, Auth) (Jellyfin, Sonarr) (Ollama, TTS, Bots)
Every service belongs to a category and communicates through pre-defined Docker networks, with networks.yml
acting as the shared config.
π Modularity with Compose
β File Structure
docker/
βββ core.yml
βββ infra.yml
βββ media.yml
βββ extras.yml
βββ networks.yml
βββ .env
π§© Why Split Files?
This modular split helps in:
- β Running specific layers independently
- β Upgrading only what you need
- β Easier debugging and configuration
- β Clear separation of concern
I also prefix volumes and container names per file to avoid naming conflicts.
π Networks & Naming
Defined in networks.yml
:
networks:
traefik:
name: traefik
driver: bridge
backend:
name: backend
driver: bridge
ai:
name: ai
driver: bridge
Services declare these external networks in their own files. This ensures containers are interoperable across layers without duplicating definitions.
π Secrets and Security
Security is critical. Even a home server should have strong hygiene:
- π
.env
files store secrets (never committed) - π Authelia + Nginx Proxy Manager enable 2FA and domain routing
- π Tailscale manages zero-config VPN with ACLs
All admin UIs are hidden behind TOTP authentication or VPN entry.
π§ Reverse Proxy Flow
The reverse proxy stack routes requests like this:
User β https://service.jay739.dev
β³ Nginx Proxy Manager
β³ Authelia (2FA if protected)
β³ Internal Docker container
Each app is accessible via a subdomain thanks to NPM + wildcard DNS setup via Cloudflare.
π Monitoring & Maintenance
Every containerβs health is tracked using Netdata, running on a dedicated infra
container and exposed via:
π https://metrics.jay739.dev
Future parts will explore how I created a custom Astro dashboard to visualize key stats live on my portfolio.
π§° Core Tools Installed on Host
Even though most things run in Docker, I have some native tools:
- π
tailscale
β for remote access - π³
docker
,docker-compose
β core engine - π¦
fail2ban
β SSH brute force protection - π
rsync
,cron
β automated local backups - π§
nvitop
β monitor GPU usage in terminal
π Whatβs Next?
In the next part of this series, Iβll walk you through the Core Services stack in detail: reverse proxy, domain mapping, VPN access, and 2FA gateways.
Stay tuned, and feel free to reach out if you want to replicate this setup or have questions on customizing your own server stack! π¬
π Part 2 β Core Services (Nginx, Authelia, Tailscale)
β Jayakrishna