Skip to content

Self-Hosting Beginner's Guide

Your hands-on guide to get started with self-hosting — from choosing hardware to running your first app.

What You’ll Need

ComponentRecommended Options
HardwareRaspberry Pi 4, old laptop/desktop, mini PC, or VPS
Operating SystemUbuntu Server, Debian, DietPi
NetworkingAccess to your router for port forwarding or VPN/tunneling
InternetOptional Dynamic DNS (e.g., DuckDNS) for external access
SkillsBasic command line (SSH, apt), willingness to learn

Step 1: Choose Your Hardware

You don’t need expensive gear. Here are a few starting points:

  • Raspberry Pi 4 / 5: Great for learning and low-power 24/7 use
  • Old Laptop or Desktop: Reuse existing hardware
  • Mini PCs (e.g. Intel NUC, Beelink): Quiet and powerful
  • VPS (e.g. Hetzner, DigitalOcean): If you prefer remote hosting

TIP

You can use the code selfhostguides for 20% off at ZAP-Hosting.com 😉

Step 2: Install a Server OS

We recommend starting with a lightweight Linux server.

Ubuntu Server (Beginner Friendly)

Optional:

Step 3: Secure Your Server

Once installed, SSH into your server:

bash
ssh username@your-server-ip

Then:

bash
# Create a new user and disable root login
sudo adduser yourname
sudo usermod -aG sudo yourname

# Set up a basic firewall
sudo apt update && sudo apt install ufw -y
sudo ufw allow OpenSSH
sudo ufw enable

# Enable automatic security updates
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades

# Install fail2ban to block brute-force attempts
sudo apt install fail2ban -y

TIP

New to Docker? Check out our Docker Beginner's Guide for a simple introduction and practical tips!

Step 4: Install Docker & Docker Compose

Docker makes it easy to install self-hosted apps in seconds.

Install Docker

bash
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER

Then log out and back in (or run newgrp docker) to apply Docker group.

Install Docker Compose

bash
sudo apt install docker-compose -y

Step 5: Run Your First App

Let’s run Uptime Kuma – a beautiful uptime monitor.

bash
mkdir -p ~/apps/uptime-kuma && cd ~/apps/uptime-kuma
nano docker-compose.yml

Paste:

yaml
version: '3'
services:
  uptime-kuma:
    image: louislam/uptime-kuma
    container_name: uptime-kuma
    ports:
      - "3001:3001"
    volumes:
      - ./data:/app/data
    restart: always

Save and exit (Ctrl+O, Enter, Ctrl+X), then run:

bash
docker-compose up -d

Now visit:

http://<your-server-ip>:3001

And your website should be up and running! 🎉

Optional: Access From Anywhere

To access your apps from outside your home:

Option A: Port Forwarding

  • Log into your router
  • Forward external port 80/443 to your server’s IP

Be careful exposing services directly — secure them!

Option B: Dynamic DNS + Reverse Proxy

  • Set up free dynamic DNS (e.g. DuckDNS)
  • Use Nginx Proxy Manager or Caddy for SSL and domain routing

Option C: Cloud Tunnels (No Port Forwarding)

Step 6: Keep Things Updated

Keeping your stack up-to-date is important for security and stability.

bash
cd ~/apps/uptime-kuma
docker-compose pull
docker-compose up -d

You can also install Watchtower for automatic container updates.

bash
~/apps/
  ├── uptime-kuma/
    └── docker-compose.yml
  ├── nextcloud/
  ├── jellyfin/
  └── nginx-proxy-manager/

What to Host Next?

CategoryApp Suggestions
File SyncNextcloud, Syncthing
Media ServerJellyfin, Plex
Notes & WikiJoplin Server, BookStack, Outline
PasswordsVaultwarden
DNS/Ad BlockerPi-hole, AdGuard Home
AutomationHome Assistant, Node-RED
Git HostingGitea, Forgejo
DashboardsHomer, Flame, Dashy

Basic Security Reminders

  • Use SSH keys instead of passwords
  • Don’t expose Docker admin tools (e.g., Portainer) publicly
  • Set up HTTPS for every exposed service
  • Always back up critical config and data

Congratulations! You’ve taken your first step toward digital independence.

“Self-hosting isn't just for nerds — it's for everyone who wants to control their digital life.”

Released under Creative Commons Zero v1.0 Universal License.