| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 1 vCPU | 2+ vCPU |
| RAM | 2 GB | 4 GB+ |
| Storage | 20 GB SSD | 40 GB+ SSD |
| OS | Ubuntu 22.04 LTS | |
| Ports | 80, 443 open | |
Recommended providers: DigitalOcean, Hetzner, Vultr, Linode, AWS Lightsail
curl -sSL https://wplauncher.msrbuilds.com/install.sh | bashThe script handles everything: swap setup, Docker installation, config prompts, admin account creation, secret generation, Traefik SSL, image building, and service startup.
For custom deployments when the one-click installer doesn't fit your needs.
sudo apt update && sudo apt upgrade -y
sudo apt install -y docker.io docker-compose-plugin git
sudo systemctl enable dockersudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enablecd /opt
git clone https://github.com/msrbuilds/wp-launcher.git
cd wp-launcher
cp .env.example .env
# Generate secure secrets
openssl rand -hex 32 # Use for JWT_SECRET
openssl rand -hex 32 # Use for API_KEY
openssl rand -hex 16 # Use for other secretsUpdate traefik/traefik.yml with your Let's Encrypt email and create a docker-compose.override.yml for production TLS labels.
bash scripts/build-wp-image.sh
docker compose up -d --buildWP Launcher also runs on Dokploy as a Docker Compose service using docker-compose.dokploy.yml. Dokploy's Traefik keeps serving the panel, while WP Launcher runs its own Traefik for site traffic.
*.BASE_DOMAIN to WP Launcher's Traefik by SNI without decrypting it (TLS passthrough). WP Launcher terminates TLS and owns certificate issuance, so nothing is configured on the host and a Dokploy upgrade can't break renewal.ACME_DNS_PROVIDER (e.g. cloudflare with CF_DNS_API_TOKEN) to switch to one wildcard certificate — worth it once you approach Let's Encrypt's 50-certificates-per-week limit.wpl-sites network and can't reach other apps on the Dokploy instance.ACME_EMAIL, BASE_DOMAIN_REGEX, ADMINER_AUTH_USERS (Adminer requires a login) and SHARED_DB_ROOT_PASSWORD, plus real SMTP — there is no bundled Mailpit.PRODUCT_ASSETS_PATH and SITES_HOST_PATH must be absolute host paths under Dokploy's files/ directory, since code/ is wiped on every redeploy.Set up two DNS A records pointing to your server IP:
| Type | Name | Value |
|---|---|---|
| A | yourdomain.com | Your server IP |
| A | *.yourdomain.com | Your server IP |
Enable TLS in your .env:
ENABLE_TLS=true
CERT_RESOLVER=letsencryptCreates one wildcard certificate. Requires a Cloudflare API token with Zone > DNS > Edit permissions.
[email protected]
CF_DNS_API_TOKEN=your-api-tokenCreates separate certificates per subdomain. No Cloudflare account needed, but incompatible with Cloudflare proxy.
If using the Cloudflare DNS challenge for wildcard SSL:
Zone → DNS → Edit for your specific domain.env:[email protected]
CF_DNS_API_TOKEN=your-cloudflare-api-tokenVerify it's working by checking Traefik logs:
docker compose logs traefik | grep -i "certificate"
# Should show: "Certificate obtained successfully"For sending verification and notification emails in Agency Mode.
| Provider | Host | Port | SMTP_SECURE |
|---|---|---|---|
| Brevo | smtp-relay.brevo.com | 587 | false |
| SendGrid | smtp.sendgrid.net | 587 | false |
| Mailgun | smtp.mailgun.org | 587 | false |
| Amazon SES | email-smtp.region.amazonaws.com | 587 | false |
SMTP_SECURE must be false for port 587 (STARTTLS) and true for port 465 (implicit TLS). Getting this wrong causes connection failures.