Add Hetzner edge node as reverse proxy for custom domains #419
Labels
No labels
domain:backend
domain:devops
domain:frontend
status:approved
status:in-progress
status:needs-fix
status:qa
type:bug
type:devops
type:feature
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
ldraney/pal-e-platform#419
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Type
Feature
Lineage
Standalone — replaces Cloudflare Tunnel approach from palinks custom-domain spike (ldraney/palinks#15). Uses existing Hetzner account infrastructure.
Repo
ldraney/pal-e-platformUser Story
As a platform operator
I want a Hetzner VPS acting as a reverse proxy with TLS termination
So that custom domains (palinks.app, landscaping-assistant.app, westsidekingsandqueens.com) route to k3s services via Tailscale
Context
The platform currently uses Tailscale Funnel for ingress, which is locked to
*.ts.netsubdomains. Custom domains need a public-facing edge node with its own IP to terminate TLS (Let's Encrypt via Caddy). The edge node joins the Tailscale network and proxies traffic to k3s services. Lucas already has a Hetzner account (K0624949326) with API access. This is a single VPS serving all custom domains — not one per service.Architecture:
File Targets
Files to create:
terraform/modules/hetzner-edge/main.tf— VPS provisioning, SSH key, firewallterraform/modules/hetzner-edge/variables.tf— token, server type, locationterraform/modules/hetzner-edge/outputs.tf— public IP, server IDterraform/versions.tf— add hcloud providerterraform/providers.tf— add hcloud provider blockterraform/variables.tf— add hetzner_api_token variableterraform/main.tf— wire hetzner-edge moduleFiles to modify:
Makefile— add hetzner_api_token to TF_SECRET_VARSsalt/pillar/secrets_registry.sls— add hetzner_api_token metadatasalt/pillar/secrets/platform.sls— add hetzner_api_token (GPG-encrypted)Feature Flag
none
Acceptance Criteria
tofu planshows Hetzner VPS resource to createtofu applyprovisions VPS with public IPv4Test Expectations
tofu validatepassestofu planshows expected resourcescd terraform && tofu planConstraints
Checklist
Related
project-palinks— primary consumer (palinks.app)ldraney/palinks#28— Configure GoDaddy redirect (superseded by this approach)ldraney/palinks#15— Custom domain spike (recommended Cloudflare, pivoting to Hetzner)