Deploy
Bootstrap appliance
Single-host path: Docker Supabase, Caddy, systemd units for API/SMTP/web, Kumo on private admin. Marketing and panel share one Astro hybrid deploy — no second CDN.
Topology
Single-origin routing

Install
Fresh host steps
Mirrors docs/ops/PRODUCTION.md — condensed for operators.
Clone and bootstrap
pnpm install, then POSTMTA_HOSTED_MODE=prod bash scripts/install-appliance.sh (Supabase, migrations, SSR build).
SMTP STARTTLS PEMs
Install fullchain/privkey under /etc/postmta-hosted/smtp. Prod forbids SMTP_ALLOW_INSECURE.
systemd + Caddy
sudo POSTMTA_HOSTED_MODE=prod POSTMTA_HOSTED_INSTALL_SYSTEMD=1 POSTMTA_HOSTED_INSTALL_CADDY=1 POSTMTA_HOSTED_DOMAIN=hosted.example.com bash scripts/install-appliance.sh
KumoMTA
kumod admin on loopback :8000 — never publish via Caddy. Set KUMO_BASE_URL in .env.
Start and smoke
systemctl start postmta-hosted-api postmta-hosted-web postmta-hosted-smtp postmta-hosted-policy-worker; make smoke-prod must fail if lab flags remain on.
# from repo root make install POSTMTA_HOSTED_MODE=prod bash scripts/install-appliance.sh sudo POSTMTA_HOSTED_MODE=prod POSTMTA_HOSTED_INSTALL_SYSTEMD=1 POSTMTA_HOSTED_INSTALL_CADDY=1 \ POSTMTA_HOSTED_DOMAIN=hosted.example.com bash scripts/install-appliance.sh make smoke-prod
Routing
Caddy routes
Need a guided bootstrap?
Use the setup wizard for first-run checks, or request access for we-operate deployment.
- ComplianceSOC 2-aligned
- DeploymentManaged appliance · On your VPC
- Statushosted.postmta.com/status
- IncidentsNo open incidents