From e06a16e2007670b01c9f530e978363bf32077bfd Mon Sep 17 00:00:00 2001 From: iye <1713042409@qq.com> Date: Thu, 28 May 2026 18:56:43 +0800 Subject: [PATCH] fix: restore deploy manifests and polish script assistant --- k8s/cert-manager-issuer.yaml | 15 ++ k8s/ingress.yaml | 24 ++ k8s/redirect-https-middleware.yaml | 8 + k8s/web-deployment.yaml | 59 +++++ 电商AI平台/pipeline.html | 337 ++++++++++++++++++++++++----- 5 files changed, 387 insertions(+), 56 deletions(-) create mode 100644 k8s/cert-manager-issuer.yaml create mode 100644 k8s/ingress.yaml create mode 100644 k8s/redirect-https-middleware.yaml create mode 100644 k8s/web-deployment.yaml diff --git a/k8s/cert-manager-issuer.yaml b/k8s/cert-manager-issuer.yaml new file mode 100644 index 0000000..b78a0e3 --- /dev/null +++ b/k8s/cert-manager-issuer.yaml @@ -0,0 +1,15 @@ +# ClusterIssuer for Let's Encrypt automatic certificate generation & renewal +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: letsencrypt-prod +spec: + acme: + server: https://acme-v02.api.letsencrypt.org/directory + email: airlabsv001@gmail.com + privateKeySecretRef: + name: letsencrypt-prod-key + solvers: + - http01: + ingress: + class: traefik diff --git a/k8s/ingress.yaml b/k8s/ingress.yaml new file mode 100644 index 0000000..c31894e --- /dev/null +++ b/k8s/ingress.yaml @@ -0,0 +1,24 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: airshelf-ingress + annotations: + kubernetes.io/ingress.class: "traefik" + cert-manager.io/cluster-issuer: "letsencrypt-prod" + traefik.ingress.kubernetes.io/router.middlewares: "default-redirect-https@kubernetescrd" +spec: + tls: + - hosts: + - airshelf.airlabs.art + secretName: airshelf-tls + rules: + - host: airshelf.airlabs.art + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: airshelf-web + port: + number: 80 diff --git a/k8s/redirect-https-middleware.yaml b/k8s/redirect-https-middleware.yaml new file mode 100644 index 0000000..e5eedb9 --- /dev/null +++ b/k8s/redirect-https-middleware.yaml @@ -0,0 +1,8 @@ +apiVersion: traefik.io/v1alpha1 +kind: Middleware +metadata: + name: redirect-https +spec: + redirectScheme: + scheme: https + permanent: true diff --git a/k8s/web-deployment.yaml b/k8s/web-deployment.yaml new file mode 100644 index 0000000..ff9091f --- /dev/null +++ b/k8s/web-deployment.yaml @@ -0,0 +1,59 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: airshelf-web + labels: + app: airshelf-web +spec: + replicas: 1 + selector: + matchLabels: + app: airshelf-web + template: + metadata: + labels: + app: airshelf-web + spec: + imagePullSecrets: + - name: cr-pull-secret + containers: + - name: airshelf-web + image: ${CI_REGISTRY_IMAGE}/airshelf-web:latest + imagePullPolicy: Always + ports: + - containerPort: 80 + livenessProbe: + httpGet: + path: / + port: 80 + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 3 + failureThreshold: 3 + readinessProbe: + httpGet: + path: / + port: 80 + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + resources: + requests: + memory: "32Mi" + cpu: "20m" + limits: + memory: "128Mi" + cpu: "150m" +--- +apiVersion: v1 +kind: Service +metadata: + name: airshelf-web +spec: + selector: + app: airshelf-web + ports: + - protocol: TCP + port: 80 + targetPort: 80 diff --git a/电商AI平台/pipeline.html b/电商AI平台/pipeline.html index ec61853..cb41e78 100644 --- a/电商AI平台/pipeline.html +++ b/电商AI平台/pipeline.html @@ -438,6 +438,12 @@ } /* 镜头脚本顶栏 · 自动从脚本抓取的人物/场景标签 · 可编辑/删除/添加 */ + .shot-list > .pane-h { flex-wrap: wrap; row-gap: 8px; } + .shot-headline { display: inline-flex; align-items: center; gap: 8px; min-width: 0; } + .script-brief-summary { display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; } + .script-brief-pill { gap: 4px; padding: 3px 8px; font-size: 11px; } + .script-brief-pill .k { font-family: var(--font-mono); font-size: 10px; color: var(--black-alpha-48); letter-spacing: .04em; } + .script-brief-pill .v { color: var(--accent-black); max-width: 116px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .script-tags { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 14px; margin-left: 6px; } .script-tags .tag-group { display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; } .script-tags .tg-lbl { font-family: var(--font-mono); font-size: 10.5px; color: var(--black-alpha-48); letter-spacing: .04em; text-transform: uppercase; flex-shrink: 0; } @@ -465,6 +471,61 @@ .chat-mode:hover { background: var(--heat-12); border-color: var(--heat); color: var(--heat); } .chat-mode.primary { background: var(--heat-12); border-color: var(--heat); color: var(--heat); } .chat-mode svg { width: 13px; height: 13px; } + .script-brief-card { margin-top: 8px; padding: 12px; background: var(--background-base); border: 1px solid var(--border-faint); border-radius: var(--r-md); display: flex; flex-direction: column; gap: 10px; } + .script-brief-row { display: grid; grid-template-columns: 56px minmax(0, 1fr); column-gap: 10px; row-gap: 4px; align-items: center; } + .script-brief-row .k { font-family: var(--font-mono); font-size: 10.5px; color: var(--black-alpha-48); letter-spacing: .04em; } + .script-brief-row .why { grid-column: 2 / 3; font-size: 11.5px; color: var(--black-alpha-48); line-height: 1.5; } + .script-brief-select { position: relative; display: inline-flex; width: 100%; min-width: 0; } + .script-brief-value { + width: 100%; + min-width: 0; + height: 36px; + padding: 0 12px; + border: 1px solid var(--border-faint); + border-radius: var(--r-md); + background: var(--surface); + color: var(--accent-black); + font-size: 13px; + font-weight: 500; + font-family: inherit; + cursor: pointer; + display: inline-flex; + align-items: center; + justify-content: space-between; + gap: 8px; + transition: background var(--t-base), border-color var(--t-base), color var(--t-base); + } + .script-brief-value .v { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left; } + .script-brief-value::after { + content: ''; + width: 5px; + height: 5px; + border-right: 1px solid currentColor; + border-bottom: 1px solid currentColor; + transform: rotate(45deg) translateY(-1px); + transition: transform var(--t-base); + color: var(--black-alpha-48); + flex-shrink: 0; + } + .script-brief-value:hover { + background: var(--heat-12); + border-color: var(--heat-20); + color: var(--heat); + } + .script-brief-select.open .script-brief-value { + background: var(--heat-12); + border-color: var(--heat); + color: var(--heat); + } + .script-brief-select.open .script-brief-value::after { + color: var(--heat); + transform: rotate(225deg) translate(-1px, -1px); + } + .script-brief-select.open .chip-menu { display: block; } + .script-brief-select .chip-menu { min-width: 168px; right: 0; left: auto; z-index: 80; } + .script-brief-select .chip-menu .mi { width: 100%; border: 0; background: transparent; font-family: inherit; text-align: left; } + .script-brief-actions { display: grid; grid-template-columns: 56px minmax(0, 1fr); column-gap: 10px; align-items: center; padding-top: 2px; } + .script-brief-actions .action-row { grid-column: 2 / 3; display: flex; align-items: center; justify-content: space-between; gap: 8px; min-width: 0; } /* AI 思考态 typing indicator */ .ai-thinking .dots { display: inline-flex; gap: 3px; } @@ -1626,8 +1687,15 @@