Choose a deployment path
The Kubernetes root does not provision a cluster. The EC2 root is an adoption configuration, not an unattended new-server installer. Neither path creates databases, installs controllers, approves SES production access, or deploys the static marketing website. Those have separate lifecycles. Do not point both runtimes at the same production database with sending workers active.
Cloudflare provides authoritative DNS and ACME DNS challenges for Kubernetes. SMTP records must be DNS-only. Cloudflare Origin CA certificates are not trusted by ordinary SMTP clients; use a public CA such as Let’s Encrypt.
Layout
terraform/environments/{dokploy,kubernetes,domain}: independent state roots with pinned providers.terraform/modules: reusable runtime identity, sending stack, and platform DNS modules.charts/xem: application chart; no embedded database or secret values.hakopod/xem.toml: four-service self-hosted Hakopod configuration with public SMTP, STARTTLS readiness and automatic certificate renewal; see its setup guide.host/andscripts/install-dokploy-smtp-tls.sh: certificate export and read-only host mirror.scripts/smtp-smoke.py: transport-only test, no email or credentials.legacy/: archived Kops/manifests; not supported deployment instructions.
