Zulip is an open source threaded team chat that helps teams stay productive and focused.
Helm chart based on https://github.com/zulip/docker-zulip
Copy values-local.yaml.example
, modify it as instructed in the comments, then
install with the following commands:
helm dependency update # Get helm dependency charts
helm install -f ./values-local.yaml zulip . # Install Zulip
This will show a message on how to reach your Zulip installation and how to
create your first realm. Wait for all your pods to be ready before you continue.
You can run kubectl get pods
to their current state. Once all pods are ready,
you can run the commands to create a Realm, and you can reach Zulip following
the instructions as well.
You need to do a few things to make minikube serve Zulip with a TLS certificate. Without it, Zulip will not work.
If you haven't already, you need to set up cert-manager
inside your minikube.
First, enable the "ingress" minikube addon (more info available here)
minikube addons enable ingress
Second, install cert-manager into your minikube cluster:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml
Now you'll need to add an issuer that issues self-signed certificates. Copy this
into a file, self-signed-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: selfsigned
namespace: cert-manager
spec:
selfSigned: {}
Now apply the issuer: kubectl apply -f self-signed-issuer.yaml
We'll host Zulip on zulip.local
. Add that to your /etc/hosts
file and
point it to the IP address you get with the command minikube ip
.
Now you're ready to follow the installation instructions above.
Key | Type | Default | Description |
---|---|---|---|
affinity | object | {} |
|
fullnameOverride | string | "" |
|
image.pullPolicy | string | "IfNotPresent" |
|
image.repository | string | "zulip/docker-zulip" |
|
image.tag | string | "9.4-0" |
|
imagePullSecrets | list | [] |
|
ingress.annotations | object | {} |
|
ingress.enabled | bool | false |
|
ingress.hosts[0].host | string | "zulip.example.com" |
|
ingress.hosts[0].paths[0].path | string | "/" |
|
ingress.tls | list | [] |
|
livenessProbe.enabled | bool | true |
|
livenessProbe.failureThreshold | int | 3 |
|
livenessProbe.initialDelaySeconds | int | 10 |
|
livenessProbe.periodSeconds | int | 10 |
|
livenessProbe.successThreshold | int | 1 |
|
livenessProbe.timeoutSeconds | int | 5 |
|
memcached.memcachedUsername | string | "zulip@localhost" |
|
nameOverride | string | "" |
|
nodeSelector | object | {} |
|
podAnnotations | object | {} |
|
podLabels | object | {} |
|
podSecurityContext | object | {} |
|
postSetup.scripts | object | {} |
|
postgresql.auth.database | string | "zulip" |
|
postgresql.auth.username | string | "zulip" |
|
postgresql.image.repository | string | "zulip/zulip-postgresql" |
|
postgresql.image.tag | int | 14 |
|
postgresql.primary.containerSecurityContext.runAsUser | int | 0 |
|
rabbitmq.auth.username | string | "zulip" |
|
rabbitmq.persistence.enabled | bool | false |
|
redis.architecture | string | "standalone" |
|
redis.master.persistence.enabled | bool | false |
|
resources | object | {} |
|
securityContext | object | {} |
|
service.port | int | 80 |
|
service.type | string | "ClusterIP" |
|
serviceAccount.annotations | object | {} |
|
serviceAccount.create | bool | true |
|
serviceAccount.name | string | "" |
|
sidecars | list | [] |
|
startupProbe.enabled | bool | true |
|
startupProbe.failureThreshold | int | 30 |
|
startupProbe.initialDelaySeconds | int | 10 |
|
startupProbe.periodSeconds | int | 10 |
|
startupProbe.successThreshold | int | 1 |
|
startupProbe.timeoutSeconds | int | 5 |
|
statefulSetAnnotations | object | {} |
|
statefulSetLabels | object | {} |
|
tolerations | list | [] |
|
zulip.environment.DISABLE_HTTPS | bool | true |
|
zulip.environment.SECRETS_email_password | string | "123456789" |
|
zulip.environment.SETTING_EMAIL_HOST | string | "" |
|
zulip.environment.SETTING_EMAIL_HOST_USER | string | "[email protected]" |
|
zulip.environment.SETTING_EMAIL_PORT | string | "587" |
|
zulip.environment.SETTING_EMAIL_USE_SSL | string | "False" |
|
zulip.environment.SETTING_EMAIL_USE_TLS | string | "True" |
|
zulip.environment.SETTING_EXTERNAL_HOST | string | "zulip.example.com" |
|
zulip.environment.SETTING_ZULIP_ADMINISTRATOR | string | "[email protected]" |
|
zulip.environment.SSL_CERTIFICATE_GENERATION | string | "self-signed" |
|
zulip.environment.ZULIP_AUTH_BACKENDS | string | "EmailAuthBackend" |
|
zulip.persistence.accessMode | string | "ReadWriteOnce" |
|
zulip.persistence.enabled | bool | true |
|
zulip.persistence.size | string | "10Gi" |
|
zulip.persistence.storageClass | string | nil |
This helm chart sets up a StatefulSet that runs a Zulip pod, that in turn runs
the docker-zulip Dockerized
Zulip version. Configuration of Zulip happens through environment variables that
are defined in the values.yaml
under zulip.environment
. These environment
variables are forwarded to the Docker container, you can read more about
configuring Zulip through environment variables
here.
The chart uses Memcached, RabbitMQ and Redis helm charts defined in the Bitnami Helm repository. Most of these are configured following their default settings, but you can check https://github.com/bitnami/charts/tree/master/bitnami/ for more configuration options of the subcharts.
For PostgreSQL the chart also uses the Bitnami chart to install it on the Kubernetes cluster. However, in this case we use Zulip's zulip-postgresql docker image, because it contains the Postgresql plugins that are needed to run Zulip.
Repository | Name | Version |
---|---|---|
oci://registry-1.docker.io/bitnamicharts | memcached | 7.4.16 |
oci://registry-1.docker.io/bitnamicharts | postgresql | 15.5.32 |
oci://registry-1.docker.io/bitnamicharts | rabbitmq | 14.7.0 |
oci://registry-1.docker.io/bitnamicharts | redis | 20.1.4 |