From 448b5f54d3814def8db689f0407cd696078ece03 Mon Sep 17 00:00:00 2001 From: Lee Chapman Date: Sat, 15 Aug 2026 18:31:44 -0700 Subject: [PATCH] feat(slashbay): add prd-apps Fleet manifests Co-authored-by: Cursor --- README.md | 16 ++++ fleet-gitrepo.yaml | 32 +++++++ slashbay/README.md | 36 ++++++++ slashbay/base/configmap.yaml | 22 +++++ slashbay/base/deployment.yaml | 87 ++++++++++++++++++ slashbay/base/kustomization.yaml | 10 +++ slashbay/base/namespace.yaml | 7 ++ slashbay/base/pvc.yaml | 14 +++ slashbay/base/service.yaml | 17 ++++ slashbay/base/serviceaccount.yaml | 8 ++ slashbay/overlays/prd-apps/configmap.yaml | 22 +++++ slashbay/overlays/prd-apps/deployment.yaml | 88 +++++++++++++++++++ slashbay/overlays/prd-apps/fleet.yaml | 14 +++ slashbay/overlays/prd-apps/ingress.yaml | 29 ++++++ slashbay/overlays/prd-apps/kustomization.yaml | 18 ++++ slashbay/overlays/prd-apps/namespace.yaml | 7 ++ slashbay/overlays/prd-apps/pvc.yaml | 15 ++++ slashbay/overlays/prd-apps/service.yaml | 17 ++++ .../overlays/prd-apps/serviceaccount.yaml | 8 ++ slashbay/secrets/README.md | 48 ++++++++++ .../secrets/slashbay-secrets.yaml.example | 19 ++++ 21 files changed, 534 insertions(+) create mode 100644 fleet-gitrepo.yaml create mode 100644 slashbay/README.md create mode 100644 slashbay/base/configmap.yaml create mode 100644 slashbay/base/deployment.yaml create mode 100644 slashbay/base/kustomization.yaml create mode 100644 slashbay/base/namespace.yaml create mode 100644 slashbay/base/pvc.yaml create mode 100644 slashbay/base/service.yaml create mode 100644 slashbay/base/serviceaccount.yaml create mode 100644 slashbay/overlays/prd-apps/configmap.yaml create mode 100644 slashbay/overlays/prd-apps/deployment.yaml create mode 100644 slashbay/overlays/prd-apps/fleet.yaml create mode 100644 slashbay/overlays/prd-apps/ingress.yaml create mode 100644 slashbay/overlays/prd-apps/kustomization.yaml create mode 100644 slashbay/overlays/prd-apps/namespace.yaml create mode 100644 slashbay/overlays/prd-apps/pvc.yaml create mode 100644 slashbay/overlays/prd-apps/service.yaml create mode 100644 slashbay/overlays/prd-apps/serviceaccount.yaml create mode 100644 slashbay/secrets/README.md create mode 100644 slashbay/secrets/slashbay-secrets.yaml.example diff --git a/README.md b/README.md index e6e68d0..156d7a9 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,16 @@ Coder provides secure, on-demand development environments (workspaces) that run - **PostgreSQL**: Deployed via [CloudNativePG](https://cloudnative-pg.io/) operator (same pattern as `high-command-postgres` in the cluster) - **Storage**: TrueNAS CSI NFS — see [docs/](docs/README.md) +### [Slashbay](https://github.com/DataKnifeAI/slashbay) — Issue-webhook herald + +Slashbay receives GitHub/GitLab issue webhooks, triages with a cheap LLM, and berths a Coder `dkai-agent` workspace. + +- **Path**: `slashbay/` +- **Namespace**: `slashbay` +- **Image**: `harbor.dataknife.net/library/slashbay` (GitLab CI → Harbor `library`) +- **Ingress**: `slashbay.dataknife.net` (webhooks) +- **Secrets**: [slashbay/secrets/README.md](slashbay/secrets/README.md) + ## Prerequisites - [CloudNativePG operator](https://cloudnative-pg.io/documentation/current/installation/) installed on the cluster @@ -44,6 +54,11 @@ gitops-dev/ │ └── prd-apps/ # prd-apps cluster overlay │ ├── fleet.yaml │ └── kustomization.yaml +├── slashbay/ +│ ├── base/ # Generic Slashbay manifests +│ ├── overlays/ +│ │ └── prd-apps/ # Self-contained Fleet overlay +│ └── secrets/ # Secret examples (not live values) ├── docs/ # Deployment and operations documentation │ └── truenas-csi/ # TrueNAS CSI driver patches and migration └── README.md @@ -65,6 +80,7 @@ postgres://{user}:{password}@{cluster}-rw.{namespace}:5432/{database}?sslmode=di ```bash kubectl config use-context prd-apps kubectl apply -k coder/overlays/prd-apps/ +kubectl apply -k slashbay/overlays/prd-apps/ ``` ### Fleet (GitOps) diff --git a/fleet-gitrepo.yaml b/fleet-gitrepo.yaml new file mode 100644 index 0000000..65cecf9 --- /dev/null +++ b/fleet-gitrepo.yaml @@ -0,0 +1,32 @@ +# Fleet GitRepo — register this repo to deploy Coder + Slashbay to prd-apps +# Apply to the cluster where Fleet runs (e.g. Rancher management cluster): +# kubectl apply -f fleet-gitrepo.yaml +# +# If a GitRepo named gitops-dev-prd-apps already exists, add the slashbay +# path to spec.paths instead of creating a second GitRepo. +# +# Requires: Fleet installed, prd-apps cluster registered with label +# management.cattle.io/cluster-display-name=prd-apps +# Before Slashbay starts: create secrets — see slashbay/secrets/README.md +apiVersion: fleet.cattle.io/v1alpha1 +kind: GitRepo +metadata: + name: gitops-dev-prd-apps + namespace: fleet-default + labels: + app: gitops-dev + cluster: prd-apps + managed-by: gitops +spec: + repo: https://github.com/DataKnifeAI/gitops-dev.git + branch: main + paths: + - coder/overlays/prd-apps + - slashbay/overlays/prd-apps + targets: + - clusterSelector: + matchLabels: + management.cattle.io/cluster-display-name: prd-apps + correctDrift: + enabled: true + keepResources: true diff --git a/slashbay/README.md b/slashbay/README.md new file mode 100644 index 0000000..028a463 --- /dev/null +++ b/slashbay/README.md @@ -0,0 +1,36 @@ +# Slashbay + +[Slashbay](https://github.com/DataKnifeAI/slashbay) — DataKnifeAI issue-webhook herald. Issues dock here, cheap-LLM triage decides if they are work, and a Coder workspace is berthed for a coding agent. + +Image is built in GitLab CI (GitHub mirror) and pushed to Harbor. This repo only deploys it. + +## Target + +| Item | Value | +|------|--------| +| Cluster | `prd-apps` | +| Namespace | `slashbay` | +| Image | `harbor.dataknife.net/library/slashbay` | +| Fleet path | `slashbay/overlays/prd-apps` | +| Ingress | `slashbay.dataknife.net` (nginx; GitHub/GitLab webhooks) | +| Coder | `https://coder.dataknife.net` (`CODER_ACCESS_URL`) | + +## Prerequisites + +1. Harbor image exists (`library/slashbay`) and `harbor-registry-secret` in namespace `slashbay` +2. Application secret `slashbay-secrets` — see [secrets/README.md](secrets/README.md) +3. DNS for `slashbay.dataknife.net` if webhooks must reach the cluster from GitHub/GitLab.com + +## Deployment + +```bash +kubectl config use-context prd-apps +# secrets first — see secrets/README.md +kubectl apply -k overlays/prd-apps/ +``` + +`overlays/prd-apps` is self-contained (no `../../base`) so Fleet can use that directory as the GitRepo path, same as Coder. + +Leave `SLASHBAY_DRY_RUN=true` on the ConfigMap until secrets and Coder are ready. Pin the image tag after the first Harbor release (siblings pin `high-command-*:v0.N`). + +App-repo copy of these manifests: [DataKnifeAI/slashbay](https://github.com/DataKnifeAI/slashbay) `deploy/`. diff --git a/slashbay/base/configmap.yaml b/slashbay/base/configmap.yaml new file mode 100644 index 0000000..7aff3b1 --- /dev/null +++ b/slashbay/base/configmap.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: slashbay-config + namespace: slashbay + labels: + app: slashbay + app.kubernetes.io/name: slashbay +data: + SLASHBAY_DRY_RUN: "true" + SLASHBAY_STATE_DSN: "sqlite:////data/slashbay.db" + SLASHBAY_REPO_ALLOWLIST: "DataKnifeAI/*" + SLASHBAY_TRIGGER_EVENTS: "opened,reopened" + SLASHBAY_MAX_CONCURRENT: "3" + SLASHBAY_TRIAGE_MODEL: "gpt-5-nano" + SLASHBAY_TRIAGE_ESCALATE_MODEL: "gpt-5.6-luna" + SLASHBAY_TRIAGE_ESCALATE_BELOW: "0.7" + CODER_ACCESS_URL: "https://coder.dataknife.net" + CODER_TEMPLATE: "dkai-agent" + CODER_WORKSPACE_OWNER: "me" + GITHUB_API_URL: "https://api.github.com" + GITLAB_API_URL: "https://gitlab.com/api/v4" diff --git a/slashbay/base/deployment.yaml b/slashbay/base/deployment.yaml new file mode 100644 index 0000000..10cd324 --- /dev/null +++ b/slashbay/base/deployment.yaml @@ -0,0 +1,87 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: slashbay + namespace: slashbay + labels: + app: slashbay + app.kubernetes.io/name: slashbay +spec: + replicas: 1 + selector: + matchLabels: + app: slashbay + template: + metadata: + labels: + app: slashbay + app.kubernetes.io/name: slashbay + spec: + serviceAccountName: slashbay + imagePullSecrets: + - name: harbor-registry-secret + securityContext: + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 + containers: + - name: slashbay + image: harbor.dataknife.net/library/slashbay:latest + imagePullPolicy: Always + ports: + - name: http + containerPort: 8080 + protocol: TCP + envFrom: + - configMapRef: + name: slashbay-config + - secretRef: + name: slashbay-secrets + optional: true + env: + - name: SLASHBAY_HOST + value: "0.0.0.0" + - name: SLASHBAY_PORT + value: "8080" + livenessProbe: + httpGet: + path: /healthz + port: http + initialDelaySeconds: 10 + periodSeconds: 30 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /healthz + port: http + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 2 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 512Mi + securityContext: + readOnlyRootFilesystem: true + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + volumeMounts: + - name: data + mountPath: /data + - name: tmp + mountPath: /tmp + volumes: + - name: data + persistentVolumeClaim: + claimName: slashbay-data + - name: tmp + emptyDir: {} diff --git a/slashbay/base/kustomization.yaml b/slashbay/base/kustomization.yaml new file mode 100644 index 0000000..c2fba4c --- /dev/null +++ b/slashbay/base/kustomization.yaml @@ -0,0 +1,10 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - namespace.yaml + - serviceaccount.yaml + - configmap.yaml + - pvc.yaml + - deployment.yaml + - service.yaml diff --git a/slashbay/base/namespace.yaml b/slashbay/base/namespace.yaml new file mode 100644 index 0000000..b9e503f --- /dev/null +++ b/slashbay/base/namespace.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: slashbay + labels: + app.kubernetes.io/name: slashbay + managed-by: gitops diff --git a/slashbay/base/pvc.yaml b/slashbay/base/pvc.yaml new file mode 100644 index 0000000..0068011 --- /dev/null +++ b/slashbay/base/pvc.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: slashbay-data + namespace: slashbay + labels: + app: slashbay + app.kubernetes.io/name: slashbay +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/slashbay/base/service.yaml b/slashbay/base/service.yaml new file mode 100644 index 0000000..e903fda --- /dev/null +++ b/slashbay/base/service.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: slashbay + namespace: slashbay + labels: + app: slashbay + app.kubernetes.io/name: slashbay +spec: + type: ClusterIP + selector: + app: slashbay + ports: + - name: http + port: 80 + targetPort: http + protocol: TCP diff --git a/slashbay/base/serviceaccount.yaml b/slashbay/base/serviceaccount.yaml new file mode 100644 index 0000000..c0cb581 --- /dev/null +++ b/slashbay/base/serviceaccount.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: slashbay + namespace: slashbay + labels: + app: slashbay + app.kubernetes.io/name: slashbay diff --git a/slashbay/overlays/prd-apps/configmap.yaml b/slashbay/overlays/prd-apps/configmap.yaml new file mode 100644 index 0000000..7aff3b1 --- /dev/null +++ b/slashbay/overlays/prd-apps/configmap.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: slashbay-config + namespace: slashbay + labels: + app: slashbay + app.kubernetes.io/name: slashbay +data: + SLASHBAY_DRY_RUN: "true" + SLASHBAY_STATE_DSN: "sqlite:////data/slashbay.db" + SLASHBAY_REPO_ALLOWLIST: "DataKnifeAI/*" + SLASHBAY_TRIGGER_EVENTS: "opened,reopened" + SLASHBAY_MAX_CONCURRENT: "3" + SLASHBAY_TRIAGE_MODEL: "gpt-5-nano" + SLASHBAY_TRIAGE_ESCALATE_MODEL: "gpt-5.6-luna" + SLASHBAY_TRIAGE_ESCALATE_BELOW: "0.7" + CODER_ACCESS_URL: "https://coder.dataknife.net" + CODER_TEMPLATE: "dkai-agent" + CODER_WORKSPACE_OWNER: "me" + GITHUB_API_URL: "https://api.github.com" + GITLAB_API_URL: "https://gitlab.com/api/v4" diff --git a/slashbay/overlays/prd-apps/deployment.yaml b/slashbay/overlays/prd-apps/deployment.yaml new file mode 100644 index 0000000..e6e4427 --- /dev/null +++ b/slashbay/overlays/prd-apps/deployment.yaml @@ -0,0 +1,88 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: slashbay + namespace: slashbay + labels: + app: slashbay + app.kubernetes.io/name: slashbay +spec: + replicas: 1 + selector: + matchLabels: + app: slashbay + template: + metadata: + labels: + app: slashbay + app.kubernetes.io/name: slashbay + spec: + serviceAccountName: slashbay + imagePullSecrets: + - name: harbor-registry-secret + # Omit fsGroup — TrueNAS CSI NFS can fail kubelet applyFSGroup (same as Coder postgres). + securityContext: + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 + containers: + - name: slashbay + image: harbor.dataknife.net/library/slashbay:latest + imagePullPolicy: Always + ports: + - name: http + containerPort: 8080 + protocol: TCP + envFrom: + - configMapRef: + name: slashbay-config + - secretRef: + name: slashbay-secrets + optional: true + env: + - name: SLASHBAY_HOST + value: "0.0.0.0" + - name: SLASHBAY_PORT + value: "8080" + livenessProbe: + httpGet: + path: /healthz + port: http + initialDelaySeconds: 10 + periodSeconds: 30 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /healthz + port: http + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 2 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 512Mi + securityContext: + readOnlyRootFilesystem: true + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + volumeMounts: + - name: data + mountPath: /data + - name: tmp + mountPath: /tmp + volumes: + - name: data + persistentVolumeClaim: + claimName: slashbay-data + - name: tmp + emptyDir: {} diff --git a/slashbay/overlays/prd-apps/fleet.yaml b/slashbay/overlays/prd-apps/fleet.yaml new file mode 100644 index 0000000..fa1e263 --- /dev/null +++ b/slashbay/overlays/prd-apps/fleet.yaml @@ -0,0 +1,14 @@ +# Fleet configuration for prd-apps +# Self-contained overlay - Fleet path: slashbay/overlays/prd-apps +# Uses same pattern as coder/overlays/prd-apps +apiVersion: fleet.cattle.io/v1alpha1 +kind: Bundle +metadata: + name: slashbay-prd-apps + labels: + fleet.cattle.io/bundle-name: slashbay-prd-apps +spec: + targetRestrictions: + - clusterSelector: + matchLabels: + management.cattle.io/cluster-display-name: prd-apps diff --git a/slashbay/overlays/prd-apps/ingress.yaml b/slashbay/overlays/prd-apps/ingress.yaml new file mode 100644 index 0000000..b1852e9 --- /dev/null +++ b/slashbay/overlays/prd-apps/ingress.yaml @@ -0,0 +1,29 @@ +# GitHub / GitLab issue webhooks need inbound HTTPS. +# Same nginx + *.dataknife.net pattern as Coder and MCP servers on prd-apps. +# TLS uses the ingress controller default certificate (cert-manager wildcard). +# If slashbay.dataknife.net is not reachable from the public internet, use a +# Cloudflare Tunnel (high-command-ui) or a webhook relay instead of this Ingress. +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: slashbay + namespace: slashbay + labels: + app: slashbay + app.kubernetes.io/name: slashbay + managed-by: gitops + annotations: + nginx.ingress.kubernetes.io/ssl-redirect: "true" +spec: + ingressClassName: nginx + rules: + - host: slashbay.dataknife.net + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: slashbay + port: + number: 80 diff --git a/slashbay/overlays/prd-apps/kustomization.yaml b/slashbay/overlays/prd-apps/kustomization.yaml new file mode 100644 index 0000000..066e0da --- /dev/null +++ b/slashbay/overlays/prd-apps/kustomization.yaml @@ -0,0 +1,18 @@ +# Self-contained overlay for Fleet - no ../../base (path is slashbay/overlays/prd-apps) +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: slashbay + +resources: + - namespace.yaml + - serviceaccount.yaml + - configmap.yaml + - pvc.yaml + - deployment.yaml + - service.yaml + - ingress.yaml + +commonLabels: + managed-by: gitops + cluster: prd-apps diff --git a/slashbay/overlays/prd-apps/namespace.yaml b/slashbay/overlays/prd-apps/namespace.yaml new file mode 100644 index 0000000..b9e503f --- /dev/null +++ b/slashbay/overlays/prd-apps/namespace.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: slashbay + labels: + app.kubernetes.io/name: slashbay + managed-by: gitops diff --git a/slashbay/overlays/prd-apps/pvc.yaml b/slashbay/overlays/prd-apps/pvc.yaml new file mode 100644 index 0000000..98fe613 --- /dev/null +++ b/slashbay/overlays/prd-apps/pvc.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: slashbay-data + namespace: slashbay + labels: + app: slashbay + app.kubernetes.io/name: slashbay +spec: + accessModes: + - ReadWriteOnce + storageClassName: truenas-csi-nfs + resources: + requests: + storage: 1Gi diff --git a/slashbay/overlays/prd-apps/service.yaml b/slashbay/overlays/prd-apps/service.yaml new file mode 100644 index 0000000..e903fda --- /dev/null +++ b/slashbay/overlays/prd-apps/service.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: slashbay + namespace: slashbay + labels: + app: slashbay + app.kubernetes.io/name: slashbay +spec: + type: ClusterIP + selector: + app: slashbay + ports: + - name: http + port: 80 + targetPort: http + protocol: TCP diff --git a/slashbay/overlays/prd-apps/serviceaccount.yaml b/slashbay/overlays/prd-apps/serviceaccount.yaml new file mode 100644 index 0000000..c0cb581 --- /dev/null +++ b/slashbay/overlays/prd-apps/serviceaccount.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: slashbay + namespace: slashbay + labels: + app: slashbay + app.kubernetes.io/name: slashbay diff --git a/slashbay/secrets/README.md b/slashbay/secrets/README.md new file mode 100644 index 0000000..4317959 --- /dev/null +++ b/slashbay/secrets/README.md @@ -0,0 +1,48 @@ +# Slashbay secrets + +Create these in namespace `slashbay` on **prd-apps** before flipping `SLASHBAY_DRY_RUN` to `false`. Never commit filled secrets. + +## 1. `slashbay-secrets` + +| Key | Purpose | +|-----|---------| +| `OPENAI_API_KEY` | Cheap-LLM triage. Empty → heuristic classifier | +| `CURSOR_API_KEY` | Injected into the Coder workspace as `cursor_api_key` | +| `CODER_TOKEN` | Coder API token that can create/start `dkai-agent` workspaces | +| `GITHUB_WEBHOOK_SECRET` | HMAC for `X-Hub-Signature-256` | +| `GITHUB_TOKEN` | Comments/labels on GitHub issues | +| `GITLAB_WEBHOOK_TOKEN` | Shared token for `X-Gitlab-Token` | +| `GITLAB_TOKEN` | Notes/labels on GitLab issues | + +```bash +kubectl create namespace slashbay --dry-run=client -o yaml | kubectl apply -f - + +kubectl create secret generic slashbay-secrets -n slashbay \ + --from-literal=OPENAI_API_KEY='...' \ + --from-literal=CURSOR_API_KEY='...' \ + --from-literal=CODER_TOKEN='...' \ + --from-literal=GITHUB_WEBHOOK_SECRET='...' \ + --from-literal=GITHUB_TOKEN='...' \ + --from-literal=GITLAB_WEBHOOK_TOKEN='...' \ + --from-literal=GITLAB_TOKEN='...' +``` + +Or copy `slashbay-secrets.yaml.example`, fill `stringData`, `kubectl apply -f` (keep the file out of git). + +## 2. `harbor-registry-secret` + +```bash +kubectl create secret docker-registry harbor-registry-secret \ + --docker-server=harbor.dataknife.net \ + --docker-username='robot$library+ci-builder' \ + --docker-password='...' \ + --namespace=slashbay +``` + +Use the org Harbor robot account (see [gitops-tools Harbor docs](https://github.com/DataKnifeAI/gitops-tools/blob/main/docs/HARBOR.md)). + +## Order + +1. Namespace + both secrets +2. Apply `slashbay/overlays/prd-apps` +3. Set `SLASHBAY_DRY_RUN=false` on ConfigMap `slashbay-config` when ready to berth workspaces diff --git a/slashbay/secrets/slashbay-secrets.yaml.example b/slashbay/secrets/slashbay-secrets.yaml.example new file mode 100644 index 0000000..ce8a10c --- /dev/null +++ b/slashbay/secrets/slashbay-secrets.yaml.example @@ -0,0 +1,19 @@ +# Example only — do not commit a filled copy. +# Create the live secret with kubectl (see secrets/README.md). +apiVersion: v1 +kind: Secret +metadata: + name: slashbay-secrets + namespace: slashbay + labels: + app: slashbay + app.kubernetes.io/name: slashbay +type: Opaque +stringData: + OPENAI_API_KEY: "" + CURSOR_API_KEY: "" + CODER_TOKEN: "" + GITHUB_WEBHOOK_SECRET: "" + GITHUB_TOKEN: "" + GITLAB_WEBHOOK_TOKEN: "" + GITLAB_TOKEN: ""