DocsA VPS or server

Install on a VPS

One line installs everything - Docker included - and one .env line puts the dashboard on your own domain with automatic HTTPS.

On this page

Any provider works (Hetzner, DigitalOcean, Vultr, ...); a 1 GB Ubuntu or Debian box is enough. About five minutes end to end.

Connect to the server

Open a terminal on your own computer (the Terminal app on Mac, Git Bash or WSL on Windows) and paste this, with the IP swapped for yours - it's the address your VPS provider shows in its dashboard and emailed you at signup:

ssh root@your-server-ip

Type yes if it asks about a fingerprint, then the password your provider gave you (or nothing, if you set up an SSH key). Your prompt changes - you're now typing on the server.

Install and start

One line - it installs Docker if the server doesn't have it, fetches DispatchSEO, and boots the stack:

curl -fsSL https://dispatchseo.com/install.sh | sh

Re-running the same line later is also the upgrade command. (Prefer to do it by hand? git clone https://github.com/NeoZi12/dispatchseo && cd dispatchseo && sh start.sh is all the script does.)

When it finishes, the stack is listening on port 4005 of the server - but only locally. Don't open that port to the internet; the next step gives the dashboard a proper HTTPS address instead.

Give it its address: your domain, automatic HTTPS

You already own a domain - your website's - so this is one DNS record and one line in .env.

One thing before the steps: everywhere below, dispatch.your-domain.com is a placeholder. Keep the dispatch part, replace your-domain.com with the domain you actually own. If your website is acme.com, your dashboard's address will be dispatch.acme.com.

Never touched DNS before? The record part, spelled out:

a. Open your domain's DNS settings. They live wherever your domain is managed - usually the registrar you bought it from (Namecheap, GoDaddy, Porkbun, ...), or Cloudflare / Vercel if you've pointed the domain's nameservers there. Log in, pick the domain, and look for the section called DNS, DNS records, Manage DNS, or Zone editor - every host has one, the name just varies.

b. Add one A record. Click Add record and fill the form like this (Cloudflare shown - other hosts have the same fields under slightly different names):

Cloudflare's Add record form filled in: Type A, Name dispatch, IPv4 address 203.0.113.10, Proxy status switched to DNS only, TTL Auto

  • Type: A
  • Name (some hosts call it Host): dispatch
  • IPv4 address (some hosts call it Value or "Points to"): your server's IP - the same one you SSH into. The screenshot shows a placeholder; put your real one.
  • Proxy status (Cloudflare only): switch it to DNS only, the grey cloud - exactly as in the screenshot. Orange "Proxied" blocks the certificate handshake in the next step.
  • TTL: leave whatever it already says.

Save the record. That creates dispatch.your-domain.com, the address every command below uses.

c. Confirm it landed. After a few minutes, run this on your own computer (your domain swapped in) - it should print your server's IP:

ping -c 1 dispatch.your-domain.com

d. Tell DispatchSEO the domain - your domain swapped in here too:

cd dispatchseo &&
  echo "DOMAIN=dispatch.your-domain.com" >> .env &&
  sh start.sh

That's it. The stack now includes its own HTTPS proxy: it fetches the certificate, renews it forever, and start.sh prints your new address. From now on the dashboard is a bookmark, from any device - and opening it is the next step.

Three situations you might hit - skip any that aren't you:

"I opened the https address and nothing loads." Some VPS providers ship a firewall in their control panel that blocks all ports by default. Open the panel and allow TCP ports 80 and 443 (inbound, from anywhere):

  • Hetzner: Cloud Console → your server → Firewalls
  • DigitalOcean: Networking → Firewalls
  • AWS / Lightsail: the instance's security group / Networking tab

Servers without a panel firewall need nothing - Docker opens its own ports, even past ufw. To check from your own computer:

curl -I https://dispatch.your-domain.com

Any HTTP/... reply means you're through; a hang means the firewall is still in the way.

"This server already runs Nginx, Traefik, or another Caddy." If you don't know what those are, you don't have one - skip this. For those who do: ports 80/443 are yours, so don't set DOMAIN. Point your existing proxy at localhost:4005 and tell DispatchSEO its public address:

cd dispatchseo &&
  echo "APP_URL=https://dispatch.your-domain.com" >> .env &&
  sh start.sh

"DNS hasn't landed yet and I want to see it now." On your own computer - not the server - run:

ssh -L 4005:localhost:4005 root@your-server-ip

Keep that window open and browse http://localhost:4005 - it's an encrypted tunnel straight to the dashboard (some registrars take up to an hour to publish the record). Peek only, though: finish the wizard at your https:// address, so the commands it generates carry your real domain instead of localhost. Close the window and the tunnel is gone.

Walk the setup wizard

Open https://dispatch.your-domain.com in your browser (the certificate can take a minute after DNS lands - just refresh). Choose a dashboard password, and the setup wizard starts.

The wizard is the actual product setup - your site, Google Search Console, keyword data, publish mode, connecting Claude Code, and turning on automatic builds. It takes about 10 minutes, checks every step on the spot, and saves your progress, so you can close the tab and come back. Every screen is covered in The setup wizard, step by step if you want to read ahead.

One server-flavored note for the wizard's last screen: the builder token is created on your own computer, not the server - claude setup-token opens a browser login, which a machine without a screen can't do. The wizard shows the exact paste for the server, and its checklist flips green when the builder checks in.

That's the whole install. When the wizard unlocks the dashboard, this machine takes over - and since it never sleeps, the schedules fire on time.