From 3de489424e3adda132763920767aef87e435d75b Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Tue, 22 Mar 2022 21:21:25 +0200 Subject: [PATCH] feat(outline): Add outline (#2230) * feat(outline): add outline * fix minio * remove minio as it's optional * vars * update questions * fix ports * common * common version * dont init db * try migrate as install * update image and try rootless --- charts/incubator/outline/Chart.yaml | 36 ++ charts/incubator/outline/questions.yaml | 504 ++++++++++++++++++ .../incubator/outline/templates/_secrets.tpl | 24 + .../incubator/outline/templates/common.yaml | 8 + charts/incubator/outline/values.yaml | 148 +++++ docs/_static/img/appicons/outline.png | Bin 0 -> 34563 bytes docs/manual/default-ports.md | 1 + 7 files changed, 721 insertions(+) create mode 100644 charts/incubator/outline/Chart.yaml create mode 100644 charts/incubator/outline/questions.yaml create mode 100644 charts/incubator/outline/templates/_secrets.tpl create mode 100644 charts/incubator/outline/templates/common.yaml create mode 100644 charts/incubator/outline/values.yaml create mode 100644 docs/_static/img/appicons/outline.png diff --git a/charts/incubator/outline/Chart.yaml b/charts/incubator/outline/Chart.yaml new file mode 100644 index 00000000000..d203459f331 --- /dev/null +++ b/charts/incubator/outline/Chart.yaml @@ -0,0 +1,36 @@ +apiVersion: v2 +appVersion: "5.6.13" +dependencies: +- name: common + repository: https://truecharts.org + version: 9.1.8 +- condition: postgresql.enabled + name: postgresql + repository: https://truecharts.org/ + version: 7.0.6 +- condition: redis.enabled + name: redis + repository: https://truecharts.org + version: 2.0.5 +deprecated: false +description: A fast, collaborative, knowledge base for your team built using React and Node.js. +home: https://github.com/truecharts/apps/tree/master/charts/stable/outline +icon: https://truecharts.org/_static/img/appicons/outline.png +keywords: +- outline +- knowledge +kubeVersion: '>=1.16.0-0' +maintainers: +- email: info@truecharts.org + name: TrueCharts + url: https://truecharts.org +name: outline +sources: +- https://github.com/outline/outline +type: application +version: 0.0.1 +annotations: + truecharts.org/catagories: | + - productivity + truecharts.org/SCALE-support: "true" + truecharts.org/grade: U diff --git a/charts/incubator/outline/questions.yaml b/charts/incubator/outline/questions.yaml new file mode 100644 index 00000000000..12dff52188e --- /dev/null +++ b/charts/incubator/outline/questions.yaml @@ -0,0 +1,504 @@ +# 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} + + - variable: env + group: "Container Configuration" + label: "Image Environment" + schema: + additional_attrs: true + type: dict + attrs: + - variable: URL + label: "URL" + description: "URL should point to the fully qualified, publicly accessible URL." + schema: + type: string + default: "http://localhost:10194" + - variable: COLLABORATION_URL + label: "COLLABORATION_URL" + description: "URL for external collaboration server" + schema: + type: string + default: "" + - variable: ALLOWED_DOMAINS + label: "ALLOWED_DOMAINS" + description: "Comma separated list of domains to be allowed to signin to the wiki. If not set, all domains are allowed by default when using Google OAuth to signin" + schema: + type: string + default: "" + - variable: SLACK_MESSAGE_ACTIONS + label: "SLACK_MESSAGE_ACTIONS" + schema: + type: boolean + default: true + - variable: ENABLE_UPDATES + label: "ENABLE_UPDATES" + schema: + type: boolean + default: true + - variable: WEB_CONCURRENCY + label: "WEB_CONCURRENCY" + description: "How many processes should be spawned. As a reasonable rule divide your servers available memory by 512 for a rough estimate" + schema: + type: int + default: 1 + - variable: DEFAULT_LANGUAGE + label: "DEFAULT_LANGUAGE" + description: "The default interface language. See translate.getoutline.com for a list of available language codes and their rough percentage translated." + schema: + type: string + default: "en_US" + - variable: TEAM_LOGO + label: "TEAM_LOGO URL" + description: "Custom logo that displays on the authentication screen, scaled to height: 60px (Insert URL here)" + schema: + type: string + default: "" + - variable: MAXIMUM_IMPORT_SIZE + label: "MAXIMUM_IMPORT_SIZE" + description: "Override the maxium size of document imports, could be required if you have especially large Word documents with embedded imagery" + schema: + type: int + default: 5120000 + - variable: SENTRY_DSN + label: "SENTRY_DSN" + schema: + type: string + default: "" + - variable: slackenabled + label: "Enable Slack Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: SLACK_KEY + label: "SLACK_KEY" + schema: + type: string + default: "" + private: true + - variable: SLACK_SECRET + label: "SLACK_SECRET" + schema: + type: string + default: "" + private: true + - variable: SLACK_VERIFICATION_TOKEN + label: "SLACK_VERIFICATION_TOKEN" + schema: + type: string + default: "" + private: true + - variable: SLACK_APP_ID + label: "SLACK_APP_ID" + schema: + type: string + default: "" + private: true + - variable: googlenabled + label: "Enable Google Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: GOOGLE_CLIENT_ID + label: "GOOGLE_CLIENT_ID" + schema: + type: string + default: "" + private: true + - variable: GOOGLE_CLIENT_SECRET + label: "GOOGLE_CLIENT_SECRET" + schema: + type: string + default: "" + private: true + - variable: GOOGLE_ANALYTICS_ID + label: "GOOGLE_ANALYTICS_ID" + schema: + type: string + default: "" + private: true + - variable: azureenabled + label: "Enable Azure Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: AZURE_CLIENT_ID + label: "AZURE_CLIENT_ID" + schema: + type: string + default: "" + private: true + - variable: AZURE_CLIENT_SECRET + label: "AZURE_CLIENT_SECRET" + schema: + type: string + default: "" + private: true + - variable: AZURE_RESOURCE_APP_ID + label: "AZURE_RESOURCE_APP_ID" + schema: + type: string + default: "" + private: true + - variable: oidcenabled + label: "Enable OIDC Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: OIDC_CLIENT_ID + label: "OIDC_CLIENT_ID" + schema: + type: string + default: "" + private: true + - variable: OIDC_CLIENT_SECRET + label: "OIDC_CLIENT_SECRET" + schema: + type: string + default: "" + private: true + - variable: OIDC_AUTH_URI + label: "OIDC_AUTH_URI" + schema: + type: string + default: "" + - variable: OIDC_TOKEN_URI + label: "OIDC_TOKEN_URI" + schema: + type: string + default: "" + - variable: OIDC_USERINFO_URI + label: "OIDC_USERINFO_URI" + schema: + type: string + default: "" + - variable: OIDC_USERNAME_CLAIM + label: "OIDC_USERNAME_CLAIM" + schema: + type: string + default: "preferred_username" + - variable: OIDC_DISPLAY_NAME + label: "OIDC_DISPLAY_NAME" + schema: + type: string + default: "OpenID" + - variable: OIDC_SCOPES + label: "OIDC_SCOPES" + schema: + type: string + default: "openid profile email" + - variable: sthreenabled + label: "Enable AWS / Minio (S3) Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: AWS_ACCESS_KEY_ID + label: "AWS_ACCESS_KEY_ID" + schema: + type: string + default: "" + private: true + - variable: AWS_SECRET_ACCESS_KEY + label: "AWS_SECRET_ACCESS_KEY" + schema: + type: string + default: "" + private: true + - variable: AWS_REGION + label: "AWS_REGION" + schema: + type: string + default: "" + - variable: AWS_S3_ACCELERATE_URL + label: "AWS_S3_ACCELERATE_URL" + schema: + type: string + default: "" + - variable: AWS_S3_UPLOAD_BUCKET_URL + label: "AWS_S3_UPLOAD_BUCKET_URL" + schema: + type: string + default: "" + - variable: AWS_S3_UPLOAD_BUCKET_NAME + label: "AWS_S3_UPLOAD_BUCKET_NAME" + schema: + type: string + default: "" + - variable: AWS_S3_UPLOAD_MAX_SIZE + label: "AWS_S3_UPLOAD_MAX_SIZE" + schema: + type: int + default: 26214400 + - variable: AWS_S3_FORCE_PATH_STYLE + label: "AWS_S3_FORCE_PATH_STYLE" + schema: + type: boolean + default: true + - variable: AWS_S3_ACL + label: "AWS_S3_ACL" + schema: + type: string + default: "private" +# 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: 10196 + 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: 10196 + + - 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} + +# 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} + +# Include{security} + + - 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/outline/templates/_secrets.tpl b/charts/incubator/outline/templates/_secrets.tpl new file mode 100644 index 00000000000..0337d613fe0 --- /dev/null +++ b/charts/incubator/outline/templates/_secrets.tpl @@ -0,0 +1,24 @@ +{{/* Define the secrets */}} +{{- define "outline.secrets" -}} +--- + +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: outline-secrets +{{- $outlineprevious := lookup "v1" "Secret" .Release.Namespace "outline-secrets" }} +{{- $secret_key := "" }} +{{- $utils_secret := "" }} +data: + {{- if $outlineprevious}} + SECRET_KEY: {{ index $outlineprevious.data "SECRET_KEY" }} + UTILS_SECRET: {{ index $outlineprevious.data "UTILS_SECRET" }} + {{- else }} + {{- $secret_key := randAlphaNum 32 }} + {{- $utils_secret := randAlphaNum 32 }} + SECRET_KEY: {{ $secret_key | b64enc }} + UTILS_SECRET: {{ $utils_secret | b64enc }} + {{- end }} + +{{- end -}} diff --git a/charts/incubator/outline/templates/common.yaml b/charts/incubator/outline/templates/common.yaml new file mode 100644 index 00000000000..a62fd1cae85 --- /dev/null +++ b/charts/incubator/outline/templates/common.yaml @@ -0,0 +1,8 @@ +{{/* Make sure all variables are set properly */}} +{{- include "common.setup" . }} + +{{/* Render secrets for fireflyiii */}} +{{- include "outline.secrets" . }} + +{{/* Render the templates */}} +{{ include "common.postSetup" . }} diff --git a/charts/incubator/outline/values.yaml b/charts/incubator/outline/values.yaml new file mode 100644 index 00000000000..58542fc4886 --- /dev/null +++ b/charts/incubator/outline/values.yaml @@ -0,0 +1,148 @@ +image: + repository: tccr.io/truecharts/outline + pullPolicy: IfNotPresent + tag: v0.62.0@sha256:9350ace6f88ae314620ab32e9990481d0e89895409b171fa0545b8ef9f7ede65 + +minioImage: + repository: tccr.io/truecharts/minio + tag: latest@sha256:bd004ba41b2456f115c7f1360d7c49f4478f5d9ce20ad042c8ce2cf5aff46d24 + +# # Needs check +# securityContext: +# readOnlyRootFilesystem: false +# runAsNonRoot: false +# # Needs check +# podSecurityContext: +# runAsUser: 0 +# runAsGroup: 0 + +env: + FORCE_HTTPS: false + PGSSLMODE: "disable" + PORT: "{{ .Values.service.main.ports.main.port }}" + # User defined + SLACK_MESSAGE_ACTIONS: true + ENABLE_UPDATES: true + WEB_CONCURRENCY: 1 + DEFAULT_LANGUAGE: "en_US" + TEAM_LOGO: "" + MAXIMUM_IMPORT_SIZE: 5120000 + ALLOWED_DOMAINS: "" + URL: "http://localhost:{{ .Values.service.main.ports.main.port }}" + COLLABORATION_URL: "" + SLACK_KEY: "" + SLACK_SECRET: "" + SLACK_VERIFICATION_TOKEN: "" + SLACK_APP_ID: "" + GOOGLE_CLIENT_ID: "" + GOOGLE_CLIENT_SECRET: "" + GOOGLE_ANALYTICS_ID: "" + AZURE_CLIENT_ID: "" + AZURE_CLIENT_SECRET: "" + AZURE_RESOURCE_APP_ID: "" + OIDC_CLIENT_ID: "" + OIDC_CLIENT_SECRET: "" + OIDC_AUTH_URI: "" + OIDC_TOKEN_URI: "" + OIDC_USERINFO_URI: "" + OIDC_USERNAME_CLAIM: "" + OIDC_DISPLAY_NAME: "" + OIDC_SCOPES: "" + SENTRY_DSN: "" + AWS_ACCESS_KEY_ID: "" + AWS_SECRET_ACCESS_KEY: "" + AWS_REGION: "" + AWS_S3_ACCELERATE_URL: "" + AWS_S3_UPLOAD_BUCKET_URL: "" + AWS_S3_UPLOAD_BUCKET_NAME: "" + AWS_S3_UPLOAD_MAX_SIZE: 26214400 + AWS_S3_FORCE_PATH_STYLE: true + AWS_S3_ACL: "" + +envValueFrom: + DATABASE_URL: + secretKeyRef: + name: dbcreds + key: url-noql + REDIS_URL: + secretKeyRef: + name: rediscreds + key: url + SECRET_KEY: + secretKeyRef: + name: outline-secrets + key: SECRET_KEY + UTILS_SECRET: + secretKeyRef: + name: outline-secrets + key: UTILS_SECRET + +service: + main: + ports: + main: + port: 10196 + +# Enabled redis +redis: + enabled: true + existingSecret: "rediscreds" + +# Enabled postgres +postgresql: + enabled: true + existingSecret: "dbcreds" + postgresqlUsername: outline + postgresqlDatabase: outline + +installContainers: + initdb: + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + env: + - name: DATABASE_URL + valueFrom: + secretKeyRef: + name: dbcreds + key: url-noql + - name: REDIS_URL + valueFrom: + secretKeyRef: + name: rediscreds + key: url + - name: SECRET_KEY + valueFrom: + secretKeyRef: + name: outline-secrets + key: SECRET_KEY + - name: UTILS_SECRET + valueFrom: + secretKeyRef: + name: outline-secrets + key: UTILS_SECRET + command: ["sh", "-c", "yarn sequelize db:migrate --env=production-ssl-disabled"] + +upgradeContainers: + upgradedb: + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + env: + - name: DATABASE_URL + valueFrom: + secretKeyRef: + name: dbcreds + key: url-noql + - name: REDIS_URL + valueFrom: + secretKeyRef: + name: rediscreds + key: url + - name: SECRET_KEY + valueFrom: + secretKeyRef: + name: outline-secrets + key: SECRET_KEY + - name: UTILS_SECRET + valueFrom: + secretKeyRef: + name: outline-secrets + key: UTILS_SECRET + command: ["sh", "-c", "yarn sequelize db:migrate --env=production-ssl-disabled"] diff --git a/docs/_static/img/appicons/outline.png b/docs/_static/img/appicons/outline.png new file mode 100644 index 0000000000000000000000000000000000000000..edca70b0440275d4d28ef1bc297839390b2d3903 GIT binary patch literal 34563 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/manual/default-ports.md b/docs/manual/default-ports.md index 4a68fa92aab..56e586f60da 100644 --- a/docs/manual/default-ports.md +++ b/docs/manual/default-ports.md @@ -352,6 +352,7 @@ These defaults can of course be changed, but as we guarantee "sane, working defa | verysync | main | main | 10193 | HTTP | | | browserless | main | main | 10194 | TCP | | | kutt | main | main | 10195 | TCP | | +| outline | main | main | 10196 | TCP | | | storj-node | main | main | 14002 | TCP | | | satisfactory | beacon | beacon | 15000 | UDP | | | satisfactory | query | query | 15777 | UDP | |