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.

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 -d

Step 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