From bd264c1b82fa052d14b211a79330e1191e41afd8 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Mon, 18 Sep 2023 18:48:09 +0300 Subject: [PATCH] NAS-124129 / 24.04 / adds `unifi-controller` to `community` train (#1541) --- .../community/unifi-controller/Chart.lock | 6 + .../community/unifi-controller/Chart.yaml | 27 ++ .../community/unifi-controller/README.md | 8 + .../community/unifi-controller/app-readme.md | 8 + .../unifi-controller/charts/common-1.1.1.tgz | Bin 0 -> 61740 bytes .../unifi-controller/ci/basic-values.yaml | 4 + .../unifi-controller/ci/extra-values.yaml | 12 + .../unifi-controller/ci/hostNet-values.yaml | 7 + .../unifi-controller/ci/https-values.yaml | 93 ++++++ .../community/unifi-controller/item.yaml | 7 + .../community/unifi-controller/metadata.yaml | 8 + .../community/unifi-controller/questions.yaml | 273 ++++++++++++++++++ .../unifi-controller/templates/NOTES.txt | 1 + .../templates/_persistence.tpl | 59 ++++ .../unifi-controller/templates/_portal.tpl | 12 + .../unifi-controller/templates/_service.tpl | 36 +++ .../unifi-controller/templates/_unifi.tpl | 78 +++++ .../unifi-controller/templates/common.yaml | 11 + .../unifi-controller/upgrade_info.json | 1 + .../unifi-controller/upgrade_strategy | 31 ++ .../community/unifi-controller/values.yaml | 29 ++ 21 files changed, 711 insertions(+) create mode 100644 library/ix-dev/community/unifi-controller/Chart.lock create mode 100644 library/ix-dev/community/unifi-controller/Chart.yaml create mode 100644 library/ix-dev/community/unifi-controller/README.md create mode 100644 library/ix-dev/community/unifi-controller/app-readme.md create mode 100644 library/ix-dev/community/unifi-controller/charts/common-1.1.1.tgz create mode 100644 library/ix-dev/community/unifi-controller/ci/basic-values.yaml create mode 100644 library/ix-dev/community/unifi-controller/ci/extra-values.yaml create mode 100644 library/ix-dev/community/unifi-controller/ci/hostNet-values.yaml create mode 100644 library/ix-dev/community/unifi-controller/ci/https-values.yaml create mode 100644 library/ix-dev/community/unifi-controller/item.yaml create mode 100644 library/ix-dev/community/unifi-controller/metadata.yaml create mode 100644 library/ix-dev/community/unifi-controller/questions.yaml create mode 100644 library/ix-dev/community/unifi-controller/templates/NOTES.txt create mode 100644 library/ix-dev/community/unifi-controller/templates/_persistence.tpl create mode 100644 library/ix-dev/community/unifi-controller/templates/_portal.tpl create mode 100644 library/ix-dev/community/unifi-controller/templates/_service.tpl create mode 100644 library/ix-dev/community/unifi-controller/templates/_unifi.tpl create mode 100644 library/ix-dev/community/unifi-controller/templates/common.yaml create mode 100644 library/ix-dev/community/unifi-controller/upgrade_info.json create mode 100755 library/ix-dev/community/unifi-controller/upgrade_strategy create mode 100644 library/ix-dev/community/unifi-controller/values.yaml diff --git a/library/ix-dev/community/unifi-controller/Chart.lock b/library/ix-dev/community/unifi-controller/Chart.lock new file mode 100644 index 0000000000..d0f93988d0 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.1.1 +digest: sha256:a7dbe3e4d42dbcd4325776e5e01a1d630c7f185f79e7ebf22b1b9cc80f56eed7 +generated: "2023-09-11T14:13:06.750883824+03:00" diff --git a/library/ix-dev/community/unifi-controller/Chart.yaml b/library/ix-dev/community/unifi-controller/Chart.yaml new file mode 100644 index 0000000000..3bbde9e5b9 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/Chart.yaml @@ -0,0 +1,27 @@ +name: unifi-controller +description: Unifi Controller is a network management controller for Unifi Equipment. +annotations: + title: Unifi Controller +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: v7.4.162 +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.1.1 +home: https://github.com/jacobalberty/unifi-docker +icon: https://theme.zdassets.com/theme_assets/77613/f9322e267ea20a462f60726984c22c1b8d5743b4.ico +sources: + - https://github.com/jacobalberty/unifi-docker + - https://github.com/truenas/charts/tree/master/library/ix-dev/community/unifi-controller + - https://hub.docker.com/r/jacobalberty/unifi +keywords: + - network + - controller + - unifi diff --git a/library/ix-dev/community/unifi-controller/README.md b/library/ix-dev/community/unifi-controller/README.md new file mode 100644 index 0000000000..757081d4a1 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/README.md @@ -0,0 +1,8 @@ +# Unifi Controller + +[Unifi Controller](https://github.com/jacobalberty/unifi-docker) is a network management controller for Unifi Equipment. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Unifi Controller` directories. +> Afterward, the `Unifi Controller` container will run as a **non**-root user (`999`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. diff --git a/library/ix-dev/community/unifi-controller/app-readme.md b/library/ix-dev/community/unifi-controller/app-readme.md new file mode 100644 index 0000000000..757081d4a1 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/app-readme.md @@ -0,0 +1,8 @@ +# Unifi Controller + +[Unifi Controller](https://github.com/jacobalberty/unifi-docker) is a network management controller for Unifi Equipment. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Unifi Controller` directories. +> Afterward, the `Unifi Controller` container will run as a **non**-root user (`999`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. diff --git a/library/ix-dev/community/unifi-controller/charts/common-1.1.1.tgz b/library/ix-dev/community/unifi-controller/charts/common-1.1.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..a3639d9add342b3f019d2a81489ae7a97f29f09e GIT binary patch literal 61740 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

5EHYf(>ZyzG-||goCTH+n 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 literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/unifi-controller/ci/basic-values.yaml b/library/ix-dev/community/unifi-controller/ci/basic-values.yaml new file mode 100644 index 0000000000..e5de6d579c --- /dev/null +++ b/library/ix-dev/community/unifi-controller/ci/basic-values.yaml @@ -0,0 +1,4 @@ +unifiStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/data diff --git a/library/ix-dev/community/unifi-controller/ci/extra-values.yaml b/library/ix-dev/community/unifi-controller/ci/extra-values.yaml new file mode 100644 index 0000000000..51ae6de7ab --- /dev/null +++ b/library/ix-dev/community/unifi-controller/ci/extra-values.yaml @@ -0,0 +1,12 @@ +unifiStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/data + additionalStorages: + - type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/init.d + mountPath: /unifi/init.d + +unifiNetwork: + enableWebHttp: true + enablePortalHttp: true diff --git a/library/ix-dev/community/unifi-controller/ci/hostNet-values.yaml b/library/ix-dev/community/unifi-controller/ci/hostNet-values.yaml new file mode 100644 index 0000000000..7251f97ef5 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/ci/hostNet-values.yaml @@ -0,0 +1,7 @@ +unifiStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/data + +unifiNetwork: + hostNetwork: true diff --git a/library/ix-dev/community/unifi-controller/ci/https-values.yaml b/library/ix-dev/community/unifi-controller/ci/https-values.yaml new file mode 100644 index 0000000000..a1f2b8ac7b --- /dev/null +++ b/library/ix-dev/community/unifi-controller/ci/https-values.yaml @@ -0,0 +1,93 @@ +unifiStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/data + +unifiNetwork: + certificateID: 1 + +ixCertificates: + "1": + certificate: | + -----BEGIN CERTIFICATE----- + MIIEdjCCA16gAwIBAgIDYFMYMA0GCSqGSIb3DQEBCwUAMGwxDDAKBgNVBAMMA2Fz + ZDELMAkGA1UEBhMCVVMxDTALBgNVBAgMBGFzZGYxCzAJBgNVBAcMAmFmMQ0wCwYD + VQQKDARhc2RmMQwwCgYDVQQLDANhc2QxFjAUBgkqhkiG9w0BCQEWB2FAYS5jb20w + HhcNMjEwODMwMjMyMzU0WhcNMjMxMjAzMjMyMzU0WjBuMQswCQYDVQQDDAJhZDEL + MAkGA1UEBhMCVVMxDTALBgNVBAgMBGFzZGYxDTALBgNVBAcMBGFzZGYxDTALBgNV + BAoMBGFkc2YxDTALBgNVBAsMBGFzZGYxFjAUBgkqhkiG9w0BCQEWB2FAYS5jb20w + ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7+1xOHRQyOnQTHFcrdasX + Zl0gzutVlA890a1wiQpdD5dOtCLo7+eqVYjqVKo9W8RUIArXWmBu/AbkH7oVFWC1 + P973W1+ArF5sA70f7BZgqRKJTIisuIFIlRETgfnP2pfQmHRZtGaIJRZI4vQCdYgW + 2g0KOvvNcZJCVq1OrhKiNiY1bWCp66DGg0ic6OEkZFHTm745zUNQaf2dNgsxKU0H + PGjVLJI//yrRFAOSBUqgD4c50krnMF7fU/Fqh+UyOu8t6Y/HsySh3urB+Zie331t + AzV6QV39KKxRflNx/yuWrtIEslGTm+xHKoCYJEk/nZ3mX8Y5hG6wWAb7A/FuDVg3 + AgMBAAGjggEdMIIBGTAnBgNVHREEIDAehwTAqAADhwTAqAAFhwTAqAC2hwTAqACB + hwTAqACSMB0GA1UdDgQWBBQ4G2ff4tgZl4vmo4xCfqmJhdqShzAMBgNVHRMBAf8E + AjAAMIGYBgNVHSMEgZAwgY2AFLlYf9L99nxJDcpCM/LT3V5hQ/a3oXCkbjBsMQww + CgYDVQQDDANhc2QxCzAJBgNVBAYTAlVTMQ0wCwYDVQQIDARhc2RmMQswCQYDVQQH + DAJhZjENMAsGA1UECgwEYXNkZjEMMAoGA1UECwwDYXNkMRYwFAYJKoZIhvcNAQkB + FgdhQGEuY29tggNgUxcwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwEwDgYDVR0PAQH/ + BAQDAgWgMA0GCSqGSIb3DQEBCwUAA4IBAQA6FpOInEHB5iVk3FP67GybJ29vHZTD + KQHbQgmg8s4L7qIsA1HQ+DMCbdylpA11x+t/eL/n48BvGw2FNXpN6uykhLHJjbKR + h8yITa2KeD3LjLYhScwIigXmTVYSP3km6s8jRL6UKT9zttnIHyXVpBDya6Q4WTMx + fmfC6O7t1PjQ5ZyVtzizIUP8ah9n4TKdXU4A3QIM6WsJXpHb+vqp1WDWJ7mKFtgj + x5TKv3wcPnktx0zMPfLb5BTSE9rc9djcBG0eIAsPT4FgiatCUChe7VhuMnqskxEz + MymJLoq8+mzucRwFkOkR2EIt1x+Irl2mJVMeBow63rVZfUQBD8h++LqB + -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- + MIIEhDCCA2ygAwIBAgIDYFMXMA0GCSqGSIb3DQEBCwUAMGwxDDAKBgNVBAMMA2Fz + ZDELMAkGA1UEBhMCVVMxDTALBgNVBAgMBGFzZGYxCzAJBgNVBAcMAmFmMQ0wCwYD + VQQKDARhc2RmMQwwCgYDVQQLDANhc2QxFjAUBgkqhkiG9w0BCQEWB2FAYS5jb20w + HhcNMjEwODMwMjMyMDQ1WhcNMzEwODI4MjMyMDQ1WjBsMQwwCgYDVQQDDANhc2Qx + CzAJBgNVBAYTAlVTMQ0wCwYDVQQIDARhc2RmMQswCQYDVQQHDAJhZjENMAsGA1UE + CgwEYXNkZjEMMAoGA1UECwwDYXNkMRYwFAYJKoZIhvcNAQkBFgdhQGEuY29tMIIB + IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq//c0hEEr83CS1pMgsHX50jt + 2MqIbcf63UUNJTiYpUUvUQSFJFc7m/dr+RTZvu97eDCnD5K2qkHHvTPaPZwY+Djf + iy7N641Sz6u/y3Yo3xxs1Aermsfedh48vusJpjbkT2XS44VjbkrpKcWDNVpp3Evd + M7oJotXeUsZ+imiyVCfr4YhoY5gbGh/r+KN9Wf9YKoUyfLLZGwdZkhtX2zIbidsL + Thqi9YTaUHttGinjiBBum234u/CfvKXsfG3yP2gvBGnlvZnM9ktv+lVffYNqlf7H + VmB1bKKk84HtzuW5X76SGAgOG8eHX4x5ZLI1WQUuoQOVRl1I0UCjBtbz8XhwvQID + AQABo4IBLTCCASkwLQYDVR0RBCYwJIcEwKgABYcEwKgAA4cEwKgAkocEwKgAtYcE + wKgAgYcEwKgAtjAdBgNVHQ4EFgQUuVh/0v32fEkNykIz8tPdXmFD9rcwDwYDVR0T + AQH/BAUwAwEB/zCBmAYDVR0jBIGQMIGNgBS5WH/S/fZ8SQ3KQjPy091eYUP2t6Fw + pG4wbDEMMAoGA1UEAwwDYXNkMQswCQYDVQQGEwJVUzENMAsGA1UECAwEYXNkZjEL + MAkGA1UEBwwCYWYxDTALBgNVBAoMBGFzZGYxDDAKBgNVBAsMA2FzZDEWMBQGCSqG + SIb3DQEJARYHYUBhLmNvbYIDYFMXMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF + BQcDAjAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAKEocOmVuWlr + zegtKYMe8NhHIkFY9oVn5ym6RHNOJpPH4QF8XYC3Z5+iC5yGh4P/jVe/4I4SF6Ql + PtofU0jNq5vzapt/y+m008eXqPQFmoUOvu+JavoRVcRx2LIP5AgBA1mF56CSREsX + TkuJAA9IUQ8EjnmAoAeKINuPaKxGDuU8BGCMqr/qd564MKNf9XYL+Fb2rlkA0O2d + 2No34DQLgqSmST/LAvPM7Cbp6knYgnKmGr1nETCXasg1cueHLnWWTvps2HiPp2D/ + +Fq0uqcZLu4Mdo0CPs4e5sHRyldEnRSKh0DVLprq9zr/GMipmPLJUsT5Jed3sj0w + M7Y3vwxshpo= + -----END CERTIFICATE----- + privatekey: | + -----BEGIN PRIVATE KEY----- + MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC7+1xOHRQyOnQT + HFcrdasXZl0gzutVlA890a1wiQpdD5dOtCLo7+eqVYjqVKo9W8RUIArXWmBu/Abk + H7oVFWC1P973W1+ArF5sA70f7BZgqRKJTIisuIFIlRETgfnP2pfQmHRZtGaIJRZI + 4vQCdYgW2g0KOvvNcZJCVq1OrhKiNiY1bWCp66DGg0ic6OEkZFHTm745zUNQaf2d + NgsxKU0HPGjVLJI//yrRFAOSBUqgD4c50krnMF7fU/Fqh+UyOu8t6Y/HsySh3urB + +Zie331tAzV6QV39KKxRflNx/yuWrtIEslGTm+xHKoCYJEk/nZ3mX8Y5hG6wWAb7 + A/FuDVg3AgMBAAECggEAapt30rj9DitGTtxAt13pJMEhyYxvvD3WkvmJwguF/Bbu + eW0Ba1c668fMeRCA54FWi1sMqusPS4HUqqUvk+tmyAOsAF4qgD/A4MMSC7uJSVI5 + N/JWhJWyhCY94/FPakiO1nbPbVw41bcqtzU2qvparpME2CtxSCbDiqm7aaag3Kqe + EF0fGSUdZ+TYl9JM05+eIyiX+UY19Fg0OjTHMn8nGpxcNTfDBdQ68TKvdo/dtIKL + PLKzJUNNdM8odC4CvQtfGMqaslwZwXkiOl5VJcW21ncj/Y0ngEMKeD/i65ZoqGdR + 0FKCQYEAGtM2FvJcZQ92Wsw7yj2bK2MSegVUyLK32QKBgQDe8syVCepPzRsfjfxA + 6TZlWcGuTZLhwIx97Ktw3VcQ1f4rLoEYlv0xC2VWBORpzIsJo4I/OLmgp8a+Ga8z + FkVRnq90dV3t4NP9uJlHgcODHnOardC2UUka4olBSCG6zmK4Jxi34lOxhGRkshOo + L4IBeOIB5g+ZrEEXkzfYJHESRQKBgQDX2YhFhGIrT8BAnC5BbXbhm8h6Bhjz8DYL + d+qhVJjef7L/aJxViU0hX9Ba2O8CLK3FZeREFE3hJPiJ4TZSlN4evxs5p+bbNDcA + 0mhRI/o3X4ac6IxdRebyYnCOB/Cu94/MzppcZcotlCekKNike7eorCcX4Qavm7Pu + MUuQ+ifmSwKBgEnchoqZzlbBzMqXb4rRuIO7SL9GU/MWp3TQg7vQmJerTZlgvsQ2 + wYsOC3SECmhCq4117iCj2luvOdihCboTFsQDnn0mpQe6BIF6Ns3J38wAuqv0CcFd + DKsrge1uyD3rQilgSoAhKzkUc24o0PpXQurZ8YZPgbuXpbj5vPaOnCdBAoGACYc7 + wb3XS4wos3FxhUfcwJbM4b4VKeeHqzfu7pI6cU/3ydiHVitKcVe2bdw3qMPqI9Wc + nvi6e17Tbdq4OCsEJx1OiVwFD9YdO3cOTc6lw/3+hjypvZBRYo+/4jUthbu96E+S + dtOzehGZMmDvN0uSzupSi3ZOgkAAUFpyuIKickMCgYAId0PCRjonO2thn/R0rZ7P + //L852uyzYhXKw5/fjFGhQ6LbaLgIRFaCZ0L2809u0HFnNvJjHv4AKP6j+vFQYYY + qQ+66XnfsA9G/bu4MDS9AX83iahD9IdLXQAy8I19prAbpVumKegPbMnNYNB/TYEc + 3G15AKCXo7jjOUtHY01DCQ== + -----END PRIVATE KEY----- diff --git a/library/ix-dev/community/unifi-controller/item.yaml b/library/ix-dev/community/unifi-controller/item.yaml new file mode 100644 index 0000000000..394a54c079 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/item.yaml @@ -0,0 +1,7 @@ +icon_url: https://theme.zdassets.com/theme_assets/77613/f9322e267ea20a462f60726984c22c1b8d5743b4.ico +categories: + - network +screenshots: [] +tags: + - controller + - unifi diff --git a/library/ix-dev/community/unifi-controller/metadata.yaml b/library/ix-dev/community/unifi-controller/metadata.yaml new file mode 100644 index 0000000000..2d0de7f918 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/metadata.yaml @@ -0,0 +1,8 @@ +runAsContext: + - userName: unifi + groupName: unifi + gid: 999 + uid: 999 + description: Unifi runs as a non-root user. +capabilities: [] +hostMounts: [] diff --git a/library/ix-dev/community/unifi-controller/questions.yaml b/library/ix-dev/community/unifi-controller/questions.yaml new file mode 100644 index 0000000000..b4047ec58a --- /dev/null +++ b/library/ix-dev/community/unifi-controller/questions.yaml @@ -0,0 +1,273 @@ +groups: + - name: Unifi Controller Configuration + description: Configure Unifi Controller + - name: User and Group Configuration + description: Configure User and Group for Unifi Controller + - name: Network Configuration + description: Configure Network for Unifi Controller + - name: Storage Configuration + description: Configure Storage for Unifi Controller + - name: Resources Configuration + description: Configure Resources for Unifi Controller + +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: TZ + group: Unifi Controller Configuration + label: Timezone + schema: + type: string + default: Etc/UTC + required: true + $ref: + - definitions/timezone + + - variable: unifiConfig + label: "" + group: Unifi Controller Configuration + schema: + type: dict + attrs: + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Unifi Controller. + 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: unifiNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webHttpsPort + label: Web HTTPS Port + description: The HTTPS port for the Unifi Controller Web UI. + schema: + type: int + default: 30072 + min: 9000 + max: 65535 + required: true + - variable: enableWebHttp + label: Enable Web HTTP + description: Enable HTTP for the Unifi Controller Web UI. + schema: + type: boolean + default: false + - variable: webHttpPort + label: Web HTTP Port + description: The HTTP port for the Unifi Controller Web UI. + schema: + type: int + default: 30073 + show_if: [["enableWebHttp", "=", true]] + min: 9000 + max: 65535 + required: true + - variable: portalHttpsPort + label: Portal HTTPS Port + description: The HTTPS port for the Unifi Controller Portal. + schema: + type: int + default: 30074 + min: 9000 + max: 65535 + required: true + - variable: enablePortalHttp + label: Enable Portal HTTP + description: Enable HTTP for the Unifi Controller Portal. + schema: + type: boolean + default: false + - variable: portalHttpPort + label: Portal HTTP Port + description: The HTTP port for the Unifi Controller Portal. + schema: + type: int + default: 30075 + show_if: [["enablePortalHttp", "=", true]] + min: 9000 + max: 65535 + required: true + - variable: certificateID + label: Certificate + description: | + The certificate to use for Unifi Controller
+ Using the Rocket method for TLS setup is NOT recommended
+ Prefer a reverse proxy with a valid certificate
+ schema: + type: int + "null": true + $ref: + - "definitions/certificate" + - variable: hostNetwork + label: Host Network + description: | + Bind to the host network.
+ This might be required for specific features like STUN. + schema: + type: boolean + default: false + + - variable: unifiStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: data + label: Unifi Controller Data Storage + description: The path to store Unifi Controller Data. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ 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: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "data" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: additionalStorages + label: Additional Storage + description: Additional storage for Unifi Controller. + 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.
+ 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: mountPath + label: Mount Path + description: The path inside the container to mount the storage. + schema: + type: path + required: true + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + required: true + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + immutable: true + default: "storage_entry" + $ref: + - "normalize/ixVolume" + + - 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 Unifi Controller. + 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
+ - Plain Integer - eg. 1
+ - Float - eg. 0.5
+ - Milicpu - eg. 500m + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for Unifi Controller. + 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
+ - Suffixed with E/P/T/G/M/K - eg. 1G
+ - Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi
+ - Plain Integer in bytes - eg. 1024
+ - Exponent - eg. 134e6 + default: "8Gi" + required: true diff --git a/library/ix-dev/community/unifi-controller/templates/NOTES.txt b/library/ix-dev/community/unifi-controller/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/unifi-controller/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/unifi-controller/templates/_persistence.tpl b/library/ix-dev/community/unifi-controller/templates/_persistence.tpl new file mode 100644 index 0000000000..81b5a2b008 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/templates/_persistence.tpl @@ -0,0 +1,59 @@ +{{- define "unifi.persistence" -}} +persistence: + data: + enabled: true + type: {{ .Values.unifiStorage.data.type }} + datasetName: {{ .Values.unifiStorage.data.datasetName | default "" }} + hostPath: {{ .Values.unifiStorage.data.hostPath | default "" }} + targetSelector: + unifi: + unifi: + mountPath: /unifi + 01-permissions: + mountPath: /mnt/directories/unifi + 02-certs: + mountPath: /unifi + tmp: + enabled: true + type: emptyDir + targetSelector: + unifi: + unifi: + mountPath: /tmp + {{- range $idx, $storage := .Values.unifiStorage.additionalStorages }} + {{ printf "unifi-%v" (int $idx) }}: + enabled: true + type: {{ $storage.type }} + datasetName: {{ $storage.datasetName | default "" }} + hostPath: {{ $storage.hostPath | default "" }} + targetSelector: + unifi: + unifi: + mountPath: {{ $storage.mountPath }} + 01-permissions: + mountPath: /mnt/directories{{ $storage.mountPath }} + {{- end -}} + + {{- if .Values.unifiNetwork.certificateID }} + cert: + enabled: true + type: secret + objectName: unifi-cert + defaultMode: "0600" + items: + - key: tls.key + path: private.key + - key: tls.crt + path: public.crt + targetSelector: + unifi: + 02-certs: + mountPath: /ix/cert + readOnly: true + +scaleCertificate: + unifi-cert: + enabled: true + id: {{ .Values.unifiNetwork.certificateID }} + {{- end -}} +{{- end -}} diff --git a/library/ix-dev/community/unifi-controller/templates/_portal.tpl b/library/ix-dev/community/unifi-controller/templates/_portal.tpl new file mode 100644 index 0000000000..b241c0d035 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "unifi.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ .Values.unifiNetwork.webHttpsPort | quote }} + protocol: https + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/unifi-controller/templates/_service.tpl b/library/ix-dev/community/unifi-controller/templates/_service.tpl new file mode 100644 index 0000000000..89188ff3c7 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/templates/_service.tpl @@ -0,0 +1,36 @@ +{{- define "unifi.service" -}} +service: + unifi: + enabled: true + primary: true + type: NodePort + targetSelector: unifi + ports: + web-https: + enabled: true + primary: true + port: {{ .Values.unifiNetwork.webHttpsPort }} + nodePort: {{ .Values.unifiNetwork.webHttpsPort }} + targetSelector: unifi + web-http: + enabled: {{ .Values.unifiNetwork.enableWebHttp }} + port: {{ .Values.unifiNetwork.webHttpPort }} + nodePort: {{ .Values.unifiNetwork.webHttpPort }} + targetSelector: unifi + unifi-portal: + enabled: true + type: NodePort + targetSelector: unifi + ports: + portal-https: + enabled: true + primary: true + port: {{ .Values.unifiNetwork.portalHttpsPort }} + nodePort: {{ .Values.unifiNetwork.portalHttpsPort }} + targetSelector: unifi + portal-http: + enabled: {{ .Values.unifiNetwork.enablePortalHttp }} + port: {{ .Values.unifiNetwork.portalHttpPort }} + nodePort: {{ .Values.unifiNetwork.portalHttpPort }} + targetSelector: unifi +{{- end -}} diff --git a/library/ix-dev/community/unifi-controller/templates/_unifi.tpl b/library/ix-dev/community/unifi-controller/templates/_unifi.tpl new file mode 100644 index 0000000000..0e6f980ad6 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/templates/_unifi.tpl @@ -0,0 +1,78 @@ +{{- define "unifi.workload" -}} +workload: + unifi: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.unifiNetwork.hostNetwork }} + containers: + unifi: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: 999 + runAsGroup: 999 + readOnlyRootFilesystem: false + env: + UNIFI_STDOUT: true + UNIFI_HTTP_PORT: {{ .Values.unifiNetwork.webHttpPort }} + UNIFI_HTTPS_PORT: {{ .Values.unifiNetwork.webHttpsPort }} + PORTAL_HTTP_PORT: {{ .Values.unifiNetwork.portalHttpPort }} + PORTAL_HTTPS_PORT: {{ .Values.unifiNetwork.portalHttpsPort }} + {{- if .Values.unifiNetwork.certificateID }} + CERTNAME: cert.pem + CERT_PRIVATE_NAME: privkey.pem + CERT_IS_CHAIN: true + {{- end }} + {{ with .Values.unifiConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: exec + command: /usr/local/bin/docker-healthcheck.sh + readiness: + enabled: true + type: exec + command: /usr/local/bin/docker-healthcheck.sh + startup: + enabled: true + type: exec + command: /usr/local/bin/docker-healthcheck.sh + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" 999 + "GID" 999 + "mode" "check" + "type" "init") | nindent 8 }} + {{- if .Values.unifiNetwork.certificateID }} + # Unifi chowns the files on startup, and if we mount them directly + # from the secret, it will fail to start. So we make copy. + 02-certs: + enabled: true + type: init + imageSelector: image + securityContext: + runAsUser: 999 + runAsGroup: 999 + readOnlyRootFilesystem: false + command: + - /bin/sh + - -c + args: + - | + certdir=/unifi/cert + echo "Copying certificates to $certdir" + mkdir -p $certdir + cp --force --verbose /ix/cert/private.key $certdir/privkey.pem + cp --force --verbose /ix/cert/public.crt $certdir/cert.pem + cp --force --verbose /ix/cert/public.crt $certdir/chain.pem + {{- end -}} +{{- end -}} diff --git a/library/ix-dev/community/unifi-controller/templates/common.yaml b/library/ix-dev/community/unifi-controller/templates/common.yaml new file mode 100644 index 0000000000..b5d8d72ddd --- /dev/null +++ b/library/ix-dev/community/unifi-controller/templates/common.yaml @@ -0,0 +1,11 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "unifi.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "unifi.service" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "unifi.persistence" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "unifi.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/unifi-controller/upgrade_info.json b/library/ix-dev/community/unifi-controller/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/unifi-controller/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/unifi-controller/upgrade_strategy b/library/ix-dev/community/unifi-controller/upgrade_strategy new file mode 100755 index 0000000000..5718e19a44 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/upgrade_strategy @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'v\d+\.\d+\.\d+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t.strip('v'): t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/library/ix-dev/community/unifi-controller/values.yaml b/library/ix-dev/community/unifi-controller/values.yaml new file mode 100644 index 0000000000..3e3e3c1af2 --- /dev/null +++ b/library/ix-dev/community/unifi-controller/values.yaml @@ -0,0 +1,29 @@ +image: + repository: jacobalberty/unifi + pullPolicy: IfNotPresent + tag: v7.4.162 + +resources: + limits: + cpu: 4000m + memory: 8Gi + +unifiConfig: + additionalEnvs: [] + +unifiNetwork: + webHttpsPort: 30072 + enableWebHttp: false + webHttpPort: 30073 + portalHttpsPort: 30074 + enablePortalHttp: false + portalHttpPort: 30075 + certificateID: + # Stun only works with hostNetwork: true + hostNetwork: false + +unifiStorage: + data: + type: ixVolume + datasetName: data + additionalStorages: []