import Navbar from '@/components/Navbar'; import Footer from '@/components/Footer'; import DocsLayout from '@/components/docs/DocsLayout'; export default function DocsInstallationPage() { return (
You only need three things to install DashCaddy:
/etc/dashcaddy, /opt/dockerdata, and the system Docker daemon.dashcaddy.home, or just your machine's IP for local-only use.
DashCaddy uses a single base hostname and creates subdomains under it for every service you add (for example
plex.dashcaddy.home, homeassistant.dashcaddy.home). Choose the option that matches
your situation:
If you own example.com, register dashcaddy.example.com as a DNS A record pointing at
your host's public IP. You can buy a domain for about $10/year from any registrar (Namecheap, Cloudflare,
Porkbun, Google Domains). With a real domain, DashCaddy automatically gets a trusted Let's Encrypt
certificate on first launch — no certificate warnings, no client setup.
Use a domain like dashcaddy.home, dashcaddy.lan, or dashcaddy.local.
These will not resolve on the public internet, which is exactly what you want for a home server. Two ways to
make them resolve:
*.dashcaddy.home at your server's LAN IP. All devices on your network pick it up automatically.name.tailnet.ts.net name, no DNS editing needed.Custom TLDs require installing DashCaddy's internal CA certificate (DashCA) on each device that connects. The setup wizard walks you through this on first run.
If you don't want to set up DNS at all, you can reach DashCaddy at https://192.168.x.x:port.
This works for a single machine on a LAN, but the URL changes when the host gets a new IP and you lose
subdomain support. Useful for a quick test, not a permanent setup.
No port forwarding? If your ISP puts you behind CGNAT or you don't want to open ports 80 and 443, DashCaddy works fine behind a Tailscale tunnel or Cloudflare Tunnel. Set up the tunnel first, point your hostname at the tunnel's origin, then run the installer with
--no-caddyand let the tunnel handle HTTPS termination.
Open a terminal on the host you want to install DashCaddy on and run one of these:
{`# 1. Download and run the installer
curl -fsSL https://get.dashcaddy.net | bash
# 2. Answer the prompts (domain, install location, storage size)
# Defaults are sensible — just press Enter to accept.
# 3. Open the URL the installer prints at the end`}
{`# Install with a public domain — only thing you type is the domain
curl -fsSL https://get.dashcaddy.net | bash -s -- --domain dashcaddy.example.com
# Or use a custom TLD (your router / Tailscale handles DNS)
curl -fsSL https://get.dashcaddy.net | bash -s -- --domain dashcaddy.home
# Or skip DNS entirely and use a local address (good for a first test)
curl -fsSL https://get.dashcaddy.net | bash -s -- quick`}
The installer is a single shell script that runs in seven steps, all idempotent — re-running it on an existing install reconciles the stack rather than clobbering your config:
/etc/dashcaddy/, /opt/dockerdata/, and the DashCaddy config file with sensible defaultsdashcaddy-api on port 3001, mounts persistent data volumes/healthz before continuingIf the installer ever hits a problem, it stops at the step that failed and tells you exactly which command to re-run to retry. It does not silently leave a half-installed state behind.
When you open the dashboard URL the installer printed, you land on the setup wizard. It runs once and writes your configuration to disk — every choice is editable later from the settings page.
The wizard walks through these screens:
After the wizard saves, you're asked to create the first admin account. Pick a strong password — this account controls every service DashCaddy manages.
Right after creating your admin account, the dashboard prompts you to enroll a TOTP authenticator (Google Authenticator, Authy, 1Password, or any RFC 6238 app). Scan the QR code with your phone, enter the 6-digit code to confirm, and store the recovery codes somewhere safe — they are the only way back into your account if you lose your phone.
Don't skip 2FA. DashCaddy can manage DNS records, start and stop containers, and read credentials for the services it deploys. A leaked password without a second factor is a full compromise. A leaked password with 2FA is just a login screen.
If you chose Option B (a custom TLD like dashcaddy.home) or Option C (a direct IP), your browser
will warn that the certificate is not trusted — because it isn't, to anyone outside your network. DashCaddy
ships an internal certificate authority called DashCA so internal hostnames get a real TLS
certificate instead of self-signed warnings.
Visit the DashCA page in the dashboard and follow the per-platform instructions:
.crt, add it to the System keychain, set it to “Always Trust”.crt, install to “Trusted Root Certification Authorities”/usr/local/share/ca-certificates/ and run sudo update-ca-certificatesYou need to install the root certificate on every device that connects to your DashCaddy services, not just the server. There's no way around this for custom-TLD installs — TLS is what keeps your traffic private.
DashCaddy protects the services it manages, but it runs on top of a normal Linux box that's still exposed on your network. Spend five minutes on these four steps:
{`# UFW (Ubuntu / Debian)
sudo ufw default deny incoming
sudo ufw allow ssh # if you SSH in
sudo ufw allow 80/tcp # HTTP (Let's Encrypt + redirect)
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable
# If you put DashCaddy behind a tunnel (Tailscale / Cloudflare), skip 80/443 above
# and only allow the tunnel interface — see your tunnel provider's docs`}
{`# Edit /etc/ssh/sshd_config and set:
PasswordAuthentication no
PermitRootLogin prohibit-password # or "no" if you use a sudo user
sudo systemctl restart sshd`}
{`# Debian / Ubuntu
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades # answer "Yes"`}
All your DashCaddy state — services, config, encrypted credentials, DashCA — lives in
/opt/dockerdata and /etc/dashcaddy. Snapshot those two directories somewhere off
the host. Any tool works: rsync to a NAS, restic to Backblaze B2, a systemd timer
that tars them up nightly. The dashboard's Backup button exports a single JSON file you can store
anywhere if you want a no-setup option.
After the wizard finishes and you've logged in, run through this checklist to confirm everything is wired up correctly:
docker ps should show dashcaddy-api with status Upcurl http://localhost:3001/healthz returns {`{"status":"alive"}`} and /readyz returns 200 with all checks passing| Symptom | Likely cause | Fix |
|---|---|---|
| Installer says “Docker not found” | Docker Engine isn't installed or you're not in the docker group | Run sudo usermod -aG docker $USER, log out, log back in. Re-run the installer. |
| Installer fails on “port 80/443 already in use” | Another web server (nginx, Apache, another Caddy) is bound to those ports | Stop the conflicting service, or move it to different ports and re-run the installer |
| Dashboard URL gives a connection refused | Container failed to start, or the host firewall is blocking the port | docker ps — if the container exited, docker logs dashcaddy-api shows why. If running, check the firewall. |
| Browser shows “Your connection is not private” | Custom-TLD install with no DashCA trust, OR the domain doesn't point at this host | For custom TLDs, install the DashCA root certificate. For real domains, check DNS: dig +short your-hostname should return the host's public IP. |
| Let's Encrypt certificate never issues | Domain doesn't resolve publicly, OR port 80 is blocked by your ISP | Verify the A record with dig. If you're on CGNAT, switch to Tailscale Funnel or Cloudflare Tunnel. |
| Setup wizard loops back to step 1 | Browser stored a stale config from a previous install | Open DevTools → Application → Local Storage → clear the dashcaddy-setup key, then reload |
If you want to remove DashCaddy cleanly, the installer has an uninstall mode that stops the container, removes the systemd unit, and (optionally) deletes the data volumes:
{`# Remove DashCaddy but keep your config and data (you can reinstall later)
curl -fsSL https://get.dashcaddy.net | bash -s -- --uninstall
# Remove everything including config and data (irreversible)
curl -fsSL https://get.dashcaddy.net | bash -s -- --uninstall --purge`}
With DashCaddy installed and hardened, head to the Deploy Your First Service guide to bring an application online through the App Selector.
If you want to understand the architecture before adding services, see the Product Overview. For problems during or after install, the Troubleshooting page walks each layer bottom-up.