Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/e2e-tests-cypress-template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ jobs:
ref: ${{ inputs.commit_sha }}
fetch-depth: 1
- name: ci/dispatch-begin
uses: mattermost/mattermost-test-system-io/.github/actions/test-system-io-dispatch-begin@a2ea7f005484c28fedf51e16645f6d3bd683fd63 # 2026-05-16
uses: mattermost/mattermost-test-system-io/.github/actions/test-system-io-dispatch-begin@1631d8fcea24f4545a0b3b7f77e41c2fe0be4418 # 2026-07-28
with:
use-staging: ${{ vars.E2E_USE_STAGING_TEST_IO_URL != 'false' }}
framework: cypress
Expand Down Expand Up @@ -332,7 +332,7 @@ jobs:
working-directory: e2e-tests
run: make start-server
- name: ci/dispatch-run
uses: mattermost/mattermost-test-system-io/.github/actions/test-system-io-dispatch-run@a2ea7f005484c28fedf51e16645f6d3bd683fd63 # 2026-05-16
uses: mattermost/mattermost-test-system-io/.github/actions/test-system-io-dispatch-run@1631d8fcea24f4545a0b3b7f77e41c2fe0be4418 # 2026-07-28
with:
use-staging: ${{ vars.E2E_USE_STAGING_TEST_IO_URL != 'false' }}
framework: cypress
Expand Down Expand Up @@ -377,7 +377,7 @@ jobs:
- name: ci/run-summary
id: summary
continue-on-error: true
uses: mattermost/mattermost-test-system-io/.github/actions/test-system-io-summary@a2ea7f005484c28fedf51e16645f6d3bd683fd63 # 2026-05-16
uses: mattermost/mattermost-test-system-io/.github/actions/test-system-io-summary@1631d8fcea24f4545a0b3b7f77e41c2fe0be4418 # 2026-07-28
with:
use-staging: ${{ vars.E2E_USE_STAGING_TEST_IO_URL != 'false' }}
composite-identity: ${{ needs.prepare-run.outputs.composite-identity-json }}
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/e2e-tests-playwright-template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
# Authenticates via GitHub Actions OIDC; calling job MUST grant
# `id-token: write`.

on:

Check warning on line 8 in .github/workflows/e2e-tests-playwright-template.yml

View workflow job for this annotation

GitHub Actions / yamllint

8:1 [truthy] truthy value should be one of [false, true]

Check warning on line 8 in .github/workflows/e2e-tests-playwright-template.yml

View workflow job for this annotation

GitHub Actions / yamllint

8:1 [truthy] truthy value should be one of [false, true]
workflow_call:
inputs:
workers:
Expand Down Expand Up @@ -113,7 +113,7 @@
start_time: ${{ steps.matrix.outputs.start_time }}
steps:
- name: ci/checkout-repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

Check warning on line 116 in .github/workflows/e2e-tests-playwright-template.yml

View workflow job for this annotation

GitHub Actions / yamllint

116:73 [comments] too few spaces before comment: expected 2

Check warning on line 116 in .github/workflows/e2e-tests-playwright-template.yml

View workflow job for this annotation

GitHub Actions / yamllint

116:73 [comments] too few spaces before comment: expected 2
with:
persist-credentials: false
ref: ${{ inputs.commit_sha }}
Expand Down Expand Up @@ -174,7 +174,7 @@
contents: read
steps:
- name: ci/checkout-repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

Check warning on line 177 in .github/workflows/e2e-tests-playwright-template.yml

View workflow job for this annotation

GitHub Actions / yamllint

177:73 [comments] too few spaces before comment: expected 2

Check warning on line 177 in .github/workflows/e2e-tests-playwright-template.yml

View workflow job for this annotation

GitHub Actions / yamllint

177:73 [comments] too few spaces before comment: expected 2
with:
persist-credentials: false
ref: ${{ inputs.commit_sha }}
Expand All @@ -185,7 +185,7 @@
# Caches node_modules + the rolled-up @mattermost/playwright-lib dist
# so workers don't re-run rollup on every job.
id: cache-playwright
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3

Check warning on line 188 in .github/workflows/e2e-tests-playwright-template.yml

View workflow job for this annotation

