# k8s/ingress.yaml # ============================================ # Switchboard Core - Ingress # ============================================ # Path-based routing on a single domain: # switchboard.DOMAIN/ → production # switchboard.DOMAIN/test/ → test (main branch) # switchboard.DOMAIN/dev/ → dev (PR branches) # # Each environment deploys its own Ingress resource. # Traefik merges rules for the same host automatically. # Longer path prefixes take priority (Traefik default). # # BASE_PATH is empty for prod, "/test" or "/dev" for others. # Backend handles BASE_PATH via r.Group(cfg.BasePath). # Frontend entrypoint injects BASE_PATH into nginx + HTML. # ============================================ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: switchboard${DEPLOY_SUFFIX} namespace: ${NAMESPACE} annotations: cert-manager.io/cluster-issuer: "${CERT_ISSUER}" traefik.ingress.kubernetes.io/router.entrypoints: websecure labels: app: switchboard env: ${ENVIRONMENT} spec: ingressClassName: "traefik" tls: - hosts: - ${DEPLOY_HOST} secretName: switchboard-tls rules: - host: "${DEPLOY_HOST}" http: paths: # API routes → backend - path: ${BASE_PATH}/api pathType: Prefix backend: service: name: switchboard-be${DEPLOY_SUFFIX} port: number: 8080 # Health check → backend - path: ${BASE_PATH}/health pathType: Prefix backend: service: name: switchboard-be${DEPLOY_SUFFIX} port: number: 8080 # WebSocket → backend (must be Prefix, not Exact — Traefik's Exact # doesn't reliably win over Prefix rules in the same Ingress resource) - path: ${BASE_PATH}/ws pathType: Prefix backend: service: name: switchboard-be${DEPLOY_SUFFIX} port: number: 8080 # Everything else under this prefix → frontend - path: ${BASE_PATH}/ pathType: Prefix backend: service: name: switchboard-fe${DEPLOY_SUFFIX} port: number: 80