Self Managed
Quick Start
The home server setup: six steps from Ubuntu Server to a working dashboard and management tools.
Commands below are for your Ubuntu server. Replace <tailscale-ip> with its Tailscale IPv4 address. Published Docker ports may also be reachable from your local network; Tailscale alone does not restrict those listeners.
Hardware: HP ProDesk 600 G1 with an i5-4590T, 8 GB RAM and a 500 GB SSD. I paid about $100 for it. On 10/19/2026 the same model was listing at $145. It has enough CPU and memory for everything below.
Plan: move the main server to a more powerful machine once component prices drop. The ProDesk then becomes a cybersecurity homelab.
1. Install Ubuntu Server LTS
Install the current Ubuntu Server LTS release from a USB stick. Enable the OpenSSH server in the installer so you can finish the rest remotely.
2. Set up Tailscale
Create a Tailscale account with GitHub sign-in, and keep the GitHub login in your password manager. Then install Tailscale on the server and join it to your tailnet:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale upInstall Tailscale on your laptop and phone too. Every service below is reachable at the server's Tailscale IP, so nothing needs a forwarded port on your router.
3. Install Docker
Docker documents its convenience script for testing and development. For a production server, follow the official apt repository instructions linked below. Review remote scripts before running them.
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USERLog out and back in so the group change applies. Membership in the docker group is effectively root access on the host, so only add accounts you trust.
4. Install Homepage (port 3000)
Homepage is a lightweight dashboard. Each service gets a tile that links to its address, and the top bar shows CPU, memory and disk. Any dashboard works here; Homepage is what I use.
Create a directory for Homepage and its configuration:
mkdir -p ~/homepage/config
cd ~/homepage
nano compose.yamlSave the following as compose.yaml, replacing the IP placeholder:
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- ./config:/app/config
environment:
HOMEPAGE_ALLOWED_HOSTS: "<tailscale-ip>:3000"HOMEPAGE_ALLOWED_HOSTS is required. Without the address you browse to, Homepage rejects the request. Set it to the Tailscale IP and port, then run docker compose up -d.
docker compose up -dOpen http://<tailscale-ip>:3000 in your browser. Configure the dashboard’s tiles in its configuration files; installing the container alone does not populate them.
5. Install Beszel (port 8090)
Beszel tracks CPU, memory, disk, load, network and temperature per machine. It has two parts: a hub (the web UI) and an agent on each monitored host. Start the hub from the compose example in the Beszel getting-started guide, browse to http://<tailscale-ip>:8090, and create the admin account. Then click Add System, copy the agent compose snippet it generates, and run it on the host.
6. Install Portainer (port 9443)
Portainer gives you a web view of containers, images, volumes and logs.
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data portainer/portainer-ce:ltsOpen https://<tailscale-ip>:9443. The certificate is self-signed, so the browser will warn once. Create the admin user on first load.
Service reference
| Service | Port | Purpose |
|---|---|---|
| Homepage | 3000 | Dashboard and launcher |
| Beszel | 8090 | Host resource monitoring |
| Portainer | 9443 (HTTPS) | Docker container management |
My estimate for all six steps is under 4 hours.