Skip to content
PostMTA Hosted
StatusSign inOpen panelRequest access
Open menu

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

PostMTA Hosted Caddy routing to web, API, credits, and KumoMTA
Caddy terminates TLS; postmta-hosted-web serves marketing and panel

Install

Fresh host steps

Mirrors docs/ops/PRODUCTION.md — condensed for operators.

  1. Clone and bootstrap

    pnpm install, then POSTMTA_HOSTED_MODE=prod bash scripts/install-appliance.sh (Supabase, migrations, SSR build).

  2. SMTP STARTTLS PEMs

    Install fullchain/privkey under /etc/postmta-hosted/smtp. Prod forbids SMTP_ALLOW_INSECURE.

  3. 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

  4. KumoMTA

    kumod admin on loopback :8000 — never publish via Caddy. Set KUMO_BASE_URL in .env.

  5. 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.