diff --git a/apps/backstage/README.md b/apps/backstage/README.md new file mode 100644 index 0000000..0d9907c --- /dev/null +++ b/apps/backstage/README.md @@ -0,0 +1,20 @@ +# Backstage + +Backstage 作为 homelab 的只读开发者门户运行。应用源码、插件、测试和镜像构建归 +`panxiao81/backstage` 仓库管理;本目录只保存 Kubernetes/Flux 部署声明,并通过 +OCI digest 固定镜像。 + +## 外部前置 + +- OpenBao `kv/k8s/backstage` 必须包含以下与容器环境变量同名的字段: + `BACKEND_SECRET`、`AUTH_SESSION_SECRET`、`AUTH_OIDC_CLIENT_ID`、 + `AUTH_OIDC_CLIENT_SECRET`、`POSTGRES_PASSWORD`、`GITEA_TOKEN`。 +- PostgreSQL 需要在共享集群中预先创建由 `backstage` 角色拥有的 `backstage` + 数据库;密码必须与 OpenBao 中的 `POSTGRES_PASSWORD` 一致。 +- Authelia OIDC 客户端回调地址为 + `https://backstage.ad.ddupan.top/api/auth/oidc/handler/frame`。 +- AD DNS 需要将 `backstage.ad.ddupan.top` 指向 Envoy Gateway + `192.168.10.127`。 + +Flux 等待 ExternalSecret 和 Deployment 就绪;任何前置缺失都会使该 +Kustomization 保持 NotReady,而不会回退到明文 Secret。 diff --git a/apps/backstage/deployment.yaml b/apps/backstage/deployment.yaml new file mode 100644 index 0000000..679fb96 --- /dev/null +++ b/apps/backstage/deployment.yaml @@ -0,0 +1,85 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: backstage + namespace: backstage + labels: + app.kubernetes.io/name: backstage +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app.kubernetes.io/name: backstage + template: + metadata: + labels: + app.kubernetes.io/name: backstage + spec: + serviceAccountName: backstage + securityContext: + fsGroup: 1000 + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + containers: + - name: backstage + image: zot.ad.ddupan.top/panxiao81/backstage@sha256:6d6a11f8611a85237e3b0ffd30a2a6e119b1e5258b2ca6c193d60a8c3ec52553 + imagePullPolicy: IfNotPresent + env: + - name: BACKSTAGE_BASE_URL + value: https://backstage.ad.ddupan.top + - name: POSTGRES_HOST + value: shared-postgresql-rw.shared-db.svc.cluster.local + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_USER + value: backstage + - name: POSTGRES_DATABASE + value: backstage + - name: GITEA_HOST + value: git.ddupan.top + - name: GITEA_ORG + value: panxiao81 + envFrom: + - secretRef: + name: backstage + ports: + - containerPort: 7007 + name: http + protocol: TCP + readinessProbe: + httpGet: + path: /healthcheck + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 3 + livenessProbe: + httpGet: + path: /healthcheck + port: http + initialDelaySeconds: 30 + periodSeconds: 20 + timeoutSeconds: 3 + resources: + requests: + cpu: 100m + memory: 512Mi + limits: + cpu: "1" + memory: 1Gi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: [ALL] + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1000 + volumeMounts: + - mountPath: /tmp + name: tmp + volumes: + - emptyDir: {} + name: tmp diff --git a/apps/backstage/external-secret.yaml b/apps/backstage/external-secret.yaml new file mode 100644 index 0000000..8290051 --- /dev/null +++ b/apps/backstage/external-secret.yaml @@ -0,0 +1,16 @@ +apiVersion: external-secrets.io/v1 +kind: ExternalSecret +metadata: + name: backstage + namespace: backstage +spec: + refreshInterval: 1h + secretStoreRef: + kind: ClusterSecretStore + name: openbao + target: + creationPolicy: Owner + name: backstage + dataFrom: + - extract: + key: k8s/backstage diff --git a/apps/backstage/httproute.yaml b/apps/backstage/httproute.yaml new file mode 100644 index 0000000..a5cbd29 --- /dev/null +++ b/apps/backstage/httproute.yaml @@ -0,0 +1,20 @@ +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: backstage + namespace: backstage +spec: + parentRefs: + - name: eg + namespace: envoy-gateway-system + sectionName: https + hostnames: + - backstage.ad.ddupan.top + rules: + - matches: + - path: + type: PathPrefix + value: / + backendRefs: + - name: backstage + port: 7007 diff --git a/apps/backstage/kustomization.yaml b/apps/backstage/kustomization.yaml new file mode 100644 index 0000000..6141cf0 --- /dev/null +++ b/apps/backstage/kustomization.yaml @@ -0,0 +1,10 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - namespace.yaml + - serviceaccount.yaml + - external-secret.yaml + - deployment.yaml + - service.yaml + - networkpolicy.yaml + - httproute.yaml diff --git a/apps/backstage/namespace.yaml b/apps/backstage/namespace.yaml new file mode 100644 index 0000000..88e2b3b --- /dev/null +++ b/apps/backstage/namespace.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: backstage + labels: + pod-security.kubernetes.io/enforce: restricted + pod-security.kubernetes.io/enforce-version: v1.36 diff --git a/apps/backstage/networkpolicy.yaml b/apps/backstage/networkpolicy.yaml new file mode 100644 index 0000000..7d3fb16 --- /dev/null +++ b/apps/backstage/networkpolicy.yaml @@ -0,0 +1,24 @@ +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: backstage-ingress + namespace: backstage +spec: + podSelector: + matchLabels: + app.kubernetes.io/name: backstage + policyTypes: [Ingress] + ingress: + - from: + - namespaceSelector: + matchLabels: + kubernetes.io/metadata.name: envoy-gateway-system + ports: + - port: 7007 + protocol: TCP + - from: + - ipBlock: + cidr: 192.168.10.127/32 + ports: + - port: 7007 + protocol: TCP diff --git a/apps/backstage/service.yaml b/apps/backstage/service.yaml new file mode 100644 index 0000000..21ba1a1 --- /dev/null +++ b/apps/backstage/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: backstage + namespace: backstage +spec: + selector: + app.kubernetes.io/name: backstage + ports: + - name: http + port: 7007 + protocol: TCP + targetPort: http diff --git a/apps/backstage/serviceaccount.yaml b/apps/backstage/serviceaccount.yaml new file mode 100644 index 0000000..b427db8 --- /dev/null +++ b/apps/backstage/serviceaccount.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: backstage + namespace: backstage +automountServiceAccountToken: false diff --git a/clusters/homelab/apps/backstage.yaml b/clusters/homelab/apps/backstage.yaml new file mode 100644 index 0000000..8445723 --- /dev/null +++ b/clusters/homelab/apps/backstage.yaml @@ -0,0 +1,22 @@ +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: backstage + namespace: flux-system +spec: + dependsOn: + - name: envoy-gateway + - name: external-secrets + healthChecks: + - apiVersion: apps/v1 + kind: Deployment + name: backstage + namespace: backstage + interval: 10m + path: ./apps/backstage + prune: true + sourceRef: + kind: GitRepository + name: flux-system + timeout: 5m + wait: true diff --git a/clusters/homelab/kustomization.yaml b/clusters/homelab/kustomization.yaml index 00dcccf..cc51a53 100644 --- a/clusters/homelab/kustomization.yaml +++ b/clusters/homelab/kustomization.yaml @@ -7,6 +7,7 @@ resources: - apps/envoy-gateway.yaml - apps/external-secrets.yaml - apps/gitea.yaml + - apps/backstage.yaml - apps/http-echo.yaml - apps/openebs.yaml - apps/nats.yaml