groups:
  - name: Nextcloud Configuration
    description: Configure Nextcloud
  - name: Advanced Pod Configuration
    description: Configure Advanced Pod Options for Nextcloud
  - name: Network Configuration
    description: Configure Network for Nextcloud
  - name: Storage Configuration
    description: Configure Storage for Nextcloud
  - name: Resources Configuration
    description: Configure Resources for Nextcloud

portals:
  web_portal:
    protocols:
      - "$kubernetes-resource_configmap_portal_protocol"
    host:
      - "$kubernetes-resource_configmap_portal_host"
    ports:
      - "$kubernetes-resource_configmap_portal_port"
    path: "$kubernetes-resource_configmap_portal_path"

questions:
  - variable: ncConfig
    label: ""
    group: Nextcloud Configuration
    schema:
      type: dict
      attrs:
        - variable: adminUser
          label: Admin User
          description: The Nextcloud admin user.
          schema:
            type: string
            default: ""
            required: true
        - variable: adminPassword
          label: Admin Password
          description: The Nextcloud admin password.
          schema:
            type: string
            default: ""
            private: true
            required: true
        - variable: host
          label: Host
          description: |
            Nextcloud host to create application URLs</br>
            Examples: </br>
            cloud.domain.com:30001</br>
            cloud.domain.com (if you use port 443 externally)</br>
            192.168.1.100:9001 (replace ip and port with your own)</br>
          schema:
            type: string
            $ref:
              - "definitions/nodeIP"
        - variable: dataDir
          label: "Nextcloud data directory"
          description: "Configures the data directory where Nextcloud stores all files from the users. The path refers to the path inside the container"
          schema:
            type: path
            default: "/var/www/html/data"
            required: true
        - variable: commands
          label: Commands
          description: Commands to run in the Nextcloud container
          schema:
            type: list
            items:
              - variable: command
                label: Command
                schema:
                  type: string
                  required: true
                  enum:
                    - value: ffmpeg
                      description: ffmpeg
                    - value: smbclient
                      description: smbclient
        - variable: maxUploadLimit
          label: Max Upload Size (Giga Bytes)
          description: |
            Applies the timeout to the following settings:</br>
            - client_max_body_size in nginx</br>
            - post_max_size and upload_max_filesize in php</br>
          schema:
            type: int
            default: 3
            min: 1
            required: true
        - variable: maxExecutionTime
          label: Max Execution Time (Seconds)
          description: Configures the max execution time of php
          schema:
            type: int
            default: 30
            min: 30
            required: true
        - variable: phpMemoryLimit
          label: PHP Memory Limit (Mega Bytes)
          description: Configures the memory limit of php
          schema:
            type: int
            default: 512
            min: 128
            max: 4096
            required: true
        - variable: opCacheMemoryConsumption
          label: Opcache Memory Consumption (Mega Bytes)
          description: Configures the memory consumption of the opcache
          schema:
            type: int
            min: 128
            max: 1024
            default: 128
            required: true
        - variable: cron
          label: Cron
          description: Configures the cron job for Nextcloud
          schema:
            type: dict
            attrs:
              - variable: enabled
                label: Enabled
                schema:
                  type: boolean
                  default: true
                  required: true
              - variable: schedule
                label: Schedule
                schema:
                  type: string
                  show_if: [["enabled", "=", true]]
                  default: "*/15 * * * *"
                  required: true
        - variable: additionalEnvs
          label: Additional Environment Variables
          description: Configure additional environment variables for Nextcloud.
          schema:
            type: list
            default: []
            items:
              - variable: env
                label: Environment Variable
                schema:
                  type: dict
                  attrs:
                    - variable: name
                      label: Name
                      schema:
                        type: string
                        required: true
                    - variable: value
                      label: Value
                      schema:
                        type: string
                        required: true

  - variable: podOptions
    label: ""
    group: Advanced Pod Configuration
    schema:
      type: dict
      attrs:
        - variable: dnsConfig
          label: Advanced DNS Configuration
          schema:
            type: dict
            attrs:
              - variable: options
                label: DNS Options
                schema:
                  type: list
                  items:
                    - variable: optionsEntry
                      label: DNS Option Entry
                      schema:
                        type: dict
                        attrs:
                          - variable: name
                            label: Option Name
                            schema:
                              type: string
                              required: true
                          - variable: value
                            label: Option Value
                            schema:
                              type: string
                              required: true

  - variable: ncNetwork
    label: ""
    group: Network Configuration
    schema:
      type: dict
      attrs:
        - variable: webPort
          label: Web Port
          description: The port for the Nextcloud Web UI.
          schema:
            type: int
            default: 9001
            min: 9000
            max: 65535
            required: true
        - variable: certificateID
          label: Certificate
          description: The certificate to use for Nextcloud
          schema:
            type: int
            "null": true
            $ref:
              - "definitions/certificate"
        - variable: nginx
          label: Nginx Configuration
          schema:
            type: dict
            show_if: [["certificateID", "!=", null]]
            attrs:
              - variable: proxyTimeouts
                label: Proxy timeouts (Seconds)
                description: |
                  Applies the timeout to the following settings:</br>
                  - proxy_connect_timeout</br>
                  - proxy_send_timeout</br>
                  - proxy_read_timeout</br>
                schema:
                  type: int
                  min: 30
                  default: 60
                  required: true
              - variable: useDifferentAccessPort
                label: Use different port for URL rewrites
                description: |
                  If enabled, the URL rewrite will use [Access Port] defined below instead of the [Node Port].</br>
                  Note that Nextcloud will still listen on the [Node Port]. (Default 9001)
                schema:
                  type: boolean
                  default: false
              - variable: externalAccessPort
                label: External Access Port
                schema:
                  type: int
                  show_if: [["useDifferentAccessPort", "=", true]]
                  min: 443
                  max: 65535
                  default: 443
                  required: true

  - variable: ncStorage
    label: ""
    group: Storage Configuration
    schema:
      type: dict
      attrs:
        # Dummy variable so we can skip "fixing" migration on new installations
        - variable: migrationFixed
          label: ""
          schema:
            type: boolean
            default: true
            hidden: true
        - variable: isDataInTheSameVolume
          label: "Pre v2 Storage Structure (See the tooltip for more information)"
          description: |
            Do NOT check this, if this is a new installation.</br>
            If this is checked, means that this is an installation coming from a previous version (v1.x.x).<br/>
            In order to have backwards compatibility, the older storage structure was kept for this installation.<br/>
            If you want to utilize the new storage structure, move 'data' in a separate directory or dataset.
            Change the 'Nextcloud UserData' configuration below to point to the new location and then uncheck this checkbox.
            <br/><br/>
            You will NOT likely want to change that if your setup uses ixVolume as storage.
          schema:
            type: boolean
            default: false
        - variable: html
          label: Nextcloud AppData Storage (HTML, Custom Themes, Apps, etc.)
          description: The path to store Nextcloud HTML and AppData.
          schema:
            type: dict
            attrs:
              - variable: type
                label: Type
                description: |
                  ixVolume: Is dataset created automatically by the system.</br>
                  Host Path: Is a path that already exists on the system.
                schema:
                  type: string
                  required: true
                  default: ixVolume
                  enum:
                    - value: hostPath
                      description: Host Path (Path that already exists on the system)
                    - value: ixVolume
                      description: ixVolume (Dataset created automatically by the system)
              - variable: ixVolumeConfig
                label: ixVolume Configuration
                description: The configuration for the ixVolume dataset.
                schema:
                  type: dict
                  show_if: [["type", "=", "ixVolume"]]
                  $ref:
                    - "normalize/ixVolume"
                  attrs:
                    - variable: aclEnable
                      label: Enable ACL
                      description: Enable ACL for the dataset.
                      schema:
                        type: boolean
                        default: false
                    - variable: datasetName
                      label: Dataset Name
                      description: The name of the dataset to use for storage.
                      schema:
                        type: string
                        required: true
                        immutable: true
                        hidden: true
                        default: "html"
                    - variable: aclEntries
                      label: ACL Configuration
                      schema:
                        type: dict
                        show_if: [["aclEnable", "=", true]]
                        attrs: []
              - variable: hostPathConfig
                label: Host Path Configuration
                schema:
                  type: dict
                  show_if: [["type", "=", "hostPath"]]
                  attrs:
                    - variable: aclEnable
                      label: Enable ACL
                      description: Enable ACL for the dataset.
                      schema:
                        type: boolean
                        default: false
                    - variable: acl
                      label: ACL Configuration
                      schema:
                        type: dict
                        show_if: [["aclEnable", "=", true]]
                        attrs: []
                        $ref:
                          - "normalize/acl"
                    - variable: hostPath
                      label: Host Path
                      description: The host path to use for storage.
                      schema:
                        type: hostpath
                        show_if: [["aclEnable", "=", false]]
                        required: true
        - variable: data
          label: Nextcloud User Data Storage
          description: The path to store Nextcloud User Data.
          schema:
            type: dict
            attrs:
              - variable: type
                label: Type
                description: |
                  ixVolume: Is dataset created automatically by the system.</br>
                  Host Path: Is a path that already exists on the system.
                schema:
                  type: string
                  required: true
                  default: ixVolume
                  enum:
                    - value: hostPath
                      description: Host Path (Path that already exists on the system)
                    - value: ixVolume
                      description: ixVolume (Dataset created automatically by the system)
              - variable: ixVolumeConfig
                label: ixVolume Configuration
                description: The configuration for the ixVolume dataset.
                schema:
                  type: dict
                  show_if: [["type", "=", "ixVolume"]]
                  $ref:
                    - "normalize/ixVolume"
                  attrs:
                    - variable: aclEnable
                      label: Enable ACL
                      description: Enable ACL for the dataset.
                      schema:
                        type: boolean
                        default: false
                    - variable: datasetName
                      label: Dataset Name
                      description: The name of the dataset to use for storage.
                      schema:
                        type: string
                        required: true
                        immutable: true
                        hidden: true
                        default: "data"
                    - variable: aclEntries
                      label: ACL Configuration
                      schema:
                        type: dict
                        show_if: [["aclEnable", "=", true]]
                        attrs: []
              - variable: hostPathConfig
                label: Host Path Configuration
                schema:
                  type: dict
                  show_if: [["type", "=", "hostPath"]]
                  attrs:
                    - variable: aclEnable
                      label: Enable ACL
                      description: Enable ACL for the dataset.
                      schema:
                        type: boolean
                        default: false
                    - variable: acl
                      label: ACL Configuration
                      schema:
                        type: dict
                        show_if: [["aclEnable", "=", true]]
                        attrs: []
                        $ref:
                          - "normalize/acl"
                    - variable: hostPath
                      label: Host Path
                      description: The host path to use for storage.
                      schema:
                        type: hostpath
                        show_if: [["aclEnable", "=", false]]
                        required: true

        - variable: pgData
          label: Nextcloud Postgres Data Storage
          description: The path to store Nextcloud Postgres Data.
          schema:
            type: dict
            attrs:
              - variable: type
                label: Type
                description: |
                  ixVolume: Is dataset created automatically by the system.</br>
                  Host Path: Is a path that already exists on the system.
                schema:
                  type: string
                  required: true
                  default: ixVolume
                  enum:
                    - value: hostPath
                      description: Host Path (Path that already exists on the system)
                    - value: ixVolume
                      description: ixVolume (Dataset created automatically by the system)
              - variable: ixVolumeConfig
                label: ixVolume Configuration
                description: The configuration for the ixVolume dataset.
                schema:
                  type: dict
                  # Nothing to show for the user
                  hidden: true
                  show_if: [["type", "=", "ixVolume"]]
                  $ref:
                    - "normalize/ixVolume"
                  attrs:
                    - variable: aclEnable
                      label: Enable ACL
                      description: Enable ACL for the dataset.
                      schema:
                        type: boolean
                        # Postgres does a CHMOD at startup
                        # Which fails with ACL
                        hidden: true
                        default: false
                    - variable: datasetName
                      label: Dataset Name
                      description: The name of the dataset to use for storage.
                      schema:
                        type: string
                        required: true
                        immutable: true
                        hidden: true
                        default: "pgData"
                    - variable: aclEntries
                      label: ACL Configuration
                      schema:
                        type: dict
                        show_if: [["aclEnable", "=", true]]
                        attrs: []
              - variable: hostPathConfig
                label: Host Path Configuration
                schema:
                  type: dict
                  show_if: [["type", "=", "hostPath"]]
                  attrs:
                    - variable: aclEnable
                      label: Enable ACL
                      description: Enable ACL for the dataset.
                      schema:
                        type: boolean
                        # Postgres does a CHMOD at startup
                        # Which fails with ACL
                        hidden: true
                        default: false
                    - variable: acl
                      label: ACL Configuration
                      schema:
                        type: dict
                        show_if: [["aclEnable", "=", true]]
                        attrs: []
                        $ref:
                          - "normalize/acl"
                    - variable: hostPath
                      label: Host Path
                      description: The host path to use for storage.
                      schema:
                        type: hostpath
                        show_if: [["aclEnable", "=", false]]
                        required: true
        - variable: pgBackup
          label: Nextcloud Postgres Backup Storage
          description: The path to store Nextcloud Postgres Backup.
          schema:
            type: dict
            attrs:
              - variable: type
                label: Type
                description: |
                  ixVolume: Is dataset created automatically by the system.</br>
                  Host Path: Is a path that already exists on the system.
                schema:
                  type: string
                  required: true
                  default: ixVolume
                  enum:
                    - value: hostPath
                      description: Host Path (Path that already exists on the system)
                    - value: ixVolume
                      description: ixVolume (Dataset created automatically by the system)
              - variable: ixVolumeConfig
                label: ixVolume Configuration
                description: The configuration for the ixVolume dataset.
                schema:
                  type: dict
                  # Nothing to show for the user
                  hidden: true
                  show_if: [["type", "=", "ixVolume"]]
                  $ref:
                    - "normalize/ixVolume"
                  attrs:
                    - variable: aclEnable
                      label: Enable ACL
                      description: Enable ACL for the dataset.
                      schema:
                        type: boolean
                        # Postgres does a CHMOD at startup
                        # Which fails with ACL
                        hidden: true
                        default: false
                    - variable: datasetName
                      label: Dataset Name
                      description: The name of the dataset to use for storage.
                      schema:
                        type: string
                        required: true
                        immutable: true
                        hidden: true
                        default: "pgBackup"
                    - variable: aclEntries
                      label: ACL Configuration
                      schema:
                        type: dict
                        show_if: [["aclEnable", "=", true]]
                        attrs: []
              - variable: hostPathConfig
                label: Host Path Configuration
                schema:
                  type: dict
                  show_if: [["type", "=", "hostPath"]]
                  attrs:
                    - variable: aclEnable
                      label: Enable ACL
                      description: Enable ACL for the dataset.
                      schema:
                        type: boolean
                        # Postgres does a CHMOD at startup
                        # Which fails with ACL
                        hidden: true
                        default: false
                    - variable: acl
                      label: ACL Configuration
                      schema:
                        type: dict
                        show_if: [["aclEnable", "=", true]]
                        attrs: []
                        $ref:
                          - "normalize/acl"
                    - variable: hostPath
                      label: Host Path
                      description: The host path to use for storage.
                      schema:
                        type: hostpath
                        show_if: [["aclEnable", "=", false]]
                        required: true

        - variable: additionalStorages
          label: Additional Storage
          description: Additional storage for Nextcloud.
          schema:
            type: list
            default: []
            items:
              - variable: storageEntry
                label: Storage Entry
                schema:
                  type: dict
                  attrs:
                    - variable: type
                      label: Type
                      description: |
                        ixVolume: Is dataset created automatically by the system.</br>
                        Host Path: Is a path that already exists on the system.</br>
                        SMB Share: Is a SMB share that is mounted to a persistent volume claim.
                      schema:
                        type: string
                        required: true
                        default: "ixVolume"
                        enum:
                          - value: "hostPath"
                            description: Host Path (Path that already exists on the system)
                          - value: "ixVolume"
                            description: ixVolume (Dataset created automatically by the system)
                          - value: "smb-pv-pvc"
                            description: SMB Share (Mounts a persistent volume claim to a SMB share)
                    - variable: readOnly
                      label: Read Only
                      description: Mount the volume as read only.
                      schema:
                        type: boolean
                        default: false
                    - variable: mountPath
                      label: Mount Path
                      description: The path inside the container to mount the storage.
                      schema:
                        type: path
                        required: true
                    - variable: hostPathConfig
                      label: Host Path Configuration
                      schema:
                        type: dict
                        show_if: [["type", "=", "hostPath"]]
                        attrs:
                          - variable: aclEnable
                            label: Enable ACL
                            description: Enable ACL for the dataset.
                            schema:
                              type: boolean
                              default: false
                          - variable: acl
                            label: ACL Configuration
                            schema:
                              type: dict
                              show_if: [["aclEnable", "=", true]]
                              attrs: []
                              $ref:
                                - "normalize/acl"
                          - variable: hostPath
                            label: Host Path
                            description: The host path to use for storage.
                            schema:
                              type: hostpath
                              show_if: [["aclEnable", "=", false]]
                              required: true
                    - variable: ixVolumeConfig
                      label: ixVolume Configuration
                      description: The configuration for the ixVolume dataset.
                      schema:
                        type: dict
                        show_if: [["type", "=", "ixVolume"]]
                        $ref:
                          - "normalize/ixVolume"
                        attrs:
                          - variable: aclEnable
                            label: Enable ACL
                            description: Enable ACL for the dataset.
                            schema:
                              type: boolean
                              default: false
                          - variable: datasetName
                            label: Dataset Name
                            description: The name of the dataset to use for storage.
                            schema:
                              type: string
                              required: true
                              immutable: true
                              default: "storage_entry"
                          - variable: aclEntries
                            label: ACL Configuration
                            schema:
                              type: dict
                              show_if: [["aclEnable", "=", true]]
                              attrs: []
                    - variable: smbConfig
                      label: SMB Share Configuration
                      description: The configuration for the SMB Share.
                      schema:
                        type: dict
                        show_if: [["type", "=", "smb-pv-pvc"]]
                        attrs:
                          - variable: server
                            label: Server
                            description: The server for the SMB share.
                            schema:
                              type: string
                              required: true
                          - variable: share
                            label: Share
                            description: The share name for the SMB share.
                            schema:
                              type: string
                              required: true
                          - variable: domain
                            label: Domain (Optional)
                            description: The domain for the SMB share.
                            schema:
                              type: string
                          - variable: username
                            label: Username
                            description: The username for the SMB share.
                            schema:
                              type: string
                              required: true
                          - variable: password
                            label: Password
                            description: The password for the SMB share.
                            schema:
                              type: string
                              required: true
                              private: true
                          - variable: size
                            label: Size (in Gi)
                            description: The size of the volume quota.
                            schema:
                              type: int
                              required: true
                              min: 1
                              default: 1

  - variable: resources
    group: Resources Configuration
    label: ""
    schema:
      type: dict
      attrs:
        - variable: limits
          label: Limits
          schema:
            type: dict
            attrs:
              - variable: cpu
                label: CPU
                description: CPU limit for WG-Easy.
                schema:
                  type: string
                  max_length: 6
                  valid_chars: '^(0\.[1-9]|[1-9][0-9]*)(\.[0-9]|m?)$'
                  valid_chars_error: |
                    Valid CPU limit formats are</br>
                    - Plain Integer - eg. 1</br>
                    - Float - eg. 0.5</br>
                    - Milicpu - eg. 500m
                  default: "4000m"
                  required: true
              - variable: memory
                label: Memory
                description: Memory limit for WG-Easy.
                schema:
                  type: string
                  max_length: 12
                  valid_chars: "^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$"
                  valid_chars_error: |
                    Valid Memory limit formats are</br>
                    - Suffixed with E/P/T/G/M/K - eg. 1G</br>
                    - Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi</br>
                    - Plain Integer in bytes - eg. 1024</br>
                    - Exponent - eg. 134e6
                  default: "8Gi"
                  required: true
