apiVersion: v1 kind: Namespace metadata: name: cobalt-downloader --- # 1. THE BACKEND API (Processing Engine) apiVersion: apps/v1 kind: Deployment metadata: name: cobalt-api namespace: cobalt-downloader labels: app: cobalt-api spec: replicas: 1 selector: matchLabels: app: cobalt-api template: metadata: labels: app: cobalt-api spec: containers: - name: api image: ghcr.io/imputnet/cobalt:latest imagePullPolicy: IfNotPresent ports: - containerPort: 9000 name: http-api env: # Identifies its own public API endpoint location - name: API_URL value: "https://cobalt-api.needlestack.boo" # Grants cross-origin clearance strictly to your web UI subdomain - name: CORS_ALLOWED_ORIGINS value: "https://cobalt.needlestack.boo" resources: limits: cpu: "500m" memory: "512Mi" requests: cpu: "100m" memory: "128Mi" --- apiVersion: v1 kind: Service metadata: name: cobalt-api-svc namespace: cobalt-downloader spec: selector: app: cobalt-api ports: - protocol: TCP port: 9000 targetPort: 9000 --- # 2. THE WEB FRONTEND UI (Browser Dashboard) apiVersion: apps/v1 kind: Deployment metadata: name: cobalt-web namespace: cobalt-downloader labels: app: cobalt-web spec: replicas: 1 selector: matchLabels: app: cobalt-web template: metadata: labels: app: cobalt-web spec: containers: - name: web # Swapped to the official, verified web UI container path image: ghcr.io/imputnet/cobalt-web:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 name: http-web env: # CORRECTED: Official SvelteKit container variable mapping the API to your browser - name: WEB_DEFAULT_API value: "https://cobalt-api.needlestack.boo" resources: limits: cpu: "500m" memory: "512Mi" requests: cpu: "50m" memory: "128Mi" --- apiVersion: v1 kind: Service metadata: name: cobalt-web-svc namespace: cobalt-downloader spec: selector: app: cobalt-web ports: - protocol: TCP port: 80 targetPort: 80 --- # 3. NGINX INGRESS MAPPING (Dual Host Control) apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cobalt-ingress namespace: cobalt-downloader annotations: cert-manager.io/cluster-issuer: "letsencrypt-production" nginx.ingress.kubernetes.io/backend-protocol: "HTTP" nginx.ingress.kubernetes.io/ssl-redirect: "true" # REMOVED: nginx-cors injection removed to prevent browser-side "Double CORS header" conflicts spec: ingressClassName: nginx tls: - secretName: cobalt-tls-secret hosts: - cobalt.needlestack.boo - cobalt-api.needlestack.boo rules: # Routes your primary browser landing screen traffic - host: cobalt.needlestack.boo http: paths: - path: / pathType: Prefix backend: service: name: cobalt-web-svc port: number: 80 # Routes underlying stream data traffic - host: cobalt-api.needlestack.boo http: paths: - path: / pathType: Prefix backend: service: name: cobalt-api-svc port: number: 9000