Start Here — Self-Hosting from Zero¶
New to self-hosting? This page takes you from nothing to your first running service. Every other guide on this site assumes you've done the steps below — do them once and the whole site opens up.
Break things, start small, document everything.
Step 1 — Pick your hardware¶
You don't need a server rack. Any of these work:
| Option | Good for | Rough cost |
|---|---|---|
| An old PC or laptop | Free if you have one — the classic starting point | $0 |
| A mini PC (Intel N100 class) | Low power, silent, plenty fast for 10+ containers | ~$150–250 |
| Raspberry Pi ⅘ | Tiny, low power — note some images are ARM-only quirky | ~$60–120 |
| A cheap VPS | No hardware at all, public IP included | ~$1–3/month — see RackNerd deals |
Start with what you have
The best first server is the one you already own. You can always migrate later — that's half the fun.
Step 2 — Install Ubuntu Server¶
The guides on this site are written against Ubuntu Server LTS (Debian works nearly identically).
- Download Ubuntu Server LTS
- Flash it to a USB stick with balenaEtcher or Rufus
- Boot from the USB and follow the installer — enable OpenSSH server when prompted
- Once installed, connect from your main machine:
ssh your-user@<server-ip>
Give your server a static IP
Set a DHCP reservation for your server in your router settings. If the server's IP changes, everything pointing at it breaks.
Step 3 — Install Docker¶
Nearly every guide on this site deploys with Docker Compose. Install Docker using the official convenience script:
Then add your user to the docker group so you don't need sudo for every command:
Log out and back in for the group change to take effect, then verify:
Both commands should print version numbers. That's it — Docker Compose v2 ships with Docker.
Step 4 — Docker in five minutes¶
The handful of concepts that every guide on this site uses:
- Image — the application package, pulled from a registry (e.g.
louislam/uptime-kuma) - Container — a running instance of an image
- Volume — persistent storage. Containers are disposable; volumes are where your data survives. This is what you back up.
- Ports —
8080:80means "host port 8080 → container port 80". You browse to the host port. - Environment variables — per-container settings (passwords, timezones, URLs)
- Compose file — a
docker-compose.ymldescribing all of the above, so your whole setup is one readable text file
The workflow is the same for everything you'll ever deploy:
mkdir ~/docker/<app> && cd ~/docker/<app> # one folder per app
nano docker-compose.yml # paste the compose file from a guide
docker compose up -d # start it
docker compose logs -f # watch the logs (Ctrl+C to exit)
Step 5 — Your first container¶
Uptime Kuma is the perfect first deploy — a beautiful status/monitoring dashboard, one service, no database, instantly satisfying.
Create docker-compose.yml:
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
volumes:
- ./data:/app/data
ports:
- 3001:3001
restart: unless-stopped
Start it:
Open http://<server-ip>:3001, create your admin account, and add a monitor for a website you care about.
You are now self-hosting. 🎉
Step 6 — Where to go next¶
-
A reverse proxy
Stop memorising ports — give every service a proper name and HTTPS with Nginx Proxy Manager.
-
Network-wide ad blocking
Block ads and trackers for every device on your network with AdGuard Home.
-
A dashboard
One page for all your services with Homepage or Glance.
-
Backups
Before you host anything you care about, set up scheduled encrypted backups with Duplicati.
-
Everything else
40+ guides — media servers, photo libraries, note apps, monitoring stacks, and more.
-
The full homelab build
Ready to go deeper? Follow the complete rebuild — router, DNS, VPN, hardware keys.
The golden rules¶
Learned the hard way, so you don't have to
- One folder per app, with its compose file and data inside — moving or backing up an app becomes copying a folder
- Back up volumes before updating —
docker compose pullis safe, but major version jumps can migrate data irreversibly - Change every default password — the guides flag them, take the ten seconds
- Don't expose services to the internet until you understand what that means — use WireGuard or Cloudflare Tunnels instead of port forwarding
- It's a lab. Breaking things is the curriculum, not a failure
Stuck? Join the Discord — the community is friendly and someone has hit your error before.
If there is an issue with this guide or you wish to suggest changes, please raise an issue on GitHub.