From 4c2e896140c7190e2a40938dd62092d4a530919b Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Mon, 28 Feb 2022 01:00:52 +0200 Subject: [PATCH] feat(grist): Add grist (#1972) * feat(grist): Add grist * add db and redis deps * add rest files, no work done yet * basic test values * typo * rofs false * root * remove redis for now due to a bug * add api service, update questions and doc * completely remove redis for nwo --- charts/incubator/grist/Chart.yaml | 29 ++ charts/incubator/grist/questions.yaml | 503 +++++++++++++++++++ charts/incubator/grist/templates/common.yaml | 1 + charts/incubator/grist/values.yaml | 45 ++ docs/_static/img/appicons/grist-icon.png | Bin 0 -> 52861 bytes docs/manual/default-ports.md | 2 + 6 files changed, 580 insertions(+) create mode 100644 charts/incubator/grist/Chart.yaml create mode 100644 charts/incubator/grist/questions.yaml create mode 100644 charts/incubator/grist/templates/common.yaml create mode 100644 charts/incubator/grist/values.yaml create mode 100644 docs/_static/img/appicons/grist-icon.png diff --git a/charts/incubator/grist/Chart.yaml b/charts/incubator/grist/Chart.yaml new file mode 100644 index 00000000000..fd81bdc69c3 --- /dev/null +++ b/charts/incubator/grist/Chart.yaml @@ -0,0 +1,29 @@ +apiVersion: v2 +appVersion: "10.6.2" +dependencies: +- name: common + repository: https://truecharts.org + version: 8.16.0 +description: Grist is a modern relational spreadsheet. It combine the flexibility of a spreadsheet with the robustness of a database to organize your data. +home: https://github.com/truecharts/apps/tree/master/charts/stable/grist +icon: https://truecharts.org/_static/img/appicons/grist-icon.png +keywords: +- grist +- spreadsheet +- database +kubeVersion: '>=1.16.0-0' +maintainers: +- email: info@truecharts.org + name: TrueCharts + url: https://truecharts.org +name: grist +sources: +- https://hub.docker.com/r/gristlabs/grist +- https://github.com/gristlabs/grist-core +- https://support.getgrist.com/ +version: 0.0.1 +annotations: + truecharts.org/catagories: | + - productivity + truecharts.org/SCALE-support: "true" + truecharts.org/grade: U diff --git a/charts/incubator/grist/questions.yaml b/charts/incubator/grist/questions.yaml new file mode 100644 index 00000000000..611c23aa1bb --- /dev/null +++ b/charts/incubator/grist/questions.yaml @@ -0,0 +1,503 @@ +# Include{groups} +portals: + open: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" +questions: + - variable: portal + group: "Container Image" + label: "Configure Portal Button" + schema: + type: dict + hidden: true + attrs: + - variable: enabled + label: "Enable" + description: "enable the portal button" + schema: + hidden: true + editable: false + type: boolean + default: true +# Include{global} + - variable: controller + group: "Controller" + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: advanced + label: "Show Advanced Controller Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: type + description: "Please specify type of workload to deploy" + label: "(Advanced) Controller Type" + schema: + type: string + default: "deployment" + required: true + enum: + - value: "deployment" + description: "Deployment" + - value: "statefulset" + description: "Statefulset" + - value: "daemonset" + description: "Daemonset" + - variable: replicas + description: "Number of desired pod replicas" + label: "Desired Replicas" + schema: + type: int + default: 1 + required: true + - variable: strategy + description: "Please specify type of workload to deploy" + label: "(Advanced) Update Strategy" + schema: + type: string + default: "Recreate" + required: true + enum: + - value: "Recreate" + description: "Recreate: Kill existing pods before creating new ones" + - value: "RollingUpdate" + description: "RollingUpdate: Create new pods and then kill old ones" + - value: "OnDelete" + description: "(Legacy) OnDelete: ignore .spec.template changes" +# Include{controllerExpert} + # Docker specific env + - variable: env + group: "Container Configuration" + label: "Image Environment" + schema: + additional_attrs: true + type: dict + attrs: +# Include{fixedEnv} + - variable: GRIST_DEFAULT_EMAIL + label: "GRIST_DEFAULT_EMAIL" + description: "If set, login as this user if no other credentials presented" + schema: + type: string + default: "" + - variable: GRIST_DOMAIN + label: "GRIST_DOMAIN" + description: "In hosted Grist, Grist is served from subdomains of this domain" + schema: + type: string + default: "" + - variable: GRIST_SUPPORT_ANON + label: "GRIST_SUPPORT_ANON" + description: "If set to true, show UI for anonymous access." + schema: + type: boolean + default: false + - variable: GRIST_THROTTLE_CPU + label: "GRIST_THROTTLE_CPU" + description: "If set, CPU throttling is enabled" + schema: + type: boolean + default: false + - variable: GRIST_BACKUP_DELAY_SECS + label: "GRIST_BACKUP_DELAY_SECS" + description: "Wait this long after a doc change before making a backup" + schema: + type: int + default: 15 + - variable: ALLOWED_WEBHOOK_DOMAINS + label: "ALLOWED_WEBHOOK_DOMAINS" + description: "Comma-separated list of permitted domains to use in webhooks" + schema: + type: string + default: "" + - variable: enabledsandbox + label: "Sandbox" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: GRIST_SANDBOX_FLAVOR + label: "GRIST_SANDBOX_FLAVOR" + description: "If set, forces Grist to use the specified kind of sandbox." + schema: + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "pynbox" + description: "pynbox" + - value: "unsandboxed" + description: "unsandboxed" + - value: "docker" + description: "docker" + - value: "macSandboxExec" + description: "macSandboxExec" + - variable: GRIST_SANDBOX + label: "GRIST_SANDBOX" + description: "A program or image name to run as the sandbox. See NSandbox.ts for nerdy details." + schema: + type: string + default: "" + - variable: PYTHON_VERSION + label: "PYTHON_VERSION" + description: "If set, documents without an engine setting are assumed to use the specified version of python. Not all sandboxes support all versions." + schema: + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "2" + description: "2" + - value: "3" + description: "3" + - variable: PYTHON_VERSION_ON_CREATION + label: "PYTHON_VERSION_ON_CREATION" + description: "If set, newly created documents have an engine setting set to python2 or python3. Not all sandboxes support all versions." + schema: + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "2" + description: "2" + - value: "3" + description: "3" + - variable: secret + group: "Container Configuration" + label: "Secret Image Environment" + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabledgdrive + label: "Google Drive Integration" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: GOOGLE_CLIENT_ID + label: "GOOGLE_CLIENT_ID" + description: "Set to the Google Client Id to be used with Google API client" + schema: + type: string + default: "" + - variable: GOOGLE_CLIENT_SECRET + label: "GOOGLE_CLIENT_SECRET" + description: "Set to the Google Client Secret to be used with Google API client" + schema: + type: string + private: true + default: "" + - variable: GOOGLE_API_KEY + label: "GOOGLE_API_KEY" + description: "Set to the Google API Key to be used with Google API client (accessing public files)" + schema: + type: string + private: true + default: "" + - variable: GOOGLE_DRIVE_SCOPE + label: "GOOGLE_DRIVE_SCOPE" + description: "Set to the scope requested for Google Drive integration (defaults to drive.file)" + schema: + type: string + private: true + default: "" + +# Include{containerConfig} + + - variable: service + group: "Networking and Services" + label: "Configure Service(s)" + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: "Main Service" + description: "The Primary service on which the healthcheck runs, often the webUI" + schema: + additional_attrs: true + type: dict + attrs: +# Include{serviceSelector} + - variable: main + label: "Main Service Port Configuration" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: "Port" + description: "This port exposes the container port on the service" + schema: + type: int + default: 10163 + required: true + - variable: advanced + label: "Show Advanced settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: protocol + label: "Port Type" + schema: + type: string + default: "HTTP" + enum: + - value: HTTP + description: "HTTP" + - value: "HTTPS" + description: "HTTPS" + - value: TCP + description: "TCP" + - value: "UDP" + description: "UDP" + - variable: nodePort + label: "Node Port (Optional)" + description: "This port gets exposed to the node. Only considered when service type is NodePort, Simple or LoadBalancer" + schema: + type: int + min: 9000 + max: 65535 + - variable: targetPort + label: "Target Port" + description: "The internal(!) port on the container the Application runs on" + schema: + type: int + default: 10163 + - variable: api + label: "API Service" + description: "API service" + schema: + additional_attrs: true + type: dict + attrs: +# Include{serviceSelector} + - variable: api + label: "API Service Port Configuration" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: "Port" + description: "This port exposes the container port on the service" + schema: + type: int + default: 10164 + required: true + - variable: advanced + label: "Show Advanced settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: protocol + label: "Port Type" + schema: + type: string + default: "HTTP" + enum: + - value: HTTP + description: "HTTP" + - value: "HTTPS" + description: "HTTPS" + - value: TCP + description: "TCP" + - value: "UDP" + description: "UDP" + - variable: nodePort + label: "Node Port (Optional)" + description: "This port gets exposed to the node. Only considered when service type is NodePort, Simple or LoadBalancer" + schema: + type: int + min: 9000 + max: 65535 + - variable: targetPort + label: "Target Port" + description: "The internal(!) port on the container the Application runs on" + schema: + type: int + default: 10164 + + - variable: serviceexpert + group: "Networking and Services" + label: "Show Expert Config" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hostNetwork + group: "Networking and Services" + label: "Host-Networking (Complicated)" + schema: + type: boolean + default: false + +# Include{serviceExpert} + +# Include{serviceList} + + - variable: persistence + label: "Integrated Persistent Storage" + description: "Integrated Persistent Storage" + group: "Storage and Persistence" + schema: + additional_attrs: true + type: dict + attrs: + - variable: persist + label: "App Persist Storage" + description: "Stores the Application Persist." + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: "Type of Storage" + description: "Sets the persistence type, Anything other than PVC could break rollback!" + schema: + type: string + default: "simplePVC" + enum: + - value: "simplePVC" + description: "PVC (simple)" + - value: "simpleHP" + description: "HostPath (simple)" + - value: "emptyDir" + description: "emptyDir" + - value: "pvc" + description: "pvc" + - value: "hostPath" + description: "hostPath" +# Include{persistenceBasic} + - variable: hostPath + label: "hostPath" + description: "Path inside the container the storage is mounted" + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: medium + label: "EmptyDir Medium" + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "Memory" + description: "Memory" +# Include{persistenceAdvanced} + +# Include{persistenceList} + + - variable: ingress + label: "" + group: "Ingress" + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: "Main Ingress" + schema: + additional_attrs: true + type: dict + attrs: +# Include{ingressDefault} + +# Include{ingressTLS} + +# Include{ingressTraefik} + +# Include{ingressExpert} + +# Include{ingressList} + + - variable: advancedSecurity + label: "Show Advanced Security Settings" + group: "Security and Permissions" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: securityContext + label: "Security Context" + schema: + additional_attrs: true + type: dict + attrs: + - variable: privileged + label: "Privileged mode" + schema: + type: boolean + default: false + - variable: readOnlyRootFilesystem + label: "ReadOnly Root Filesystem" + schema: + type: boolean + default: false + - variable: allowPrivilegeEscalation + label: "Allow Privilege Escalation" + schema: + type: boolean + default: false + - variable: runAsNonRoot + label: "runAsNonRoot" + schema: + type: boolean + default: false +# Include{securityContextAdvanced} + + - variable: podSecurityContext + group: "Security and Permissions" + label: "Pod Security Context" + schema: + additional_attrs: true + type: dict + attrs: + - variable: runAsUser + label: "runAsUser" + description: "The UserID of the user running the application" + schema: + type: int + default: 0 + - variable: runAsGroup + label: "runAsGroup" + description: The groupID this App of the user running the application" + schema: + type: int + default: 0 + - variable: fsGroup + label: "fsGroup" + description: "The group that should own ALL storage." + schema: + type: int + default: 568 +# Include{podSecurityContextAdvanced} + +# Include{resources} + +# Include{advanced} + +# Include{addons} diff --git a/charts/incubator/grist/templates/common.yaml b/charts/incubator/grist/templates/common.yaml new file mode 100644 index 00000000000..a6613c2ce21 --- /dev/null +++ b/charts/incubator/grist/templates/common.yaml @@ -0,0 +1 @@ +{{ include "common.all" . }} diff --git a/charts/incubator/grist/values.yaml b/charts/incubator/grist/values.yaml new file mode 100644 index 00000000000..6756b939f2e --- /dev/null +++ b/charts/incubator/grist/values.yaml @@ -0,0 +1,45 @@ +image: + repository: gristlabs/grist + tag: latest@sha256:f28bc8762e602d5a4c0ef368ee3c8abe7b26bc4b90c7ad4ebc21e7b3ac7b3e70 + pullPolicy: IfNotPresent + +securityContext: + readOnlyRootFilesystem: false + runAsNonRoot: false + +podSecurityContext: + runAsUser: 0 + runAsGroup: 0 + +env: + PORT: "{{ .Values.service.main.ports.main.port }}" + HOME_PORT: "{{ .Values.service.api.ports.api.port }}" + GRIST_DEFAULT_EMAIL: "user@mydomain.com" + +# https://github.com/gristlabs/grist-core/issues/128 +# envValueFrom: +# REDIS_URL: +# secretKeyRef: +# name: rediscreds +# key: url + +service: + main: + ports: + main: + port: 10163 + targetPort: 10163 + api: + ports: + api: + port: 10164 + targetPort: 10164 + +persistence: + persist: + enabled: true + mountPath: "/persist" + +# redis: +# enabled: true +# existingSecret: "rediscreds" diff --git a/docs/_static/img/appicons/grist-icon.png b/docs/_static/img/appicons/grist-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..db33b9d15465d53cf0501813147a5e7a49d6abea GIT binary patch literal 52861 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 NRVB?!`3h$D{|DD~aaaHV literal 0 HcmV?d00001 diff --git a/docs/manual/default-ports.md b/docs/manual/default-ports.md index dc9b8eb9c97..ae7df96297f 100644 --- a/docs/manual/default-ports.md +++ b/docs/manual/default-ports.md @@ -320,6 +320,8 @@ These defaults can of course be changed, but as we guarantee "sane, working defa | linkace | main | main | 10160 | TCP | | | librephotos | main | main | 10161 | TCP | | | pydio-cells | healthcheck | healthcheck | 10162 | TCP | | +| grist | main | main | 10163 | TCP | | +| grist | api | api | 10164 | TCP | | | satisfactory | beacon | beacon | 15000 | UDP | | | satisfactory | query | query | 15777 | UDP | | | minecraft-bedrock | main | main | 19132 | UDP | |