Skip to content

feat: h&s changes - #82

Draft
Ben754444 wants to merge 10 commits into
mainfrom
feat/h&s-changes
Draft

feat: h&s changes#82
Ben754444 wants to merge 10 commits into
mainfrom
feat/h&s-changes

Conversation

@Ben754444

Copy link
Copy Markdown
Contributor

Description

Describe what work this pull request includes. There's no need to list line-by-line (the change list will do that);
instead just summarise each bit of functionality that's been added, edited or removed. Good code should be
self-documenting (aka, show what it's achieving) so focus on the explaining why you took the approach you did. We also
recommend highlighting any specific testing that may need to be performed on the staging server before it's deployed to
production.

There's no need to write an essay - we welcome bullet points over prose.

Ticket:

Checklist

Important

Make sure you follow these wherever possible; if you have then check it off, and if not then use a strikethrough (~)
to cross it off. This will help the reviewer identify any changes that may have been missed.

General

  • Documentation updated/written (if applicable)
  • Good coverage of tests
  • Updated docker config
  • CI/CD config updated
  • Docker image builds and boots

Principles

  • DRY, SOLID and Clean
  • Follows language code style
  • Use consistent vocabulary
  • Any tech debt justified and ticketed where appropriate
  • All data access audited
  • Appropriate level of logging

@github-actions

github-actions Bot commented Jan 2, 2026

Copy link
Copy Markdown

helm chart: staging

🟢 lint
==> Linting chart
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, 0 chart(s) failed


🟢 template
---
# Source: website-v4/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: staging-website-v4
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
data:
  APP_ENV: 'staging'
  APP_DEBUG: 'false'
  APP_URL: 'https://staging.bts-crew.com'
  LOG_CHANNEL: 'monolog'
  DB_CONNECTION: 'mysql'
  DB_HOST: 'mariadb-10-4'
  DB_PORT: '3306'
  DB_DATABASE: 'website_v4_staging'
  BROADCAST_DRIVER: 'log'
  CACHE_DRIVER: 'file'
  SESSION_DRIVER: 'database'
  QUEUE_DRIVER: 'database'
  MAIL_DRIVER: 'smtp'
  MAIL_HOST: 'maildev'
  MAIL_PORT: '1025'
  MAIL_ENCRYPTION: 'none'
  MAIL_FROM_ADDRESS: 'website@bts-crew.com'
  MAIL_FROM_NAME: 'Backstage Website'
  GOOGLE_ANALYTICS_CODE: 'UA-150311689-1'
  FINANCE_DB_ADD_URL: 'https://bts-finance.co.uk/events.json'
  FINANCE_DB_EM_URL: 'https://bts-finance.co.uk/emfinance/'
  BACKUP_DIRECTORY: 'backups'
  LINK_EVENT_RA: 'https://docs.google.com/forms/d/e/1FAIpQLSdvaBOleqmMPlVjoKsMpIcwzyJHWUNiNoI_a5d0PT_mLF_xyQ/viewform'
  LINK_EVENT_REPORT: 'https://docs.google.com/a/bts-crew.com/forms/d/e/1FAIpQLSekw6oEojBdD1REd2krli3U-4BYWNG9zfThCmTJKc1A1OaR3g/viewform'
---
# Source: website-v4/templates/storage.yaml
########################################################################################################################
# backups
########################################################################################################################
apiVersion: v1
kind: PersistentVolume
metadata:
  name: backstage-staging-website-v4-backups
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: backups
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: aws-efs
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-05929b3d75352ac77:/website-v4/staging/backups
    volumeAttributes:
      encryptInTransit: 'true'
  capacity:
    storage: 10Gi
---
# Source: website-v4/templates/storage.yaml
########################################################################################################################
# breakages
########################################################################################################################
apiVersion: v1
kind: PersistentVolume
metadata:
  name: backstage-staging-website-v4-breakages
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: breakages
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: aws-efs
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-05929b3d75352ac77:/website-v4/staging/breakages
    volumeAttributes:
      encryptInTransit: 'true'
  capacity:
    storage: 10Gi
---
# Source: website-v4/templates/storage.yaml
########################################################################################################################
# elections
########################################################################################################################
apiVersion: v1
kind: PersistentVolume
metadata:
  name: backstage-staging-website-v4-elections
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: elections
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: aws-efs
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-05929b3d75352ac77:/website-v4/staging/elections
    volumeAttributes:
      encryptInTransit: 'true'
  capacity:
    storage: 10Gi
---
# Source: website-v4/templates/storage.yaml
########################################################################################################################
# profiles
########################################################################################################################
apiVersion: v1
kind: PersistentVolume
metadata:
  name: backstage-staging-website-v4-profiles
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: profiles
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: aws-efs
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-05929b3d75352ac77:/website-v4/staging/profiles
    volumeAttributes:
      encryptInTransit: 'true'
  capacity:
    storage: 10Gi
---
# Source: website-v4/templates/storage.yaml
########################################################################################################################
# resources
########################################################################################################################
apiVersion: v1
kind: PersistentVolume
metadata:
  name: backstage-staging-website-v4-resources
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: resources
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: aws-efs
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-05929b3d75352ac77:/website-v4/staging/resources
    volumeAttributes:
      encryptInTransit: 'true'
  capacity:
    storage: 10Gi
---
# Source: website-v4/templates/storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: staging-website-v4-backups
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: backups
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: aws-efs
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      backstage.uk/environment: staging
      backstage.uk/component: website-v4
      backstage.uk/storage-name: backups
---
# Source: website-v4/templates/storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: staging-website-v4-breakages
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: breakages
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: aws-efs
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      backstage.uk/environment: staging
      backstage.uk/component: website-v4
      backstage.uk/storage-name: breakages
---
# Source: website-v4/templates/storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: staging-website-v4-elections
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: elections
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: aws-efs
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      backstage.uk/environment: staging
      backstage.uk/component: website-v4
      backstage.uk/storage-name: elections
---
# Source: website-v4/templates/storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: staging-website-v4-profiles
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: profiles
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: aws-efs
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      backstage.uk/environment: staging
      backstage.uk/component: website-v4
      backstage.uk/storage-name: profiles
---
# Source: website-v4/templates/storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: staging-website-v4-resources
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: resources
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: aws-efs
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      backstage.uk/environment: staging
      backstage.uk/component: website-v4
      backstage.uk/storage-name: resources
---
# Source: website-v4/templates/ingress.yaml
apiVersion: v1
kind: Service
metadata:
  name: staging-website-v4
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
spec:
  type: ClusterIP
  selector:
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
  ports:
    - port: 8080
---
# Source: website-v4/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: staging-website-v4
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
spec:
  selector:
    matchLabels:
      backstage.uk/environment: staging
      backstage.uk/component: website-v4
  template:
    metadata:
      name: staging-website-v4
      labels:
        helm.sh/chart: website-v4-0.0.0
        app.kubernetes.io/name: staging-website-v4
        app.kubernetes.io/instance: website-v4
        backstage.uk/environment: staging
        backstage.uk/component: website-v4
        app.kubernetes.io/managed-by: Helm
    spec:
      containers:
        - name: app
          image: '685624812686.dkr.ecr.eu-west-1.amazonaws.com/backstage-website-v4:9838c2a872bea11ead88baa91724f48c939305f6'
          imagePullPolicy: Always
          envFrom:
            - secretRef:
                name: staging-website-v4
            - configMapRef:
                name: staging-website-v4
          volumeMounts:
            - name: backups
              mountPath: /var/www/storage/app/backups
            - name: profiles
              mountPath: /var/www/public/images/profiles
            - name: elections
              mountPath: /var/www/resources/elections
            - name: resources
              mountPath: /var/www/resources/resources
            - name: breakages
              mountPath: /var/www/resources/breakages
          resources:
            requests:
              memory: '256Mi'
            limits:
              memory: '1Gi'
      # volumes need to be declared using a PVC and PV in the storage.yaml file
      volumes:
        - name: backups
          persistentVolumeClaim:
            claimName: staging-website-v4-backups
        - name: profiles
          persistentVolumeClaim:
            claimName: staging-website-v4-profiles
        - name: elections
          persistentVolumeClaim:
            claimName: staging-website-v4-elections
        - name: resources
          persistentVolumeClaim:
            claimName: staging-website-v4-resources
        - name: breakages
          persistentVolumeClaim:
            claimName: staging-website-v4-breakages
      nodeSelector:
        bnjns.uk/owner: backstage
      tolerations:
        - key: bnjns.uk/reserved-for
          operator: Equal
          value: backstage
          effect: NoSchedule
---
# Source: website-v4/templates/cron.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: staging-website-v4-scheduled-commands
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
spec:
  schedule: '0/15 * * * *'
  startingDeadlineSeconds: 15
  successfulJobsHistoryLimit: 1
  failedJobsHistoryLimit: 1
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        metadata:
          name: staging-website-v4-scheduled-commands
          labels:
            helm.sh/chart: website-v4-0.0.0
            app.kubernetes.io/name: staging-website-v4
            app.kubernetes.io/instance: website-v4
            backstage.uk/environment: staging
            backstage.uk/component: website-v4
            app.kubernetes.io/managed-by: Helm
        spec:
          containers:
            - name: app
              image: '685624812686.dkr.ecr.eu-west-1.amazonaws.com/backstage-website-v4:9838c2a872bea11ead88baa91724f48c939305f6'
              imagePullPolicy: IfNotPresent
              command:
                - /usr/local/bin/php
              args:
                - /var/www/artisan
                - schedule:run
              envFrom:
                - secretRef:
                    name: staging-website-v4
                - configMapRef:
                    name: staging-website-v4
              volumeMounts:
                - name: backups
                  mountPath: /var/www/storage/app/backups
                - name: profiles
                  mountPath: /var/www/public/images/profiles
                - name: elections
                  mountPath: /var/www/resources/elections
                - name: resources
                  mountPath: /var/www/resources/resources
                - name: breakages
                  mountPath: /var/www/resources/breakages
          restartPolicy: Never
          # volumes need to be declared using a PVC and PV in the storage.yaml file
          volumes:
            - name: backups
              persistentVolumeClaim:
                claimName: staging-website-v4-backups
            - name: profiles
              persistentVolumeClaim:
                claimName: staging-website-v4-profiles
            - name: elections
              persistentVolumeClaim:
                claimName: staging-website-v4-elections
            - name: resources
              persistentVolumeClaim:
                claimName: staging-website-v4-resources
            - name: breakages
              persistentVolumeClaim:
                claimName: staging-website-v4-breakages
          nodeSelector:
            bnjns.uk/owner: backstage
          tolerations:
            - key: bnjns.uk/reserved-for
              operator: Equal
              value: backstage
              effect: NoSchedule
---
# Source: website-v4/templates/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: staging-website-v4
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
    external-dns.alpha.kubernetes.io/hostname: staging.bts-crew.com
    traefik.ingress.kubernetes.io/router.middlewares: default-redirect-http-to-https@kubernetescrd,backstage-basic-auth@kubernetescrd
spec:
  ingressClassName: traefik
  rules:
    - host: staging.bts-crew.com
      http:
        paths:
          - backend:
              service:
                name: staging-website-v4
                port:
                  number: 8080
            path: /
            pathType: Prefix
  tls:
    - hosts:
        - staging.bts-crew.com
      secretName: staging-website-v4-tls
---
# Source: website-v4/templates/secrets.yaml
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
  name: staging-website-v4
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: staging-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: staging
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
spec:
  secretStoreRef:
    kind: ClusterSecretStore
    name: aws-ssm
  refreshInterval: 15m
  data:
    - secretKey: APP_KEY
      remoteRef:
        key: /backstage/staging/website-v4/app-key
    - secretKey: APP_LOG_LEVEL
      remoteRef:
        key: /backstage/staging/website-v4/log-level
    - secretKey: DB_USERNAME
      remoteRef:
        key: /backstage/staging/website-v4/db-credentials
        property: username
    - secretKey: DB_PASSWORD
      remoteRef:
        key: /backstage/staging/website-v4/db-credentials
        property: password
    - secretKey: YOUTUBE_API_KEY
      remoteRef:
        key: /backstage/staging/website-v4/youtube-api-key
    - secretKey: NOCAPTCHA_SITEKEY
      remoteRef:
        key: /backstage/staging/website-v4/nocaptcha-config
        property: siteKey
    - secretKey: NOCAPTCHA_SECRET
      remoteRef:
        key: /backstage/staging/website-v4/nocaptcha-config
        property: secret
    - secretKey: BUGSNAG_API_KEY
      remoteRef:
        key: /backstage/staging/website-v4/bugsnag-api-key
    - secretKey: FINANCE_DB_KEY
      remoteRef:
        key: /backstage/staging/website-v4/finance-db-key
    - secretKey: BACKUP_WEBHOOK
      remoteRef:
        key: /backstage/staging/website-v4/backup-webhook

🟢 validate
Summary: 16 resources found parsing stdin - Valid: 15, Invalid: 0, Errors: 0, Skipped: 1


@github-actions

github-actions Bot commented Jan 2, 2026

Copy link
Copy Markdown

helm chart: prod

🟢 lint
==> Linting chart
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, 0 chart(s) failed


🟢 template
---
# Source: website-v4/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prod-website-v4
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
data:
  APP_ENV: 'prod'
  APP_DEBUG: 'false'
  APP_URL: 'https://bts-crew.com'
  LOG_CHANNEL: 'stack'
  DB_CONNECTION: 'mysql'
  DB_HOST: 'mariadb-10-4'
  DB_PORT: '3306'
  DB_DATABASE: 'website_v4_prod'
  BROADCAST_DRIVER: 'log'
  CACHE_DRIVER: 'file'
  SESSION_DRIVER: 'database'
  QUEUE_DRIVER: 'database'
  MAIL_DRIVER: 'smtp'
  MAIL_HOST: 'smtp.gmail.com'
  MAIL_PORT: '587'
  MAIL_ENCRYPTION: 'tls'
  MAIL_FROM_ADDRESS: 'website@bts-crew.com'
  MAIL_FROM_NAME: 'Backstage Website'
  GOOGLE_ANALYTICS_CODE: 'UA-150311689-2'
  FINANCE_DB_ADD_URL: 'https://bts-finance.co.uk/events.json'
  FINANCE_DB_EM_URL: 'https://bts-finance.co.uk/emfinance/'
  BACKUP_DIRECTORY: 'backups'
  LINK_EVENT_RA: 'https://docs.google.com/forms/d/e/1FAIpQLSdvaBOleqmMPlVjoKsMpIcwzyJHWUNiNoI_a5d0PT_mLF_xyQ/viewform'
  LINK_EVENT_REPORT: 'https://docs.google.com/a/bts-crew.com/forms/d/e/1FAIpQLSekw6oEojBdD1REd2krli3U-4BYWNG9zfThCmTJKc1A1OaR3g/viewform'
---
# Source: website-v4/templates/storage.yaml
########################################################################################################################
# backups
########################################################################################################################
apiVersion: v1
kind: PersistentVolume
metadata:
  name: backstage-prod-website-v4-backups
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: backups
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: aws-efs
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-05929b3d75352ac77:/website-v4/prod/backups
    volumeAttributes:
      encryptInTransit: 'true'
  capacity:
    storage: 10Gi
---
# Source: website-v4/templates/storage.yaml
########################################################################################################################
# breakages
########################################################################################################################
apiVersion: v1
kind: PersistentVolume
metadata:
  name: backstage-prod-website-v4-breakages
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: breakages
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: aws-efs
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-05929b3d75352ac77:/website-v4/prod/breakages
    volumeAttributes:
      encryptInTransit: 'true'
  capacity:
    storage: 10Gi
---
# Source: website-v4/templates/storage.yaml
########################################################################################################################
# elections
########################################################################################################################
apiVersion: v1
kind: PersistentVolume
metadata:
  name: backstage-prod-website-v4-elections
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: elections
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: aws-efs
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-05929b3d75352ac77:/website-v4/prod/elections
    volumeAttributes:
      encryptInTransit: 'true'
  capacity:
    storage: 10Gi
---
# Source: website-v4/templates/storage.yaml
########################################################################################################################
# profiles
########################################################################################################################
apiVersion: v1
kind: PersistentVolume
metadata:
  name: backstage-prod-website-v4-profiles
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: profiles
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: aws-efs
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-05929b3d75352ac77:/website-v4/prod/profiles
    volumeAttributes:
      encryptInTransit: 'true'
  capacity:
    storage: 10Gi
---
# Source: website-v4/templates/storage.yaml
########################################################################################################################
# resources
########################################################################################################################
apiVersion: v1
kind: PersistentVolume
metadata:
  name: backstage-prod-website-v4-resources
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: resources
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: aws-efs
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-05929b3d75352ac77:/website-v4/prod/resources
    volumeAttributes:
      encryptInTransit: 'true'
  capacity:
    storage: 10Gi
---
# Source: website-v4/templates/storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: prod-website-v4-backups
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: backups
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: aws-efs
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      backstage.uk/environment: prod
      backstage.uk/component: website-v4
      backstage.uk/storage-name: backups
---
# Source: website-v4/templates/storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: prod-website-v4-breakages
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: breakages
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: aws-efs
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      backstage.uk/environment: prod
      backstage.uk/component: website-v4
      backstage.uk/storage-name: breakages
---
# Source: website-v4/templates/storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: prod-website-v4-elections
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: elections
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: aws-efs
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      backstage.uk/environment: prod
      backstage.uk/component: website-v4
      backstage.uk/storage-name: elections
---
# Source: website-v4/templates/storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: prod-website-v4-profiles
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: profiles
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: aws-efs
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      backstage.uk/environment: prod
      backstage.uk/component: website-v4
      backstage.uk/storage-name: profiles
---
# Source: website-v4/templates/storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: prod-website-v4-resources
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
    backstage.uk/storage-name: resources
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: aws-efs
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      backstage.uk/environment: prod
      backstage.uk/component: website-v4
      backstage.uk/storage-name: resources
---
# Source: website-v4/templates/ingress.yaml
apiVersion: v1
kind: Service
metadata:
  name: prod-website-v4
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
spec:
  type: ClusterIP
  selector:
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
  ports:
    - port: 8080
---
# Source: website-v4/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prod-website-v4
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
spec:
  selector:
    matchLabels:
      backstage.uk/environment: prod
      backstage.uk/component: website-v4
  template:
    metadata:
      name: prod-website-v4
      labels:
        helm.sh/chart: website-v4-0.0.0
        app.kubernetes.io/name: prod-website-v4
        app.kubernetes.io/instance: website-v4
        backstage.uk/environment: prod
        backstage.uk/component: website-v4
        app.kubernetes.io/managed-by: Helm
    spec:
      containers:
        - name: app
          image: '685624812686.dkr.ecr.eu-west-1.amazonaws.com/backstage-website-v4:9838c2a872bea11ead88baa91724f48c939305f6'
          imagePullPolicy: Always
          envFrom:
            - secretRef:
                name: prod-website-v4
            - configMapRef:
                name: prod-website-v4
          volumeMounts:
            - name: backups
              mountPath: /var/www/storage/app/backups
            - name: profiles
              mountPath: /var/www/public/images/profiles
            - name: elections
              mountPath: /var/www/resources/elections
            - name: resources
              mountPath: /var/www/resources/resources
            - name: breakages
              mountPath: /var/www/resources/breakages
          resources:
            requests:
              memory: '256Mi'
            limits:
              memory: '1Gi'
      # volumes need to be declared using a PVC and PV in the storage.yaml file
      volumes:
        - name: backups
          persistentVolumeClaim:
            claimName: prod-website-v4-backups
        - name: profiles
          persistentVolumeClaim:
            claimName: prod-website-v4-profiles
        - name: elections
          persistentVolumeClaim:
            claimName: prod-website-v4-elections
        - name: resources
          persistentVolumeClaim:
            claimName: prod-website-v4-resources
        - name: breakages
          persistentVolumeClaim:
            claimName: prod-website-v4-breakages
      nodeSelector:
        bnjns.uk/owner: backstage
      tolerations:
        - key: bnjns.uk/reserved-for
          operator: Equal
          value: backstage
          effect: NoSchedule
---
# Source: website-v4/templates/cron.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: prod-website-v4-scheduled-commands
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
spec:
  schedule: '0/15 * * * *'
  startingDeadlineSeconds: 15
  successfulJobsHistoryLimit: 1
  failedJobsHistoryLimit: 1
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        metadata:
          name: prod-website-v4-scheduled-commands
          labels:
            helm.sh/chart: website-v4-0.0.0
            app.kubernetes.io/name: prod-website-v4
            app.kubernetes.io/instance: website-v4
            backstage.uk/environment: prod
            backstage.uk/component: website-v4
            app.kubernetes.io/managed-by: Helm
        spec:
          containers:
            - name: app
              image: '685624812686.dkr.ecr.eu-west-1.amazonaws.com/backstage-website-v4:9838c2a872bea11ead88baa91724f48c939305f6'
              imagePullPolicy: IfNotPresent
              command:
                - /usr/local/bin/php
              args:
                - /var/www/artisan
                - schedule:run
              envFrom:
                - secretRef:
                    name: prod-website-v4
                - configMapRef:
                    name: prod-website-v4
              volumeMounts:
                - name: backups
                  mountPath: /var/www/storage/app/backups
                - name: profiles
                  mountPath: /var/www/public/images/profiles
                - name: elections
                  mountPath: /var/www/resources/elections
                - name: resources
                  mountPath: /var/www/resources/resources
                - name: breakages
                  mountPath: /var/www/resources/breakages
          restartPolicy: Never
          # volumes need to be declared using a PVC and PV in the storage.yaml file
          volumes:
            - name: backups
              persistentVolumeClaim:
                claimName: prod-website-v4-backups
            - name: profiles
              persistentVolumeClaim:
                claimName: prod-website-v4-profiles
            - name: elections
              persistentVolumeClaim:
                claimName: prod-website-v4-elections
            - name: resources
              persistentVolumeClaim:
                claimName: prod-website-v4-resources
            - name: breakages
              persistentVolumeClaim:
                claimName: prod-website-v4-breakages
          nodeSelector:
            bnjns.uk/owner: backstage
          tolerations:
            - key: bnjns.uk/reserved-for
              operator: Equal
              value: backstage
              effect: NoSchedule
---
# Source: website-v4/templates/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: prod-website-v4
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
    external-dns.alpha.kubernetes.io/hostname: bts-crew.com,www.bts-crew.com
    traefik.ingress.kubernetes.io/router.middlewares: default-redirect-http-to-https@kubernetescrd
spec:
  ingressClassName: traefik
  rules:
    - host: bts-crew.com
      http:
        paths:
          - backend:
              service:
                name: prod-website-v4
                port:
                  number: 8080
            path: /
            pathType: Prefix
    - host: www.bts-crew.com
      http:
        paths:
          - backend:
              service:
                name: prod-website-v4
                port:
                  number: 8080
            path: /
            pathType: Prefix
  tls:
    - hosts:
        - bts-crew.com
        - www.bts-crew.com
      secretName: prod-website-v4-tls
---
# Source: website-v4/templates/secrets.yaml
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
  name: prod-website-v4
  labels:
    helm.sh/chart: website-v4-0.0.0
    app.kubernetes.io/name: prod-website-v4
    app.kubernetes.io/instance: website-v4
    backstage.uk/environment: prod
    backstage.uk/component: website-v4
    app.kubernetes.io/managed-by: Helm
spec:
  secretStoreRef:
    kind: ClusterSecretStore
    name: aws-ssm
  refreshInterval: 15m
  data:
    - secretKey: APP_KEY
      remoteRef:
        key: /backstage/prod/website-v4/app-key
    - secretKey: APP_LOG_LEVEL
      remoteRef:
        key: /backstage/prod/website-v4/log-level
    - secretKey: DB_USERNAME
      remoteRef:
        key: /backstage/prod/website-v4/db-credentials
        property: username
    - secretKey: DB_PASSWORD
      remoteRef:
        key: /backstage/prod/website-v4/db-credentials
        property: password
    - secretKey: MAIL_USERNAME
      remoteRef:
        key: /backstage/prod/website-v4/smtp-credentials
        property: username
    - secretKey: MAIL_PASSWORD
      remoteRef:
        key: /backstage/prod/website-v4/smtp-credentials
        property: password
    - secretKey: YOUTUBE_API_KEY
      remoteRef:
        key: /backstage/prod/website-v4/youtube-api-key
    - secretKey: NOCAPTCHA_SITEKEY
      remoteRef:
        key: /backstage/prod/website-v4/nocaptcha-config
        property: siteKey
    - secretKey: NOCAPTCHA_SECRET
      remoteRef:
        key: /backstage/prod/website-v4/nocaptcha-config
        property: secret
    - secretKey: BUGSNAG_API_KEY
      remoteRef:
        key: /backstage/prod/website-v4/bugsnag-api-key
    - secretKey: FINANCE_DB_KEY
      remoteRef:
        key: /backstage/prod/website-v4/finance-db-key
    - secretKey: BACKUP_WEBHOOK
      remoteRef:
        key: /backstage/prod/website-v4/backup-webhook

🟢 validate
Summary: 16 resources found parsing stdin - Valid: 15, Invalid: 0, Errors: 0, Skipped: 1


@github-actions

github-actions Bot commented Jan 2, 2026

Copy link
Copy Markdown

Summary

Tests 📝 Passed ✅ Failed ❌ Skipped ⏭️ Other ❓ Flaky 🍂 Duration ⏱️
6 6 0 0 0 0 not captured

Tests

View All Tests
Test Name Status Flaky Duration
Modules\StaticPage\tests\Feature\StaticPageTest - it should show the homepage 498ms
Modules\StaticPage\tests\Feature\StaticPageTest - it should show the about page 161ms
Modules\StaticPage\tests\Feature\StaticPageTest - it should show the faq page 165ms
Modules\StaticPage\tests\Feature\StaticPageTest - it should show the links page 175ms
Modules\StaticPage\tests\Feature\StaticPageTest - it should show the privacy policy page 178ms
Modules\StaticPage\tests\Feature\StaticPageTest - it should show the terms and conditions page 241ms

Github Test Reporter by CTRF 💚

🔄 This comment has been updated

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants