From c47542a99ab198ed0c74ecf1e725c3bf829a941c Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Mon, 3 Jul 2023 14:50:35 +0300 Subject: [PATCH] NAS-122653 / 23.10 / Adds `filebrowser` to `community` train (#1299) * initial commit * some fixes * add TODO * update metadata and ui * add cert support * add default item in additional storage, add validation, extend readme --- .../ix-dev/community/filebrowser/Chart.lock | 6 + .../ix-dev/community/filebrowser/Chart.yaml | 26 ++ .../ix-dev/community/filebrowser/README.md | 28 +++ .../community/filebrowser/app-readme.md | 28 +++ .../filebrowser/charts/common-1.0.8.tgz | Bin 0 -> 55447 bytes .../filebrowser/ci/basic-values.yaml | 11 + .../filebrowser/ci/https-values.yaml | 104 ++++++++ .../ix-dev/community/filebrowser/item.yaml | 10 + .../community/filebrowser/metadata.yaml | 8 + .../community/filebrowser/questions.yaml | 230 ++++++++++++++++++ .../community/filebrowser/templates/NOTES.txt | 1 + .../filebrowser/templates/_filebrowser.tpl | 87 +++++++ .../filebrowser/templates/_persistence.tpl | 60 +++++ .../filebrowser/templates/_portal.tpl | 16 ++ .../filebrowser/templates/_service.tpl | 15 ++ .../filebrowser/templates/common.yaml | 11 + .../community/filebrowser/upgrade_info.json | 1 + .../community/filebrowser/upgrade_strategy | 31 +++ .../ix-dev/community/filebrowser/values.yaml | 33 +++ 19 files changed, 706 insertions(+) create mode 100644 library/ix-dev/community/filebrowser/Chart.lock create mode 100644 library/ix-dev/community/filebrowser/Chart.yaml create mode 100644 library/ix-dev/community/filebrowser/README.md create mode 100644 library/ix-dev/community/filebrowser/app-readme.md create mode 100644 library/ix-dev/community/filebrowser/charts/common-1.0.8.tgz create mode 100644 library/ix-dev/community/filebrowser/ci/basic-values.yaml create mode 100644 library/ix-dev/community/filebrowser/ci/https-values.yaml create mode 100644 library/ix-dev/community/filebrowser/item.yaml create mode 100644 library/ix-dev/community/filebrowser/metadata.yaml create mode 100644 library/ix-dev/community/filebrowser/questions.yaml create mode 100644 library/ix-dev/community/filebrowser/templates/NOTES.txt create mode 100644 library/ix-dev/community/filebrowser/templates/_filebrowser.tpl create mode 100644 library/ix-dev/community/filebrowser/templates/_persistence.tpl create mode 100644 library/ix-dev/community/filebrowser/templates/_portal.tpl create mode 100644 library/ix-dev/community/filebrowser/templates/_service.tpl create mode 100644 library/ix-dev/community/filebrowser/templates/common.yaml create mode 100644 library/ix-dev/community/filebrowser/upgrade_info.json create mode 100644 library/ix-dev/community/filebrowser/upgrade_strategy create mode 100644 library/ix-dev/community/filebrowser/values.yaml diff --git a/library/ix-dev/community/filebrowser/Chart.lock b/library/ix-dev/community/filebrowser/Chart.lock new file mode 100644 index 0000000000..06dd96e66c --- /dev/null +++ b/library/ix-dev/community/filebrowser/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.8 +digest: sha256:254efaa1285f634b7a80b7baadeadbd20a680f7fee49d1d9d3c4618aa0d657ad +generated: "2023-06-26T19:30:25.999950732+03:00" diff --git a/library/ix-dev/community/filebrowser/Chart.yaml b/library/ix-dev/community/filebrowser/Chart.yaml new file mode 100644 index 0000000000..b223b43485 --- /dev/null +++ b/library/ix-dev/community/filebrowser/Chart.yaml @@ -0,0 +1,26 @@ +name: filebrowser +description: File Browser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. +annotations: + title: File Browser +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: 'v2.23.0' +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.0.8 +home: https://filebrowser.org +icon: https://raw.githubusercontent.com/filebrowser/logo/master/banner.png +sources: + - https://github.com/filebrowser/filebrowser + - https://github.com/truenas/charts/tree/master/library/ix-dev/community/filebrowser + - https://hub.docker.com/r/filebrowser/filebrowser +keywords: + - files + - browser diff --git a/library/ix-dev/community/filebrowser/README.md b/library/ix-dev/community/filebrowser/README.md new file mode 100644 index 0000000000..f22b128b27 --- /dev/null +++ b/library/ix-dev/community/filebrowser/README.md @@ -0,0 +1,28 @@ +# Filebrowser + +[Filebrowser](https://filebrowser.org) provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Filebrowser` directories. +> Afterward, the `Filebrowser` container will run as a **non**-root user (Default: `568`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. + +You can configure further the settings by using Environment Variables. +See [Filebrowser Documentation](https://filebrowser.org/cli/filebrowser) for more information. +Use the format `FB_OPTION_NAME` where the option name is the name of the option you want to set. + +You can also edit the configuration file `/config/filebrowser.json`. + +Note that the following options are already set and will always take precedence +over the environment variables and the configuration file: + +- `FB_ROOT`/`--root` is set to `/data` (Any additional volume mounted will be under this directory) +- `FB_PORT`/`--port` is set to `30044` (Or the port you configured in the installation wizard) +- `FB_ADDRESS`/`--address` is set to `0.0.0.0` (It will listen on all interfaces **inside** the container) +- `FB_DATABASE`/`--database` is set to `/config/filebrowser.db` +- `FB_CONFIG`/`--config` is set to `/config/filebrowser.json` + +Also when a certificate is selected + +- `FB_CERT`/`--cert` is set to `/config/certs/tls.crt` +- `FB_KEY`/`--key` is set to `/config/certs/tls.key` diff --git a/library/ix-dev/community/filebrowser/app-readme.md b/library/ix-dev/community/filebrowser/app-readme.md new file mode 100644 index 0000000000..f22b128b27 --- /dev/null +++ b/library/ix-dev/community/filebrowser/app-readme.md @@ -0,0 +1,28 @@ +# Filebrowser + +[Filebrowser](https://filebrowser.org) provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Filebrowser` directories. +> Afterward, the `Filebrowser` container will run as a **non**-root user (Default: `568`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. + +You can configure further the settings by using Environment Variables. +See [Filebrowser Documentation](https://filebrowser.org/cli/filebrowser) for more information. +Use the format `FB_OPTION_NAME` where the option name is the name of the option you want to set. + +You can also edit the configuration file `/config/filebrowser.json`. + +Note that the following options are already set and will always take precedence +over the environment variables and the configuration file: + +- `FB_ROOT`/`--root` is set to `/data` (Any additional volume mounted will be under this directory) +- `FB_PORT`/`--port` is set to `30044` (Or the port you configured in the installation wizard) +- `FB_ADDRESS`/`--address` is set to `0.0.0.0` (It will listen on all interfaces **inside** the container) +- `FB_DATABASE`/`--database` is set to `/config/filebrowser.db` +- `FB_CONFIG`/`--config` is set to `/config/filebrowser.json` + +Also when a certificate is selected + +- `FB_CERT`/`--cert` is set to `/config/certs/tls.crt` +- `FB_KEY`/`--key` is set to `/config/certs/tls.key` diff --git a/library/ix-dev/community/filebrowser/charts/common-1.0.8.tgz b/library/ix-dev/community/filebrowser/charts/common-1.0.8.tgz new file mode 100644 index 0000000000000000000000000000000000000000..b8b068f4fb1d911025145907ee3645b545cf642f GIT binary patch literal 55447 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�oDa_}ezD|<`xPyDA2;WK@a&5ut`!}+3f6yy^I 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 KV=3_f9tQw7MMcU0 literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/filebrowser/ci/basic-values.yaml b/library/ix-dev/community/filebrowser/ci/basic-values.yaml new file mode 100644 index 0000000000..b04b4a6581 --- /dev/null +++ b/library/ix-dev/community/filebrowser/ci/basic-values.yaml @@ -0,0 +1,11 @@ +filebrowserStorage: + config: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/config + additionalStorages: + - type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data1 + mountPath: /data1 + - type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data2 + mountPath: /data2 diff --git a/library/ix-dev/community/filebrowser/ci/https-values.yaml b/library/ix-dev/community/filebrowser/ci/https-values.yaml new file mode 100644 index 0000000000..234db8fc2f --- /dev/null +++ b/library/ix-dev/community/filebrowser/ci/https-values.yaml @@ -0,0 +1,104 @@ +filebrowserStorage: + config: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/config + additionalStorages: + - type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data1 + mountPath: /data1 + - type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data2 + mountPath: /data2 + +filebrowserNetwork: + certificateID: 1 + +filebrowserRunAs: + user: 2000 + group: 2000 + +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/filebrowser/item.yaml b/library/ix-dev/community/filebrowser/item.yaml new file mode 100644 index 0000000000..73492b2a11 --- /dev/null +++ b/library/ix-dev/community/filebrowser/item.yaml @@ -0,0 +1,10 @@ +icon_url: https://raw.githubusercontent.com/filebrowser/logo/master/banner.png +categories: + - storage +screenshots: + - https://3149836655-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M8KDxOujDoPpJyJJ5_i%2Fuploads%2Fgit-blob-b6cab252432e211dec693fc77d036c15259a8087%2F1.PNG?alt=media + - https://3149836655-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M8KDxOujDoPpJyJJ5_i%2Fuploads%2Fgit-blob-9390768b0cbb83b1e7da55c0ae13ecd2d8fcb114%2F2.PNG?alt=media + - https://3149836655-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M8KDxOujDoPpJyJJ5_i%2Fuploads%2Fgit-blob-dfc8d803dcd6546622888f399d94af9c6bbdbe60%2F6.PNG?alt=media +tags: + - files + - browser diff --git a/library/ix-dev/community/filebrowser/metadata.yaml b/library/ix-dev/community/filebrowser/metadata.yaml new file mode 100644 index 0000000000..16c60ff901 --- /dev/null +++ b/library/ix-dev/community/filebrowser/metadata.yaml @@ -0,0 +1,8 @@ +runAsContext: + - userName: filebrowser + groupName: filebrowser + gid: 568 + uid: 568 + description: Filebrowser can run as any non-root user. +capabilities: [] +hostMounts: [] diff --git a/library/ix-dev/community/filebrowser/questions.yaml b/library/ix-dev/community/filebrowser/questions.yaml new file mode 100644 index 0000000000..69f79876a1 --- /dev/null +++ b/library/ix-dev/community/filebrowser/questions.yaml @@ -0,0 +1,230 @@ +groups: + - name: Filebrowser Configuration + description: Configure Filebrowser + - name: User and Group Configuration + description: Configure User and Group for Filebrowser + - name: Network Configuration + description: Configure Network for Filebrowser + - name: Storage Configuration + description: Configure Storage for Filebrowser + - name: Resources Configuration + description: Configure Resources for Filebrowser + +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: filebrowserConfig + label: "" + group: Filebrowser Configuration + schema: + type: dict + attrs: + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Filebrowser. + 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: filebrowserRunAs + label: "" + group: User and Group Configuration + schema: + type: dict + attrs: + - variable: user + label: User ID + description: The user id that Filebrowser will run as. + schema: + type: int + min: 2 + default: 568 + required: true + - variable: group + label: Group ID + description: The group id that Filebrowser will run as. + schema: + type: int + min: 2 + default: 568 + required: true + + - variable: filebrowserNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the Filebrowser Web UI. + schema: + type: int + default: 30044 + min: 9000 + max: 65535 + required: true + - variable: certificateID + label: Certificate + description: | + The certificate to use for Filebrowser. + schema: + type: int + "null": true + $ref: + - "definitions/certificate" + - variable: hostNetwork + label: Host Network + description: | + Bind to the host network. It's recommended to keep this disabled.
+ schema: + type: boolean + default: false + + - variable: filebrowserStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: config + label: Filebrowser Config Storage + description: The path to store Filebrowser Configuration. + 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: "config" + $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 Filebrowser. + schema: + type: list + default: + - type: hostPath + mountPath: /my_data + hostPath: "" + 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 Filebrowser. + schema: + type: string + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for Filebrowser. + schema: + type: string + default: "8Gi" + required: true diff --git a/library/ix-dev/community/filebrowser/templates/NOTES.txt b/library/ix-dev/community/filebrowser/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/filebrowser/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/filebrowser/templates/_filebrowser.tpl b/library/ix-dev/community/filebrowser/templates/_filebrowser.tpl new file mode 100644 index 0000000000..ecfb9c474c --- /dev/null +++ b/library/ix-dev/community/filebrowser/templates/_filebrowser.tpl @@ -0,0 +1,87 @@ +{{- define "filebrowser.workload" -}} +{{- $configBasePath := "/config" -}} +{{- $scheme := "http" }} +workload: + filebrowser: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.filebrowserNetwork.hostNetwork }} + containers: + filebrowser: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: {{ .Values.filebrowserRunAs.user }} + runAsGroup: {{ .Values.filebrowserRunAs.group }} + args: + - --config + - {{ $configBasePath }}/filebrowser.json + - --database + - {{ $configBasePath }}/filebrowser.db + - --port + - "{{ .Values.filebrowserNetwork.webPort }}" + - --address + - "0.0.0.0" + - --root + - /data + {{- if .Values.filebrowserNetwork.certificateID }} + - --cert + - {{ $configBasePath }}/certs/tls.crt + - --key + - {{ $configBasePath }}/certs/tls.key + {{- $scheme = "https" -}} + {{- end -}} + {{ with .Values.filebrowserConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: {{ $scheme }} + port: "{{ .Values.filebrowserNetwork.webPort }}" + path: /health + readiness: + enabled: true + type: {{ $scheme }} + port: "{{ .Values.filebrowserNetwork.webPort }}" + path: /health + startup: + enabled: true + type: {{ $scheme }} + port: "{{ .Values.filebrowserNetwork.webPort }}" + path: /health + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" .Values.filebrowserRunAs.user + "GID" .Values.filebrowserRunAs.group + "mode" "check" + "type" "init") | nindent 8 }} + 02-init-config: + enabled: true + type: init + imageSelector: image + securityContext: + runAsUser: {{ .Values.filebrowserRunAs.user }} + runAsGroup: {{ .Values.filebrowserRunAs.group }} + # Creating the config file if it doesn't exist + # This will make the container to log + # "Using config file: {{ $configBasePath }}/filebrowser.json" + # on startup, so users know where the config is, in case they need it. + # Arguments will take precedence over the config file always. + # (Like the port, paths, etc we set above.) + command: + - /bin/sh + - -c + - | + if [ ! -f {{ $configBasePath }}/filebrowser.json ]; then + echo "Creating an empty config file" + echo '{}' > {{ $configBasePath }}/filebrowser.json + fi +{{- end -}} diff --git a/library/ix-dev/community/filebrowser/templates/_persistence.tpl b/library/ix-dev/community/filebrowser/templates/_persistence.tpl new file mode 100644 index 0000000000..a4741bc86c --- /dev/null +++ b/library/ix-dev/community/filebrowser/templates/_persistence.tpl @@ -0,0 +1,60 @@ +{{- define "filebrowser.persistence" -}} +{{- $configBasePath := "/config" }} +persistence: + config: + enabled: true + type: {{ .Values.filebrowserStorage.config.type }} + datasetName: {{ .Values.filebrowserStorage.config.datasetName | default "" }} + hostPath: {{ .Values.filebrowserStorage.config.hostPath | default "" }} + targetSelector: + filebrowser: + filebrowser: + mountPath: {{ $configBasePath }} + 02-init-config: + mountPath: {{ $configBasePath }} + 01-permissions: + mountPath: /mnt/directories/config + {{- if not .Values.filebrowserStorage.additionalStorages -}} + {{- fail "Filebrowser - Expected at least 1 additional storage" -}} + {{- end -}} + {{- range $idx, $storage := .Values.filebrowserStorage.additionalStorages }} + {{- if not (hasPrefix "/" $storage.mountPath) -}} + {{- fail (printf "Filebrowser - Expected [Mount Path] to start with [/], but got [%v]" $storage.mountPath) -}} + {{- end }} + {{ printf "filebrowser-%v" (int $idx) }}: + enabled: true + type: {{ $storage.type }} + datasetName: {{ $storage.datasetName | default "" }} + hostPath: {{ $storage.hostPath | default "" }} + targetSelector: + filebrowser: + filebrowser: + mountPath: /data{{ $storage.mountPath }} + 01-permissions: + mountPath: /mnt/directories{{ $storage.mountPath }} + {{- end }} + +{{/* Certificate */}} +{{- with .Values.filebrowserNetwork.certificateID }} + cert: + enabled: true + type: secret + objectName: filebrowser-cert + defaultMode: "0600" + items: + - key: tls.key + path: tls.key + - key: tls.crt + path: tls.crt + targetSelector: + filebrowser: + filebrowser: + mountPath: {{ $configBasePath }}/certs + readOnly: true + +scaleCertificate: + filebrowser-cert: + enabled: true + id: {{ . }} +{{- end -}} +{{- end -}} diff --git a/library/ix-dev/community/filebrowser/templates/_portal.tpl b/library/ix-dev/community/filebrowser/templates/_portal.tpl new file mode 100644 index 0000000000..939464d1ec --- /dev/null +++ b/library/ix-dev/community/filebrowser/templates/_portal.tpl @@ -0,0 +1,16 @@ +{{- define "filebrowser.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + {{- $scheme := "http" -}} + {{- if .Values.filebrowserNetwork.certificateID -}} + {{- $scheme = "https" -}} + {{- end }} + path: "/" + port: {{ .Values.filebrowserNetwork.webPort | quote }} + protocol: {{ $scheme }} + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/filebrowser/templates/_service.tpl b/library/ix-dev/community/filebrowser/templates/_service.tpl new file mode 100644 index 0000000000..9cfdbd1f04 --- /dev/null +++ b/library/ix-dev/community/filebrowser/templates/_service.tpl @@ -0,0 +1,15 @@ +{{- define "filebrowser.service" -}} +service: + filebrowser: + enabled: true + primary: true + type: NodePort + targetSelector: filebrowser + ports: + webui: + enabled: true + primary: true + port: {{ .Values.filebrowserNetwork.webPort }} + nodePort: {{ .Values.filebrowserNetwork.webPort }} + targetSelector: filebrowser +{{- end -}} diff --git a/library/ix-dev/community/filebrowser/templates/common.yaml b/library/ix-dev/community/filebrowser/templates/common.yaml new file mode 100644 index 0000000000..50a403b3c1 --- /dev/null +++ b/library/ix-dev/community/filebrowser/templates/common.yaml @@ -0,0 +1,11 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "filebrowser.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "filebrowser.persistence" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "filebrowser.service" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "filebrowser.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/filebrowser/upgrade_info.json b/library/ix-dev/community/filebrowser/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/filebrowser/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/filebrowser/upgrade_strategy b/library/ix-dev/community/filebrowser/upgrade_strategy new file mode 100644 index 0000000000..5718e19a44 --- /dev/null +++ b/library/ix-dev/community/filebrowser/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/filebrowser/values.yaml b/library/ix-dev/community/filebrowser/values.yaml new file mode 100644 index 0000000000..21da06cfe5 --- /dev/null +++ b/library/ix-dev/community/filebrowser/values.yaml @@ -0,0 +1,33 @@ +image: + repository: filebrowser/filebrowser + pullPolicy: IfNotPresent + tag: v2.23.0 + +resources: + limits: + cpu: 4000m + memory: 8Gi + +filebrowserConfig: + additionalEnvs: [] + +filebrowserNetwork: + webPort: 30044 + certificateID: 0 + hostNetwork: false + +filebrowserRunAs: + user: 568 + group: 568 + +filebrowserStorage: + config: + type: ixVolume + datasetName: config + additionalStorages: [] + +notes: + custom: | + Default credentials: + - username: admin + - password: admin