Goal
Pick a small set of services to self-host that:
- actually make your life better
- don’t require a full-time SRE to babysit
- run happily on a low-power box
This is a starter stack, not a “30 containers and 4 reverse proxies” situation.
1. The SmallGrid starter stack
Here’s a simple set of services that play nicely together:
- Media – Jellyfin
- Backups – something to push data off the box (restic / Borg / plain rsync)
- Network-level sanity – Pi-hole or AdGuard Home
- Remote access – Tailscale
- Sync – Syncthing for your files across devices
You can run all of these on:
- one mini PC, or
- one Proxmox VM / LXC with Docker
2. Jellyfin (media you actually control)
Jellyfin is your:
- films / TV / home videos / kids stuff
- served to TVs, phones, tablets
On a Debian/Ubuntu server:
# Example: Docker-based Jellyfin
mkdir -p /srv/docker/jellyfin
cd /srv/docker/jellyfin
cat > docker-compose.yml << 'EOF'
version: "3.8"
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
network_mode: host
volumes:
- ./config:/config
- /mnt/media:/media
EOF
docker compose up -d
Point your browser at:
text
Copy code
http://YOUR-SERVER-IP:8096
Add your library paths and you’re done.
3. Backups (boring but important)
Pick something you can understand when tired:
rsync to a USB disk
restic to a local disk and/or cloud
Borg if you like dedup + archives
Example: quick rsync to a USB drive mounted at /mnt/usb-backup:
bash
Copy code
rsync -av --delete /srv/docker/ /mnt/usb-backup/docker/
rsync -av --delete /mnt/media/ /mnt/usb-backup/media/
Put that in a script and run it via cron or systemd timers.
4. Pi-hole / AdGuard Home (network-level ad-blocking)
DNS + ad-blocking in one place:
cut down noise on the network
easy to point devices at
Example: Pi-hole folder layout:
text
Copy code
/srv/docker/pihole/
docker-compose.yml
etc-pihole/
etc-dnsmasq.d/
Compose file:
bash
Copy code
cd /srv/docker/pihole
cat > docker-compose.yml << 'EOF'
version: "3.8"
services:
pihole:
image: pihole/pihole:latest
container_name: pihole
restart: unless-stopped
environment:
TZ: "Europe/London"
WEBPASSWORD: "changeme"
volumes:
- ./etc-pihole:/etc/pihole
- ./etc-dnsmasq.d:/etc/dnsmasq.d
ports:
- "53:53/tcp"
- "53:53/udp"
- "80:80/tcp"
cap_add:
- NET_ADMIN
EOF
docker compose up -d
Then set your router’s DNS to the Pi-hole IP.
5. Tailscale (remote access without pain)
Install Tailscale on:
your homelab box
your laptop / phone
Then Jellyfin, Pi-hole, Proxmox, etc. are reachable via:
text
Copy code
http://TAIL_IP_SERVER:PORT
No port forwarding, no external DNS.
Install (on Ubuntu):
bash
Copy code
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
6. Syncthing (file sync without cloud drama)
Syncthing gives you:
peer-to-peer file sync between PCs, laptop, server
versioning, selective folders
On a Docker host:
bash
Copy code
mkdir -p /srv/docker/syncthing
cd /srv/docker/syncthing
cat > docker-compose.yml << 'EOF'
version: "3.8"
services:
syncthing:
image: syncthing/syncthing:latest
container_name: syncthing
restart: unless-stopped
ports:
- "8384:8384" # Web UI
- "22000:22000" # Sync
- "21027:21027/udp"
volumes:
- ./config:/var/syncthing
- /srv/sync:/sync
EOF
docker compose up -d
Web UI:
text
Copy code
http://YOUR-SERVER-IP:8384
7. Recap: starter stack rules
Start with 5–6 services, not 25.
Make each one:
easy to back up
easy to restart
easy to ignore for weeks
Once this stack feels boring, you’re ready to add more toys.
Boring is the goal. Boring means “it just works”.