# FlowerCore Remote Desktop — TLS + Ingress # # Source-of-truth split: # - bluejay-infra OWNS: Certificate, IngressRoute, all NetworkPolicies # (see network-policies.yaml in this directory). # - FlowerCore.RemoteDesktop scripts/deploy-web.sh OWNS: Deployment + # Service. Reason: image refs like `localhost/fc-desktop:linux-xfce` # only exist on each node's containerd after a manual import, so a # Deployment manifest in bluejay-infra would race the image-import # step and crash-loop. # # NetworkPolicies moved into bluejay-infra 2026-05-07 — previously they # were applied via the deploy script's kubectl apply calls, which broke # cluster-rebuild repeatability. See # feedback_networkpolicies_belong_in_bluejay_infra.md. --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: remotedesktop-web-tls namespace: fc-desktop spec: secretName: remotedesktop-web-tls issuerRef: name: step-ca-acme kind: ClusterIssuer dnsNames: - desktop.iamworkin.lan --- apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: remotedesktop-web namespace: fc-desktop spec: entryPoints: - websecure routes: # Host-level catch-all for desktop.iamworkin.lan. The /guacamole # path-prefix match lives in apps/guacamole/guacamole.yaml as a # separate IngressRoute in the guacamole namespace — the cluster # Traefik disallows cross-namespace service refs, so the PathPrefix # rule can't sit here. Traefik's router matching precedence gives # longer/more-specific rules priority automatically, so as long as # the guacamole IngressRoute exists it takes /guacamole traffic # before this catch-all sees it. - match: Host(`desktop.iamworkin.lan`) kind: Rule services: - name: remotedesktop-web port: 8080 tls: secretName: remotedesktop-web-tls # ---- PUBLIC HOST PRE-STAGING (DISABLED - Sprint 61+ exposure go-decision only) ---- # When the operator decides to expose remotedesktop-web publicly, uncomment + update the host, # then verify the five safe-to-expose gates (authentik-safe-to-expose-readiness-2026-06-07.md section 2). # # --- IngressRoute --- # apiVersion: traefik.io/v1alpha1 # kind: IngressRoute # metadata: # name: remotedesktop-web-public # namespace: fc-desktop # spec: # entryPoints: [websecure] # routes: # - match: Host(`desktop.flowercore.io`) && (Method(`GET`) || Method(`HEAD`)) # kind: Rule # middlewares: # - name: remotedesktop-web-public-profile-header # injects entitlement profile # services: # - name: remotedesktop-web # port: 8080 # tls: {} # # POST/PUT/PATCH/DELETE miss every route -> Traefik 404 -> no admin writes on the public surface. # # Reference pattern: dist.flowercore.io (already live + method-gated; do not edit that one).