# yaml-language-server: $schema=https://raw.githubusercontent.com/bjw-s/helm-charts/main/charts/other/app-template/schemas/helmrelease-helm-v2beta2.schema.json
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: ganymede
  namespace: default
spec:
  interval: 5m
  chart:
    spec:
      chart: app-template
      version: 3.1.0
      sourceRef:
        kind: HelmRepository
        name: bjws-charts
        namespace: flux-system

  values:
    controllers:
      main:
#        pod:
#          securityContext:
#            runAsNonRoot: true
#            runAsUser: 10000
#            runAsGroup: 10000
#            fsGroup: 10000
#            fsGroupChangePolicy: OnRootMismatch

        initContainers:
          copy-config:
            image:
              repository: alpine
              tag: 3.20

            command: [ "sh", "-c", "cat /ganymede-config.json && cp -v /ganymede-config.json /data/config.json" ]

        containers:
          api:
            image:
              repository: ghcr.io/zibbp/ganymede
              tag: v2.3.2

            env:
            - name: TZ
              value: "America/New_York" # Set to your timezone
            - name: DB_HOST
              value: "postgresql.database"
            - name: DB_PORT
              value: "5432"
            - name: DB_USER
              value: "ganymede"
            - name: DB_PASS
              secretKeyRef:
                name: ganymede-env
                key: dbPassword
            - name: DB_NAME
              value: "ganymede"
            - name: DB_SSL
              value: "disable"
            - name: JWT_SECRET
              secretKeyRef:
                name: ganymede-env
                key: jwtSecret
            - name: JWT_REFRESH_SECRET
              secretKeyRef:
                name: ganymede-env
                key: jwtRefreshSecret
            - name: TWITCH_CLIENT_ID
              secretKeyRef:
                name: ganymede-env
                key: twitchClientId
            - name: TWITCH_CLIENT_SECRET
              secretKeyRef:
                name: ganymede-env
                key: twitchClientSecret
            - name: FRONTEND_HOST
              value: https://twvods.${SECRET_NEW_DOMAIN}
            - name: OAUTH_PROVIDER_URL
              value: "https://auth.${SECRET_NEW_DOMAIN}/application/o/ganymede/.well-known/openid-configuration"
            - name: OAUTH_CLIENT_ID
              secretKeyRef:
                name: ganymede-env
                key: oauthClientId
            - name: OAUTH_CLIENT_SECRET
              secretKeyRef:
                name: ganymede-env
                key: oauthClientSecret
            - name: OAUTH_REDIRECT_URL
              value: "https://twvods.${SECRET_NEW_DOMAIN}/api/v1/auth/oauth/callback"
            - name: TEMPORAL_URL
              value: "temporal:7233"

            # WORKER
            - name: MAX_CHAT_DOWNLOAD_EXECUTIONS
              value: "5"
            - name: MAX_CHAT_RENDER_EXECUTIONS
              value: "3"
            - name: MAX_VIDEO_DOWNLOAD_EXECUTIONS
              value: "5"
            - name: MAX_VIDEO_CONVERT_EXECUTIONS
              value: "3"

          frontend:
            image:
              repository: ghcr.io/zibbp/ganymede-frontend
              tag: 3.0.0

            env:
            - name: API_URL
              # /api will be added to this
              value: "https://twvods.${SECRET_NEW_DOMAIN}" # Points to the API service
            - name: CDN_URL
              # /vods will be added to this
              value: "https://twvods.${SECRET_NEW_DOMAIN}" # Points to the CDN service
            - name: SHOW_SSO_LOGIN_BUTTON
              value: "true" # show/hide SSO login button on login page
            - name: FORCE_SSO_AUTH
              value: "false" # force SSO auth for all users (bypasses login page and redirects to SSO)
            - name: REQUIRE_LOGIN
              value: "false" # require login to view videos

          nginx:
            image:
              repository: nginxinc/nginx-unprivileged
              tag: 1.27.0-alpine

    service:
      app:
        controller: main

        ports:
          nginx:
            port: 8080

          frontend:
            port: 3000

          api:
            port: 4000

    ingress:
      main:
        annotations:
          cert-manager.io/cluster-issuer: letsencrypt-production
          traefik.ingress.kubernetes.io/router.entrypoints: websecure

        hosts:
        - host: twvods.${SECRET_NEW_DOMAIN}
          paths:
          - path: /
            service:
              identifier: app
              port: frontend
          - path: /api
            service:
              identifier: app
              port: api
          - path: /vods
            service:
              identifier: app
              port: nginx

    persistence:
      vods:
        type: persistentVolumeClaim
        size: 50Gi
        retain: true
        storageClass: mainpool-hostpath
        accessMode: ReadWriteOnce
        globalMounts:
        - path: /vods

      ganymede-data:
        type: persistentVolumeClaim
        size: 5Gi
        retain: true
        storageClass: mainpool-hostpath
        accessMode: ReadWriteOnce
        advancedMounts:
          main: # controller name
            api: # container name
            - path: /data

      ganymede-logs:
        type: persistentVolumeClaim
        size: 5Gi
        retain: true
        storageClass: mainpool-hostpath
        accessMode: ReadWriteOnce
        advancedMounts:
          main: # controller name
            api: # container name
            - path: /logs

      nginx-conf:
        name: ganymede-nginx-conf
        type: configMap
        defaultMode: 0664
        advancedMounts:
          main: # controller name
            nginx: # container name
            - subPath: nginx.conf
              path: /etc/nginx/nginx.conf

      ganymede-temp-conf:
        type: emptyDir
        advancedMounts:
          main: # controller name
            api: # container name
            - path: /data
            copy-config: # container name
            - path: /data

      ganymede-conf:
        name: ganymede-conf
        type: configMap
        defaultMode: 0777
        advancedMounts:
          main: # controller name
            copy-config: # container name
            - subPath: config.json
              path: /ganymede-config.json