DISCLAIMER: This is a 3rd party project and has no affiliation with the Stoat.chat team.
This chart provides a means of deploying Stoat to kubernetes.
To use the minimal setup, you will require
- A working kubernetes cluster
- Persistent storage for MongoDB, Redis, MinIO, and RabbitMQ
- A valid hostname and the ability to access it via HTTPS (such as cert-manager)
- Generate required config keys. We provide a script to run in docker to generate it in this repo. (This is a
simplified version of the script provided by the self-hosted repo)
docker run --entrypoint /bin/ash -v ./:/data alpine/openssl /data/generate_config.sh
- Fill out required config
global: namespace: 'stoat' domain: 'stoat.example.com' ingress: enabled: true className: nginx annotations: # Annotations may differ for other ingress controllers. Consult your documentation. nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/force-ssl-redirect: 'true' nginx.ingress.kubernetes.io/proxy-body-size: '0' # Or GatewayAPI Routes route: enabled: true parentRefs: - <Your parent ref here> secret: vapid_key: '' vapid_public_key: '' encryption_key: ''
- Fill out any other credentials you may need, such as RabbitMQ or other external charts.
- Run
helm install ./ stoat -f my_values.yaml - Once it's done setting itself, up, access it at your external URL. It may take a few minutes to spin up from scratch.
Congrats, you have a minimal working setup. A slightly more complete setup can be seen at docs/example_values.yaml
However, you should not consider this setup production ready until the services provided by the external charts are supplied elsewhere and with proper authentication.
Persistence is handled by the subcharts. Consult the subcharts for more information.
The subcharts all support external connections, with the option to disable the built-in chart.
global:
subcharts:
# All but rabbitmq are full connection+auth strings.
mongo: # mongodb
enabled: true # Set to false to use external MongoDB
connection_url: ''
redis:
enabled: true # Set to false to use external Redis
connection_url: ''
minio:
enabled: true # Set to false to use external MinIO
connection_url: ''
rabbitmq:
enabled: true # Set to false to use external RabbitMQ
host: ''
port: 5672
username: 'rabbituser'
password: 'rabbitpass'| Chart Option | Description | Default |
|---|---|---|
global.namespace |
Namespace for the chart services | 'stoat' |
global.domain REQUIRED |
Domain name used for access (e.g. ) stoat.example.com |
'' |
global.secret.vapid_key REQUIRED |
VAPID private key for push notifications | '' |
global.secret.vapid_public_key REQUIRED |
VAPID public key for push notifications | '' |
global.secret.encryption_key REQUIRED |
Encryption key for sensitive data | '' |
global.web.port |
Port for the web frontend | 5000 |
global.api.port |
Port for the API server | 14702 |
global.bonfire.port |
Port for the bonfire events service | 14703 |
global.autumn.port |
Port for the autumn file server | 14704 |
global.january.port |
Port for the january metadata proxy | 14705 |
global.gifbox.port |
Port for the gifbox proxy | 14706 |
global.crond.port |
Port for the crond scheduler | 80 |
global.pushd.port |
Port for the pushd notification service | 80 |
global.ingress.enabled |
Enable Kubernetes Ingress | false |
global.ingress.className |
Ingress class name (e.g., ) nginx |
'' |
global.ingress.annotations |
Additional Ingress annotations (map) | {} |
global.ingress.extra_hosts |
Additional hosts for Ingress (list) | [] |
global.route.enabled |
Enable GatewayAPI Routes | false |
global.route.parentRefs |
Parent references for route (required) | [] |
global.route.annotations |
Additional annotations for routes | {} |
global.serviceAccount.create |
Whether to create a Kubernetes service account | true |
global.serviceAccount.automount |
Automount service account tokens | true |
global.serviceAccount.annotations |
Additional annotations for ServiceAccount | {} |
global.serviceAccount.name |
ServiceAccount name override | '' |
global.subcharts.mongo.enabled |
Enable built-in MongoDB subchart | true |
global.subcharts.mongo.connection_url |
MongoDB connection string (if using external) | '' |
global.subcharts.redis.enabled |
Enable built-in Redis subchart | true |
global.subcharts.redis.connection_url |
Redis connection string (if using external) | '' |
global.subcharts.minio.enabled |
Enable built-in MinIO subchart | true |
global.subcharts.minio.connection_url |
MinIO connection string (if using external) | '' |
global.subcharts.rabbitmq.enabled |
Enable built-in RabbitMQ subhcart | true |
global.subcharts.rabbitmq.host |
RabbitMQ hostname (if using external) | '' |
global.subcharts.rabbitmq.port |
RabbitMQ port (if using external) | 5672 |
global.subcharts.rabbitmq.username |
RabbitMQ username | 'rabbituser' |
global.subcharts.rabbitmq.password |
RabbitMQ password | 'rabbitpass' |
MongoDB, Redis, MinIO, and RabbitMQ are all subcharts. Consult their respective documentation for more information.
- MongoDB: https://github.com/bitnami/charts/tree/main/bitnami/mongodb#parameters
- Redis: https://github.com/bitnami/charts/tree/main/bitnami/redis#parameters
- MinIO: https://github.com/bitnami/charts/tree/main/bitnami/minio#parameters
- RabbitMQ: https://github.com/bitnami/charts/tree/main/bitnami/rabbitmq#parameters
These are the default values we supply for the subcharts.
| config | description | default |
|---|---|---|
mongodb.architecture |
MongoDB deployment mode | standalone |
mongodb.auth.enabled |
Enable auth | false |
mongodb.persistence.enabled |
Enable persistence | false |
mongodb.image.repository |
MongoDB image repository | bitnamilegacy/mongodb |
mongodb.image.tag |
MongoDB image tag | 8.0.13-debian-12-r0 |
| config | description | default |
|---|---|---|
redis.architecture |
Redis deployment mode | standalone |
redis.auth.enabled |
Enable auth | false |
redis.master.persistence.enabled |
Enable persistence for master | true |
redis.image.repository |
Redis image repository | bitnamilegacy/redis |
redis.image.tag |
Redis image tag | 8.2.1-debian-12-r0 |
| config | description | default |
|---|---|---|
rabbitmq.replicaCount |
Number of RabbitMQ replicas | 1 |
rabbitmq.auth.username |
RabbitMQ username | rabbituser |
rabbitmq.auth.password |
RabbitMQ password | rabbitpass |
rabbitmq.persistence.enabled |
Enable persistence | true |
rabbitmq.image.repository |
RabbitMQ image repository | bitnamilegacy/rabbitmq |
rabbitmq.image.tag |
RabbitMQ image tag | 4.1.3-debian-12-r1 |
| config | description | default |
|---|---|---|
minio.mode |
MinIO deployment mode | standalone |
minio.rootUser |
MinIO root user | minioautumn |
minio.rootPassword |
MinIO root password | minioautumn |
minio.persistence.enabled |
Enable persistence | true |
minio.auth.rootUser |
MinIO root user for auth section | minioautumn |
minio.auth.rootPassword |
MinIO root password for auth section | minioautumn |
minio.image.repository |
MinIO image repository | bitnamilegacy/minio |
minio.image.tag |
MinIO image tag | 2025.7.23-debian-12-r3 |
This section exposes the config options found in Revolt.toml.
| config | description | default |
|---|---|---|
stoat.config.production |
Production mode | false |
stoat.config.api.registration.invite_only |
Set to true to require an invite code to register. | false |
stoat.config.api.smtp.host |
SMTP server host | '' |
stoat.config.api.smtp.port |
SMTP server port | 587 |
stoat.config.api.smtp.use_tls |
Use TLS for SMTP | true |
stoat.config.api.smtp.username |
SMTP Username | '' |
stoat.config.api.smtp.password |
SMTP Password | '' |
stoat.config.api.smtp.from_address |
Email address that they will appear to be sent from | '' |
stoat.config.api.smtp.reply_to |
Monitored email users can reply to | '' |
stoat.config.files.s3.region |
S3 region | 'minio' |
stoat.config.files.s3.default_bucket |
S3 default bucket | 'revolt-uploads' |
| config | description | default |
|---|---|---|
web.image.repository |
Image repository | ghcr.io/revoltchat/client |
web.image.tag |
Image tag | master |
web.image.pullPolicy |
Image pull policy | Always |
web.annotations |
Additional pod annotations | {} |
web.labels |
Additional pod labels | {} |
web.nodeSelector |
Pod nodeSelector | {} |
web.tolerations |
Pod tolerations list | [] |
web.affinity |
Pod affinity | {} |
web.replicaCount |
Number of replicas | 1 |
web.resources |
Resource requests and limits | {} |
web.livenessProbe |
Liveness probe | |
web.readinessProbe |
Readiness probe | |
web.service.type |
Service type | ClusterIP |
web.extra_volumes |
Additional pod volumes | [] |
web.extra_volumeMounts |
Additional pod volumeMounts | [] |
| config | description | default |
|---|---|---|
api.image.repository |
Image repository | ghcr.io/revoltchat/server |
api.image.tag |
Image tag | 20250930-2 |
api.image.pullPolicy |
Image pull policy | IfNotPresent |
api.replicaCount |
Number of replicas | 1 |
api.annotations |
Additional pod annotations | {} |
api.labels |
Additional pod labels | {} |
api.nodeSelector |
Pod nodeSelector | {} |
api.tolerations |
Pod tolerations list | [] |
api.affinity |
Pod affinity | {} |
api.resources |
Resource requests and limits | {} |
api.livenessProbe |
Liveness probe | |
api.readinessProbe |
Readiness probe | |
api.service.type |
Service type | ClusterIP |
api.extra_volumes |
Additional pod volumes | [] |
api.extra_volumeMounts |
Additional pod volumeMounts | [] |
api.configMountPath |
Config mount path in pod | /Revolt.toml |
| config | description | default |
|---|---|---|
bonfire.image.repository |
Image repository | ghcr.io/revoltchat/bonfire |
bonfire.image.tag |
Image tag | 20250930-2 |
bonfire.image.pullPolicy |
Image pull policy | IfNotPresent |
bonfire.replicaCount |
Number of replicas | 1 |
bonfire.annotations |
Additional pod annotations | {} |
bonfire.labels |
Additional pod labels | {} |
bonfire.nodeSelector |
Pod nodeSelector | {} |
bonfire.tolerations |
Pod tolerations list | [] |
bonfire.affinity |
Pod affinity | {} |
bonfire.resources |
Resource requests and limits | {} |
bonfire.livenessProbe |
Liveness probe | |
bonfire.readinessProbe |
Readiness probe | |
bonfire.service.type |
Service type | ClusterIP |
bonfire.extra_volumes |
Additional pod volumes | [] |
bonfire.extra_volumeMounts |
Additional pod volumeMounts | [] |
bonfire.configMountPath |
Config mount path in pod | /Revolt.toml |
| config | description | default |
|---|---|---|
autumn.image.repository |
Image repository | ghcr.io/revoltchat/autumn |
autumn.image.tag |
Image tag | 20250930-2 |
autumn.image.pullPolicy |
Image pull policy | IfNotPresent |
autumn.replicaCount |
Number of replicas | 1 |
autumn.annotations |
Additional pod annotations | {} |
autumn.labels |
Additional pod labels | {} |
autumn.nodeSelector |
Pod nodeSelector | {} |
autumn.tolerations |
Pod tolerations list | [] |
autumn.affinity |
Pod affinity | {} |
autumn.resources |
Resource requests and limits | {} |
autumn.livenessProbe |
Liveness probe | {} (empty by default) |
autumn.readinessProbe |
Readiness probe | |
autumn.service.type |
Service type | ClusterIP |
autumn.extra_volumes |
Additional pod volumes | [] |
autumn.extra_volumeMounts |
Additional pod volumeMounts | [] |
autumn.configMountPath |
Config mount path in pod | /Revolt.toml |
| config | description | default |
|---|---|---|
january.image.repository |
Image repository | ghcr.io/revoltchat/january |
january.image.tag |
Image tag | 20250930-2 |
january.image.pullPolicy |
Image pull policy | IfNotPresent |
january.replicaCount |
Number of replicas | 1 |
january.annotations |
Additional pod annotations | {} |
january.labels |
Additional pod labels | {} |
january.nodeSelector |
Pod nodeSelector | {} |
january.tolerations |
Pod tolerations list | [] |
january.affinity |
Pod affinity | {} |
january.resources |
Resource requests and limits | {} |
january.livenessProbe |
Liveness probe | |
january.readinessProbe |
Readiness probe | |
january.service.type |
Service type | ClusterIP |
january.extra_volumes |
Additional pod volumes | [] |
january.extra_volumeMounts |
Additional pod volumeMounts | [] |
january.configMountPath |
Config mount path in pod | /Revolt.toml |
| config | description | default |
|---|---|---|
crond.image.repository |
Image repository | ghcr.io/revoltchat/crond |
crond.image.tag |
Image tag | 20250930-2 |
crond.image.pullPolicy |
Image pull policy | IfNotPresent |
crond.replicaCount |
Number of replicas | 1 |
crond.annotations |
Additional pod annotations | {} |
crond.labels |
Additional pod labels | {} |
crond.nodeSelector |
Pod nodeSelector | {} |
crond.tolerations |
Pod tolerations list | [] |
crond.affinity |
Pod affinity | {} |
crond.resources |
Resource requests and limits | {} |
crond.livenessProbe |
Liveness probe | |
crond.readinessProbe |
Readiness probe | |
crond.extra_volumes |
Additional pod volumes | [] |
crond.extra_volumeMounts |
Additional pod volumeMounts | [] |
crond.configMountPath |
Config mount path in pod | /Revolt.toml |
| config | description | default |
|---|---|---|
pushd.image.repository |
Image repository | ghcr.io/revoltchat/pushd |
pushd.image.tag |
Image tag | 20250930-2 |
pushd.image.pullPolicy |
Image pull policy | IfNotPresent |
pushd.replicaCount |
Number of replicas | 1 |
pushd.annotations |
Additional pod annotations | {} |
pushd.labels |
Additional pod labels | {} |
pushd.nodeSelector |
Pod nodeSelector | {} |
pushd.tolerations |
Pod tolerations list | [] |
pushd.affinity |
Pod affinity | {} |
pushd.resources |
Resource requests and limits | {} |
pushd.livenessProbe |
Liveness probe | |
pushd.readinessProbe |
Readiness probe | |
pushd.extra_volumes |
Additional pod volumes | [] |
pushd.extra_volumeMounts |
Additional pod volumeMounts | [] |
pushd.configMountPath |
Config mount path in pod | /Revolt.toml |
| config | description | default |
|---|---|---|
gifbox.image.repository |
Image repository | ghcr.io/revoltchat/gifbox |
gifbox.image.tag |
Image tag | 20250930-2 |
gifbox.image.pullPolicy |
Image pull policy | IfNotPresent |
gifbox.replicaCount |
Number of replicas | 1 |
gifbox.annotations |
Additional pod annotations | {} |
gifbox.labels |
Additional pod labels | {} |
gifbox.nodeSelector |
Pod nodeSelector | {} |
gifbox.tolerations |
Pod tolerations list | [] |
gifbox.affinity |
Pod affinity | {} |
gifbox.resources |
Resource requests and limits | {} |
gifbox.livenessProbe |
Liveness probe | |
gifbox.readinessProbe |
Readiness probe | |
gifbox.extra_volumes |
Additional pod volumes | [] |
gifbox.extra_volumeMounts |
Additional pod volumeMounts | [] |
gifbox.configMountPath |
Config mount path in pod | /Revolt.toml |
