Self-Hosting a Home Server

A home server enables complete control over your data, services, and digital infrastructure. This guide covers the architecture, services, and practices for running a production homelab server.

Why Self-Host?

Privacy & Control

Learning & Skills

Cost Efficiency

Customization

Server Architecture Overview

Hardware Foundation

A modern homelab server typically includes:

CPU: Multi-core processor (8+ cores recommended)

RAM: 32GB+ DDR4/DDR5

Storage: Tiered approach

GPU (Optional but recommended):

Network: 2.5GbE or better

Power: Quality PSU with headroom

Software Stack

Operating System: Linux (Ubuntu Server LTS recommended)

Containerization: Docker

Reverse Proxy: Notes/NGINX

VPN: Tailscale

Service Categories

Media Services

Notes/Jellyfin - Media Streaming

Notes/Navidrome - Music Server

Notes/Immich - Photo Management

Smart Home

Notes/Home Assistant - Home Automation Hub

Protocol Bridges:

AI & LLM Services

Ollama Help - Local LLM Server

Notes/Open WebUI - LLM Interface

Utility Services

SearXNG - Private Search Engine

PrivateBin - Encrypted Pastebin

Network Architecture

Physical Network Topology

Internet
    ↓
Router (with VPN)
    ↓
Network Switch
    ├─ Server (wired 2.5GbE)
    ├─ WiFi Access Points
    └─ Other devices

Network Segmentation

Management Network: Server administration

Service Network: Docker containers

IoT Network: Smart home devices

Remote Access Strategy

Tailscale (Recommended):

Cloudflare Tunnel (Alternative):

Never expose services directly to the internet without protection

Storage Strategy

Filesystem Layout

/                    # System (NVMe)
/mnt/data           # Docker volumes (SSD)
/mnt/media1         # Movies, Music (HDD)
/mnt/media2         # TV Shows (HDD)
/mnt/archive        # Backups, cold storage (HDD)

Mount Configuration

Use /etc/fstab for persistent mounts:

UUID=xxx /mnt/data ext4 defaults 0 2
UUID=yyy /mnt/media1 ext4 defaults 0 2

Why UUIDs? Device names (/dev/sdX) can change between boots. UUIDs are stable.

Backup Strategy

3-2-1 Rule:

What to backup:

What not to backup:

Security Practices

Firewall Configuration

UFW (Uncomplicated Firewall):

# Default policies
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Allow SSH from local network only
sudo ufw allow from 192.168.1.0/24 to any port 22

# Allow Tailscale
sudo ufw allow 41641/udp

# Enable firewall
sudo ufw enable

Access Control

SSH Hardening:

Service Authentication:

Update Strategy

System Updates:

# Weekly system updates
sudo apt update && sudo apt upgrade -y

Docker Updates:

# Update all containers in a stack
cd /path/to/compose/
docker compose pull
docker compose up -d

Automation: Use cron jobs for scheduled updates (with caution)

Monitoring & Maintenance

Health Checks

System Resources:

Service Status:

Log Management

Centralized Logging:

Log Rotation: Configure logrotate to prevent disk fill

Scheduled Maintenance

Daily:

Weekly:

Monthly:

Quarterly:

Common Challenges & Solutions

Performance Issues

Symptom: Slow service response
Causes:

Solutions:

Storage Management

Symptom: Running out of disk space
Causes:

Solutions:

# Clean Docker resources
docker system prune -a

# Check large directories
du -sh /* | sort -h

# Implement log rotation
# Add storage capacity

Network Connectivity

Symptom: Can't access services remotely
Causes:

Solutions:

Getting Started Checklist

Phase 1: Foundation (Week 1)

Phase 2: Core Services (Week 2-3)

Phase 3: Expansion (Week 4+)

Learning Resources

Documentation

Community

Best Practices

Conclusion

Self-hosting a home server is a rewarding journey that provides privacy, control, and valuable technical skills. Start with core services, expand as you learn, and always prioritize security and backups.

The initial setup requires time and effort, but the result is a powerful, private infrastructure that serves your needs without relying on third-party services.


Related Topics: