DEPLOY GUIDE
Deploy Self-Hosted Apps in 5 Steps
From zero to production. Pick a server, get a domain, install Docker, add Traefik, and deploy your first app.
Step 1: Pick a Server
You need a VPS (or bare metal) to run your apps. These providers offer strong price-to-performance, global regions, and stable networking for self-hosted workloads.
Hetzner
From €4.15/mo. Excellent value, EU & US regions.
Get server →DigitalOcean
From $6/mo. Great UX, docs, and managed networking.
Get server →Vultr
From $6/mo. Many regions, hourly billing.
Get server →Linode (Akamai)
Developer-friendly cloud VPS with simple pricing.
Get server →OVHcloud Bare Metal
Dedicated hardware for heavier production workloads.
Get bare metal →Hivelocity Bare Metal
US-focused dedicated servers and private networking.
Get bare metal →Running Platforms (easier ops)
Prefer a dashboard to manage containers, domains, and deployments? Use one of these on top of your VPS.
Don't want to manage servers?
You can still run containers on managed platforms with less infrastructure overhead.
Step 2: Get a Domain
Point a domain (or subdomain) to your server. These registrars offer good prices and easy DNS management.
Step 3: Set Up the Server
SSH into your server and install Docker and Docker Compose. Replace root@your-ip with your actual user and IP.
ssh root@your-ip# Update and install Docker
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Add your user to docker group
sudo usermod -aG docker $USER
# Log out and back in for group to take effect
Step 4: Traefik Reverse Proxy
Traefik handles SSL (Let's Encrypt) and routes traffic to your apps. Create a docker-compose.yml and run it. Update the ACME email before deploying.
version: "3.8"
services:
traefik:
image: traefik:v3.0
command:
- "--api.dashboard=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=you@example.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik-letsencrypt:/letsencrypt
- traefik-certs:/certs
restart: unless-stopped
volumes:
traefik-letsencrypt:
traefik-certs:
docker compose up -dStep 5: Deploy Your First App
Add your app's service to the same docker-compose.yml (or a separate stack), configure Traefik labels for your domain, and bring it up.
docker compose up -d