GitHub Actions / yamllint

188:70 [comments] too few spaces before comment: expected 2

Check warning on line 188 in .github/workflows/e2e-tests-playwright-template.yml

View workflow job for this annotation

GitHub Actions / yamllint

188:70 [comments] too few spaces before comment: expected 2
with:
path: |
e2e-tests/playwright/node_modules
Expand Down Expand Up @@ -232,7 +232,7 @@
ref: ${{ inputs.commit_sha }}
fetch-depth: 1
- name: ci/dispatch-begin
uses: mattermost/mattermost-test-system-io/.github/actions/test-system-io-dispatch-begin@a2ea7f005484c28fedf51e16645f6d3bd683fd63 # 2026-05-16
uses: mattermost/mattermost-test-system-io/.github/actions/test-system-io-dispatch-begin@1631d8fcea24f4545a0b3b7f77e41c2fe0be4418 # 2026-07-28
with:
use-staging: ${{ vars.E2E_USE_STAGING_TEST_IO_URL != 'false' }}
framework: playwright
Expand Down Expand Up @@ -317,7 +317,7 @@
working-directory: e2e-tests/playwright
run: npx playwright test --project=setup
- name: ci/dispatch-run
uses: mattermost/mattermost-test-system-io/.github/actions/test-system-io-dispatch-run@a2ea7f005484c28fedf51e16645f6d3bd683fd63 # 2026-05-16
uses: mattermost/mattermost-test-system-io/.github/actions/test-system-io-dispatch-run@1631d8fcea24f4545a0b3b7f77e41c2fe0be4418 # 2026-07-28
with:
use-staging: ${{ vars.E2E_USE_STAGING_TEST_IO_URL != 'false' }}
framework: playwright
Expand Down Expand Up @@ -363,7 +363,7 @@
- name: ci/run-summary
id: summary
continue-on-error: true
uses: mattermost/mattermost-test-system-io/.github/actions/test-system-io-summary@a2ea7f005484c28fedf51e16645f6d3bd683fd63 # 2026-05-16
uses: mattermost/mattermost-test-system-io/.github/actions/test-system-io-summary@1631d8fcea24f4545a0b3b7f77e41c2fe0be4418 # 2026-07-28
with:
use-staging: ${{ vars.E2E_USE_STAGING_TEST_IO_URL != 'false' }}
composite-identity: ${{ needs.prepare-run.outputs.composite-identity-json }}
Expand Down
254 changes: 131 additions & 123 deletions docs/main/deployment-guide/server/kubernetes/deploy-k8s.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -32,34 +32,34 @@ The Mattermost Kubernetes Operator can be installed using Helm.
1. Install Helm (version 3.13.0 or later). See the [Helm quickstart documentation](https://helm.sh/docs/using_helm/) for installation instructions.
2. Add the Mattermost Helm repository:

> ``` sh
> helm repo add mattermost https://helm.mattermost.com
> ```
``` sh
helm repo add mattermost https://helm.mattermost.com
```

3. Create a file named `config.yaml` and populate it with the contents of the [Mattermost operator values file](https://github.com/mattermost/mattermost-helm/blob/master/charts/mattermost-operator/values.yaml). This file allows for customization of the operator.
4. Create a namespace for the Mattermost Operator:

> ``` sh
> kubectl create ns mattermost-operator
> ```
``` sh
kubectl create ns mattermost-operator
```

5. Install the Mattermost Operator. If you don't specify a version, the latest version of the Mattermost Operator will be installed. We recommend using the latest version of the Mattermost Operator.

> ``` sh
> helm install &lt;your-release-name&gt; mattermost/mattermost-operator -n <namespace_name>
> ```
>
> For example:
>
> ``` sh
> helm install mattermost-operator mattermost/mattermost-operator -n mattermost-operator
> ```
>
> To use your custom `config.yaml` file:
>
> ``` sh
> helm install mattermost-operator mattermost/mattermost-operator -n mattermost-operator -f config.yaml
> ```
``` sh
helm install <your-release-name> mattermost/mattermost-operator -n <namespace_name>
```

For example:

``` sh
helm install mattermost-operator mattermost/mattermost-operator -n mattermost-operator
```

To use your custom `config.yaml` file:

``` sh
helm install mattermost-operator mattermost/mattermost-operator -n mattermost-operator -f config.yaml
```

### Step 3: Deploy Mattermost

Expand All @@ -72,71 +72,71 @@ The Mattermost Kubernetes Operator can be installed using Helm.

1. **(Mattermost Enterprise only)** Create a Mattermost license secret. Create a file named `mattermost-license-secret.yaml` with the following content, replacing `[LICENSE_FILE_CONTENTS]` with your actual license:

> ``` yaml
> apiVersion: v1
> kind: Secret
> metadata:
> name: my-mattermost-license
> type: Opaque
> stringData:
> license: <LICENSE_FILE_CONTENTS>
> ```
``` yaml
apiVersion: v1
kind: Secret
metadata:
name: my-mattermost-license
type: Opaque
stringData:
license: <LICENSE_FILE_CONTENTS>
```

2. Create a Mattermost installation manifest file named `mattermost-installation.yaml`. File names in this guide are suggestions; you can use different names. Use the following template, adjusting the values as needed:

> ``` yaml
> apiVersion: installation.mattermost.com/v1beta1
> kind: Mattermost
> metadata:
> name: <INSTALLATION_NAME_HERE> # Example: mm-example-full
> spec:
> size: <SIZE_VALUE_HERE> # Example: 5000users
> ingress:
> enabled: true
> host: <FULL_DOMAIN_NAME_HERE> # Example: example.mattermost-example.com
> annotations:
> kubernetes.io/ingress.class: nginx
> version: <VERSION_HERE> # Example: 9.3.0
> licenseSecret: "" # If you created a license secret, put the name here
> ```
>
> Key fields in the manifest include:
>
> - `metadata.name`: The name of your Mattermost deployment in Kubernetes.
> - `spec.size`: The size of your installation (e.g., "100users", "1000users", etc.).
> - `spec.ingress.host`: The DNS name for your Mattermost installation.
> - `spec.version`: The Mattermost version. See the [server version archive](/product-overview/version-archive) for available versions. You should use a [supported version](/product-overview/release-policy) of Mattermost in conjunction with the latest version of the Mattermost Operator.
> - `spec.licenseSecret`: The name of the Kubernetes secret containing your license (required for Enterprise).
>
> For a full list of configurable fields, see the [example manifest](https://github.com/mattermost/mattermost-operator/blob/master/docs/examples/mattermost_full.yaml) and the [Custom Resource Definition](https://github.com/mattermost/mattermost-operator/blob/master/config/crd/bases/installation.mattermost.com_mattermosts.yaml).
``` yaml
apiVersion: installation.mattermost.com/v1beta1
kind: Mattermost
metadata:
name: <INSTALLATION_NAME_HERE>
spec:
size: <SIZE_VALUE_HERE>
ingress:
enabled: true
host: <FULL_DOMAIN_NAME_HERE>
annotations:
kubernetes.io/ingress.class: nginx
version: <VERSION_HERE>
licenseSecret: ""
```

Key fields in the manifest include:

- `metadata.name`: The name of your Mattermost deployment in Kubernetes.
- `spec.size`: The size of your installation (e.g., "100users", "1000users", etc.).
- `spec.ingress.host`: The DNS name for your Mattermost installation.
- `spec.version`: The Mattermost version. See the [server version archive](/product-overview/version-archive) for available versions. You should use a [supported version](/product-overview/release-policy) of Mattermost in conjunction with the latest version of the Mattermost Operator.
- `spec.licenseSecret`: The name of the Kubernetes secret containing your license (required for Enterprise).

For a full list of configurable fields, see the [example manifest](https://github.com/mattermost/mattermost-operator/blob/master/docs/examples/mattermost_full.yaml) and the [Custom Resource Definition](https://github.com/mattermost/mattermost-operator/blob/master/config/crd/bases/installation.mattermost.com_mattermosts.yaml).

3. Create a file named `mattermost-database-secret.yaml` for database credentials. This secret must be in the same namespace as the Mattermost installation.

> ``` yaml
> apiVersion: v1
> data:
> DB_CONNECTION_CHECK_URL: <DB_CONNECTION_CHECK_URL>
> DB_CONNECTION_STRING: <DB_CONNECTION_STRING>
> MM_SQLSETTINGS_DATASOURCEREPLICAS: <MM_SQLSETTINGS_DATASOURCEREPLICAS>
> kind: Secret
> metadata:
> name: my-postgres-connection
> type: Opaque
> ```
>
> Example for AWS Aurora with PostgreSQL (`DB_CONNECTION_CHECK_URL`, `DB_CONNECTION_STRING`, and `MM_SQLSETTINGS_DATASOURCEREPLICAS` are the base64-encoded form of your Aurora connection URL, e.g. `postgres://user:password@host:5432/mattermost`):
>
> ``` yaml
> apiVersion: v1
> data:
> DB_CONNECTION_CHECK_URL: cG9zdGdyZXM6Ly91c2Vy... # base64-encoded connection URL
> DB_CONNECTION_STRING: cG9zdGdyZXM6Ly91c2Vy... # base64-encoded connection URL
> MM_SQLSETTINGS_DATASOURCEREPLICAS: cG9zdGdyZXM6... # base64-encoded replica URL
> kind: Secret
> metadata:
> name: my-postgres-connection
> type: Opaque
> ```
``` yaml
apiVersion: v1
data:
DB_CONNECTION_CHECK_URL: <DB_CONNECTION_CHECK_URL>
DB_CONNECTION_STRING: <DB_CONNECTION_STRING>
MM_SQLSETTINGS_DATASOURCEREPLICAS: <MM_SQLSETTINGS_DATASOURCEREPLICAS>
kind: Secret
metadata:
name: my-postgres-connection
type: Opaque
```

Example for AWS Aurora with PostgreSQL (`DB_CONNECTION_CHECK_URL`, `DB_CONNECTION_STRING`, and `MM_SQLSETTINGS_DATASOURCEREPLICAS` are the base64-encoded form of your Aurora connection URL, e.g. `postgres://user:password@host:5432/mattermost`):

``` yaml
apiVersion: v1
data:
DB_CONNECTION_CHECK_URL: cG9zdGdyZXM6Ly91c2Vy...
DB_CONNECTION_STRING: cG9zdGdyZXM6Ly91c2Vy...
MM_SQLSETTINGS_DATASOURCEREPLICAS: cG9zdGdyZXM6...
kind: Secret
metadata:
name: my-postgres-connection
type: Opaque
```

<Note>

Expand All @@ -152,7 +152,7 @@ Create a file named `mattermost-filestore-secret.yaml` to store the credentials
apiVersion: v1
kind: Secret
metadata:
name: <secret-name> # Choose a descriptive name (e.g., my-s3-credentials)
name: <secret-name>
type: Opaque
data:
accesskey: <base64-encoded-access-key>
Expand Down Expand Up @@ -199,63 +199,71 @@ metadata:
name: my-s3-credentials
type: Opaque
data:
accesskey: QUNDRVNTX0tFWQo= # Example: Replace with your actual encoded key
secretkey: U1VQRVJfU0VDUkVUX0tFWQo= # Example: Replace with your actual encoded key
accesskey: QUNDRVNTX0tFWQo=
secretkey: U1VQRVJfU0VDUkVUX0tFWQo=
```

Replace both values with your own base64-encoded keys.

</Important>

### Step 5: Configure the Mattermost Installation Manifest

1. Modify the `mattermost-installation.yaml` file (created in step 2) to connect Mattermost to your external database and object storage. Refer to the supported fields for guidance on where to add these configurations within the YAML structure.
2. Connect to the database:

> 1. Add the following to the `spec` section of your manifest:
>
> > ``` yaml
> > spec:
> > database:
> > external:
> > secret: &lt;database-secret-name&gt; # The name of the database secret (e.g., my-postgres-connection)
> > ```
>
> 2. **(Recommended)** Configure the database-readiness init container to use the in-image `mattermost db ping` command instead of the legacy `postgres:13` + `pg_isready` flow. This avoids the need to pull a separate `postgres:13` image (the primary motivation for air-gapped clusters that can't mirror it) and keeps your readiness check in sync with the Mattermost release you're running.
>
> > ``` yaml
> > spec:
> > database:
> > external:
> > secret: <database-secret-name>
> > readinessCheck:
> > mode: builtin
> > timeout: 5m # optional; default is 5m
> > ```
>
> Using `builtin` mode requires a Mattermost release that ships the `mattermost db ping` command (see the [Mattermost server pull request](https://github.com/mattermost/mattermost/pull/36406) for availability).
>
> Omitting `readinessCheck` (or setting `mode: external`) preserves the legacy `postgres:13` + `pg_isready` behavior. The legacy mode is the current default for backward compatibility and will be deprecated in a future operator release. See the [Mattermost CRD reference](https://github.com/mattermost/mattermost-operator/blob/master/docs/mattermost_v1beta1_crd.md) for the full `readinessCheck` field schema.
1. Add the following to the `spec` section of your manifest:

``` yaml
spec:
database:
external:
secret: <database-secret-name>
```

Replace `<database-secret-name>` with the name of the database secret you created (e.g., `my-postgres-connection`).

2. **(Recommended)** Configure the database-readiness init container to use the in-image `mattermost db ping` command instead of the legacy `postgres:13` + `pg_isready` flow. This avoids the need to pull a separate `postgres:13` image (the primary motivation for air-gapped clusters that can't mirror it) and keeps your readiness check in sync with the Mattermost release you're running.

``` yaml
spec:
database:
external:
secret: <database-secret-name>
readinessCheck:
mode: builtin
timeout: 5m
```

`timeout` is optional and defaults to `5m`.

Using `builtin` mode requires a Mattermost release that ships the `mattermost db ping` command (see the [Mattermost server pull request](https://github.com/mattermost/mattermost/pull/36406) for availability).

Omitting `readinessCheck` (or setting `mode: external`) preserves the legacy `postgres:13` + `pg_isready` behavior. The legacy mode is the current default for backward compatibility and will be deprecated in a future operator release. See the [Mattermost CRD reference](https://github.com/mattermost/mattermost-operator/blob/master/docs/mattermost_v1beta1_crd.md) for the full `readinessCheck` field schema.

3. Connect to Object Storage:

> 1. Add the following to the `spec` section of your manifest:
>
> > ``` yaml
> > spec:
> > fileStore:
> > external:
> > url: &lt;storage-service-url&gt; # The URL of your storage service (e.g., s3.amazonaws.com)
> > bucket: &lt;bucket-name&gt; # The name of your storage bucket
> > secret: &lt;filestore-secret-name&gt; # The name of the filestore secret (e.g., my-s3-credentials)
> > ```
1. Add the following to the `spec` section of your manifest:

``` yaml
spec:
fileStore:
external:
url: <storage-service-url>
bucket: <bucket-name>
secret: <filestore-secret-name>
```

Replace `<storage-service-url>` with the URL of your storage service (e.g., `s3.amazonaws.com`), `<bucket-name>` with the name of your storage bucket, and `<filestore-secret-name>` with the name of the filestore secret you created (e.g., `my-s3-credentials`).

4. If you are using Amazon S3, it's recommended to enable server-side encryption (SSE) and SSL. Add the following environment variables to the `mattermostEnv` section:

> ``` yaml
> spec:
> mattermostEnv:
> MM_FILESETTINGS_AMAZONS3SSL: true
> MM_FILESETTINGS_AMAZONS3SSE: true
> ```
``` yaml
spec:
mattermostEnv:
MM_FILESETTINGS_AMAZONS3SSL: true
MM_FILESETTINGS_AMAZONS3SSE: true
```

## Review Mattermost Resource Status

Expand Down
9 changes: 6 additions & 3 deletions docs/site/src/components/CardGrid/styles.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,13 @@
}

.title {
font-family: var(--mm-font-heading);
font-weight: 900;
/* Mixed-case, multi-word labels (e.g. "For End Users") read as too
* heavy/shouty in Archivo Black at 900 — same issue already fixed for
* h1-h4 — so use the sans face at a lighter bold weight instead. */
font-family: var(--mm-font-sans);
font-weight: 700;
font-size: 1.05rem;
letter-spacing: 0.01em;
letter-spacing: -0.01em;
margin-bottom: 0.35rem;
color: var(--mm-text-primary);
}
Expand Down
Loading
Loading