Skip to content

feat(workspace-mail): external SMTP + IMAPS LoadBalancers on the reserved IPs - #1140

Merged
mdheller merged 1 commit into
mainfrom
feat/workspace-mail-lb-services
Jul 31, 2026
Merged

feat(workspace-mail): external SMTP + IMAPS LoadBalancers on the reserved IPs#1140
mdheller merged 1 commit into
mainfrom
feat/workspace-mail-lb-services

Conversation

@mdheller

Copy link
Copy Markdown
Member

Makes the sovereign mail plane externally reachable — it's been ClusterIP-only (internal skeleton). Companion to the tofu IPs/cert-manager PR (#1139).

What

Two L4 LoadBalancer Services in infra/k8s/workspace-mail/base, bound to the reserved regional static IPs:

  • workspace-smtp-lb130.211.115.191 (ws-smtp): 25 (inbound MX) + 587 (submission)
  • workspace-imap-lb136.116.203.17 (ws-imap): 993 (IMAPS)

Kept separate from the existing ClusterIP services so 143 (plaintext IMAP) + 24 (lmtp) stay internal-only — only secure/needed ports face the internet.

externalTrafficPolicy: Local — preserves the real client source IP, which SMTP reputation, RBL/greylisting, and SPF all depend on (SNAT would hide it).

Sequencing (safe to merge now)

The MX stays on Google until TLS is verified (mail-tester ≥ 9/10), so no real inbound traffic hits these yet. Do not cut the MX over until Dovecot ssl=required + a cert-manager cert are in place, or 993 is plaintext.

Verified

kubectl kustomize overlays/p0-lab renders both LB Services with the correct IPs/ports.

Unblocks

Once merged + synced, the LBs get forwarding rules → then PTR on ws-smtp and TLS issuance (ACME DNS-01 via the new acme.socioprophet.ai Cloud DNS delegation zone) can proceed.

🤖 Generated with Claude Code

…rved IPs

Makes the mail plane externally reachable (it was ClusterIP-only). Two L4 LB Services
bound to the reserved static IPs (ws-smtp 130.211.115.191, ws-imap 136.116.203.17),
separate from the ClusterIP services so 143/lmtp stay internal-only and just the secure
external ports (25/587, 993) are exposed. externalTrafficPolicy: Local preserves the real
client source IP — mandatory for SMTP reputation/RBL/SPF. Safe to land: MX stays on Google
until TLS + mail-tester>=9/10, so nothing real lands here yet.
Copilot AI review requested due to automatic review settings July 30, 2026 23:22

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.

Adds external-facing L4 LoadBalancer Services for the workspace mail plane, binding them to reserved static IPs so SMTP and IMAPS can be reached from the internet.

Changes:

  • Introduce workspace-smtp-lb (ports 25/587) and workspace-imap-lb (port 993) Service resources with externalTrafficPolicy: Local.
  • Register the new Service manifest in the base kustomization.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

File Description
infra/k8s/workspace-mail/base/service-lb.yaml Adds two external LoadBalancer Services pinned to reserved IPs for SMTP + IMAPS.
infra/k8s/workspace-mail/base/kustomization.yaml Includes the new LB Service manifest in rendered resources.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +9 to +11
# SEQUENCING: safe to land now — the MX stays on Google until TLS is verified (mail-tester >= 9/10),
# so no real inbound traffic lands here yet. Do NOT cut the MX over until Dovecot ssl=required + a
# cert-manager cert are in place, or 993 would be plaintext.
Comment on lines +16 to +17
annotations:
networking.gke.io/load-balancer-type: "External"
@mdheller
mdheller merged commit 738d11d into main Jul 31, 2026
72 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants