From 7135d60dde0866ff81ac5c122b6f71aade37386a Mon Sep 17 00:00:00 2001 From: "Carrie Warner (Mattermost)" <74422101+cwarnermm@users.noreply.github.com> Date: Mon, 10 Jul 2023 11:49:43 -0400 Subject: [PATCH 01/34] Deprecated & redirected AI bot framework page to GitHub repo (#6511) * Deprecated & redirected AI bot framework page * Added missing redirect --- source/about/use-cases.rst | 4 +--- .../mattermost-customizable-ai-bot-framework.rst | 3 +++ source/conf.py | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) rename source/{about => archive}/mattermost-customizable-ai-bot-framework.rst (99%) diff --git a/source/about/use-cases.rst b/source/about/use-cases.rst index 3727786b613..1ea3b7dcb1c 100644 --- a/source/about/use-cases.rst +++ b/source/about/use-cases.rst @@ -8,11 +8,9 @@ Use cases /about/secure-command-and-control.rst /about/devops-collaboration.rst /about/incident-response-collaboration.rst - /about/mattermost-customizable-ai-bot-framework.rst Learn more about how to use Mattermost in agile software development, incident response, customer onboarding, and many other applications. * :doc:`Secure command and control ` - Learn about the Mattermost Secure Command and Control solution, designed to provide fast and secure mobile communications for technical teams. * :doc:`How to: Build your Agile software development practice ` - Learn how accelerate software development and deployment processes and reduce costs. -* :doc:`How to: Respond to incidents and outages quickly and effectively ` - Maximize your Mattermost deployment with incident response collaboration. -* :doc:`How to: Integrate AI with Mattermost ` - Learn about how to leverage AI for your Mattermost deployment. \ No newline at end of file +* :doc:`How to: Respond to incidents and outages quickly and effectively ` - Maximize your Mattermost deployment with incident response collaboration. \ No newline at end of file diff --git a/source/about/mattermost-customizable-ai-bot-framework.rst b/source/archive/mattermost-customizable-ai-bot-framework.rst similarity index 99% rename from source/about/mattermost-customizable-ai-bot-framework.rst rename to source/archive/mattermost-customizable-ai-bot-framework.rst index b5470aa99ca..b4dc1e0b71c 100644 --- a/source/about/mattermost-customizable-ai-bot-framework.rst +++ b/source/archive/mattermost-customizable-ai-bot-framework.rst @@ -1,3 +1,6 @@ +:orphan: +:nosearch: + .. _mattermost-customizable-chatgpt-bot-framework: Customizable AI bot framework diff --git a/source/conf.py b/source/conf.py index 277d477dca8..fcbb61dd015 100644 --- a/source/conf.py +++ b/source/conf.py @@ -87,7 +87,9 @@ def setup(_: Sphinx): "about/faq-mattermost-source-available-license.html": "https://docs.mattermost.com/about/faq-license.html#source-available-licensing", "about/mattermost-customizable-chatgpt-bot-framework.html": - "https://docs.mattermost.com/about/mattermost-customizable-ai-bot-framework.html", + "https://github.com/mattermost/openops#readme", +"about/mattermost-customizable-ai-bot-framework.html": + "https://github.com/mattermost/openops#readme", # Administration redirects "administration/announcement-banner.html": From 5e6ea88558fd1ea181289e563aeef198229d58c5 Mon Sep 17 00:00:00 2001 From: Claudio Costa Date: Tue, 11 Jul 2023 15:08:33 -0600 Subject: [PATCH 02/34] Document new settings for TCP listener(s) and IPv6 support (#6458) * Document new settings for TCP listener(s) and IPv6 support * Improve clarity --------- Co-authored-by: Carrie Warner (Mattermost) <74422101+cwarnermm@users.noreply.github.com> --- source/configure/calls-deployment.rst | 30 ++-- .../plugins-configuration-settings.rst | 141 ++++++++++++++---- 2 files changed, 131 insertions(+), 40 deletions(-) diff --git a/source/configure/calls-deployment.rst b/source/configure/calls-deployment.rst index 95e343e9adb..5a5ccc49667 100644 --- a/source/configure/calls-deployment.rst +++ b/source/configure/calls-deployment.rst @@ -52,17 +52,19 @@ Client Network ~~~~~~~ -+---------------------------------+--------+-----------------+------------------------------------------------------------+------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| Service | Ports | Protocols | Source | Target | Purpose | -+=================================+========+=================+============================================================+==========================================+===================================================================================================================================================================================================================================================================================================================================+ -| API (Calls plugin) | 80,443 | TCP (incoming) | Mattermost clients (web/desktop/mobile) | Mattermost instance (Calls plugin) | To allow for HTTP and WebSocket connectivity from clients to Calls plugin. This API is exposed on the same connection as Mattermost, so there’s likely no need to change anything. | -+---------------------------------+--------+-----------------+------------------------------------------------------------+------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| RTC (Calls plugin or ``rtcd``) | 8443 | UDP (incoming) | Mattermost clients (Web/Desktop/Mobile) | Mattermost instance or ``rtcd`` service | To allow clients to establish connections that transport calls related media (e.g. audio, video). This should be open on any network component (e.g. NAT, firewalls) in between the instance running the plugin (or ``rtcd``) and the clients joining calls so that UDP traffic is correctly routed both ways (from/to clients). | -+---------------------------------+--------+-----------------+------------------------------------------------------------+------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| API (``rtcd``) | 8045 | TCP (incoming) | Mattermost instance(s) (Calls plugin) | ``rtcd`` service | To allow for HTTP/WebSocket connectivity from Calls plugin to ``rtcd`` service. Can be expose internally as the service only needs to be reachable by the instance(s) running the Mattermost server. | -+---------------------------------+--------+-----------------+------------------------------------------------------------+------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| STUN (Calls plugin or ``rtcd``) | 3478 | UDP (outgoing) | Mattermost Instance(s) (Calls plugin) or ``rtcd`` service | Configured STUN servers | (Optional) To allow for either Calls plugin or ``rtcd`` service to discover their instance public IP. Only needed if configuring STUN/TURN servers. This requirement does not apply when manually setting an IP or hostname through the |ice_host_override_link| config option. | -+---------------------------------+--------+-----------------+------------------------------------------------------------+------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ++---------------------------------+--------+-----------------+------------------------------------------------------------+------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Service | Ports | Protocols | Source | Target | Purpose | ++---------------------------------+--------+-----------------+------------------------------------------------------------+------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| API (Calls plugin) | 80,443 | TCP (incoming) | Mattermost clients (web/desktop/mobile) | Mattermost instance (Calls plugin) | To allow for HTTP and WebSocket connectivity from clients to Calls plugin. This API is exposed on the same connection as Mattermost, so there’s likely no need to change anything. | ++---------------------------------+--------+-----------------+------------------------------------------------------------+------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| RTC (Calls plugin or ``rtcd``) | 8443 | UDP (incoming) | Mattermost clients (Web/Desktop/Mobile) | Mattermost instance or ``rtcd`` service | To allow clients to establish connections that transport calls related media (e.g. audio, video). This should be open on any network component (e.g. NAT, firewalls) in between the instance running the plugin (or ``rtcd``) and the clients joining calls so that UDP traffic is correctly routed both ways (from/to clients). | ++---------------------------------+--------+-----------------+------------------------------------------------------------+------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| RTC (Calls plugin or ``rtcd``) | 8443 | TCP (incoming) | Mattermost clients (Web/Desktop/Mobile) | Mattermost instance or ``rtcd`` service | To allow clients to establish connections that transport calls related media (e.g. audio, video). This should be open on any network component (e.g. NAT, firewalls) in between the instance running the plugin (or ``rtcd``) and the clients joining calls so that TCP traffic is correctly routed both ways (from/to clients). This can be used as a backup channel in case clients are unable to connect using UDP. It requires ``rtcd`` version >= v0.11 and Calls version >= v0.17. | ++---------------------------------+--------+-----------------+------------------------------------------------------------+------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| API (``rtcd``) | 8045 | TCP (incoming) | Mattermost instance(s) (Calls plugin) | ``rtcd`` service | To allow for HTTP/WebSocket connectivity from Calls plugin to ``rtcd`` service. Can be expose internally as the service only needs to be reachable by the instance(s) running the Mattermost server. | ++---------------------------------+--------+-----------------+------------------------------------------------------------+------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| STUN (Calls plugin or ``rtcd``) | 3478 | UDP (outgoing) | Mattermost Instance(s) (Calls plugin) or ``rtcd`` service | Configured STUN servers | (Optional) To allow for either Calls plugin or ``rtcd`` service to discover their instance public IP. Only needed if configuring STUN/TURN servers. This requirement does not apply when manually setting an IP or hostname through the |ice_host_override_link| config option. | ++---------------------------------+--------+-----------------+------------------------------------------------------------+------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. |ice_host_override_link| replace:: `ICE Host Override `__ @@ -453,7 +455,11 @@ The only external service used is a Mattermost official STUN server (``stun.glob Is using UDP a requirement? ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Yes, UDP is the recommended protocol to serve real-time media as it allows for the lowest latency between peers. While theoretically possible to use TCP, it's not currently supported by the plugin. If using a UDP port is unfeasible, one possible solution would be to run calls through an external TURN server that listens on TCP and relays all media traffic between peers. However, this is a sub-optimal solution that should be avoided if possible as it will introduce extra latency along with added infrastructural cost. +Yes, UDP is the recommended protocol to serve real-time media as it allows for the lowest latency between peers. However, there are a couple of possible solutions to cover clients that due to limitations or strict firewalls are unable to use UDP: + +- Since plugin version 0.17 and ``rtcd`` version 0.11 the RTC service will listen for TCP connections in addition to UDP ones. If configured correctly (e.g. using commonly allowed ports such as 80 or 443) it's possible to have clients connect directly through TCP when unable to do it through the preferred UDP channel. + +- Run calls through an external TURN server that listens on TCP and relays all media traffic between peers. However, this is a sub-optimal solution that should be avoided if possible as it will introduce extra latency along with added infrastructural cost. Do I need a TURN server? ~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/source/configure/plugins-configuration-settings.rst b/source/configure/plugins-configuration-settings.rst index d3df512d59f..750283956b2 100644 --- a/source/configure/plugins-configuration-settings.rst +++ b/source/configure/plugins-configuration-settings.rst @@ -507,50 +507,105 @@ Enable plugin +----------------------------------------------------------------------+----------------------------------------------------------------------------------------+ .. config:setting:: plugins-callsrtcserveraddress - :displayname: RTC server port (Plugins - Calls) + :displayname: RTC server port (UDP) (Plugins - Calls) :systemconsole: Plugins > Calls :configjson: PluginSettings.Plugins.com.mattermost.calls.udpserveraddress :environment: N/A - :description: The IP address used by the RTC server to listen on. By default the service listens on all the available interfaces. + :description: The IP address used by the RTC server to listen for UDP connections. By default the service listens on all the available interfaces. -RTC server address -~~~~~~~~~~~~~~~~~~ +RTC server address (UDP) +~~~~~~~~~~~~~~~~~~~~~~~~ .. include:: ../_static/badges/selfhosted-only.rst :start-after: :nosearch: -+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ -| This setting controls the IP address the RTC server listens to. All Calls traffic will be served through this IP. | - System Config path: **Plugins > Calls** | -| | - ``config.json`` setting: ``PluginSettings.Plugins.com.mattermost.calls.udpserveraddress`` | -| Changing this setting requires a plugin restart to take effect. | - Environment variable: N/A | -| If left unset (default value) the service will listen on all the available interfaces. | | -+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ -| **Note**: This setting is only applicable when not running calls through the standalone ``rtcd`` service. | | -+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ - -.. config:setting:: plugins-callsrtcserverport - :displayname: RTC server port (Plugins - Calls) ++--------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ +| This setting controls the IP address the RTC server listens for UDP connections. All calls UDP traffic will be served through this IP. | - System Config path: **Plugins > Calls** | +| | - ``config.json`` setting: ``PluginSettings.Plugins.com.mattermost.calls.udpserveraddress`` | +| Changing this setting requires a plugin restart to take effect. | - Environment variable: N/A | +| If left unset (default value) the service will listen on all the available interfaces. | | ++--------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ +| **Note**: This setting is only applicable when not running calls through the standalone ``rtcd`` service. | | ++--------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ + +.. config:setting:: plugins-callsrtcserveraddress + :displayname: RTC server port (TCP) (Plugins - Calls) + :systemconsole: Plugins > Calls + :configjson: PluginSettings.Plugins.com.mattermost.calls.tcpserveraddress + :environment: N/A + :description: The IP address used by the RTC server to listen for TCP connections. By default the service listens on all the available interfaces. + +RTC server address (TCP) +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. include:: ../_static/badges/selfhosted-only.rst + :start-after: :nosearch: + ++--------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ +| This setting controls the IP address the RTC server listens for TCP connections. All calls TCP traffic will be served through this IP. | - System Config path: **Plugins > Calls** | +| | - ``config.json`` setting: ``PluginSettings.Plugins.com.mattermost.calls.tcpserveraddress`` | +| Changing this setting requires a plugin restart to take effect. | - Environment variable: N/A | +| If left unset (default value) the service will listen on all the available interfaces. | | ++--------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ +| **Note**: | | +| | | +| - This setting is only applicable when not running calls through the standalone ``rtcd`` service. | | +| | | +| - This setting is available starting in plugin version 0.17. | | ++--------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ + +.. config:setting:: plugins-callsrtcserverportudp + :displayname: RTC server port (UDP) (Plugins - Calls) :systemconsole: Plugins > Calls :configjson: PluginSettings.Plugins.com.mattermost.calls.udpserverport :environment: N/A - :description: The UDP port the RTC server will listen on. All calls traffic will be served through this port. Default port is **8443**. + :description: The UDP port the RTC server will listen on. All calls UDP traffic will be served through this port. Default port is **8443**. -RTC server port -~~~~~~~~~~~~~~~ +RTC server port (UDP) +~~~~~~~~~~~~~~~~~~~~~ .. include:: ../_static/badges/selfhosted-only.rst :start-after: :nosearch: -+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+ -| This setting controls the UDP port listened on by the RTC server. All Calls traffic will be served through this port. | - System Config path: **Plugins > Calls** | -| | - ``config.json`` setting: ``PluginSettings.Plugins.com.mattermost.calls.udpserverport`` | -| | - Environment variable: N/A | -| Changing this setting requires a plugin restart to take effect. | | -| | | -| Default is **8443**. | | -+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+ -| **Note**: This setting is only applicable when not running calls through the standalone ``rtcd`` service. | | -+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+ ++-------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+ +| This setting controls the UDP port listened on by the RTC server. All calls UDP traffic will be served through this port. | - System Config path: **Plugins > Calls** | +| | - ``config.json`` setting: ``PluginSettings.Plugins.com.mattermost.calls.udpserverport`` | +| | - Environment variable: N/A | +| Changing this setting requires a plugin restart to take effect. | | +| | | +| Default is **8443**. | | ++-------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+ +| **Note**: This setting is only applicable when not running calls through the standalone ``rtcd`` service. | | ++-------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+ + +.. config:setting:: plugins-callsrtcserverporttcp + :displayname: RTC server port (TCP) (Plugins - Calls) + :systemconsole: Plugins > Calls + :configjson: PluginSettings.Plugins.com.mattermost.calls.tcpserverport + :environment: N/A + :description: The TCP port the RTC server will listen on. All calls TCP traffic will be served through this port. Default port is **8443**. + +RTC server port (TCP) +~~~~~~~~~~~~~~~~~~~~~ + +.. include:: ../_static/badges/selfhosted-only.rst + :start-after: :nosearch: + ++-------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+ +| This setting controls the TCP port listened on by the RTC server. All calls TCP traffic will be served through this port. | - System Config path: **Plugins > Calls** | +| | - ``config.json`` setting: ``PluginSettings.Plugins.com.mattermost.calls.tcpserverport`` | +| | - Environment variable: N/A | +| Changing this setting requires a plugin restart to take effect. | | +| | | +| Default is **8443**. | | ++-------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+ +| **Note**: | | +| | | +| - This setting is only applicable when not running calls through the standalone ``rtcd`` service. | | +| | | +| - This setting is available starting in plugin version 0.17. | | ++-------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+ + .. config:setting:: plugins-enableonspecificchannels :displayname: Enable on specific channels (Plugins - Calls) @@ -923,6 +978,36 @@ Call recording quality | **Note**: The quality setting will affect the performance of the recording service and the file size of recordings. Refer to the `deployment section `__ for more information. | +-----------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +.. config:setting:: plugins-callsenableipv6 + :displayname: (Experimental) Enable IPv6 (Plugins - Calls) + :systemconsole: Plugins > Calls + :configjson: PluginSettings.Plugins.com.mattermost.calls.enableipv6 + :environment: N/A + + - **true**: The RTC service will work in dual-stack mode, listening for IPv6 connections and generating candidates in addition to IPv4 ones. + - **false**: The RTC service will only listen for IPv4 connections. + +(Experimental) Enable IPv6 +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. include:: ../_static/badges/selfhosted-only.rst + :start-after: :nosearch: + ++----------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------+ +| - **true**: The RTC service will work in dual-stack mode, listening for IPv6 connections and generating candidates in addition to IPv4 ones. | - System Config path: **Plugins > Calls** | +| - **false**: The RTC service will only listen for IPv4 connections. | - ``config.json`` setting: ``PluginSettings.Plugins.com.mattermost.calls.enableipv6`` | +| | - Environment variable: N/A | +| Default value is **false**. | | +| | | +| Changing this setting requires a plugin restart to take effect. | | ++----------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------+ +| **Note**: | | +| | | +| - This setting is only applicable when not running calls through the standalone ``rtcd`` service. | | +| | | +| - This setting is available starting in plugin version 0.17. | | ++----------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------+ + .. |note| replace:: . ---- From b87e481e74bc219316d971726c5b3a7c483bc84f Mon Sep 17 00:00:00 2001 From: Amy Blais <29708087+amyblais@users.noreply.github.com> Date: Wed, 12 Jul 2023 10:18:44 -0400 Subject: [PATCH 03/34] v7.9.6 / v7.10.4 dot release docs (#6509) * Update self-managed-changelog.md * Update install-tar.rst * Update self-managed-changelog.md * Update version-archive.rst * Update version-archive.rst --- source/install/install-tar.rst | 2 +- source/install/self-managed-changelog.md | 10 ++++++++ source/upgrade/version-archive.rst | 32 ++++++++++++------------ 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/source/install/install-tar.rst b/source/install/install-tar.rst index f41ccdf7493..3ef6f6bbc06 100644 --- a/source/install/install-tar.rst +++ b/source/install/install-tar.rst @@ -63,7 +63,7 @@ Using ``wget``, download the Mattermost Server release you want to install.
- wget https://releases.mattermost.com/7.10.3/mattermost-7.10.3-linux-amd64.tar.gz + wget https://releases.mattermost.com/7.10.4/mattermost-7.10.4-linux-amd64.tar.gz Copied to clipboard
diff --git a/source/install/self-managed-changelog.md b/source/install/self-managed-changelog.md index b1e8bfc90f8..d5cb1399cad 100644 --- a/source/install/self-managed-changelog.md +++ b/source/install/self-managed-changelog.md @@ -17,6 +17,11 @@ Latest Mattermost Releases: ## Release v7.10 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html#feature-release) +- **v7.10.4, released 2023-07-12** + - Mattermost v7.10.4 contains medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/). + - Mattermost v7.10.4 contains no database or functional changes. + - Fixed an issue where posts were not fully sanitized for audit output when a link preview was included. + - Updated prepackaged Playbooks plugin version to 1.36.2. - **v7.10.3, released 2023-06-15** - Mattermost v7.10.3 contains low to medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/). - Updated prepackaged Boards to v7.10.3. @@ -130,6 +135,11 @@ The following deprecations and breaking changes are planned for the Mattermost v ## Release v7.9 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html#feature-release) +- **v7.9.6, released 2023-07-12** + - Mattermost v7.9.6 contains medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/). + - Mattermost v7.9.6 contains no database or functional changes. + - Fixed an issue where posts were not fully sanitized for audit output when a link preview was included. + - Updated prepackaged Playbooks plugin version to 1.36.2. - **v7.9.5, released 2023-06-15** - Mattermost v7.9.5 contains low to medium severity level security fixes. [Upgrading](https://docs.mattermost.com/upgrade/upgrading-mattermost-server.html) to this release is recommended. Details will be posted on our [security updates page](https://mattermost.com/security-updates/) 30 days after release as per the [Mattermost Responsible Disclosure Policy](https://mattermost.com/security-vulnerability-report/). - Updated prepackaged Boards to v7.9.6. diff --git a/source/upgrade/version-archive.rst b/source/upgrade/version-archive.rst index 5cea466a48c..dbc80382b62 100644 --- a/source/upgrade/version-archive.rst +++ b/source/upgrade/version-archive.rst @@ -16,14 +16,14 @@ If you want to check that the version of Mattermost you are installing is the of Mattermost Enterprise Edition ------------------------------ -Mattermost Enterprise Edition v7.10.3 - `View Changelog `__ - `Download `__ - - ``https://releases.mattermost.com/7.10.3/mattermost-7.10.3-linux-amd64.tar.gz`` - - SHA-256 Checksum: ``a03ebbb13c93bc1d0355cc377bac7bf58e0af31957ef962b791c2773da254f2e`` - - GPG Signature: https://releases.mattermost.com/7.10.3/mattermost-7.10.3-linux-amd64.tar.gz.sig -Mattermost Enterprise Edition v7.9.5 - `View Changelog `__ - `Download `__ - - ``https://releases.mattermost.com/7.9.5/mattermost-7.9.5-linux-amd64.tar.gz`` - - SHA-256 Checksum: ``e5d868ea960104668fee42196824d6ee92d0babc7c3da9861bef84f24bcb26db`` - - GPG Signature: https://releases.mattermost.com/7.9.5/mattermost-7.9.5-linux-amd64.tar.gz.sig +Mattermost Enterprise Edition v7.10.4 - `View Changelog `__ - `Download `__ + - ``https://releases.mattermost.com/7.10.4/mattermost-7.10.4-linux-amd64.tar.gz`` + - SHA-256 Checksum: ``132d9c1fd0a7422f03e40bc4f095a4eaf4da470208af8d51d5e853581f2154c3`` + - GPG Signature: https://releases.mattermost.com/7.10.4/mattermost-7.10.4-linux-amd64.tar.gz.sig +Mattermost Enterprise Edition v7.9.6 - `View Changelog `__ - `Download `__ + - ``https://releases.mattermost.com/7.9.6/mattermost-7.9.6-linux-amd64.tar.gz`` + - SHA-256 Checksum: ``33b256f77b215c3fbc09e042dde9a45182c079eba56df684b405161f0d68454b`` + - GPG Signature: https://releases.mattermost.com/7.9.6/mattermost-7.9.6-linux-amd64.tar.gz.sig Mattermost Enterprise Edition v7.8.8 *Extended Support Release (ESR)* - `View Changelog `__ - `Download `__ - ``https://releases.mattermost.com/7.8.8/mattermost-7.8.8-linux-amd64.tar.gz`` - SHA-256 Checksum: ``573cf678872f8edb347bff84510ce5b39c8f825702b73699af45d47f6072d6c3`` @@ -329,14 +329,14 @@ The open source Mattermost Team Edition is functionally identical to the commerc We generally recommend installing Enterprise Edition, even if you don't currently need a license. This provides the flexibility to seamlessly unlock Enterprise features should you need them. However, if you only want to install software with a fully open source code base, then Team Edition is the best choice for you. -Mattermost Team Edition v7.10.3 - `View Changelog `__ - `Download `__ - - ``https://releases.mattermost.com/7.10.3/mattermost-team-7.10.3-linux-amd64.tar.gz`` - - SHA-256 Checksum: ``cfc90a2a0b4352d10db8510281048f3e2253f600ae812af9c2a9c78146fc5db0`` - - GPG Signature: https://releases.mattermost.com/7.10.3/mattermost-team-7.10.3-linux-amd64.tar.gz.sig -Mattermost Team Edition v7.9.5 - `View Changelog `__ - `Download `__ - - ``https://releases.mattermost.com/7.9.5/mattermost-team-7.9.5-linux-amd64.tar.gz`` - - SHA-256 Checksum: ``b0b460be82380bd7b2cdf789890ec5ed38c05aa75727466880efabf8236af4dd`` - - GPG Signature: https://releases.mattermost.com/7.9.5/mattermost-team-7.9.5-linux-amd64.tar.gz.sig +Mattermost Team Edition v7.10.4 - `View Changelog `__ - `Download `__ + - ``https://releases.mattermost.com/7.10.4/mattermost-team-7.10.4-linux-amd64.tar.gz`` + - SHA-256 Checksum: ``744fae31e3cc59b8d56accd064f2605a4d165e740fcf4e224cd1693a9ff4d2eb`` + - GPG Signature: https://releases.mattermost.com/7.10.4/mattermost-team-7.10.4-linux-amd64.tar.gz.sig +Mattermost Team Edition v7.9.6 - `View Changelog `__ - `Download `__ + - ``https://releases.mattermost.com/7.9.6/mattermost-team-7.9.6-linux-amd64.tar.gz`` + - SHA-256 Checksum: ``cb4334bb355bc8a8471e66886e5332467c9e21f105514778072a142e6ab65a9e`` + - GPG Signature: https://releases.mattermost.com/7.9.6/mattermost-team-7.9.6-linux-amd64.tar.gz.sig Mattermost Team Edition v7.8.8 *Extended Support Release (ESR)* - `View Changelog `__ - `Download `__ - ``https://releases.mattermost.com/7.8.8/mattermost-team-7.8.8-linux-amd64.tar.gz`` - SHA-256 Checksum: ``87f7115d8527d9b5ef215f10bd414f91c0816b84c215cac5d51628fe1977db40`` From efe48e99e04803ad7808a376b6906c84a72c761d Mon Sep 17 00:00:00 2001 From: Amy Blais <29708087+amyblais@users.noreply.github.com> Date: Thu, 13 Jul 2023 08:14:46 -0400 Subject: [PATCH 04/34] Cloud changelog - July 13th release (#6502) * Update cloud-changelog.md * Update cloud-changelog.md * Update cloud-changelog.md * Update cloud-changelog.md * Update cloud-changelog.md --- source/install/cloud-changelog.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/source/install/cloud-changelog.md b/source/install/cloud-changelog.md index 80bcd451b8b..b766f482c83 100644 --- a/source/install/cloud-changelog.md +++ b/source/install/cloud-changelog.md @@ -4,12 +4,39 @@ This changelog summarizes updates to [Mattermost Cloud](https://mattermost.com/g Latest Mattermost Cloud releases: +- [Release 2023-07-11](#release-2023-07-11) - [Release 2023-06-26](#release-2023-06-26) - [Release 2023-06-13](#release-2023-06-13) - [Release 2023-05-31](#release-2023-05-31) - [Release 2023-05-01](#release-2023-05-01) - [Release 2023-04-21](#release-2023-04-21) -- [Release 2023-03-29](#release-2023-03-29) + +## Release 2023-07-11 + +### Highlights + +#### Calls + - Calls v0.17.0 introduces a new ringing feature (Beta): Calls in Direct and Group Message channels will ring and pop up a visual notification for the incoming call. Check out the Calls v0.17.0 release notes and Calls documentation for more details. + +### Improvements + +#### User Interface (UI) + - Updated the user interface for the **Browse channels** modal. + - Increased the nickname field in the user interface from 22 to 64 characters. + - Updated links to documentation in the **System Console**. + - Emoji size is now in scale with the text size in the channel header. + - Prepackaged Focalboard plugin version 7.11.0. + - Prepackaged Playbooks plugin version 1.37.0. + +### Bug Fixes + - Fixed an issue where scrollbars were not visible enough on the **File Preview** screen. + - Fixed an issue where SAML Admin Attribute only compared the first value instead of looping through the assertion values array. + - Fixed an issue where updates to recent emojis were not batched when multiple emojis were posted at once. + - Reverted a change that could cause the webapp to forget the current user's authentication method. + +### Known Issues + - Boards public links that follow the URL schema `/boards/public/...` will not work after this update. They can either be regenerated through the application by going to the board and selecting the **Share** button at the top right, or they can be obtained by replacing the `/boards/public/` part of the URL with `/plugins/focalboard/`. + - The Playbooks left-hand sidebar does not update when a user is added to a run or playbook without a refresh. ## Release 2023-06-26 From c70d30ca74871b6039b90ecb7b6bdd6003e7a71f Mon Sep 17 00:00:00 2001 From: Amy Blais <29708087+amyblais@users.noreply.github.com> Date: Fri, 14 Jul 2023 08:09:27 -0400 Subject: [PATCH 05/34] v2.6 Mobile changelog (#6501) * Update mobile-app-changelog.md * Update mobile-app-changelog.md * Update mobile-app-changelog.md * Update mobile-app-changelog.md * Update source/deploy/mobile-app-changelog.md * Update mobile-app-changelog.md * Update mobile-app-changelog.md --------- Co-authored-by: Carrie Warner (Mattermost) <74422101+cwarnermm@users.noreply.github.com> --- source/deploy/mobile-app-changelog.md | 42 +++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/source/deploy/mobile-app-changelog.md b/source/deploy/mobile-app-changelog.md index 36f78fccbc7..145f7ef9f97 100644 --- a/source/deploy/mobile-app-changelog.md +++ b/source/deploy/mobile-app-changelog.md @@ -2,12 +2,42 @@ Latest Mattermost Mobile Apps releases: -- [2.5.1 Release](#release) -- [2.5.0 Release](#id1) -- [2.4.0 Release](#id4) -- [2.3.0 Release](#id9) -- [2.2.0 Release](#id14) -- [2.1.0 Release](#id19) +- [2.6.0 Release](#release) +- [2.5.1 Release](#id1) +- [2.5.0 Release](#id4) +- [2.4.0 Release](#id9) +- [2.3.0 Release](#id14) +- [2.2.0 Release](#id19) + +## 2.6.0 Release +- Release Date: July 14, 2023 +- Server Versions Supported: Server v7.8.0+ is required. Self-Signed SSL Certificates are not supported unless the user installs the CA certificate on their device. + +### Compatibility + - **Upgrade to server version v7.8.0 or later is required.** Support for server [Extended Support Release](https://docs.mattermost.com/upgrade/extended-support-release.html) (ESR) v7.1.0 has ended and upgrading to server ESR v7.8.0 or later is required. As we innovate and offer newer versions of our mobile apps, we maintain backwards compatibility only with supported server versions. Users who upgrade to the newest mobile apps while being connected to an unsupported server version can be exposed to compatibility issues, which can cause crashes or severe bugs that break core functionality of the app. + - Android operating system 7+ [is required by Google](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html). + - iPhone 5s devices and later with iOS 12.1+ is required. + +### Improvements + - Calls: ``/call start`` will now start calls within an existing thread. + - Improved logging for mobile apps. + - Added localization support to iOS share extension. + - Improved the user interface of the **Edit Post** screen. + +### Bug Fixes + - Fixed a rare issue when changing the role of the current user in a channel. + - Calls: Fixed an issue for blank screen after ending a call and exiting its thread. + - Fixed an issue where the Global Threads screens didn't show a badge if the user had mentions in other channels / servers. + - Removed unneeded fetch posts for unread archived channels that were appearing in the logs. + - Removed unneeded group calls that were appearing in the logs. + - Fixed an issue with the progress indicator when uploading files on Android. + - Fixed a few issues with app initialization. + - Fixed an issue where notifications would show "Session expired" instead of the message. + - Fixed a crash when users that reacted with a certain emoji were listed and a user was missing. + +### Known Issues + - Users are unable to adjust the font size via the OS font size setting. + - Some Google Pixel phones on Android 12+ might not continue past the login screen. This is a known issue with the OS, and the current workaround is to restart the device. ## 2.5.1 Release - Release Date: June 23, 2023 From 92090304d9a6bda6a7d6d25ee2c849b5d9897b80 Mon Sep 17 00:00:00 2001 From: "Carrie Warner (Mattermost)" <74422101+cwarnermm@users.noreply.github.com> Date: Fri, 14 Jul 2023 08:24:26 -0400 Subject: [PATCH 06/34] Added slash commands for calls (#6518) --- source/channels/interact-with-channels.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/channels/interact-with-channels.rst b/source/channels/interact-with-channels.rst index 2e11dbc8df3..ace4ae040db 100644 --- a/source/channels/interact-with-channels.rst +++ b/source/channels/interact-with-channels.rst @@ -32,6 +32,12 @@ Join, leave, or mute channels - Mute a channel using ``/mute`` or ``/mute {channel-name}`` to turn off desktop, email, and push notifications for the current or specified channel. - Remove someone from a channel using ``/kick {@username}`` or ``/remove {@username}``. +Start or join a call +~~~~~~~~~~~~~~~~~~~~ + +- Start a call in a channe or thread using ``/call start`` +- Join a call in a channel or thread using ``/call join`` + Manage conversations ~~~~~~~~~~~~~~~~~~~~ From e050da5c701c1de9eaf851f5f87ba21c77fdaa47 Mon Sep 17 00:00:00 2001 From: Amy Blais <29708087+amyblais@users.noreply.github.com> Date: Fri, 14 Jul 2023 08:39:05 -0400 Subject: [PATCH 07/34] V8.0 documentation (#6406) * Update conf.py * Trace logging doesn't apply to SAML (#6361) This change addresses an issue for 7.11 from the docs task board. * Add KB link to docs on disabling Insights (#6365) * Update insights.rst Added link to knowledge base article for disabling insights, removed broken link. * Update important-upgrade-notes.rst Fixed broken links in the last two items of the Important bullet points. Added link to Insights documentation in last bullet point. * Update self-managed-changelog.md Added link to Insights documentation in the second bullet point under Known Issues. * Update source/welcome/insights.rst * Update source/install/self-managed-changelog.md * Update source/upgrade/important-upgrade-notes.rst --------- Co-authored-by: Carrie Warner (Mattermost) <74422101+cwarnermm@users.noreply.github.com> * Other MFA apps can be used instead of Google Authenticator (#6375) * Update manage-your-profile.rst Removed references to Google Authenticator * Update multi-factor-authentication.rst Updated instructions to note that apps besides Google Authenticator can be used for MFA * Update conf.py Added redirect for reference to setting-up MFA in user profiles * Update source/onboard/multi-factor-authentication.rst --------- Co-authored-by: Carrie Warner (Mattermost) <74422101+cwarnermm@users.noreply.github.com> * Update plugins-configuration-settings.rst (#6374) Removed Mattermost Boards and Mattermost Playbooks settings * Added log out screenshots (#6383) * Admins can search for users by partial criteria (#6388) * Clarified what recycle database connections does (#6387) * Added active search backend indicator in System Console (#6384) * Added active search backend indicator in System Console * Removed config.json equivalents * Added minimum screen resolution details (#6386) * Add Channels sidebar button (#6373) * Update join-leave-channels.rst Documented the new Add channels button in the channels sidebar * Update create-channels.rst Documented the Add channels button being added to the Channels sidebar * Uploaded Add channels button image * Add files via upload Replaced Add Channels screenshot * Update create-channels.rst Added width tag to Add Channels screenshot * Update join-leave-channels.rst Added width tag to Add Channels screenshot * Deprecated EnableInactivityEmail config setting (#6389) * Updated feature matrix aligned to v7.11 support (#6382) * Fixed docs build issues (#6397) * Update index.html (#6393) Changed /sign-up link to /download * Update conf.py * Incorporated CSE updates (#6385) * Incorporated CSE updates * Incorporated reviewer feedback * Incorporated retrospective updates * Move sync drafts config setting (#6462) * Moved existing config setting + redirect * Redirect update * Updated plugin default states (#6463) * Updated plugin default states * Replaced GitBook.io links with GitHub links * Added new config setting: DelayChannelAutocomplete (#6461) * Added new config setting: DelayChannelAutocomplete * Update source/configure/experimental-configuration-settings.rst * Update source/configure/experimental-configuration-settings.rst * Update source/configure/experimental-configuration-settings.rst * Deprecated PatchPluginsReactDOM config setting (#6471) * Added maxAllowedPacket size update (#6466) * Added link format shortcut (#6467) * PostgreSQL references moved ahead of MySQL (#6472) * Added channel auto-follow option (#6480) * Added support for desktop notification sounds (#6479) * Added Pascal code block formatting (#6478) * Added new config: DisableRefetchingOnBrowserFocus (#6464) * Added new config setting (#6460) * Added Desktop app MSI installer tip (#6469) * Added tip re: no desktop shortcut via MSI * Removed community-recommended tip * Germany push proxy option (#6490) * Added db migrate flags, child command & format fixes (#6491) * Added db migrate flags & child cmd & format fixes * Formatting cleanup * Removed PermissionUseSlashCommands (#6494) * Auto-enable Apps Bar (#6495) * Docs listening - incorporated docs visitor feedback (#6488) * Docs listening - incorporated visitor feedback * Update source/channels/browse-channels.rst * Deprecated Insights (#6493) * Deprecated Insights * Incorporated reviewer feedback * Updated suite references to platform (#6497) * Updated audit logging docs to include multi-line JSON & env var support (#6470) * Added multi-line JSON & env var details * Incorporated reviewer corrections & updates * Incorporated reviewer feedback * Updated min version of PG (#6505) * Transitioned Playbooks to a plugin (#6504) * Added Elasticsearch > Ignored Purge Indexes config setting (#6489) * Added Elasticsearch > IgnoredPurgeIndexes config * Incorporated reviewer feedback * Updated PostgreSQL support to v11+ (#6513) * Incoming call ring tones & desktop notifications (#6512) * Added new ring tone & notification functionality * Update source/channels/make-calls.rst Co-authored-by: Christopher Poile * Update source/configure/plugins-configuration-settings.rst Co-authored-by: Christopher Poile * Incorporated reviewer feedback --------- Co-authored-by: Christopher Poile * Added persistent notification & config settings (#6473) * Added persistent notifications & config settings * Incorporated reviewer corrections & feedback * Incorporated reviewer feedback * Update source/channels/message-priority.rst * Update source/channels/message-priority.rst * Formatting, deprecation clarifications, & fixes (#6468) * Moved MySQL content to single page (#6496) * Moved MySQL content to single page * Incorporated updates via docs PR 6477 * Fixed build warning issues (#6516) * v8.0 Changelog (#6369) * Update self-managed-changelog.md * Update open-source-components.rst * Update release-lifecycle.rst * Update important-upgrade-notes.rst * Update self-managed-changelog.md * Update prepare-to-upgrade-mattermost.rst * Update release-lifecycle.rst * Update extended-support-release.rst * Update version-archive.rst * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Update self-managed-changelog.md * Update self-managed-changelog.md * Apply suggestions from code review Co-authored-by: Carrie Warner (Mattermost) <74422101+cwarnermm@users.noreply.github.com> * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Apply suggestions from code review Co-authored-by: Maria A Nunez * Update self-managed-changelog.md * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Update self-managed-changelog.md * Update self-managed-changelog.md * Update self-managed-changelog.md * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Update self-managed-changelog.md * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Update release-lifecycle.rst * Update open-source-components.rst * Update extended-support-release.rst * Update self-managed-changelog.md * Update self-managed-changelog.md * Update deprecated-features.rst * Update important-upgrade-notes.rst * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Update self-managed-changelog.md * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Update install-tar.rst * Update self-managed-changelog.md * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Update self-managed-changelog.md * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Update self-managed-changelog.md * Update self-managed-changelog.md * Update self-managed-changelog.md * Eric's feedback * Update important-upgrade-notes.rst * Update self-managed-changelog.md * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Update self-managed-changelog.md * Update self-managed-changelog.md * Apply suggestions from code review Co-authored-by: Miguel de la Cruz * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Update self-managed-changelog.md * Add contributors * Update self-managed-changelog.md * Update deprecated-features.rst * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Update extended-support-release.rst * Add files via upload * Delete ESR_graphic.png * Add files via upload * Aligning highlights with v8.0 blog post highlights * Update self-managed-changelog.md * Update release-lifecycle.rst * Update self-managed-changelog.md * Update important-upgrade-notes.rst * Add known issue --------- Co-authored-by: Carrie Warner (Mattermost) <74422101+cwarnermm@users.noreply.github.com> Co-authored-by: Maria A Nunez Co-authored-by: Miguel de la Cruz * Update known issues * Update source/channels/set-channel-preferences.rst --------- Co-authored-by: Matthew Dalton <52355750+matthew-src@users.noreply.github.com> Co-authored-by: Carrie Warner (Mattermost) <74422101+cwarnermm@users.noreply.github.com> Co-authored-by: Christopher Poile Co-authored-by: Maria A Nunez Co-authored-by: Miguel de la Cruz --- .../about/certifications-and-compliance.rst | 2 +- source/about/editions-and-offerings.rst | 6 +- source/about/faq-enterprise.rst | 4 +- source/about/faq-general.rst | 2 +- source/about/faq-product.rst | 20 +- source/about/product.rst | 6 +- source/about/security.rst | 2 +- source/boards/navigate-boards.rst | 4 +- source/boards/work-with-cards.rst | 7 +- source/channels/browse-channels.rst | 2 +- source/channels/channels-settings.rst | 13 +- source/channels/create-channels.rst | 10 +- .../customize-your-channel-sidebar.rst | 4 +- source/channels/format-messages.rst | 17 +- source/channels/forward-messages.rst | 24 +- source/channels/join-leave-channels.rst | 12 +- source/channels/make-calls.rst | 7 +- source/channels/manage-channel-members.rst | 20 +- source/channels/message-priority.rst | 37 +- source/channels/run-slash-commands.rst | 8 +- source/channels/search-for-messages.rst | 38 +- source/channels/set-channel-preferences.rst | 83 +- source/channels/syntax-highlighting.rst | 4 + source/comply/audit-log.rst | 54 +- source/conf.py | 14 +- .../authentication-configuration-settings.rst | 2 +- .../configure/configuation-in-a-database.rst | 49 +- .../database-configuration-settings.rst | 57 +- .../deprecated-configuration-settings.rst | 28 + .../elasticsearch-configuration-settings.rst | 39 +- .../experimental-configuration-settings.rst | 84 +- .../logging-configuration-settings.rst | 19 +- .../plugins-configuration-settings.rst | 509 ++-- ...fication-server-configuration-settings.rst | 64 +- .../configure/site-configuration-settings.rst | 103 +- ...user-management-configuration-settings.rst | 20 +- source/deploy/backup-disaster-recovery.rst | 5 +- source/deploy/deployment-overview.rst | 2 +- source/deploy/encryption-options.rst | 2 +- source/deploy/mobile-hpns.rst | 10 +- .../getting-started/architecture-overview.rst | 4 +- .../getting-started/implementation-plan.rst | 6 +- source/getting-started/light-install.rst | 2 +- source/guides/deployment.rst | 2 +- source/guides/playbooks.rst | 12 +- source/guides/welcome-to-mattermost.rst | 6 +- source/images/ESR_graphic.png | Bin 0 -> 246579 bytes source/images/add-channels-button.png | Bin 0 -> 13313 bytes source/images/profile-log-out-mobile.png | Bin 0 -> 207112 bytes source/images/profile-log-out.png | Bin 0 -> 35678 bytes source/index.rst | 2 +- source/install/cloud-changelog.md | 2 +- source/install/common-prod-deploy-omnibus.rst | 2 +- source/install/common-prod-deploy-tar.rst | 6 +- .../deploying-team-edition-on-bitnami.rst | 4 +- source/install/deprecated-features.rst | 51 +- source/install/desktop-app-changelog.rst | 2 +- ...msi-installer-and-group-policy-install.rst | 16 +- source/install/install-debian.rst | 1 - source/install/install-tar.rst | 2 +- .../install/prepare-mattermost-database.rst | 173 +- .../prepare-mattermost-mysql-database.rst | 294 ++ source/install/self-managed-changelog.md | 216 +- ...ng-up-socket-based-mattermost-database.rst | 30 +- .../software-hardware-requirements.rst | 13 +- source/install/trouble-postgres.rst | 4 +- source/install/trouble_mysql.rst | 9 +- source/install/troubleshooting.rst | 4 +- source/manage/command-line-tools.rst | 2696 +++++++++-------- source/manage/mmctl-command-line-tool.rst | 2 +- source/manage/telemetry.rst | 8 +- source/onboard/ad-ldap.rst | 2 +- ...ced-permissions-backend-infrastructure.rst | 5 - ...l-membership-using-ad-ldap-sync-groups.rst | 4 +- .../migrating-from-hipchat-to-mattermost.rst | 2 +- source/onboard/migrating-to-mattermost.rst | 70 +- .../onboard/multi-factor-authentication.rst | 2 +- source/onboard/sso-saml-keycloak.rst | 50 +- source/overview/index.rst | 2 +- source/playbooks/metrics-and-goals.rst | 2 +- source/playbooks/overview.rst | 6 +- source/playbooks/share-and-collaborate.rst | 4 +- source/playbooks/work-with-playbooks.rst | 2 +- .../product-vulnerability-incident.rst | 4 +- source/scale/elasticsearch.rst | 2 +- source/scale/high-availability-cluster.rst | 15 +- source/templates/index.html | 4 +- .../upgrade/downgrading-mattermost-server.rst | 114 +- source/upgrade/extended-support-release.rst | 9 +- source/upgrade/important-upgrade-notes.rst | 73 +- source/upgrade/open-source-components.rst | 3 + .../upgrade/prepare-to-upgrade-mattermost.rst | 79 +- source/upgrade/release-lifecycle.rst | 4 + .../upgrade/upgrading-mattermost-server.rst | 2 +- source/upgrade/version-archive.rst | 2 +- .../get-started-mattermost-channels.rst | 2 +- source/welcome/insights.rst | 8 +- source/welcome/keyboard-shortcuts.rst | 2 +- source/welcome/log-out.rst | 15 +- .../manage-multiple-server-connections.rst | 4 + source/welcome/manage-your-profile.rst | 20 +- 101 files changed, 3075 insertions(+), 2400 deletions(-) create mode 100644 source/images/ESR_graphic.png create mode 100644 source/images/add-channels-button.png create mode 100644 source/images/profile-log-out-mobile.png create mode 100644 source/images/profile-log-out.png create mode 100644 source/install/prepare-mattermost-mysql-database.rst diff --git a/source/about/certifications-and-compliance.rst b/source/about/certifications-and-compliance.rst index beea8ecde60..55d78b4d64a 100644 --- a/source/about/certifications-and-compliance.rst +++ b/source/about/certifications-and-compliance.rst @@ -62,7 +62,7 @@ Data portability ^^^^^^^^^^^^^^^^^ - **Data Import:** Use the `bulk loading tool `__ to migrate data from an existing messaging system, or for pre-populating a new installation with data. `Review this guide `__ which summarizes the different approaches and meets the `Right to Data Portability `__ principle. -- **Data Export:** Use `compliance exports `__ to export conversations from public, private and direct message channels in XML or EML format. Those in Team Edition can export conversations directly from the database, both `in MySQL `__ and `in PostgreSQL `__. +- **Data Export:** Use `compliance exports `__ to export conversations from public, private and direct message channels in XML or EML format. Those in Team Edition can export conversations directly from the database, both `in PostgreSQL `__ and `in MySQL `__. Accessibility compliance ------------------------- diff --git a/source/about/editions-and-offerings.rst b/source/about/editions-and-offerings.rst index 2621f3b657c..e5dbdc3d412 100644 --- a/source/about/editions-and-offerings.rst +++ b/source/about/editions-and-offerings.rst @@ -17,7 +17,7 @@ Self-hosted editions support deploying Mattermost within IT-controlled private e Mattermost Team Edition ~~~~~~~~~~~~~~~~~~~~~~~ -Team Edition is a free-to-use, open source, self-hosted collaboration platform offering all the core productivity benefits of competing SaaS solutions. It deploys as a single Linux binary with MySQL or PostgreSQL under an MIT license. +Team Edition is a free-to-use, open source, self-hosted collaboration platform offering all the core productivity benefits of competing SaaS solutions. It deploys as a single Linux binary with PostgreSQL under an MIT license. Mattermost Team Edition is also bundled inside of the free Mattermost Enterprise Edition code base, which provides the same functionality as Mattermost Team Edition, with the additional benefit of being able to trial as well as upgrade into an expanded set of features available with paid subscription, including Mattermost Professional and Mattermost Enterprise. @@ -37,9 +37,9 @@ Mattermost plans consist of features and entitlements available either free or a We have three primary plans available: -* **Mattermost Free** - This a free version of our collaboration suite designed for single teams (self-hosted only). +* **Mattermost Free** - This a free version of our collaboration platform designed for single teams (self-hosted only). * **Mattermost Professional** - This is a paid subscription service providing advance access controls and user management for managers leading teams of teams. -* **Mattermost Enterprise** - This is a paid subscription service for large and sophisticated enterprise-scale deployments of the Mattermost suite. +* **Mattermost Enterprise** - This is a paid subscription service for large and sophisticated enterprise-scale deployments of the Mattermost platform. For customers using our service in a self-hosted deployment, the Mattermost Free offering is available in both our open source and commercial code bases (called Mattermost Team Edition and Mattermost Enterprise Edition, respectively). diff --git a/source/about/faq-enterprise.rst b/source/about/faq-enterprise.rst index 084c0b6f0a1..c789d62dbe3 100644 --- a/source/about/faq-enterprise.rst +++ b/source/about/faq-enterprise.rst @@ -19,7 +19,7 @@ Growing your Mattermost installation from supporting a team to supporting an ent 1. Technical scaling: Maintaining system responsiveness as large quantities of new users are added. 2. Functional scaling: Adding advanced features to support the increased complexity of large organizations. -**Technical Scaling:** Whether used for teams or enterprises, the Mattermost server is designed to support tens of thousands of users on a single server with appropriate hardware. The server is built using Golang, the language developed by Google to create internet-scale applications, and supports highly scalable databases like MySQL, which is `used extensively by Facebook `__. Beyond tens of thousands of users, Mattermost Enterprise Edition can offer high availability/horizontal scaling configurations using multiple servers to support even larger organizations. +**Technical Scaling:** Whether used for teams or enterprises, the Mattermost server is designed to support tens of thousands of users on a single server with appropriate hardware. The server is built using Golang, the language developed by Google to create internet-scale applications, and supports highly scalable databases. Beyond tens of thousands of users, Mattermost Enterprise Edition can offer high availability/horizontal scaling configurations using multiple servers to support even larger organizations. **Functional Scaling:** Scaling from a team to an enterprise is like going from a "virtual office" to a "virtual campus". Advanced features like enterprise authentication, granular permissions, compliance and auditing, and advanced reporting become increasingly important as organizations grow beyond teams. Organizations needing this flexibility can easily upgrade from Mattermost Team Edition to Mattermost Enterprise Edition as well as downgrade without data loss, should their needs change. @@ -28,7 +28,7 @@ For more information on how Mattermost scales, technically, and functionally, pl What does it take to manage a Mattermost deployment? ---------------------------------------------------- -For a small deployment of Mattermost up to a few hundred users, we'd recommend a part-time, mid-level IT admin with a senior IT admin for supervision and as a backup resource. They should have the ability to administer a basic Linux server, a MySQL or PostgreSQL database, and web proxy configuration with web sockets. +For a small deployment of Mattermost up to a few hundred users, we'd recommend a part-time, mid-level IT admin with a senior IT admin for supervision and as a backup resource. They should have the ability to administer a basic Linux server, a PostgreSQL database, and web proxy configuration with web sockets. For a medium deployment of 500 to 2000 users, we'd recommend a senior IT administrator who has the capability to configure Mattermost in a High Availability cluster with redundant database and application servers. They should also be able to activate performance monitoring and health check features in Prometheus and Grafana. diff --git a/source/about/faq-general.rst b/source/about/faq-general.rst index ce100a36444..1a395ef6be4 100644 --- a/source/about/faq-general.rst +++ b/source/about/faq-general.rst @@ -28,7 +28,7 @@ Mattermost provides an open source, well-documented `load test simulator `__ streamline complex, recurring processes that enable teams to achieve a specific and predictable outcome. Orchestrate prescribed workflows with built-in checklists, triggers, automation, tool integrations, and retrospectives. Increase stakeholder visibility with status updates and cumulative statistics. Customize a playbook to align with organizational practices, and adjust on the fly to respond quickly in highly dynamic situations. Playbooks are critical in incident collaboration to avoid and minimize costly business disruptions, and in software release processes to ship high-quality software on time. +The Mattermost `Playbooks plugin `__ streamlines complex, recurring processes that enable teams to achieve a specific and predictable outcome. Orchestrate prescribed workflows with built-in checklists, triggers, automation, tool integrations, and retrospectives. Increase stakeholder visibility with status updates and cumulative statistics. Customize a playbook to align with organizational practices, and adjust on the fly to respond quickly in highly dynamic situations. Playbooks are critical in incident collaboration to avoid and minimize costly business disruptions, and in software release processes to ship high-quality software on time. .. image:: ../images/Playbooks_Hero.png - :alt: An example of the Mattermost Playbooks screen that includes active run details in the right-hand pane. + :alt: An example of the Mattermost Playbooks plugin screen that includes active run details in the right-hand pane. Use Boards to hit your milestones and support your project workflows ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/source/about/security.rst b/source/about/security.rst index 53fd95c15e1..881b3b8e50b 100644 --- a/source/about/security.rst +++ b/source/about/security.rst @@ -18,7 +18,7 @@ Mattermost offers a host of features to help keep your private cloud communicati Private Cloud deployment with secure mobile apps ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Mattermost can run entirely behind your firewall as a single Linux binary, as a Docker container, or on your Kubernetes cluster with MySQL or PostgreSQL as database. Remote access can be enabled through the use of `VPN clients on PC and mobile devices `__ so that Mattermost can be used outside your private network. +- Mattermost can run entirely behind your firewall as a single Linux binary, as a Docker container, or on your Kubernetes cluster with a PostgreSQL database. Remote access can be enabled through the use of `VPN clients on PC and mobile devices `__ so that Mattermost can be used outside your private network. - Mattermost mobile apps can be deployed to an `internal Enterprise App Store `__ by using source code available for Mattermost mobile apps and push notification service. - Optionally, the provided Mattermost Mobile Apps can be used when the Mattermost server is reachable through the internet on port 443. In this configuration, you have the option of using compiled `iOS and Android applications in iTunes and Google Play provided by Mattermost, Inc. `__ (Mattermost Enterprise and Mattermost Professional). - User sessions across web, PC, and mobile can be `remotely revoked through profile settings `__, or via the System Console by deactivating accounts. diff --git a/source/boards/navigate-boards.rst b/source/boards/navigate-boards.rst index 1c0aeb28331..178207f09bb 100644 --- a/source/boards/navigate-boards.rst +++ b/source/boards/navigate-boards.rst @@ -9,7 +9,7 @@ Navigate boards :width: 24px :alt: Access additional message actions using the More actions icon. -If you've already created a board, you can open Boards using the App Bar. If you don't see the Apps Bar to the right of your screen, you can access boards using the product menu in the top left corner of Mattermost. +If you've already created a board, you can open Boards using the Apps Bar. If you don't see the Apps Bar to the right of your screen, you can access boards using the product menu in the top left corner of Mattermost. Link a board to a channel ------------------------- @@ -20,7 +20,7 @@ From Mattermost Boards v7.2, boards can be linked to channels and accessed from A channel can be linked to multiple boards, but each individual board can only be linked to one channel at a time. Linking the same board to another channel will automatically remove the link from the previous channel. -Open the boards App Bar icon, and select **Create a Board** to create a new board linked to the current channel. Once a board is linked to a channel, it's listed in the right-hand side of the Boards Apps Bar. Linking a board to a channel automatically grants all channel members access to the board, with the exception of guest accounts. Select a linked board to navigate directly to the board. +Open the Boards Apps Bar icon, and select **Create a Board** to create a new board linked to the current channel. Once a board is linked to a channel, it's listed in the right-hand side of the Boards Apps Bar. Linking a board to a channel automatically grants all channel members access to the board, with the exception of guest accounts. Select a linked board to navigate directly to the board. .. note:: diff --git a/source/boards/work-with-cards.rst b/source/boards/work-with-cards.rst index 974888c143c..175db97fead 100644 --- a/source/boards/work-with-cards.rst +++ b/source/boards/work-with-cards.rst @@ -5,10 +5,11 @@ Work with cards :start-after: :nosearch: .. |options-icon| image:: ../images/dots-horizontal_F01D8.svg - :height: 24px - :width: 24px :alt: Access additional message actions using the More actions icon. +.. |vertical-3-dots| image:: ../images/dots-vertical_F01D9.svg + :alt: Select the More icon to access additional channel management options. + A card consists of: - **A set of properties**: Properties are common to all cards in a board. Board views can group cards by “Select” type properties into different columns. @@ -123,7 +124,7 @@ From Mattermost v7.7 you can attach files to your cards, which other board membe To upload a file to a card, select **Attach** in the top-right corner of the card. Then select the file you'd like to upload. When your file has been uploaded, you can find it in the **Attachments** section of the card. Select the **+** sign to add additional files to your card. -To delete a file, hover over it and select the vertical menu. Then select **Delete**. To download the file, select the download icon. +To delete a file, hover over it and select the |vertical-3-dots| menu. Then select **Delete**. To download the file, select the download icon. Card badges ----------- diff --git a/source/channels/browse-channels.rst b/source/channels/browse-channels.rst index fe4471de48f..c484c5461e5 100644 --- a/source/channels/browse-channels.rst +++ b/source/channels/browse-channels.rst @@ -22,7 +22,7 @@ Browse channels .. tip:: - Want to see all of the channels you're already a member of? Using a browser or the desktop app, select **Find Channel** in the channel sidebar to see all of the channels you're currently a member of across all of your teams, including public and private channels, direct and group messages, channels with unread messages, and threads. Channels you have `muted `__ aren't included in results. + Want to see all of the channels you're already a member of, or can't find a specific private channel? Using a browser or the desktop app, select **Find Channel** in the channel sidebar to see all of the channels you're currently a member of across all of your teams, including public and private channels, direct and group messages, channels with unread messages, and threads. Channels you have `muted `__ aren't included in results. Revisit recent channels ----------------------- diff --git a/source/channels/channels-settings.rst b/source/channels/channels-settings.rst index c54a46c1cf7..dfc7ef10b95 100644 --- a/source/channels/channels-settings.rst +++ b/source/channels/channels-settings.rst @@ -18,7 +18,7 @@ You can customize your Channels experience in the following ways in **Settings** Notifications ------------- -Settings to configure desktop notifications, desktop notification sounds, email notifications, mobile push notifications, and words that trigger mentions. +Settings to configure desktop notifications and sounds, email notifications, mobile push notifications, words that trigger mentions, and automatic direct message replies. Desktop notifications ~~~~~~~~~~~~~~~~~~~~~ @@ -30,7 +30,7 @@ Send desktop notifications Choose what activity triggers a desktop notification. This setting applies globally, but this preference is customizable for each channel from the channel name drop-down menu. Desktop notifications are available on Chrome, Edge, Firefox, and Safari. -When `desktop app `__ notifications are set to "Only for mentions and direct messages": +When `desktop app `__ notifications are set to **Only for mentions and direct messages**, notifications trigger as follows: - An empty red circle is displayed over the upper right corner of the Mattermost dock icon when any message without an at-mention is received. - A solid red circle with a post count is displayed when a message with an at-mention is received. @@ -39,7 +39,14 @@ When `desktop app `__ notifications are set to "Onl Notification sound ^^^^^^^^^^^^^^^^^^ -Notification sounds fire for any activity that would trigger a desktop notification. Notification sounds are available on Chrome, Edge, Firefox, and Safari in addition to the Mattermost Desktop App. +When desktop app notifications are set to **For all activity** or **Only for mentions and direct messages**, you can configure Mattermost to notify you using a sound. Chooose from one of 6 preset notification sounds. Notification sounds are available on Chrome, Edge, Firefox, and Safari in addition to the Mattermost Desktop App. + +Notification sound for incoming calls (Beta) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +From Mattermost v8.0 and Calls v0.17.0, when desktop app notifications are set to **For all activity** or **Only for mentions and direct messages**, you can configure Mattermost to alert you to incoming calls through direct or group messages with a specific ring tone and a desktop notification, unless the system admin has `disabled your ability to do so `__. + +When incoming call notification sounds are enabled, choose the ring tone to play, then select **Save**. Email notifications ~~~~~~~~~~~~~~~~~~~ diff --git a/source/channels/create-channels.rst b/source/channels/create-channels.rst index 43ca10f359b..2f4b3b720db 100644 --- a/source/channels/create-channels.rst +++ b/source/channels/create-channels.rst @@ -12,10 +12,16 @@ Anyone can create public channels, private channels, direct messages, and group **To create a public or private channel** - 1. Select the **+** symbol at the top of the channel sidebar, then select **Create New Channel**. + 1. Select the **Add channels** button in the channel sidebar, then select **Create New Channel**. + + .. image:: ../images/add-channels-button.png + :alt: You can create a channel using the Add channels button + :width: 400 + + You can also select the **+** symbol at the top of the channel sidebar, then select **Create New Channel**. .. image:: ../images/create-new-channel.png - :alt: Create a channel + :alt: You can also create a channel using the + symbol button 2. Enter a channel name. 3. Choose whether this is a public or private channel. See the `channel types `__ documentation to learn more about public and private channels. diff --git a/source/channels/customize-your-channel-sidebar.rst b/source/channels/customize-your-channel-sidebar.rst index 4f686266e56..a3af19dd9b3 100644 --- a/source/channels/customize-your-channel-sidebar.rst +++ b/source/channels/customize-your-channel-sidebar.rst @@ -4,7 +4,7 @@ Customize your channel sidebar .. include:: ../_static/badges/allplans-cloud-selfhosted.rst :start-after: :nosearch: -Conversations in Mattermost are crucial to company productivity and success. Keeping conversations organized in the sidebar creates an efficient workplace. You can customize your channel sidebar in a browser or using the desktop app based on how you use Mattermost. Customizations you make are only visible to you, are visible when using the mobile app, and won't affect what your teammates see in their sidebars. +Conversations in Mattermost are crucial to company productivity and success. Keeping conversations organized in the sidebar creates an efficient workplace. You can customize your own channel sidebar in a browser or using the desktop app based on how you use Mattermost. Customizations you make are only visible to you, are visible when using the mobile app, and won't affect what your teammates see in their sidebars. Here's how your sidebar is set up by default: @@ -34,6 +34,8 @@ To create categories, select the **+** symbol at the top of the sidebar. Or, sel Next, type a category name, select **Create**, then drag any channels or direct messages into this new category. You can also multi-select channels and direct messages to drag them together as a group by pressing :kbd:`Ctrl` or :kbd:`Shift` and selecting on Windows or Linux, or :kbd:`⌘` or :kbd:`⇧` and selecting on Mac. See the section `drag and drop selections <#drag-and-drop-selections>`__ below for details. +Your custom categories can't be shared with other Mattermost users. + Make categories work for you ---------------------------- diff --git a/source/channels/format-messages.rst b/source/channels/format-messages.rst index d9debeca1f9..1c60f57afb0 100644 --- a/source/channels/format-messages.rst +++ b/source/channels/format-messages.rst @@ -49,6 +49,11 @@ Format messages .. |message-priority-icon| image:: ../images/Priority-Message-Icon.svg :alt: Mark a message as important or urgent using the Priority Message icon. +.. contents:: On this page: + :backlinks: top + :local: + :depth: 2 + Use the messaging formatting toolbar ------------------------------------ @@ -63,12 +68,12 @@ The message formatting toolbar offers the following formatting options: +--------------------------------------------------------------+-------------------------+ | **Formatting option** | **Icon** | +==============================================================+=========================+ -| Bold, italicize, or strike out text | |bold-icon| | +| `Bold, italicize, or strike out text <#use-markdown>`_ | |bold-icon| | | | |italics-icon| | | | |strikeout-icon| | +--------------------------------------------------------------+-------------------------+ -| Add headings, links, or attachments | |headings-icon| | -| | |links-icon| | +| Add `headings <#headings>`_, `links <#links>`_, | |headings-icon| | +| or attachments | |links-icon| | | | |attachments-icon| | +--------------------------------------------------------------+-------------------------+ | Format a numbered list, a bulleted list, quoted text, or | |numbered-icon| | @@ -76,7 +81,7 @@ The message formatting toolbar offers the following formatting options: | | |quotes-icon| | | | |code-icon| | +--------------------------------------------------------------+-------------------------+ -| Add emojis or GIFs | |emoji-icon| | +| `Add emojis or GIFs `__ | |emoji-icon| | +--------------------------------------------------------------+-------------------------+ | `Set message priority `__ | |message-priority-icon| | +--------------------------------------------------------------+-------------------------+ @@ -120,6 +125,10 @@ You can use either ``_`` or ``*`` around a word or phrase to make it italic, or Links ~~~~~ +.. tip:: + + Format selected message text as a link by pressing :kbd:`Ctrl` :kbd:`K` on Windows and Linux, or by pressing :kbd:`⌘` :kbd:`K` on Mac. + Channel links ^^^^^^^^^^^^^ diff --git a/source/channels/forward-messages.rst b/source/channels/forward-messages.rst index e47fb1643d9..aa83a788593 100644 --- a/source/channels/forward-messages.rst +++ b/source/channels/forward-messages.rst @@ -4,17 +4,29 @@ Forward messages .. include:: ../_static/badges/allplans-cloud-selfhosted.rst :start-after: :nosearch: -From Mattermost v7.2, using a web browser or the desktop app, you can forward messages in Mattermost to another channel by selecting the **More** |more-icon| icon next to a message, then selecting **Forward**. From Mattermost v7.5, you can also forward messages from bots and webhooks. - .. |more-icon| image:: ../images/dots-horizontal_F01D8.svg :alt: When you hover over messages, you can access more message options from the More icon. -.. image:: ../images/forward-message.png - :alt: You can forward messages to others using the More option. +From Mattermost v7.2, using a web browser or the desktop app, you can forward messages in public channels to other public channels. From Mattermost v7.5, you can also forward messages from bots and webhooks. + +.. note:: + + Private channels, direct messages, and group messages indended for specific people can't be forwarded. + +To forward a message: + +1. Select the **More** |more-icon| icon next to a message, then select **Forward**. + + .. image:: ../images/forward-message.png + :alt: You can forward messages to others using the More option. + +2. Specify where you want to forward the message, and include an optional comment. -Specify where you want to forward the message, and include an optional comment. Forwarding messages generates a preview of the message. +Forwarding a message also generates a preview of the message. .. image:: ../images/permalink-previews.png :alt: Mattermost generates previews of links shared in Channels. -Previews respect channel membership permissions, so they’re only visible to users who have access to the original message. If the link is to a message in a public channel, any member of the team can see the message preview. If the link is to a message in a private channel or direct message, only members in that channel can see the message preview. \ No newline at end of file +.. note:: + + Previews respect channel membership permissions, so they’re only visible to users who have access to the original message. If the link is to a message in a public channel, any member of the team can see the message preview. If the link is to a message in a private channel or direct message, only members in that channel can see the message preview. \ No newline at end of file diff --git a/source/channels/join-leave-channels.rst b/source/channels/join-leave-channels.rst index b0c6b119d07..3a9d50d8a80 100644 --- a/source/channels/join-leave-channels.rst +++ b/source/channels/join-leave-channels.rst @@ -16,11 +16,17 @@ To join a private channel, you need to be added to the channel by a member of th .. tab:: Desktop - 1. Select the **+** symbol at the top of the channel sidebar, then select **Browse Channels**. + 1. Select the **Add channels** button in the channel sidebar, then select **Browse Channels**. + + .. image:: ../images/add-channels-button.png + :alt: You can browse channels using the Add channels button + :width: 400 + + You can also select the **+** symbol at the top of the channel sidebar, then select **Browse Channels**. .. image:: ../images/browse-channels.png :alt: You can browse available channels to join using the + option at the top of the channel sidebar. - + 2. Select **Join** next to the public channel you want to join. .. image:: ../images/join-channels.png @@ -55,4 +61,4 @@ When you leave a private channel, you must be re-added by another channel member 1. Tap the channel you want to leave. 2. Tap the **More** |more-icon| icon located in the top right corner of the app. - 3. Tap **Leave channel**. \ No newline at end of file + 3. Tap **Leave channel**. diff --git a/source/channels/make-calls.rst b/source/channels/make-calls.rst index 4fedd326a65..bce74f7aa03 100644 --- a/source/channels/make-calls.rst +++ b/source/channels/make-calls.rst @@ -17,7 +17,7 @@ From Mattermost v7.0, you can make voice calls and share your screen in channels From Mattermost v7.0, you can: - Start or join a call from desktop and mobile apps in addition to web browsers. -- Share screen (not available on mobile), raise hands, chat in a thread, and even switch between products in the Mattermost suite (i.e., Channels, Boards, and Playbooks) while on a call. +- Share screen (not available on mobile), raise hands, chat in a thread, and continue working in Mattermost while on a call. - Start a call using the ``/call start`` slash command or **Start call** in the channel header. Starting from Mattermost v7.7 you can: @@ -113,6 +113,11 @@ To record a call: Frequently asked questions -------------------------- +Can I set a ring tone for incoming calls? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Yes! From Mattermost v8.0 and Calls v0.17.0, desktop app and webapp users can go to **Settings > Notifications > Desktop Notifications** to enable Mattermost to alert you to incoming calls through direct or group messages with a specific ring tone and a desktop notification, unless the system admin has `disabled your ability to do so `__. + Is video supported? ~~~~~~~~~~~~~~~~~~~ diff --git a/source/channels/manage-channel-members.rst b/source/channels/manage-channel-members.rst index 995108ce465..ffc9ed7c2b6 100644 --- a/source/channels/manage-channel-members.rst +++ b/source/channels/manage-channel-members.rst @@ -60,13 +60,21 @@ Using a web browser or the desktop app, you can also add users to channels withi Leave a channel ---------------- -Using a web browser or the desktop app, you can remove yourself from a channel, you can: +You can leave public or private channels any time. -- Select the channel name at the top of the center pane to access the drop-down menu, then select **Manage Members**. Select the member's `user role `__, then select **Remove from Channel**. -- Select the channel's **View Info** |channel-info| icon, and select **Members** in the right pane. Select **Manage**, select a user's role, then select **Leave a Channel**. +.. tabs:: + + .. tab:: Desktop + + Select the channel name at the top of the center pane to access the drop-down menu, then select **Leave Channel**. + + .. tab:: Mobile + + 1. In a channel, tap |options-icon| in the top right corner. + 2. Tap **Leave channel**. -Remove members from a channel ------------------------------ +Remove other members from a channel +----------------------------------- Any member of a channel can remove other members from a channel. @@ -87,6 +95,6 @@ Any member of a channel can remove other members from a channel. 1. In a channel, tap |options-icon| in the top right corner. 2. Tap **View Info**. 3. Tap **Members**. - 4. Tap **Manage**. + 4. Tap **Manage** in the top right corner of the screen. 5. Tap a `user role `__ to change it, and tap **Remove from Channel**. 6. Tap **Done**. diff --git a/source/channels/message-priority.rst b/source/channels/message-priority.rst index fb1f2357d1f..d6bab336eb7 100644 --- a/source/channels/message-priority.rst +++ b/source/channels/message-priority.rst @@ -19,15 +19,35 @@ From Mattermost v7.7 and version v2.4 of the Mattermost mobile app, you can add :width: 700 :alt: Ensure important and urgent messages stand out clearly by adding priority labels to root messages. -Set message priority --------------------- +To set the priority of a new root message: -You can add one of three priority labels when sending a new message: Standard, Important, or Urgent. When you send a priority message, the priority label displays next to your name in the channel and the Threads view when others reply to the thread. +1. Select the **Message Priority** |priority-icon| icon in the message formatting toolbar. Select from Standard, Important, or Urgent. +2. Select the priority for the message. Messages have a standard priority by default. +3. Select **Apply** -To set the priority of a new message: +When you send a priority message, the priority label displays next to your name in the channel, as well as the **Threads** view when others reply to the thread. -1. Select the **Message Priority** |priority-icon| icon in the message formatting toolbar. -2. Select the priority for the message. Messages have a standard priority by default. +Send persistent notifications +----------------------------- + +From Mattermost v8.0, when you add an urgent priority label, and your message @mentions at least one other user, you can enable persistent notifications which notify recipients at regular intervals and for a set amount of time until the recipient acknowledges, reacts, or replies to the message. + +To enable persistent notifications for a message: + +1. Compose a root message with at least one @mention. +2. Select the **Message Priority** |priority-icon| icon in the message formatting toolbar. +3. Select **Urgent**. +4. Select **Send persistent notifications**. +5. Select **Apply**. + +.. note:: + + - Recipients must have Mattermost desktop and/or mobile push notifications enabled to receive persistent notifications. + - @channel, @all and @here mentions don't send persistent notifications. + - You're notified depending on your notifications preferences __ for desktop and mobile push notifications. You won't be notified when your availability is set to Do Not Disturb, or if you're Out of Office __. + - System admins can customize the maximum number of @mentions permitted, how frequently and how many persistent notifications are sent, as well as disable persistent notifications for all users, if preferred. By default, users are notified every 5 minutes for a total of 30 minutes. See the `configuration
`__ documentation for details. + +Stop a persistent notification by replying to the thread, selecting the **Acknowlege** icon (when present), or reacting to the thread with an emoji. Persistent notifications also stop being sent if the original message is deleted, or if the maximum number of persistent notifications are sent. Request acknowledgements ------------------------ @@ -42,4 +62,7 @@ When you request acknowlegement of a message, an **Acknowledge** |acknowledge-bu .. tip:: - When you have push notifications enabled on mobile, you'll be notified every five minutes until you acknowledge or reply to the message. - - After acknowledging a message, you have up to five minutes to change your mind. Select the **Acknowledged** |acknowledged-icon| button again to remove your name from the list of acknowledged users. \ No newline at end of file + - After acknowledging a message, you have up to five minutes to change your mind. Select the **Acknowledged** |acknowledged-icon| button again to remove your name from the list of acknowledged users. + + + diff --git a/source/channels/run-slash-commands.rst b/source/channels/run-slash-commands.rst index d9b7c3eadf6..7d75c6d05f2 100644 --- a/source/channels/run-slash-commands.rst +++ b/source/channels/run-slash-commands.rst @@ -4,6 +4,10 @@ Run slash commands .. include:: ../_static/badges/allplans-cloud-selfhosted.rst :start-after: :nosearch: -Slash commands enable you to perform operations in Mattermost by typing into the text input box. Enter a ``/`` followed by a command and some arguments to perform actions. +Mattermost slash commands offer an alternate way to perform tasks and actions in Mattermost. Slash commands are often preferred by developers and technical audiences because of how fast they are to use, and how similar they are to a developer's daily coding tools. -Built-in slash commands come with all Mattermost installations and custom slash commands are configurable to interact with external applications. See our `product documentation `__ for details on built-in slash commands available in your Mattermost workspace. Then see our `developer documentation `__ to learn more about configuring custom slash commands. +Using a slash command is as easy as composing a message; however, instead of message text, you start slash commands with a slash character: ``/``. For example, if you want to log out of Mattermost using only your keyboard, you can enter ``/logout`` in the message text box and select **Send**. Because your message starts with a slash ``/``, Mattermost knows it's a slash command, and performs the action defined for that command. + +Mattermost comes with many built-in slash commands for common actions you can start using right away. Visit our `product documentation `__ to learn more. + +Interested in creating new custom slash commands for your Mattermost instance? Visit our `developer documentation `__ to learn more about configuring custom slash commands. \ No newline at end of file diff --git a/source/channels/search-for-messages.rst b/source/channels/search-for-messages.rst index 46d565aa8b7..1ded285b7c6 100644 --- a/source/channels/search-for-messages.rst +++ b/source/channels/search-for-messages.rst @@ -5,10 +5,10 @@ Search for messages :start-after: :nosearch: .. |product-list| image:: ../images/products_E82F.svg - :alt: Navigate between Channels, Playbooks, and Boards using the product menu icon. + :alt: Navigate between channels, playbooks, and Boards using the product menu icon. .. |search-icon| image:: ../images/magnify_F0349.svg - :alt: Navigate between Channels, Playbooks, and Boards using the product menu icon. + :alt: Navigate between channels, playbooks, and Boards using the product menu icon. .. |channel-info| image:: ../images/information-outline_F02FD.svg :alt: Use the Channel Info icon to access additional channel management options. @@ -157,8 +157,12 @@ To search for messages containing hashtags, select a hashtag in an existing post Hashtags don't link to channels. If you have a channel named “Marketing”, selecting a ``#marketing`` hashtag does not take you to the Marketing channel. To link to public channels, use the tilde ``~`` symbol followed by the channel name. For example ``~marketing``. -Notes about all searches ------------------------- +Use sockets for the database +---------------------------- + + +Notes about performing Mattermost searches +------------------------------------------- - Multiple-word searches return results that contain *all* of your search criteria. - Search modifiers can help narrow down searches. See the `search modifiers <#search-modifiers>`__ section for details. @@ -172,30 +176,10 @@ Notes about all searches Technical notes about searching ------------------------------- -Searching Chinese, Korean, and Japanese -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- The best experience for searching in Chinese, Korean, and Japanese is to use MySQL 5.7.6 or later with special configuration. See the `Chinese, Japanese and Korean Search documentation `__ for details. -- You can perform searches without this configuration by adding wildcards ``*`` to the end of search terms. - -Differences between PostgreSQL and MySQL search -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -By default, Mattermost uses full text search support included in MySQL and PostgreSQL. These databases have slightly different search behavior. Select the **product menu** |product-list| then select **About Mattermost** to see which database you’re using. - -For example, different databases have different “stop words” filtered out of search results. See `MySQL `__ or `PostgreSQL `__ database documentation for a full list. - -Other database-specific differences include: - -PostgreSQL: +By default, Mattermost uses full text search support included in PostgreSQL. Select the **product menu** |product-list| then select **About Mattermost** to see which database you’re using. +- Stop words are filtered out of search results. See `PostgreSQL `__ database documentation for a full list of applicable stop words. - URLs don’t return results. - Hashtags or recent mentions of usernames containing a dash don't return results. - Terms containing a dash return incorrect results since dashes are ignored in the search engine. -- From Mattermost v7.1, search results respect the ``default_text_search_config`` value instead of being hardcoded to English. We recommend that Mattermost system admins review this value to ensure it's set correctly. - -MySQL: - -- Hashtags or recent mentions of usernames containing a dot don't return results. -- Avoid using underline ``_`` symbol to `perform a wildcard search <#wildcards>`__. Use the asterisk ``*`` symbol instead. -- Stop words that are excluded from search in MySQL include: ``"a", "about", "an", "are", "as", "at", "be", "by", "com", "de", "en", "for", "from", "how", "i", "in", "is", "it", "la", "of", "on", "or", "that", "the", "this", "to", "was", "what", "when", "where", "who", "will", "with", "und", "the", "www"``. +- From Mattermost v7.1, search results respect the ``default_text_search_config`` value instead of being hardcoded to English. We recommend that Mattermost system admins review this value to ensure it's set correctly. \ No newline at end of file diff --git a/source/channels/set-channel-preferences.rst b/source/channels/set-channel-preferences.rst index 3b2a843d184..76879e53fa7 100644 --- a/source/channels/set-channel-preferences.rst +++ b/source/channels/set-channel-preferences.rst @@ -21,20 +21,21 @@ For each channel you're a member of, you can set notification preferences as wel Channel notification preferences -------------------------------- -To manage channel notification preferences, select the channel name at the top of the screen to access channel-specific settings, then select **Notification Preferences**. +You have 2 ways to manage individual channel notification preferences -.. tip:: - - Alternatively, to manage channel notification preferences select the channel name, select the **View Info** |channel-info| icon, then select **Notification Preferences** in the right pane. +- Select the channel name, then select **Notification Preferences**, or +- Select the **View Info** |channel-info| icon, then select **Notification Preferences** in the right pane. Mute channel ~~~~~~~~~~~~~ -Muting turns off desktop, email, and push notifications for a channel, direct message, or group message. The channel, direct message, or group message will only be marked as unread in the channel sidebar if you're mentioned. By default, all channels, direct messages, and group messages are unmuted. +By default, all channels, direct messages, and group messages are unmuted. + +Muting a channel turns off desktop, email, incoming call ring tones, and mobile push notifications for that channel, direct message, or group message. The channel will only be marked as unread in the channel sidebar if you're mentioned. Once a channel is muted: -- Email, desktop, and push notifications are disabled. +- Email, desktop, incoming call ring tones, and push notifications are disabled. - A mute icon displays next to the channel, direct message, or group message's name. - The channel, direct message, or group message appears at reduced opacity in the channel sidebar, and isn't marked as unread unless you're mentioned directly. @@ -67,7 +68,7 @@ By default, you'll receive mention notifications every time someone on your team .. tab:: Desktop - To stop receiving mention notifications, enable the **Ignore mentions for @channel, @here and @all** option, then select **Save**. When enabled, mention notifications for channel-wide mentions are ignored, but the channel is marked as unread unless the channel is muted. + To stop receiving notifications for these types of mentions, enable the **Ignore mentions for @channel, @here and @all** option, then select **Save**. When enabled, mention notifications for channel-wide mentions are ignored, but the channel is marked as unread unless the channel is muted. .. tab:: Mobile @@ -76,55 +77,38 @@ By default, you'll receive mention notifications every time someone on your team 3. Tap **View info**. 4. Tap **Ignore @channel, @here, @all** to disable the option. -Mobile notifications -~~~~~~~~~~~~~~~~~~~~ +Desktop notifications +~~~~~~~~~~~~~~~~~~~~~ -You can set the mobile notifications preferences per channel. +By default, the `desktop notification preferences `__ you've configured in **Settings** apply to all channels you're a member of by default. Desktop notifications are available on Edge, Firefox, Safari, Chrome, and `Mattermost desktop apps `__. -1. Tap the channel where you want to mute mention notifications. -2. Tap the **More** |more-icon| icon located in the top right corner of the app. -3. Tap **View info**. -4. Tap **All new**, **Mentions/DMs only**, or **Nothing** to determine how you'll be notified of new messages in a specific channel. +To configure desktop notifications for a channel, edit **Desktop notifications**, update your channel-specific desktop notifications, sound, and thread reply preferences, then select **Save**. -Send desktop notifications -~~~~~~~~~~~~~~~~~~~~~~~~~~ +To revert a channel to use global desktop notifications, select **Reset to defaults**. -By default, your `desktop notification preferences `__ configured in **Settings** apply to all channels. Desktop notifications are available on Edge, Firefox, Safari, Chrome, and `Mattermost desktop apps `__. +Mobile push notifications +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To customize desktop notifications per channel, edit **Send desktop notifications**, choose one of the following options, then select **Save**: +Mattermost push notifications `must be enabled `__ by a system admin. -+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| **Notification option** | **You'll receive...** | -+===========================+==================================================================================================================================================================================================================================================+ -| **Global default (None)** | Desktop notifications based on your `Settings `__ configuration. | -+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| **For all activity** | Desktop notifications for every new message. | -+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| **Only for mentions** | - Desktop notifications for @mentions only. | -| | - When you've `enabled Collapsed Reply Threads `__, receive reply thread notifications by enabling **Notify me about threads I'm following**. | -+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| **Never** | No desktop notifications. | -+---------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +Once enabled, your `mobile push notification preferences `__ configured in **Settings** apply to all channels you're a member of by default. -Send mobile push notifications -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +To customize mobile push notifications per channel: -Mattermost push notifications `must be enabled `__ by a system admin. Once enabled, your `mobile push notification preferences `__ configured in **Settings** apply to all channels by default. +.. tabs:: -To customize mobile push notifications per channel, edit **Send mobile push notifications**, choose one of the following options, then select **Save**: + .. tab:: Desktop -+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| **Notification option** | **You'll receive...** | -+==============================+==================================================================================================================================================================================================================================================+ -| **Global default (Mention)** | Mobile notifications based on your `Settings `__ configuration. | -+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| **For all activity** | Mobile notifications for every new message. | -+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| **Only for mentions** | - Mobile notifications for @mentions only. | -| | - When you've `enabled Collapsed Reply Threads `__, receive reply thread notifications by enabling **Notify me about threads I'm following**. | -+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| **Never** | No desktop notifications. | -+------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + To configure mobile notifications for a channel, edit **Mobile push notifications**, update your channel-specific mobile notifications and thread reply preferences, then select **Save**. + + To revert a channel to use global mobile push notifications, select **Reset to defaults**. + + .. tab:: Mobile + + 1. Tap the channel where you want to mute mention notifications. + 2. Tap the **More** |more-icon| icon located in the top right corner of the app. + 3. Tap **View info**. + 4. Tap **Mobile Notifications**, and tap your notification preference for that channel. Channel header -------------- @@ -160,3 +144,10 @@ Channel name A channel name must be at least two characters, and can be up to 64 characters in length. `Some unicode characters `_ aren't supported. Change the channel name by selecting **Rename Channel**. Changing the name of the channel also changes the channel URL. Any channel member can change a channel name, unless the system admin has `restricted permissions to do so using advanced permissions `__. + +Automatically follow all new threads in this channel +---------------------------------------------------- + +By default, you don't automatically follow new conversation threads unless you `start a thread or reply to a thread `__, `follow a thread `__, or are `@mentioned `__ in a thread. + +You can configure Mattermost to automatically follow every thread in a channel. When enabled, you can `access all threads `__ in the **Threads** view, and `unfollow specific threads `__ as you prefer. \ No newline at end of file diff --git a/source/channels/syntax-highlighting.rst b/source/channels/syntax-highlighting.rst index 84ce02751fa..8cff0dc900a 100644 --- a/source/channels/syntax-highlighting.rst +++ b/source/channels/syntax-highlighting.rst @@ -162,6 +162,10 @@ Perl perl, pl + + + Pascal + pascal, pas PostgreSQL diff --git a/source/comply/audit-log.rst b/source/comply/audit-log.rst index c0e4f844afd..b22fedd26d9 100644 --- a/source/comply/audit-log.rst +++ b/source/comply/audit-log.rst @@ -22,13 +22,22 @@ Audit logging provides System Admins, including Security, IT/SRE, Compliance, an Configure audit logging ----------------------- -Configuring Mattermost to enable audit logging requires editing the ``config.json`` file directly. Audit logging can’t be managed using the System Console. +The process of configuring audit logging includes specifying destination targets, event names to include, and the verbosity of the audit log output.Configuring Mattermost to enable audit logging requires editing the ``config.json`` file directly. Audit logging can’t be managed using the System Console. -In the ``config.json`` file, go to the ``ExperimentalAuditSettings`` section. Within the ``AdvancedLoggingConfig`` setting, you can specify an absolute or relative filespec to another configuration file or a JSON string. The process of configuring audit logging includes specifying destination targets, event names to include, and the verbosity of the audit log output. +In the ``config.json`` file, go to the ``ExperimentalAuditSettings`` section. You can specify the following: -The example JSON configuration specifies two log targets: one outputs to the console using a plain text format with pipes delimiting fields, and the other outputs to a file using a JSON format with log file rotation. All audit log levels are enabled. +- ``AdvancedLoggingJSON``: A multi-line JSON or a filespec to another configuration file. +- ``AdvancedLoggingConfig`` (deprecated from Mattermost v.8.0): An escaped single line JSON string or a filespec to another configuration file. -.. code-block:: json +The example JSON configuration below specifies two log targets: one outputs to the console using a plain text format with pipes delimiting fields, and the other outputs to a file using a JSON format with log file rotation. All audit log levels are enabled. + +Examples of values for the ``AdvancedLoggingJSON`` setting are: + +1. Filespec to another configuration file: ``"AdvancedLoggingJSON": "/path/to/audit_log_config.json"`` + + This file will contain a JSON object: + + .. code-block:: json { "sample-console": { @@ -68,18 +77,33 @@ The example JSON configuration specifies two log targets: one outputs to the con } } -Examples of values for the ``AdvancedLoggingConfig`` setting are: - -1. Filespec to another configuration file; this file will contain a JSON object - ``"AdvancedLoggingConfig": "/path/to/audit_log_config.json"`` - -2. JSON string - - ``"AdvancedLoggingConfig": "{\"sample-console\":{\"type\":\"console\",\"format\":\"plain\",\"format_options\":{\"delim\":\" | \"},\"levels\":[{\"id\":100,\"name\":\"audit-api\"},{\"id\":101,\"name\":\"audit-content\"},{\"id\":102,\"name\":\"audit-permissions\"},{\"id\":103,\"name\":\"audit-cli\"}],\"options\":{\"out\":\"stdout\"},\"maxqueuesize\":1000},\"sample-file\":{\"type\":\"file\",\"format\":\"json\",\"levels\":[{\"id\":100,\"name\":\"audit-api\"},{\"id\":101,\"name\":\"audit-content\"},{\"id\":102,\"name\":\"audit-permissions\"},{\"id\":103,\"name\":\"audit-cli\"}],\"options\":{\"compress\":true,\"filename\":\"audit.log\",\"max_age\":1,\"max_backups\":10,\"max_size\":500},\"maxqueuesize\":1000}}"`` - -.. note:: - When using a JSON string as the value of ``AdvancedLoggingConfig``, ensure you escape double quotes (``"``) in the string using a backslash (``\``). You can also use a free online tool, such as `Free Online JSON Escape `__ to format the value correctly. +2. Multi-line JSON in the ``config.json`` file: + + .. code-block:: json + + "AdvancedLoggingJSON": { + "file_1": { + "Type": "file", + "Format": "plain", + "Levels": [ + {"ID": 5, "Name": "debug", "Stacktrace": false}, + {"ID": 4, "Name": "info", "Stacktrace": false}, + {"ID": 3, "Name": "warn", "Stacktrace": false}, + {"ID": 2, "Name": "error", "Stacktrace": true}, + {"ID": 1, "Name": "fatal", "Stacktrace": true}, + {"ID": 0, "Name": "panic", "Stacktrace": true} + ], + "Options": { + "Compress": true, + "Filename": "mattermost_logr.log", + "MaxAgeDays": 1, + "MaxBackups": 10, + "MaxSizeMB": 500 + }, + "MaxQueueSize": 1000 + } + } Log level configuration options ------------------------------- diff --git a/source/conf.py b/source/conf.py index fcbb61dd015..36ee2af024f 100644 --- a/source/conf.py +++ b/source/conf.py @@ -1323,6 +1323,8 @@ def setup(_: Sphinx): "https://docs.mattermost.com/configure/experimental-configuration-settings.html#export-output-directory", "configure/experimental-configuration-settings.html#export-settings-default-retention-days": "https://docs.mattermost.com/configure/experimental-configuration-settings.html#export-retention-days", +"configure/experimental-configuration-settings.html#allow-synchronized-drafts": + "https://docs.mattermost.com/configure/site-configuration-settings.html#enable-server-syncing-of-message-drafts", "configure/authentication-configuration-settings.html#gitlab": "https://docs.mattermost.com/configure/authentication-configuration-settings.html#gitlab-oauth-2-0-settings", "configure/authentication-configuration-settings.html#google": @@ -1337,6 +1339,8 @@ def setup(_: Sphinx): "https://docs.mattermost.com/configure/authentication-configuration-settings.html#office-365-openid-settings", "configure/authentication-configuration-settings.html#openid-connect-other": "https://docs.mattermost.com/configure/authentication-configuration-settings.html#openid-connect-other-settings", +"configure/experimental-configuration-settings.html#enable-app-bar": + "https://docs.mattermost.com/configure/experimental-configuration-settings.html#disable-apps-bar", # Deploy redirects "deploy/mobile-apps-faq.html": @@ -1776,7 +1780,7 @@ def setup(_: Sphinx): "integrations/integration-faq.html": "https://docs.mattermost.com/about/faq-integrations.html", "integrations/jira.html": - "https://mattermost.gitbook.io/plugin-jira/", + "https://github.com/mattermost/mattermost-plugin-jira#readme", "integrations/net-promoter-score.html": "https://docs.mattermost.com/manage/user-satisfaction-surveys.html", "integrations/webhook.html": @@ -1784,7 +1788,7 @@ def setup(_: Sphinx): "integrations/zapier.html": "https://developers.mattermost.com/integrate/admin-guide/admin-zapier-integration/", "integrations/zoom.html": - "https://mattermost.gitbook.io/plugin-zoom/", + "https://github.com/mattermost/mattermost-plugin-zoom/blob/master/README.md/", # Manage redirects "manage/scripts.html": @@ -1939,6 +1943,8 @@ def setup(_: Sphinx): "https://docs.mattermost.com/welcome/manage-your-profile.html#profile", "messaging/manage-profile-settings.html#security": "https://docs.mattermost.com/welcome/manage-your-profile.html#security", +"messaging/manage-profile-settings.html#multi-factor-authentication": + "https://docs.mattermost.com/welcome/manage-your-profile.html#security", "messaging/managing-account-settings.html": "https://docs.mattermost.com/channels/channels-settings.html", "messaging/managing-channels.html": @@ -2386,9 +2392,9 @@ def setup(_: Sphinx): # built documents. # # The short X.Y version. -# version = '7.10' +# version = '8.0' # The full version, including alpha/beta/rc tags. -# release = '7.10' +# release = '8.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/source/configure/authentication-configuration-settings.rst b/source/configure/authentication-configuration-settings.rst index 30b6b210084..f4e2108b306 100644 --- a/source/configure/authentication-configuration-settings.rst +++ b/source/configure/authentication-configuration-settings.rst @@ -2204,7 +2204,7 @@ Select OpenID Connect service provider | - **Office 365** (`see settings <#office-365-openid-settings>`__) | | | - **OpenID Connect (Other)** (`see settings <#openid-connect-other-settings>`__) | | +----------------------------------------------------------------------------------+-----------------------------------------------------------+ -| **Note**: **GitLab** OpenID is available in all plans. All other providers require Mattermost Enterprise or Professional. | +| **Note**: **GitLab** OpenID is available in all plans. All other providers require Mattermost Enterprise or Professional. | +----------------------------------------------------------------------------------------------------------------------------------------------+ GitLab OpenID settings diff --git a/source/configure/configuation-in-a-database.rst b/source/configure/configuation-in-a-database.rst index 90d1260baf3..f0425711a8a 100644 --- a/source/configure/configuation-in-a-database.rst +++ b/source/configure/configuation-in-a-database.rst @@ -51,17 +51,9 @@ Example output: Another way to get your database connection string is to view your ``config.json`` file and get the value in ``SqlSettings.DataSource``. -If ``SqlSettings.DataSource`` does not start with ``postgres://`` or ``mysql://``, then you have to add this line to the beginning based on the database in use. Also, if you see ``\u0026`` replace it with ``&``. +If ``SqlSettings.DataSource`` does not start with ``postgres://``, then you have to add this line to the beginning based on the database in use. Also, if you see ``\u0026`` replace it with ``&``. -Here are two example connection strings: - -**MySQL** - -.. code-block:: text - - mysql://mmuser:really_secure_password@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s - -**PostgreSQL** +Here is an example connection string: .. code-block:: text @@ -76,26 +68,11 @@ Create an environment file Create the file ``/opt/mattermost/config/mattermost.environment`` to set the ``MM_CONFIG`` environment variable to the database connection string. For example: -**MySQL** - -.. code-block:: text - - MM_CONFIG='mysql://mmuser:mostest@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s' - -**PostgreSQL** - .. code-block:: text MM_CONFIG='postgres://mmuser:mostest@localhost:5432/mattermost_test?sslmode=disable&connect_timeout=10' -.. note:: - Be sure to escape any single quotes in the database connection string by placing a ``\`` in front of them like this ``\'``. For example: ``MM_CONFIG='mysql://mmuser:it\'s-a-password!@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s'`` - -.. code-block:: text - - MM_CONFIG='mysql://mmuser:it\'s-a-password!@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s' - -Finally, run this command to verify the permissions on your Mattermost directory: +Run this command to verify the permissions on your Mattermost directory: .. code-block:: bash @@ -129,8 +106,8 @@ Here's a complete ``mattermost.service`` file with the ``EnvironmentFile`` line [Unit] Description=Mattermost After=network.target - After=mysql.service - Requires=mysql.service + After=postgresql.service + Requires=postgresql.service [Service] Type=notify @@ -146,29 +123,19 @@ Here's a complete ``mattermost.service`` file with the ``EnvironmentFile`` line LimitNOFILE=49152 [Install] - WantedBy=mysql.service - -.. note:: - If you're using PostgreSQL as your database, the ``mysql.service`` must be replaced with ``postgresql.service``. The easiest way to avoid making a mistake is to add only the ``EnvironmentFile`` line and not copy the entire example. + WantedBy=postgresql.service Migrate configuration from ``config.json`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -You can use the `mmctl config migrate `__ command, or you can use the CLI mattermost config migrate command for this step, as described below. +You can use the `mmctl config migrate `__ command to migrate the configuration. .. note:: If you're using a High Availability cluster, you only need to run this on a single server in the cluster. -The CLI command to migrate the config to the database should always be run as the *mattermost* user. - -.. code-block:: bash - - sudo su mattermost - cd /opt/mattermost - mmctl config migrate ./config/config.json 'mysql://mmuser:mostest@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s' - .. warning:: + When migrating config, Mattermost will incorporate configuration from any existing ``MM_*`` environment variables set in the current shell. See `Environment Variables `_ As with the environment file, you'll have to escape any single quotes in the database connection string. Also, any existing SAML certificates will be migrated into the database as well so they are available for all servers in the cluster. diff --git a/source/configure/database-configuration-settings.rst b/source/configure/database-configuration-settings.rst index 4be1f2a2b82..c1e54aac881 100644 --- a/source/configure/database-configuration-settings.rst +++ b/source/configure/database-configuration-settings.rst @@ -8,7 +8,7 @@ Configure the database environment in which Mattermost is deployed by going to * :systemconsole: N/A :configjson: .SqlSettings.DriverName :environment: MM_SQLSETTINGS_DRIVERNAME - :description: The type of database. Either **mysql** or **postgres**. The default value is **mysql**. + :description: The type of database. Either **postgres** or **mysql**. The default value is **mysql**. Driver name ~~~~~~~~~~~~ @@ -45,6 +45,11 @@ Data source | - Add ``&tls=true`` to your database connection string if your SQL driver supports it. | | - Add ``&tls=skip-verify`` if you use self-signed certificates. | +---------------------------------------------------------------+--------------------------------------------------------------------------+ +| **PostgreSQL databases** | +| | +| When **Driver Name** is set to ``postgres``, use a connection string in the form of: | +| ``postgres://mmuser:password@localhost:5432/mattermost_test?sslmode=disable&connect_timeout=10.`` | ++---------------------------------------------------------------+--------------------------------------------------------------------------+ | **MySQL databases** | | | | When **Driver Name** is set to ``mysql``, using ``collation`` is recommended over using ``charset``. | @@ -71,11 +76,6 @@ Data source | **Note**: If you’re using MySQL 8.0 or later, the default collation has changed to ``utf8mb4_0900_ai_ci``. See our `Database Software | | Requirements `__ documentation for details on MySQL 8.0 support. | +---------------------------------------------------------------+--------------------------------------------------------------------------+ -| **PostgreSQL databases** | -| | -| When **Driver Name** is set to ``postgres``, use a connection string in the form of: | -| ``postgres://mmuser:password@localhost:5432/mattermost_test?sslmode=disable&connect_timeout=10.`` | -+---------------------------------------------------------------+--------------------------------------------------------------------------+ .. config:setting:: database-maxidleconnections :displayname: Maximum idle database connections (Database) @@ -232,10 +232,12 @@ Recycle database connections +--------------------------------------------------------+------------------------------------------------------------------+ | Select the **Recycle Database Connections** button to | - System Config path: **Environment > Database** | -| reconnect to the configured database. | - ``config.json`` setting: N/A | -| All old connections are closed after 20 seconds. | - Environment variable: N/A | +| manually recycle the connection pool by closing the | - ``config.json`` setting: N/A | +| current set of open connections to the database | - Environment variable: N/A | +| within 20 seconds, and then creating a new set of | | +| connections. | | | | | -| To fail over without downing the server, change the | | +| To fail over without stopping the server, change the | | | database line in the ``config.json`` file, select | | | **Reload Configuration from Disk** via **Environment | | | > Web Server**, then select **Recycle Database | | @@ -248,7 +250,7 @@ Recycle database connections :configjson: .SqlSettings.DisableDatabaseSearch :environment: MM_SQLSETTINGS_DISABLEDATABASESEARCH - - **true**: Disables the use of the database to perform earches. If another search engine isn't configured, setting this value to ``true`` will result in empty search results. + - **true**: Disables the use of the database to perform searches. If another search engine isn't configured, setting this value to ``true`` will result in empty search results. - **false**: **(Default)** Database search isn't disabled. Disable database search @@ -283,6 +285,19 @@ Applied schema migrations A list of all migrations that have been applied to the data store based on the version information available in the ``db_migrations`` table. Select **About Mattermost** from the product menu to review the current database schema version applied to your deployment. + +.. config:setting:: database-activesearchbackend + :displayname: Active search backend (Database) + :systemconsole: Environment > Database + :configjson: N/A + :environment: N/A + :description: Read-only display of the currently active backend used for search. + +Active Search Backend +~~~~~~~~~~~~~~~~~~~~~ + +Read-only display of the currently active backend used for search. Values can include ``none``, ``database``, ``elasticsearch``, or ``bleve``. + .. config:setting:: database-readreplicas :displayname: Read replicas (Database) :systemconsole: N/A @@ -393,3 +408,25 @@ Replica lag settings | | | select member_id, count_transactions_remote_in_applier_queue FROM performance_schema.replication_group_member_stats where member_id=<> | +--------------------------------------------------------+----------------------------------------------------------------------------------+ + +.. config:setting:: database-replicamonitorintervalseconds + :displayname: Replica monitor interval (Database) + :systemconsole: N/A + :configjson: .SqlSettings.ReplicaMonitorIntervalSeconds + :environment: MM_SQLSETTINGS_REPLICAMONITORINTERVALSECONDS + + Specifies how frequently unhealthy replicas will be monitored for liveness check. Mattermost will dynamically choose a replica if it's alive. + +Replica monitor interval (seconds) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. include:: ../_static/badges/allplans-selfhosted.rst + :start-after: :nosearch: + ++--------------------------------------------------------+---------------------------------------------------------------------------------+ +| Specifies how frequently unhealthy replicas will be | - System Config path: N/A | +| monitored for liveness check. Mattermost will | - ``config.json`` setting: ``".SqlSettings.ReplicaMonitorIntervalSeconds": 5`` | +| dynamically choose a replica if it's alive. | - Environment variable: ``MM_SQLSETTINGS_REPLICAMONITORINTERVALSECONDS`` | +| | | +| Numerical input. Default is 5 seconds. | | ++--------------------------------------------------------+---------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/source/configure/deprecated-configuration-settings.rst b/source/configure/deprecated-configuration-settings.rst index db2a223f1c0..c442c6a808f 100644 --- a/source/configure/deprecated-configuration-settings.rst +++ b/source/configure/deprecated-configuration-settings.rst @@ -578,6 +578,23 @@ Restrict managing integrations to Admins | This feature's ``config.json`` setting is ``"EnableOnlyAdminIntegrations": true`` with options ``true`` and ``false``. | +------------------------------------------------------------------------------------------------------------------------+ +Patch React DOM used by plugins +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +*Deprecated. Not used in Mattermost v8.0 and later* + +This setting enables the patching of the React DOM library when loading web app plugins so that the plugin uses the version matching the web app. This should only be needed temporarily after upgrading to Mattermost v7.7 for plugins that have not been updated yet. Changes to this setting require a server restart before taking effect. + +See the `Important Upgrade Notes `__ for more information. + +**True**: Web app plugins that package their own version of React DOM are patched to instead use the version of React DOM provided by the web app. + +**False**: Web app plugins are loaded as normal. + ++------------------------------------------------------------------------------------------------------------------+ +| This feature's ``config.json`` setting is ``"PatchPluginsReactDOM": false`` with options ``true`` and ``false``. | ++------------------------------------------------------------------------------------------------------------------+ + ---- Permission policy settings @@ -943,3 +960,14 @@ For more information on AD/LDAP Group Sync, please see the `AD/LDAP Group Sync d +-----------------------------------------------------------------------------------------------------------------------+ | This feature's ``config.json`` setting is ``"ExperimentalLdapGroupSync": false`` with options ``true`` and ``false``. | +-----------------------------------------------------------------------------------------------------------------------+ + +Disable inactive server email notifications +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This setting isn't available in the System Console and can only be set in ``config.json``. + +This configuration setting disables the ability to send inactivity email notifications to Mattermost System Admins. + ++-------------------------------------------------------------------------------------------------------------------+ +| This feature's ``config.json`` setting is ``"EnableInactivityEmail": true`` with options ``true`` and ``false``. | ++-------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file diff --git a/source/configure/elasticsearch-configuration-settings.rst b/source/configure/elasticsearch-configuration-settings.rst index 1bf0bec4a22..35f0bca65a7 100644 --- a/source/configure/elasticsearch-configuration-settings.rst +++ b/source/configure/elasticsearch-configuration-settings.rst @@ -170,7 +170,7 @@ Server password +---------------------------------------------------------------+--------------------------------------------------------------------------+ .. config:setting:: elastic-enablesniffing - :displayname: Enable cluster sniffing + :displayname: Enable cluster sniffing (Elasticsearch) :systemconsole: Environment > Elasticsearch :configjson: .Elasticsearchsettings.Sniff :environment: MM_ELASTICSEARCHSETTINGS_SNIFF @@ -195,6 +195,13 @@ Enable cluster sniffing | Select the **Test Connection** button in the System Console to validate the connection between Mattermost and the Elasticsearch server. | +----------------------------------------------------------------+--------------------------------------------------------------------------+ +.. config:setting:: elastic-bulkindexing + :displayname: Bulk indexing (Elasticsearch) + :systemconsole: Environment > Elasticsearch + :configjson: N/A + :environment: N/A + :description: Configure Mattermost to start a bulk index of all existing posts in the database by selecting Index Now. + Bulk indexing ~~~~~~~~~~~~~ @@ -209,13 +216,39 @@ Bulk indexing | index and search results will be incomplete. | +---------------------------------------------------------------+--------------------------------------------------------------------------+ +.. config:setting:: elastic-indexestoskipwhilepurging + :displayname: Indexes to skip while purging (Elasticsearch) + :systemconsole: Environment > Elasticsearch + :configjson: .Elasticsearchsettings.IgnoredPurgeIndexes + :environment: MM_ELASTICSEARCHSETTINGS_IGNOREDPURGEINDEXES + :description: Specify index names to ignore while purging indexes, separated by commas. + + +Indexes to skip while purging +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++---------------------------------------------------------------+--------------------------------------------------------------------------+ +| Specify index names to ignore while purging indexes. | - System Config path: **Environment > Elasticsearch** | +| Separate multiple index names with commas. | - ``config.json`` setting: ElasticsearchSettings.IgnoredPurgeIndexes | +| | - Environment variable: MM_ELASTICSEARCHSETTINGS_IGNOREDPURGEINDEXES | +| Use an asterisk (*) to match a sequence of index name | | +| characters. | | ++---------------------------------------------------------------+--------------------------------------------------------------------------+ + +.. config:setting:: elastic-purgeindexes + :displayname: Purge indexes (Elasticsearch) + :systemconsole: Environment > Elasticsearch + :configjson: N/A + :environment: N/A + :description: Purge the entire Elasticsearch index by selecting Purge Indexes. + Purge indexes ~~~~~~~~~~~~~ *Available in legacy Enterprise Edition E10/E20* +---------------------------------------------------------------+-------------------------------------------------------------+ -| Configure Mattermost to purge the entire Elasticsearch index. | - System Config path: **Environment > Elasticsearch** | +| Purge the entire Elasticsearch index. | - System Config path: **Environment > Elasticsearch** | | Typically only used if the index has corrupted and search | - ``config.json`` setting: N/A | | isn't behaving as expected. | - Environment variable: N/A | +---------------------------------------------------------------+-------------------------------------------------------------+ @@ -526,7 +559,7 @@ Request timeout +---------------------------------------------------------------+------------------------------------------------------------------------------------+ .. config:setting:: elastic-trace - :displayname: Trace (ElasticSearch) + :displayname: Trace (Elasticsearch) :systemconsole: N/A :configjson: .Elasticsearchsettings.Trace :environment: MM_ELASTICSEARCHSETTINGS_TRACE diff --git a/source/configure/experimental-configuration-settings.rst b/source/configure/experimental-configuration-settings.rst index 8f62f53afa3..c672aaa55c0 100644 --- a/source/configure/experimental-configuration-settings.rst +++ b/source/configure/experimental-configuration-settings.rst @@ -606,59 +606,57 @@ Shared channels enables the ability to establish secure connections between Matt - System Admins for Cloud deployments can submit a request to have the ``EnableRemoteClusterService`` configuration setting enabled in their Cloud instance. .. config:setting:: exp-enableappbar - :displayname: Enable app bar (Experimental) + :displayname: Disable Apps Bar (Experimental) :systemconsole: Experimental > Features - :configjson: EnableAppBar - :environment: N/A - :description: This setting enables the Apps Bar and moves all Mattermost integration icons from the channel header to a vertical pane on the far right side of the screen. + :configjson: DisableAppBar + :environment: ExperimentalSettings.DisableAppBar + :description: This setting disables the Apps Bar and moves all Mattermost integration icons from the vertical pane on the far right back to the channel header. - **true**: All integration icons in the channel header move to the Apps Bar with the exception of the calls beta feature. - **false**: **(Default)** All integration icons in the channel header display in the channel header. -Enable app bar -~~~~~~~~~~~~~~ +Disable Apps Bar +~~~~~~~~~~~~~~~~ -This setting enables the Apps Bar and moves all Mattermost integration icons from the channel header to a vertical pane on the far right side of the screen. +This setting disables the Apps Bar and moves all Mattermost integration icons from the vertical pane on the far right back to the channel header. .. note:: - Integrations currently registered to the channel header will move to the Apps Bar automatically; however, we strongly encourage Mattermost integrators to update their integrations to provide the best user experience. See the `channel header plugin changes `__ user forum discussion for details on how to register integrations with the Apps Bar. + We strongly encourage Mattermost integrators to update their integrations to provide the best user experience. See the `channel header plugin changes `__ user forum discussion for details on how to register integrations with the Apps Bar. -**True**: **(Default for Cloud deployments)** All integration icons in the channel header move to the Apps Bar with the exception of the calls beta feature. +**True**: All integration icons in the channel header display in the channel header. -**False**: **(Default for self-hosted deployments)** All integration icons in the channel header display in the channel header. - -+-------------------------------------------------------------------------------------------------------------------------------+ -| This feature's ``config.json`` setting is ``"ExperimentalSettings.EnableAppBar": false`` with options ``true`` and ``false``. | -+-------------------------------------------------------------------------------------------------------------------------------+ +**False**: **(Default)** All integration icons, except the Calls icon, are available in the vertical Apps Bar pane on the right side of the screen. -Allow synchronized drafts -------------------------- ++--------------------------------------------------------------------------------------------------------------------------------+ +| This feature's ``config.json`` setting is ``"ExperimentalSettings.DisableAppBar": false`` with options ``true`` and ``false``. | ++--------------------------------------------------------------------------------------------------------------------------------+ -This setting synchronizes draft messages across all supported Mattermost clients. +Delay channel autocomplete +~~~~~~~~~~~~~~~~~~~~~~~~~~ -**True**: **(Default)** Message drafts are saved on the server and may be accessed from different clients. Users may still disable server synchronization of draft messages by going to **Settings > Advanced Settings**. +This setting controls whether or not the channel link autocomplete triggers immediately when after a tilde is typed when composing a message. This setting makes the channel autocomplete, such as ``~town-square``, less obtrusive for people who use tildes ``~`` as punctuation. -**False**: Draft messages are only stored locally on each user's device. +**True**: The autocomplete appears after the user types a tilde followed by two or more characters. For example, typing ``~to`` will show the autocomplete, but typing ``~`` will not. -+------------------------------------------------------------------------------------------------------------------------------+ -| This feature's ``config.json`` setting is ``"ServiceSettings.AllowSyncedDrafts": true`` with options ``true`` and ``false``. | -+------------------------------------------------------------------------------------------------------------------------------+ +**False**: **(Default)** The autocomplete appears immediately after the user types a tilde. For example, typing ``~`` will show the autocomplete. -Patch React DOM used by plugins -~~~~~~~~~~~~~~ ++-------------------------------------------------------------------------------------------------------------------------------------------+ +| This feature's ``config.json`` setting is ``"ExperimentalSettings.DelayChannelAutocomplete": false`` with options ``true`` and ``false``. | ++-------------------------------------------------------------------------------------------------------------------------------------------+ -This setting enables the patching of the React DOM library when loading web app plugins so that the plugin uses the version matching the web app. This should only be needed temporarily after upgrading to Mattermost v7.7 for plugins that have not been updated yet. Changes to this setting require a server restart before taking effect. +Disable data refetching on browser refocus +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -See the `Important Upgrade Notes `__ for more information. +This setting disables re-fetching of channel and channel members on browser focus. -**True**: Web app plugins that package their own version of React DOM are patched to instead use the version of React DOM provided by the web app. +**True**: Mattermost won't refetch channels and channel members when the browser regains focus. This may result in improved performance for users with many channels and channel members. -**False**: Web app plugins are loaded as normal. +**False**: (Default) Mattermost will refetch channels and channel emmbers when the browser regains focus. -+------------------------------------------------------------------------------------------------------------------+ -| This feature's ``config.json`` setting is ``"PatchPluginsReactDOM": false`` with options ``true`` and ``false``. | -+------------------------------------------------------------------------------------------------------------------+ ++--------------------------------------------------------------------------------------------------------------------------------------------------+ +| This feature's ``config.json`` setting is ``"ExperimentalSettings.DisableRefetchingOnBrowserFocus": false`` with options ``true`` and ``false``. | ++--------------------------------------------------------------------------------------------------------------------------------------------------+ ---- @@ -959,24 +957,6 @@ Used to control the buffer of outstanding Push Notification messages to be sent. | This feature’s ``config.json`` setting is ``"PushNotificationBuffer": 1000"`` with numerical input. | +---------------------------------------------------------------------------------------------------------------------------------------------+ -.. config:setting:: exp-disableinactivityemail - :displayname: Disable inactive server email notifications (Experimental) - :systemconsole: N/A - :configjson: EnableInactivityEmail - :environment: N/A - :description: This configuration setting disables the ability to send inactivity email notifications to Mattermost System Admins. Default value is **true**. - -Disable inactive server email notifications -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This setting isn't available in the System Console and can only be set in ``config.json``. - -This configuration setting disables the ability to send inactivity email notifications to Mattermost System Admins. - -+-------------------------------------------------------------------------------------------------------------------+ -| This feature's ``config.json`` setting is ``"EnableInactivityEmail": true`` with options ``true`` and ``false``. | -+-------------------------------------------------------------------------------------------------------------------+ - .. config:setting:: exp-enableauditfiles :displayname: File configuration options (Experimental) :systemconsole: N/A @@ -2231,12 +2211,12 @@ When running Mattermost in `High Availablity mode Logging - :configjson: .LogSettings.AdvancedLoggingConfig - :environment: MM_LOGSETTINGS_ADVANCEDLOGGINGCONFIG + :configjson: .LogSettings.AdvancedLoggingJSON + :environment: MM_LOGSETTINGS_ADVANCEDLOGGINGJSON :description: Configure Mattermost to allow any combination of console, local file, syslog, and TCP socket targets, and send log records to multiple targets. Enable diagnostics and error reporting @@ -231,17 +231,16 @@ Enable diagnostics and error reporting +-----------------------------------------------+---------------------------------------------------------------------------+ | Configure Mattermost to allow any combination | - System Config path: **Environment > Logging** | -| of console, local file, syslog, and TCP | - ``config.json setting``: ``".LogSettings.AdvancedLoggingConfig": "",`` | -| socket targets, and send log records to | - Environment variable: ``MM_LOGSETTINGS_ADVANCEDLOGGINGCONFIG`` | +| of console, local file, syslog, and TCP | - ``config.json setting``: ``".LogSettings.AdvancedLoggingJSON": "",`` | +| socket targets, and send log records to | - Environment variable: ``MM_LOGSETTINGS_ADVANCEDLOGGINGJSON`` | | multiple targets. | | -| | | +-----------------------------------------------+---------------------------------------------------------------------------+ .. config:setting:: log-multipletargetoutput :displayname: Output logs to multiple targets (Logging) :systemconsole: Environment > Logging - :configjson: .LogSettings.AdvancedLoggingConfig - :environment: MM_LOGSETTINGS_ADVANCEDLOGGINGCONFIG + :configjson: .LogSettings.AdvancedLoggingJSON + :environment: MM_LOGSETTINGS_ADVANCEDLOGGINGJSON :description: Configure Mattermost to allow any combination of console, local file, syslog, and TCP socket targets, and send log records to multiple targets. Output logs to multiple targets @@ -251,8 +250,8 @@ Output logs to multiple targets +-----------------------------------------------+---------------------------------------------------------------------------+ | Configure Mattermost to allow any combination | - System Config path: **Environment > Logging** | -| of console, local file, syslog, and TCP | - ``config.json setting``: ``".LogSettings.AdvancedLoggingConfig": "",`` | -| socket targets, and send log records to | - Environment variable: ``MM_LOGSETTINGS_ADVANCEDLOGGINGCONFIG`` | +| of console, local file, syslog, and TCP | - ``config.json setting``: ``".LogSettings.AdvancedLoggingJSON": "",`` | +| socket targets, and send log records to | - Environment variable: ``MM_LOGSETTINGS_ADVANCEDLOGGINGJSON`` | | multiple targets. | | | | | | String input can contain a filespec to | | diff --git a/source/configure/plugins-configuration-settings.rst b/source/configure/plugins-configuration-settings.rst index 750283956b2..34a989ed19e 100644 --- a/source/configure/plugins-configuration-settings.rst +++ b/source/configure/plugins-configuration-settings.rst @@ -17,7 +17,7 @@ Both self-hosted and Cloud admins can access the following configuration setting - `Demo Plugin <#demo-plugin>`__ - `GIF commands <#gif-commands>`__ - `Mattermost Boards <#mattermost-boards>`__ -- `Mattermost Playbooks <#mattermost-playbooks>`__ +- `Mattermost Playbooks plugin <#mattermost-playbooks>`__ - `User Satisfaction surveys <#user-satisfaction-surveys>`__ - `Zoom <#zoom>`__ @@ -199,20 +199,19 @@ Access the following configuration settings in the System Console by going to ** .. config:setting:: plugins-agendaenable :displayname: Enable plugin (Plugins - Agenda) :systemconsole: Plugins > Agenda - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: Enables the Agenda plugin on your Mattermost server. - - **false**: Disables the Agenda plugin on your Mattermost server. + - **false**: (Default) Disables the Agenda plugin on your Mattermost server. Enable plugin ~~~~~~~~~~~~~ -+--------------------------------------------------------------------+--------------------------------------------+ -| - **true**: Enables the Agenda plugin on your Mattermost server. | - System Config path: **Plugins > Agenda** | -| - **false**: Disables the Agenda plugin on your Mattermost server. | - ``config.json`` setting: | -| | - Environment variable: | -+--------------------------------------------------------------------+--------------------------------------------+ ++------------------------------------------------------------------------------+--------------------------------------------+ +| - **true**: Enables the Agenda plugin on your Mattermost server. | - System Config path: **Plugins > Agenda** | +| - **false**: (Default) Disables the Agenda plugin on your Mattermost server. | | ++------------------------------------------------------------------------------+--------------------------------------------+ ---- @@ -231,51 +230,49 @@ Access the following configuration settings in the System Console by going to ** .. config:setting:: plugins-antivirusenable :displayname: Enable plugin (Plugins - Antivirus) :systemconsole: Plugins > Antivirus - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: Enables the Antivirus plugin on your Mattermost server. - - **false**: Disables the Antivirus plugin on your Mattermost server. + - **false**: (Default) Disables the Antivirus plugin on your Mattermost server. Enable plugin ~~~~~~~~~~~~~ -+-----------------------------------------------------------------------+-----------------------------------------------+ -| - **true**: Enables the Antivirus plugin on your Mattermost server. | - System Config path: **Plugins > Antivirus** | -| - **false**: Disables the Antivirus plugin on your Mattermost server. | - ``config.json`` setting: | -| | - Environment variable: | -+-----------------------------------------------------------------------+-----------------------------------------------+ ++---------------------------------------------------------------------------------+-----------------------------------------------+ +| - **true**: Enables the Antivirus plugin on your Mattermost server. | - System Config path: **Plugins > Antivirus** | +| - **false**: (Default) Disables the Antivirus plugin on your Mattermost server. | | +| | | ++---------------------------------------------------------------------------------+-----------------------------------------------+ .. config:setting:: plugins-antivirusclamavhostport :displayname: ClamAV - host and port (Plugins - Antivirus) :systemconsole: Plugins > Antivirus - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify the hostname and port to connect to the ClamAV server. ClamAV - host and port ~~~~~~~~~~~~~~~~~~~~~~ +---------------------------------------------------------------------+-----------------------------------------------+ -| Sets the **hostname** and **port** to connect to the ClamAV server. | - System Config path: **Plugins > Antivirus** | -| | - ``config.json`` setting: | -| | - Environment variable: | +| Sets the **hostname** and **port** to connect to the ClamAV server | - System Config path: **Plugins > Antivirus** | +| when the Antivirus plugin is enabled. | | +---------------------------------------------------------------------+-----------------------------------------------+ .. config:setting:: plugins-antivirusscantimeout :displayname: Scan timeout (Plugins - Antivirus) :systemconsole: Plugins > Antivirus - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specifies the length of time, in seconds, before the virus scan times out. Scan timeout (seconds) ~~~~~~~~~~~~~~~~~~~~~~ +-----------------------------------------------------------------------+-----------------------------------------------+ -| Sets the length of time, in seconds, before the virus scan times out. | - System Config path: **Plugins > Antivirus** | -| | - ``config.json`` setting: | -| | - Environment variable: | +| Sets the length of time, in seconds, before the virus scan times out | - System Config path: **Plugins > Antivirus** | +| when the Antivirus plugin is enabled. | | +-----------------------------------------------------------------------+-----------------------------------------------+ ---- @@ -293,20 +290,20 @@ To create your own Mattermost App, see the `Mattermost Apps Apps - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: Enables the Apps plugin on your Mattermost server. - - **false**: Disables the Apps plugin on your Mattermost server. + - **false**: (Default) Disables the Apps plugin on your Mattermost server. Enable plugin ~~~~~~~~~~~~~ -+------------------------------------------------------------------+-------------------------------------------------------------+ -| - **true**: Enables the Apps plugin on your Mattermost server. | - System Config path: **Plugins > Apps** | -| - **false**: Disables the Apps plugin on your Mattermost server. | - ``config.json`` setting: | -| | - Environment variable: | -+------------------------------------------------------------------+-------------------------------------------------------------+ ++----------------------------------------------------------------------------+-------------------------------------------------------------+ +| - **true**: Enables the Apps plugin on your Mattermost server. | - System Config path: **Plugins > Apps** | +| - **false**: (Default) Disables the Apps plugin on your Mattermost server. | | +| | | ++----------------------------------------------------------------------------+-------------------------------------------------------------+ ---- @@ -323,71 +320,69 @@ Access the following configuration settings in the System Console by going to ** .. config:setting:: plugins-autolinkenable :displayname: Enable plugin (Plugins - Autolink) :systemconsole: Plugins > Autolink - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: Enables the Autolink plugin on your Mattermost server. - - **false**: Disables the Autolink plugin on your Mattermost server. + - **false**: (Default) Disables the Autolink plugin on your Mattermost server. Enable plugin ~~~~~~~~~~~~~ -+----------------------------------------------------------------------+----------------------------------------------+ -| - **true**: Enables the Autolink plugin on your Mattermost server. | - System Config path: **Plugins > Autolink** | -| - **false**: Disables the Autolink plugin on your Mattermost server. | - ``config.json`` setting: | -| | - Environment variable: | -+----------------------------------------------------------------------+----------------------------------------------+ ++--------------------------------------------------------------------------------+----------------------------------------------+ +| - **true**: Enables the Autolink plugin on your Mattermost server. | - System Config path: **Plugins > Autolink** | +| - **false**: (Default) Disables the Autolink plugin on your Mattermost server. | | +| | | ++--------------------------------------------------------------------------------+----------------------------------------------+ .. config:setting:: plugins-autolinkenableadmin :displayname: Enable administration with /autolink command (Plugins - Autolink) :systemconsole: Plugins > Autolink - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: Enables the ability to configure the Apps plugin using the ``/autolink`` slash command. - - **false**: Disables the ability to use the slash command to configure the plugin. + - **false**: (Default) Disables the ability to use the slash command to configure the plugin. Enable administration with /autolink command ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+-----------------------------------------------------------------------------------------------------+----------------------------------------------+ -| - **true**: Enables administration of the Autolinks plugin using the ``/autolink`` slash command. | - System Config path: **Plugins > Autolink** | -| - **false**: Disables administration of the Autolinks plugin using the ``/autolink`` slash command. | - ``config.json`` setting: | -| | - Environment variable: | -+-----------------------------------------------------------------------------------------------------+----------------------------------------------+ ++---------------------------------------------------------------------------------------------------------------+----------------------------------------------+ +| - **true**: Enables administration of the Autolinks plugin using the ``/autolink`` slash command. | - System Config path: **Plugins > Autolink** | +| - **false**: (Default) Disables administration of the Autolinks plugin using the ``/autolink`` slash command. | | ++---------------------------------------------------------------------------------------------------------------+----------------------------------------------+ .. config:setting:: plugins-autolinkapplytoupdatedposts :displayname: Apply plugin to updated posts as well as new posts (Plugins - Autolink) :systemconsole: Plugins > Autolink - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: Applies the plugin to updated posts as well as new posts. - - **false**: Applies the plugin to new posts only. + - **false**: (Default) Applies the plugin to new posts only. Apply plugin to updated posts as well as new posts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-----------------------------------------------------------------------+----------------------------------------------+ | - **true**: Applies the plugin to updated posts as well as new posts. | - System Config path: **Plugins > Autolink** | -| - **false**: Applies the plugin to new posts only. | - ``config.json`` setting: | -| | - Environment variable: | +| - **false**: (Default) Applies the plugin to new posts only. | | +| | | +-----------------------------------------------------------------------+----------------------------------------------+ .. config:setting:: plugins-autolinkadminuserids :displayname: Admin user IDs (Plugins - Autolink) :systemconsole: Plugins > Autolink - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify users authorized to administer the plugin in addition to System Admins. Separate multiple user IDs with commas. Admin user IDs ~~~~~~~~~~~~~~ +-----------------------------------------------------------------------------------------+----------------------------------------------+ -| Use this setting to authorize non-System Admin users to administer the Autolink plugin. | - System Config path: **Plugins > Autolink** | -| | - ``config.json`` setting: | -| Separate multiple user IDs with commas. | - Environment variable: | +| Use this setting to authorize non-System Admin users to administer the Autolink plugin | - System Config path: **Plugins > Autolink** | +| when the Autolink plugin is enabled. Separate multiple user IDs with commas. | | +-----------------------------------------------------------------------------------------+----------------------------------------------+ .. tip:: @@ -409,26 +404,26 @@ Access the following configuration settings in the System Console by going to ** .. config:setting:: plugins-awssnsenable :displayname: Enable plugin (Plugins - AWS SNS) :systemconsole: Plugins > AWS SNS - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: Enables the AWS SNS plugin on your Mattermost server. - - **false**: Disables the AWS SNS plugin on your Mattermost server. + - **false**: (Default) Disables the AWS SNS plugin on your Mattermost server. Enable plugin ~~~~~~~~~~~~~ -+---------------------------------------------------------------------+---------------------------------------------+ -| - **true**: Enables the AWS SNS plugin on your Mattermost server. | - System Config path: **Plugins > AWS SNS** | -| - **false**: Disables the AWS SNS plugin on your Mattermost server. | - ``config.json`` setting: | -| | - Environment variable: | -+---------------------------------------------------------------------+---------------------------------------------+ ++-------------------------------------------------------------------------------+---------------------------------------------+ +| - **true**: Enables the AWS SNS plugin on your Mattermost server. | - System Config path: **Plugins > AWS SNS** | +| - **false**: (Default) Disables the AWS SNS plugin on your Mattermost server. | | +| | | ++-------------------------------------------------------------------------------+---------------------------------------------+ .. config:setting:: plugins-awssnsnotificationchannel :displayname: Channel to send notifications to (Plugins - AWS SNS) :systemconsole: Plugins > AWS SNS - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Use this setting to specify the channel that will receive AWS SNS notifications in the format, **teamname,channelname**. Channel to send notifications to @@ -436,8 +431,8 @@ Channel to send notifications to +----------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------+ | Use this setting to specify the channel that will receive AWS SNS notifications by entering the team name and channel name as: **teamname,channelname**. | - System Config path: **Plugins > AWS SNS** | -| | - ``config.json`` setting: | -| For example, if the channel URL is https://example.com/**myteam**/channels/**mychannel**, enter: **myteam,mychannel**. | - Environment variable: | +| | | +| For example, if the channel URL is https://example.com/**myteam**/channels/**mychannel**, enter: **myteam,mychannel**. | | | | | | If the channel does not exist, the plugin creates the channel for you. | | +----------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------+ @@ -445,17 +440,16 @@ Channel to send notifications to .. config:setting:: plugins-awssnsauthorizeduserids :displayname: Authorized user IDs (Plugins - AWS SNS) :systemconsole: Plugins > AWS SNS - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify users authorized to accept AWS SNS subscriptions to a Mattermost channel. Separate multiple user IDs with commas. Authorized user IDs ~~~~~~~~~~~~~~~~~~~ +----------------------------------------------------------------------------------------------+---------------------------------------------+ -| Use this setting to authorize users to accept AWS SNS subscriptions to a Mattermost channel. | - System Config path: **Plugins > AWS SNS** | -| | - ``config.json`` setting: | -| Separate multiple user IDs with commas. | - Environment variable: | +| Use this setting to authorize users to accept AWS SNS subscriptions to a Mattermost channel | - System Config path: **Plugins > AWS SNS** | +| when the AWS SNS plugin is enabled. Separate multiple user IDs with commas. | | +----------------------------------------------------------------------------------------------+---------------------------------------------+ .. tip:: @@ -465,17 +459,16 @@ Authorized user IDs .. config:setting:: plugins-awssnstoken :displayname: Token (Plugins - AWS SNS) :systemconsole: Plugins > AWS SNS - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Generate a token to validate incoming requests from AWS SNS by selecting **Regenerate**. Token ~~~~~ +------------------------------------------------------------------------------------------+---------------------------------------------+ -| Generate a token to validate incoming requests from AWS SNS by selecting **Regenerate**. | - System Config path: **Plugins > AWS SNS** | -| | - ``config.json`` setting: | -| | - Environment variable: | +| Generate a token to validate incoming requests from AWS SNS by selecting **Regenerate** | - System Config path: **Plugins > AWS SNS** | +| when the AWS SNS plugin is enabled. | | +------------------------------------------------------------------------------------------+---------------------------------------------+ ---- @@ -494,17 +487,17 @@ Access the following configuration settings in the System Console by going to ** :configjson: PluginSettings.PluginStates.com.mattermost.calls.Enable :environment: MM_PLUGINSETTINGS_PLUGINSTATES_COM_MATTERMOST_CALLS - - **true**: Enables the calls plugin on your Mattermost workspace. + - **true**: (Default) Enables the calls plugin on your Mattermost workspace. - **false**: Disables the calls plugin on your Mattermost workspace. Enable plugin ~~~~~~~~~~~~~ -+----------------------------------------------------------------------+----------------------------------------------------------------------------------------+ -| - **true**: Enables the Calls plugin on your Mattermost workspace. | - System Config path: **Plugins > Calls** | -| - **false**: Disables the Calls plugin on your Mattermost workspace. | - ``config.json`` setting: ``PluginSettings.PluginStates.com.mattermost.calls.Enable`` | -| | - Environment variable: ``MM_PLUGINSETTINGS_PLUGINSTATES_COM_MATTERMOST_CALLS`` | -+----------------------------------------------------------------------+----------------------------------------------------------------------------------------+ ++--------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+ +| - **true**: (Default) Enables the Calls plugin on your Mattermost workspace. | - System Config path: **Plugins > Calls** | +| - **false**: Disables the Calls plugin on your Mattermost workspace. | - ``config.json`` setting: ``PluginSettings.PluginStates.com.mattermost.calls.Enable`` | +| | - Environment variable: ``MM_PLUGINSETTINGS_PLUGINSTATES_COM_MATTERMOST_CALLS`` | ++--------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+ .. config:setting:: plugins-callsrtcserveraddress :displayname: RTC server port (UDP) (Plugins - Calls) @@ -626,7 +619,6 @@ Enable on specific channels | - **true**: Channel admins can enable or disable calls on specific channels. Participants in DMs/GMs can also enable or disable calls. | - System Config path: **Plugins > Calls** | | - **false**: Only System Admins can enable or disable calls on specific channels. | - ``config.json`` setting: ``PluginSettings.Plugins.com.mattermost.calls.allowenablecalls`` | | | - Environment variable: N/A | -| | | +----------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+ .. config:setting:: plugins-testmode @@ -648,7 +640,6 @@ Test mode | - **true**: Only System Admins can start calls in channels. | - System Config path: **Plugins > Calls** | | - **false**: All team members can start calls in channels. | - ``config.json`` setting: ``PluginSettings.Plugins.com.mattermost.calls.defaultenabled`` | | | - Environment variable: N/A | -| | | +--------------------------------------------------------------+-----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ | **Note**: Use this setting to confirm calls work as expected. When **true**, users attempting to start calls are prompted to contact System Admins. System Admins are prompted to confirm that calls are working as expected before switching to live mode. | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -670,7 +661,6 @@ ICE host override | This setting overrides the host advertised to clients when connecting to calls. | - System Config path: **Plugins > Calls** | | | - ``config.json`` setting: ``PluginSettings.Plugins.com.mattermost.calls.icehostoverride`` | | This is an optional field. Changing this setting requires a plugin restart to take effect. | | -| | | +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | **Note**: | | - This setting is only applicable when not running calls through the standalone ``rtcd`` service. | @@ -903,7 +893,7 @@ Enable simulcast for screen sharing (Experimental) :environment: N/A :description: Allow call hosts to record meeting video and audio. -Enable call recordings (beta) +Enable call recordings (Beta) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. include:: ../_static/badges/ent-selfhosted-only.rst @@ -965,7 +955,7 @@ Maximum call recording duration :description: The audio and video quality of call recordings. Call recording quality -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~ .. include:: ../_static/badges/ent-selfhosted-only.rst :start-after: :nosearch: @@ -1010,6 +1000,23 @@ Call recording quality .. |note| replace:: . +Enable call ringing (Beta) +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. config:setting:: plugins-enablecallringing + :displayname: Enable call ringing (Plugins - Calls) + :systemconsole: Plugins > Calls + :configjson: PluginSettings.Plugins.com.mattermost.calls. enableringing + :environment: N/A + :description: Enable or disable incoming call desktop alerts and ringing notifications + ++--------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ +| - **true**: Ringing functionality is enabled. Direct and group message | - System Config path: **Plugins > Calls** | +| participants receive a desktop app alert and a ringing notification | - ``config.json`` setting: ``PluginSettings.Plugins.com.mattermost.calls. enableringing`` | +| when a call starts. | - Environment variable: N/A | +| - **false**: **(Default**) Ringing functionality is disabled. | | ++--------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ + ---- Channel export @@ -1023,20 +1030,20 @@ Access the following configuration settings in the System Console by going to ** .. config:setting:: plugins-channelexportenable :displayname: Enable plugin (Plugins - Channel Export) :systemconsole: Plugins > Channel Export - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: Enables the Channel Export plugin on your Mattermost workspace. - - **false**: Disables the Channel Export plugin on your Mattermost workspace. + - **false**: (Default) Disables the Channel Export plugin on your Mattermost workspace. Enable Plugin ~~~~~~~~~~~~~ -+-------------------------------------------------------------------------------+----------------------------------------------------+ -| - **true**: Enables the Channel Export plugin on your Mattermost workspace. | - System Config path: **Plugins > Channel Export** | -| - **false**: Disables the Channel Export plugin on your Mattermost workspace. | - ``config.json`` setting: | -| | - Environment variable: | -+-------------------------------------------------------------------------------+----------------------------------------------------+ ++-----------------------------------------------------------------------------------------+----------------------------------------------------+ +| - **true**: Enables the Channel Export plugin on your Mattermost workspace. | - System Config path: **Plugins > Channel Export** | +| - **false**: (Default) Disables the Channel Export plugin on your Mattermost workspace. | | +| | | ++-----------------------------------------------------------------------------------------+----------------------------------------------------+ ---- @@ -1051,51 +1058,50 @@ Access the following configuration settings in the System Console by going to ** .. config:setting:: plugins-demoenable :displayname: Enable plugin (Plugins - Demo) :systemconsole: Plugins > Demo Plugin - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: Enables the Demo plugin on your Mattermost workspace. - - **false**: Disables the Demo plugin on your Mattermost workspace. + - **false**: (Default) Disables the Demo plugin on your Mattermost workspace. Enable plugin ~~~~~~~~~~~~~ -+---------------------------------------------------------------------+-------------------------------------------------+ -| - **true**: Enables the Demo plugin on your Mattermost workspace. | - System Config path: **Plugins > Demo Plugin** | -| - **false**: Disables the Demo plugin on your Mattermost workspace. | - ``config.json`` setting: | -| | - Environment variable: | -+---------------------------------------------------------------------+-------------------------------------------------+ ++-------------------------------------------------------------------------------+-------------------------------------------------+ +| - **true**: Enables the Demo plugin on your Mattermost workspace. | - System Config path: **Plugins > Demo Plugin** | +| - **false**: (Default) Disables the Demo plugin on your Mattermost workspace. | | ++-------------------------------------------------------------------------------+-------------------------------------------------+ .. config:setting:: plugins-demochannelname :displayname: Channel name (Plugins - Demo) :systemconsole: Plugins > Demo Plugin - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify the channel to use as part of the demo plugin. If the specified channel does not exist, the plugin creates the channel for you. Channel name ~~~~~~~~~~~~ +----------------------------------------------------------------------------------+-------------------------------------------------+ -| Specify the channel to use as part of the demo plugin. | - System Config path: **Plugins > Demo Plugin** | -| | - ``config.json`` setting: | -| If the specified channel does not exist, the plugin creates the channel for you. | - Environment variable: | +| Specify the channel to use as part of the demo plugin, when enabled. | - System Config path: **Plugins > Demo Plugin** | +| | | +| If the specified channel does not exist, the plugin creates the channel for you. | | +----------------------------------------------------------------------------------+-------------------------------------------------+ .. config:setting:: plugins-demousername :displayname: Username (Plugins - Demo) :systemconsole: Plugins > Demo Plugin - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify the user to use as part of the demo plugin. If the specified user does not exist, the plugin creates the user for you. Username ~~~~~~~~ +----------------------------------------------------------------------------+-------------------------------------------------+ -| Specify the user for the demo plugin. | - System Config path: **Plugins > Demo Plugin** | -| | - ``config.json`` setting: | -| If the specified user does not exist, the plugin creates the user for you. | - Environment variable: | +| Specify the user for the demo plugin, when enabled. | - System Config path: **Plugins > Demo Plugin** | +| | | +| If the specified user does not exist, the plugin creates the user for you. | | +----------------------------------------------------------------------------+-------------------------------------------------+ ---- @@ -1113,26 +1119,25 @@ This plugin is used to post GIFs from Gfycat, Giphy, or Tenor using slash comman .. config:setting:: plugins-gifenable :displayname: Enable plugins (Plugins - GIF) :systemconsole: Plugins > GIF commands - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: Enables the GIF commands plugin on your Mattermost server. - - **false**: Disables the GIF commands plugin on your Mattermost server. + - **false**: (Default) Disables the GIF commands plugin on your Mattermost server. Enable plugin ~~~~~~~~~~~~~ -+--------------------------------------------------------------------------+--------------------------------------------------+ -| - **true**: Enables the GIF commands plugin on your Mattermost server. | - System Config path: **Plugins > GIF commands** | -| - **false**: Disables the GIF commands plugin on your Mattermost server. | - ``config.json`` setting: | -| | - Environment variable: | -+--------------------------------------------------------------------------+--------------------------------------------------+ ++------------------------------------------------------------------------------------+--------------------------------------------------+ +| - **true**: Enables the GIF commands plugin on your Mattermost server. | - System Config path: **Plugins > GIF commands** | +| - **false**: (Default) Disables the GIF commands plugin on your Mattermost server. | | ++------------------------------------------------------------------------------------+--------------------------------------------------+ .. config:setting:: plugins-gifdisplayas :displayname: Display the GIF as (Plugins - GIF) :systemconsole: Plugins > GIF commands - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Display the GIF as an embedded image where the GIF can't be collapsed, or as a collapsible image preview where the full URL displays. Display the GIF as @@ -1140,8 +1145,8 @@ Display the GIF as +---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------+ | Display the GIF as an embedded image where the GIF can't be collapsed, or as a collapsible image preview where the full URL displays. | - System Config path: **Plugins > GIF commands** | -| | - ``config.json`` setting: | -| | - Environment variable: | +| | | +| | | +---------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------+ | **Note**: | | - `Link previews `__ must be enabled to display GIF previews. | @@ -1151,8 +1156,8 @@ Display the GIF as .. config:setting:: plugins-gifprovider :displayname: GIF provider (Plugins - GIF) :systemconsole: Plugins > GIF commands - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify the GIF provider as **GIPHY**, **Tenor**, or **Gfycat**. GIF provider @@ -1160,8 +1165,6 @@ GIF provider +-------------------------------------------------------------------+-----------------------------------------------------+ | Specify the GIF provider as **GIPHY**, **Tenor**, or **Gfycat**. | - System Config path: **Plugins > GIF commands** | -| | - ``config.json`` setting: | -| | - Environment variable: | +-------------------------------------------------------------------+-----------------------------------------------------+ | **Note**: Selecting GIPHY or Tenor requires an API key. A key is not required for Gfycat. | +-------------------------------------------------------------------------------------------------------------------------+ @@ -1169,8 +1172,8 @@ GIF provider .. config:setting:: plugins-gifgiphytenorapikey :displayname: Giphy/Tenor API key (Plugins - GIF) :systemconsole: Plugins > GIF commands - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Configure your own API Key when specifying the GIF Provider as GIPHY or Tenor. An API key is not required for Gfycat. Giphy/Tenor API key @@ -1178,16 +1181,16 @@ Giphy/Tenor API key +-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------+ | Configure your own API key when specifying the GIF Provider as GIPHY or Tenor. An API key is not required for Gfycat. | - System Config path: **Plugins > GIF commands** | -| | - ``config.json`` setting: | -| See the `GIPHY `__ | - Environment variable: | +| | | +| See the `GIPHY `__ | | | or `Tenor `__ documentation for details. | | +-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------+ .. config:setting:: plugins-gifcontentrating :displayname: Content rating (GIPHY & Tenor only) (Plugins - GIF) :systemconsole: Plugins > GIF commands - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Select an `MPAA-style content rating `__ for GIFs from GIPHY or Tenor. Leave this field empty to disable content filtering. Content rating (GIPHY & Tenor only) @@ -1195,15 +1198,14 @@ Content rating (GIPHY & Tenor only) +-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------+ | Select an `MPAA-style content rating `__ | - System Config path: **Plugins > GIF commands** | -| for GIFs from GIPHY or Tenor. | - ``config.json`` setting: | -| Leave this field empty to disable content filtering. | - Environment variable: | +| for GIFs from GIPHY or Tenor. Leave this field empty to disable content filtering. | | +-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------+ .. config:setting:: plugins-gifgfycatdisplaystyle :displayname: Gfycat display style (Plugins - GIF) :systemconsole: Plugins > GIF commands - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify the display style for GIFs from Gfycat. See the `Gfycat Developer API `__ documentation for details. Gfycat display style @@ -1211,15 +1213,14 @@ Gfycat display style +-------------------------------------------------------------------------------+--------------------------------------------------+ | Specify the display style for GIFs from Gfycat. See the `Gfycat Developer API | - System Config path: **Plugins > GIF commands** | -| `__ documentation for details. | - ``config.json`` setting: | -| | - Environment variable: | +| `__ documentation for details. | | +-------------------------------------------------------------------------------+--------------------------------------------------+ .. config:setting:: plugins-gifgiphydisplaystyle :displayname: GIPHY display style (Plugins - GIF) :systemconsole: Plugins > GIF commands - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify the display style for GIFs from GIPHY. See the `GIPHY Developers Rendition Guide `__ for details. GIPHY display style @@ -1227,15 +1228,14 @@ GIPHY display style +----------------------------------------------------------------------------------------+--------------------------------------------------+ | Specify the display style for GIFs from GIPHY. See the `GIPHY Developers | - System Config path: **Plugins > GIF commands** | -| Rendition Guide `__ for details. | - ``config.json`` setting: | -| | - Environment variable: | +| Rendition Guide `__ for details. | | +----------------------------------------------------------------------------------------+--------------------------------------------------+ .. config:setting:: plugins-giftenordisplaystyle :displayname: Tenor display style (Plugins - GIF) :systemconsole: Plugins > GIF commands - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify the display style for GIFs from Tenor. See the `Tenor API `__ documentation for details. Tenor display style @@ -1243,15 +1243,14 @@ Tenor display style +--------------------------------------------------------------------------------------------------+--------------------------------------------------+ | Specify the display style for GIFs from Tenor. See the `Tenor API | - System Config path: **Plugins > GIF commands** | -| `__ documentation for details. | - ``config.json`` setting: | -| | - Environment variable: | +| `__ documentation for details. | | +--------------------------------------------------------------------------------------------------+--------------------------------------------------+ .. config:setting:: plugins-giflanguage :displayname: Language (Plugins - GIF) - :systemconsole: Plugins > GIF commands - :configjson: - :environment: + :systemconsole: Plugins > GIF commands + :configjson: N/A + :environment: N/A :description: Specify the language used to search GIFs from GIPHY. See the `GIPHY Developers Language Support `__ documentation for details. Language @@ -1259,27 +1258,26 @@ Language +-----------------------------------------------------------------------------------------+--------------------------------------------------+ | Specify the language used to search GIFs from GIPHY. See the `GIPHY Developers Language | - System Config path: **Plugins > GIF commands** | -| Support `__ | - ``config.json`` setting: | -| documentation for details. | - Environment variable: | +| Support `__ | | +| documentation for details. | | +-----------------------------------------------------------------------------------------+--------------------------------------------------+ .. config:setting:: plugins-gifforcepreview :displayname: Force GIF preview before posting (force /gifs) (Plugins - GIF) :systemconsole: Plugins > GIF commands - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: Prevents accidental posting of inappropriate GIFs from a provider that does not support content rating filtering. - - **false**: Both ``/gif`` and ``/gifs`` slash commands are available for the GIF commands plugin on your Mattermost server. + - **false**: (Default) Both ``/gif`` and ``/gifs`` slash commands are available for the GIF commands plugin on your Mattermost server. Force GIF preview before posting (force /gifs) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+---------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------+ -| - **true**: **(Default)** Prevents accidental posting of inappropriate GIFs from a provider that does not support content rating filtering. | - System Config path: **Plugins > GIF commands** | -| - **false**: Both ``/gif`` and ``/gifs`` slash commands are available for the GIF commands plugin on your Mattermost server. | - ``config.json`` setting: | -| | - Environment variable: | -+---------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------+ ++-------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------+ +| - **true**: Prevents accidental posting of inappropriate GIFs from a provider that does not support content rating filtering. | - System Config path: **Plugins > GIF commands** | +| - **false**: (Default) Both ``/gif`` and ``/gifs`` slash commands are available for the GIF commands plugin on your Mattermost server. | | ++-------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------+ ---- @@ -1313,13 +1311,13 @@ Enable plugin ---- -Mattermost Playbooks --------------------- +Mattermost Playbooks plugin +---------------------------- .. include:: ../_static/badges/allplans-cloud-selfhosted.rst :start-after: :nosearch: -Mattermost Playbooks is an open source, self-hosted collaboration tool for teams. Each playbook represents a recurring outcome or specific goal that your teams collaborate on to achieve, such as service outage recovery or customer onboarding. Teams run a playbook every time they want to orchestrate people, tools, and data to achieve that outcome as quickly as possible while providing visibility to stakeholders. Playbooks also allow teams to incorporate learnings from the retrospective to tweak and improve the playbook with every iteration. See the `Mattermost Playbooks `__ documentation for details. +The Mattermost Playbooks plugin is an open source, self-hosted collaboration tool for teams. Each playbook represents a recurring outcome or specific goal that your teams collaborate on to achieve, such as service outage recovery or customer onboarding. Teams run a playbook every time they want to orchestrate people, tools, and data to achieve that outcome as quickly as possible while providing visibility to stakeholders. Playbooks also allow teams to incorporate learnings from the retrospective to tweak and improve the playbook with every iteration. See the `Mattermost Playbooks plugin `__ documentation for details. Access the following configuration settings in the System Console by going to **Plugins > Playbooks**. @@ -1329,33 +1327,33 @@ Access the following configuration settings in the System Console by going to ** :configjson: :environment: - - **true**: Enables the Mattermost Playbooks plugin on your Mattermost workspace. + - **true**: **(Default)** Enables the Mattermost Playbooks plugin on your Mattermost workspace. - **false**: Disables the Mattermost Playbooks plugin on your Mattermost workspace. Enable plugin ~~~~~~~~~~~~~ -+-------------------------------------------------------------------------------------+-----------------------------------------------+ -| - **true**: Enables the Mattermost Playbooks plugin on your Mattermost workspace. | - System Config path: **Plugins > Playbooks** | -| - **false**: Disables the Mattermost Playbooks plugin on your Mattermost workspace. | - ``config.json`` setting: | -| | - Environment variable: | -+-------------------------------------------------------------------------------------+-----------------------------------------------+ ++---------------------------------------------------------------------------------------------------+-----------------------------------------------+ +| - **true**: **(Default)** Enables the Mattermost Playbooks plugin on your Mattermost workspace. | - System Config path: **Plugins > Playbooks** | +| - **false**: Disables the Mattermost Playbooks plugin on your Mattermost workspace. | - ``config.json`` setting: | +| | - Environment variable: | ++---------------------------------------------------------------------------------------------------+-----------------------------------------------+ .. config:setting:: plugins-playbooksenabledteams :displayname: Enabled teams (Plugins - Playbooks) :systemconsole: Plugins > Playbooks :configjson: :environment: - :description: Enable Playbooks for all Mattermost teams, or for only selected teams. + :description: Enable the Playbooks plugin for all Mattermost teams, or for only selected teams. Enabled teams ~~~~~~~~~~~~~ -+------------------------------------------------------------------------+-----------------------------------------------+ -| Enable Playbooks for all Mattermost teams, or for only selected teams. | - System Config path: **Plugins > Playbooks** | -| | - ``config.json`` setting: | -| | - Environment variable: | -+------------------------------------------------------------------------+-----------------------------------------------+ ++-----------------------------------------------------------------------------------+-----------------------------------------------+ +| Enable the Playbooks plugin for all Mattermost teams, or for only selected teams. | - System Config path: **Plugins > Playbooks** | +| | - ``config.json`` setting: | +| | - Environment variable: | ++-----------------------------------------------------------------------------------+-----------------------------------------------+ .. config:setting:: plugins-playbooksexperimentalfeatures :displayname: Enable experimental features (Plugins - Playbooks) @@ -1363,19 +1361,17 @@ Enabled teams :configjson: :environment: - - **true**: Enables experimental Playbooks features on your Mattermost workspace. - - **false**: Disables experimental Playbooks features on your Mattermost workspace. + - **true**: Enables experimental Playbooks plugin features on your Mattermost workspace. + - **false**: Disables experimental Playbooks plugin features on your Mattermost workspace. Enable experimental features ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+-------------------------------------------------------------------------------------+-----------------------------------------------+ -| - **true**: Enables experimental Playbooks features on your Mattermost workspace. | - System Config path: **Plugins > Playbooks** | -| - **false**: Disables experimental Playbooks features on your Mattermost workspace. | - ``config.json`` setting: | -| | - Environment variable: | -+-------------------------------------------------------------------------------------+-----------------------------------------------+ - ----- ++--------------------------------------------------------------------------------------------+-----------------------------------------------+ +| - **true**: Enables experimental Playbooks plugin features on your Mattermost workspace. | - System Config path: **Plugins > Playbooks** | +| - **false**: Disables experimental Playbooks plugin features on your Mattermost workspace. | - ``config.json`` setting: | +| | - Environment variable: | ++--------------------------------------------------------------------------------------------+-----------------------------------------------+ User satisfaction surveys ------------------------- @@ -1390,40 +1386,38 @@ Access the following configuration settings in the System Console by going to ** .. config:setting:: plugins-surveysenable :displayname: Enable plugin (Plugins - User Satisfaction Surveys) :systemconsole: Plugins > User Satisfaction Surveys - :configjson: - :environment: + :configjson: N/A + :environment: N/A - - **true**: Enables the Mattermost User Satisfaction Surveys plugin on your Mattermost workspace. + - **true**: (Default) Enables the Mattermost User Satisfaction Surveys plugin on your Mattermost workspace. - **false**: Disables the Mattermost User Satisfaction Surveys plugin on your Mattermost workspace. Enable plugin ~~~~~~~~~~~~~ -+-----------------------------------------------------------------------------------------------------+---------------------------------------------------------------+ -| - **true**: Enables the Mattermost User Satisfaction Surveys plugin on your Mattermost workspace. | - System Config path: **Plugins > User Satisfaction Surveys** | -| - **false**: Disables the Mattermost User Satisfaction Surveys plugin on your Mattermost workspace. | - ``config.json`` setting: | -| | - Environment variable: | -+-----------------------------------------------------------------------------------------------------+---------------------------------------------------------------+ ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------+ +| - **true**: (Default) Enables the Mattermost User Satisfaction Surveys plugin on your Mattermost workspace. | - System Config path: **Plugins > User Satisfaction Surveys** | +| - **false**: Disables the Mattermost User Satisfaction Surveys plugin on your Mattermost workspace. | | ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------+ .. config:setting:: plugins-surveysenablesend :displayname: Enable user satisfaction survey (Plugins - User Satisfaction Surveys) :systemconsole: Plugins > User Satisfaction Surveys - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: A user satisfaction survey is sent to all users every quarter. - - **false**: User satisfaction surveys are disabled. + - **false**: (Default) User satisfaction surveys are disabled. Enable user satisfaction survey ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------+ -| - **true**: A survey is sent to all users every quarter. Results are used by Mattermost, Inc. to improve the product. | - System Config path: **Plugins > User Satisfaction Surveys** | -| - **false**: User satisfaction surveys are disabled. | - ``config.json`` setting: | -| | - Environment variable: | -+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------+ -| **Note**: See the `Mattermost Privacy Policy `__ for more information on the collection and use of information by Mattermost. | -+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ++-----------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------+ +| - **true**: A survey is sent to all users every quarter. Results are used by Mattermost, Inc. to improve the product. | - System Config path: **Plugins > User Satisfaction Surveys** | +| - **false**: (Default) User satisfaction surveys are disabled. | | ++-----------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------+ +| **Note**: See the `Mattermost Privacy Policy `__ for more information on the collection and use of information by Mattermost. | ++-----------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------+ ---- @@ -1433,37 +1427,36 @@ Zoom .. include:: ../_static/badges/allplans-selfhosted.rst :start-after: :nosearch: -This plugin allows team members to initiate a Zoom meeting with a single click. All participants in a channel can easily join the Zoom meeting and the shared link is updated when the meeting is over. See the `Zoom Conferencing Plugin `__ product documentation for details. +This plugin allows team members to initiate a Zoom meeting with a single click. All participants in a channel can easily join the Zoom meeting and the shared link is updated when the meeting is over. See the `Zoom Plugin `__ documentation for details. .. note:: - To set up this plugin, you need to create a Zoom App using a Zoom Administrator account. See the `Zoom configuration `__ documentation for details. + To set up this plugin, you need to create a Zoom App using a Zoom Administrator account. See the `Zoom plugin `__ documentation for details. Access the following configuration settings in the System Console by going to **Plugins > Zoom**. .. config:setting:: plugins-zoomenable :displayname: Enable plugin (Plugins - Zoom) :systemconsole: Plugins > Zoom - :configjson: - :environment: + :configjson: N/A + :environment: N/A - - **true**: Enables the Zoom plugin on your Mattermost server. + - **true**: (Default) Enables the Zoom plugin on your Mattermost server. - **false**: Disables the Zoom plugin on your Mattermost server. Enable plugin ~~~~~~~~~~~~~ -+------------------------------------------------------------------+------------------------------------------+ -| - **true**: Enables the Zoom plugin on your Mattermost server. | - System Config path: **Plugins > Zoom** | -| - **false**: Disables the Zoom plugin on your Mattermost server. | - ``config.json`` setting: | -| | - Environment variable: | -+------------------------------------------------------------------+------------------------------------------+ ++----------------------------------------------------------------------------+------------------------------------------+ +| - **true**: (Default) Enables the Zoom plugin on your Mattermost server. | - System Config path: **Plugins > Zoom** | +| - **false**: Disables the Zoom plugin on your Mattermost server. | | ++----------------------------------------------------------------------------+------------------------------------------+ .. config:setting:: plugins-zoomurl :displayname: Zoom URL (Plugins - Zoom) :systemconsole: Plugins > Zoom - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify the URL for a self-hosted private cloud or on-premise Zoom server. Leave blank if you're using Zoom's vendor-hosted SaaS service. Zoom URL @@ -1471,15 +1464,15 @@ Zoom URL +----------------------------------------------------------------------------+------------------------------------------+ | Specify the URL for a self-hosted private cloud or on-premise Zoom server. | - System Config path: **Plugins > Zoom** | -| For example, **https://yourzoom.com**. | - ``config.json`` setting: | -| Leave blank if you're using Zoom's vendor-hosted SaaS service. | - Environment variable: | +| For example, **https://yourzoom.com**. | | +| Leave blank if you're using Zoom's vendor-hosted SaaS service. | | +----------------------------------------------------------------------------+------------------------------------------+ .. config:setting:: plugins-zoomapiurl :displayname: Zoom API URL (Plugins - Zoom) :systemconsole: Plugins > Zoom - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify the API URL for a self-hosted private cloud or on-premise Zoom server. Leave blank if you're using Zoom's vendor-hosted SaaS service. Zoom API URL @@ -1487,31 +1480,30 @@ Zoom API URL +---------------------------------------------------------------------------------+------------------------------------------+ | Specify the API URL for a self-hosted private cloud or on-premises Zoom server. | - System Config path: **Plugins > Zoom** | -| For example, **https://api.yourzoom.com/v2**. | - ``config.json`` setting: | -| Leave blank if you're using Zoom's vendor-hosted SaaS service. | - Environment variable: | +| For example, **https://api.yourzoom.com/v2**. | | +| Leave blank if you're using Zoom's vendor-hosted SaaS service. | | +---------------------------------------------------------------------------------+------------------------------------------+ .. config:setting:: plugins-zoomoauth :displayname: Enable OAuth (Plugins - Zoom) :systemconsole: Plugins > Zoom - :configjson: - :environment: + :configjson: N/A + :environment: N/A - **true**: OAuth will be used as the authentication means with Zoom. - - **false**: JWT will be used as the authentication means with Zoom. + - **false**: (Default) JWT will be used as the authentication means with Zoom. Enable OAuth ~~~~~~~~~~~~ -+-----------------------------------------------------------------------+------------------------------------------+ -| - **true**: OAuth will be used as the authentication means with Zoom. | - System Config path: **Plugins > Zoom** | -| - **false**: JWT will be used as the authentication means with Zoom. | - ``config.json`` setting: | -| | - Environment variable: | -+-----------------------------------------------------------------------+------------------------------------------+ ++---------------------------------------------------------------------------------+------------------------------------------+ +| - **true**: OAuth will be used as the authentication means with Zoom. | - System Config path: **Plugins > Zoom** | +| - **false**: (Default) JWT will be used as the authentication means with Zoom. | | ++---------------------------------------------------------------------------------+------------------------------------------+ .. note:: - If you are currently using a JWT Zoom application and switch to OAuth, all users will need to connect their Zoom account using OAuth the next time they try to start a meeting. See the `Zoom Configuration `__ documentation for details. + If you are currently using a JWT Zoom application and switch to OAuth, all users will need to connect their Zoom account using OAuth the next time they try to start a meeting. See the `Zoom plugin `__ documentation for details. .. config:setting:: plugins-zoomoauthbyaccountlevel :displayname: OAuth by account level app (Beta) (Plugins - Zoom) @@ -1520,22 +1512,21 @@ Enable OAuth :environment: - **true**: Only an account administrator must log in. The rest of the users will use their e-mail to log in. - - **false**: All users must use their e-mail to log in. + - **false**: (Default) All users must use their e-mail to log in. OAuth by account level app (Beta) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +---------------------------------------------------------------------------------------------------------------+------------------------------------------+ | - **true**: Only an account administrator must log in. The rest of the users will use their e-mail to log in. | - System Config path: **Plugins > Zoom** | -| - **false**: All users must use their e-mail to log in. | - ``config.json`` setting: | -| | - Environment variable: | +| - **false**: (Default) All users must use their e-mail to log in. | | +---------------------------------------------------------------------------------------------------------------+------------------------------------------+ .. config:setting:: plugins-zoomoauthclientid :displayname: Zoom OAuth client ID (Plugins - Zoom) :systemconsole: Plugins > Zoom - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify the Client ID for the OAuth app registered with Zoom. Leave blank if not using OAuth. Zoom OAuth client ID @@ -1543,15 +1534,15 @@ Zoom OAuth client ID +-----------------------------------------------------------------------------------------------+------------------------------------------+ | Specify the Client ID for the OAuth app registered with Zoom. Leave blank if not using OAuth. | - System Config path: **Plugins > Zoom** | -| | - ``config.json`` setting: | -| | - Environment variable: | +| | | +| | | +-----------------------------------------------------------------------------------------------+------------------------------------------+ .. config:setting:: plugins-zoomoauthclientsecret :displayname: Zoom OAuth client secret (Plugins - Zoom) :systemconsole: Plugins > Zoom - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify the Client Secret for the OAuth app registered with Zoom. Leave blank if not using OAuth. Zoom OAuth client secret @@ -1559,15 +1550,13 @@ Zoom OAuth client secret +---------------------------------------------------------------------------------------------------+------------------------------------------+ | Specify the Client Secret for the OAuth app registered with Zoom. Leave blank if not using OAuth. | - System Config path: **Plugins > Zoom** | -| | - ``config.json`` setting: | -| | - Environment variable: | +---------------------------------------------------------------------------------------------------+------------------------------------------+ .. config:setting:: plugins-zoomatresttokenencryptionkey :displayname: At rest token encryption key (Plugins - Zoom) :systemconsole: Plugins > Zoom - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Generate an AES encryption key for the Zoom OAuth Token used to encrypt stored access tokens by selecting **Regenerate**. At rest token encryption key @@ -1575,8 +1564,7 @@ At rest token encryption key +---------------------------------------------------------------------------------------------------------------------------+------------------------------------------+ | Generate an AES encryption key for the Zoom OAuth Token used to encrypt stored access tokens by selecting **Regenerate**. | - System Config path: **Plugins > Zoom** | -| Regenerating the key invalidates your existing Zoom OAuth. | - ``config.json`` setting: | -| | - Environment variable: | +| Regenerating the key invalidates your existing Zoom OAuth. | | +---------------------------------------------------------------------------------------------------------------------------+------------------------------------------+ .. config:setting:: plugins-zoomapikey @@ -1591,15 +1579,13 @@ API key +-----------------------------------------------------------------------------------+------------------------------------------+ | Specify the API Key generated by Zoom used to create meetings and pull user data. | - System Config path: **Plugins > Zoom** | -| | - ``config.json`` setting: | -| | - Environment variable: | +-----------------------------------------------------------------------------------+------------------------------------------+ .. config:setting:: plugins-zoomapisecret :displayname: API secret (Plugins - Zoom) :systemconsole: Plugins > Zoom - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Specify the API Secret generated by Zoom for your API key. API secret @@ -1607,15 +1593,13 @@ API secret +------------------------------------------------------------+------------------------------------------+ | Specify the API Secret generated by Zoom for your API key. | - System Config path: **Plugins > Zoom** | -| | - ``config.json`` setting: | -| | - Environment variable: | +------------------------------------------------------------+------------------------------------------+ .. config:setting:: plugins-zoomwebhooksecret :displayname: API secret (Plugins - Zoom) :systemconsole: Plugins > Zoom - :configjson: - :environment: + :configjson: N/A + :environment: N/A :description: Generate a secret for the webhook URL endpoint used to authenticate the webhook to Mattermost. Webhook secret @@ -1623,8 +1607,7 @@ Webhook secret +------------------------------------------------------------------------------------------------+------------------------------------------+ | Generate a secret for the webhook URL endpoint used to authenticate the webhook to Mattermost. | - System Config path: **Plugins > Zoom** | -| Regenerating the secret invalidates your existing Zoom plugin. | - ``config.json`` setting: | -| | - Environment variable: | +| Regenerating the secret invalidates your existing Zoom plugin. | | +------------------------------------------------------------------------------------------------+------------------------------------------+ .. config:setting:: plugins-zoomsigpublickeyfile diff --git a/source/configure/push-notification-server-configuration-settings.rst b/source/configure/push-notification-server-configuration-settings.rst index b4adc00716f..90230df2242 100644 --- a/source/configure/push-notification-server-configuration-settings.rst +++ b/source/configure/push-notification-server-configuration-settings.rst @@ -9,7 +9,7 @@ Configure Mattermost to enable push notifications to Mattermost clients by going :configjson: .EmailSettings.SendPushNotifications :environment: MM_EMAILSETTINGS_SENDPUSHNOTIFICATIONS - - **true**: **(Default)** Your Mattermost server sends mobile push notifications to the server specified. + - **true**: **(Default)** Your Mattermost server sends mobile push notifications. - **false**: Mobile push notifications are disabled. Enable push notifications @@ -20,9 +20,34 @@ Enable push notifications +-----------------------------------------------------------------+--------------------------------------------------------------------------------+ | Enable or disable Mattermost push notifications. | - System Config path: **Environment > Push Notification Server** | | | - ``config.json setting``: ``".EmailSettings.SendPushNotifications": true",`` | -| - **true**: **(Default)** Your Mattermost server sends mobile | - Environment variable: ``MM_EMAILSETTINGS_SENDPUSHNOTIFICATIONS`` | -| push notifications to the server specified. | | -| - **false**: Mobile push notifications are disabled. | | +| - **Do not send push notifications**: Mobile push notifications | - Environment variable: ``MM_EMAILSETTINGS_SENDPUSHNOTIFICATIONS`` | +| are disabled. | | +| - **Use HPNS connection with uptime SLA to send notifications | | +| to iOS and Android apps**: **(Default)** Use Mattermost's | | +| `hosted push notification service `__. | | +| - **Use TPNS connection to send notifications to iOS and | | +| Android apps**: Use Mattermost's `test push notification | | +| service `__. | | +| - **Manually enter Push Notification Service location**: | | +| When building your own custom mobile apps, you must `host | | +| your own mobile push proxy service `__, and specify that | | +| URL in the **Push Notification Server** field. | | ++-----------------------------------------------------------------+--------------------------------------------------------------------------------+ +| **Notes**: | +| | +| - Mattermost Enterprise, Professional, and Cloud customers can use Mattermost’s SLA-bound Hosted Push Notification Service (HPNS) in one of two | +| of two locations, including the United States and Germany. Mattermost Team Edition customers can use Mattermost's Test Push Notification | +| server (TPNS). | +| - The TPNS is provided for testing push notifications prior to compiling your own service, and isn't available for Mattermost Cloud deployments. | +| Ensure you’re familiar with its `limitations `__. | +| - Review the `mobile push notifications `__ and `mobile apps `__ documentation, | +| including guidance on compiling your own mobile apps and MPNS, before deploying to production. | +| - To confirm push notifications are working, connect to the `Mattermost iOS App `__ | +| available on the App Store, or the `Mattermost Android App `__ available on | +| Google Play. | +-----------------------------------------------------------------+--------------------------------------------------------------------------------+ .. config:setting:: push-serverlocation @@ -30,7 +55,7 @@ Enable push notifications :systemconsole: Environment > Push Notification Server :configjson: .EmailSettings.PushNotificationServer :environment: MM_EMAILSETTINGS_PUSHNOTIFICATIONSERVER - :description: The URL of the Mattermost Push Notification Service (MPNS), which re-sends push notifications from Mattermost to services like Apple Push Notification Service (APNS) and Google Cloud Messaging (GCM). + :description: The physical location of the Mattermost Hosted Notification Service (HPNS) server. Push notification server location ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -38,29 +63,12 @@ Push notification server location *Available in legacy Enterprise Edition E10/E20* +-----------------------------------------------------------------+--------------------------------------------------------------------------------+ -| The location of Mattermost Push Notification Service (MPNS), | - System Config path: **Environment > Push Notification Server** | -| which re-sends push notifications from Mattermost to services | - ``config.json setting``: ``".EmailSettings.PushNotificationServer",`` | -| like Apple Push Notification Service (APNS) and Google Cloud | - Environment variable: ``MM_EMAILSETTINGS_PUSHNOTIFICATIONSERVER`` | -| Messaging (GCM). | | -| | | -| - Customers running a Professional or Enterprise Edition | | -| workspace should enter ``https://push.mattermost.com`` for | | -| the push notification server hosted in the United States. | | -| - If you prefer to use a push notification server hosted in | | -| Germany, enter ``https://hpns-de.mattermost.com/``. | | -| - Team Edition customers should enter | | -| ``https://push-test.mattermost.com``. | | -+-----------------------------------------------------------------+--------------------------------------------------------------------------------+ -| **Notes**: | -| | -| - The TPNS is provided for testing push notifications prior to compiling your own service. Ensure you’re familiar with its `limitations | -| `__. Review the | -| `mobile push notifications `__ | -| and `mobile apps `__ documentation, including guidance on compiling your own | -| mobile apps and MPNS, before deploying to production. | -| - To confirm push notifications are working, connect to the `Mattermost iOS App `__ | -| available on the App Store, or the `Mattermost Android App `__ available on | -| Google Play. | +| The physical location of the Mattermost Hosted Push | - System Config path: **Environment > Push Notification Server** | +| Notification Service (HPNS) server. | - ``config.json setting``: ``".EmailSettings.PushNotificationServer",`` | +| | - Environment variable: ``MM_EMAILSETTINGS_PUSHNOTIFICATIONSERVER`` | +| Select from **US** **(Default)** or **Germany** to | | +| automatically populate the **Push Notification Server** | | +| field server URL. | | +-----------------------------------------------------------------+--------------------------------------------------------------------------------+ .. config:setting:: push-maxnotificationsperchannel diff --git a/source/configure/site-configuration-settings.rst b/source/configure/site-configuration-settings.rst index 1d300bff991..c16c930ccd7 100644 --- a/source/configure/site-configuration-settings.rst +++ b/source/configure/site-configuration-settings.rst @@ -1076,12 +1076,21 @@ Collapsed reply threads | - **Disabled**: Users cannot enable Collapsed Reply Threads. ``config.json`` setting: ``"disabled"`` | | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------+ +.. config:setting:: posts-messagepriority + :displayname: Message priority (Posts) + :systemconsole: Site Configuration > Posts + :configjson: .ServiceSettings.PostPriority + :environment: MM_SERVICESETTINGS_POSTPRIORITY + + - **true**: **(Default)** Enables message priority for all users. + - **false**: Disables the ability to set message priority and request acknowlegements. + Message priority ~~~~~~~~~~~~~~~~~ +-----------------------------------------------------------------------------+------------------------------------------------------------------------+ | - **true**: **(Default)** Enables message priority for all users which | - System Config path: **Site Configuration > Posts** | -| enables them to set a visual indiciator for important or urgent root | | - ``config.json`` setting: ``.ServiceSettings.PostPriority: true`` | +| enables them to set a visual indiciator for important or urgent root | - ``config.json`` setting: ``.ServiceSettings.PostPriority: true`` | | messages. | - Environment variable: ``MM_SERVICESETTINGS_POSTPRIORITY`` | | - **false**: Disables the ability to set message priority and request | | | acknowledgements. | | @@ -1091,6 +1100,75 @@ Message priority | `message priority `__ documentation to learn more. | +-----------------------------------------------------------------------------+------------------------------------------------------------------------+ +.. config:setting:: posts-persistentnotifications + :displayname: Persistent notifications (Posts) + :systemconsole: Site Configuration > Posts + :configjson: .ServiceSettings.AllowPersistentNotifications + :environment: MM_SERVICESETTINGS_ALLOWPERSISTENTNOTIFICATIONS + + - **true**: **(Default)** Users can trigger repeating notifications to mentioned recipients of urgent messages. + - **false**: Disables the ability to send repeating notifications. + +Persistent notifications +~~~~~~~~~~~~~~~~~~~~~~~~~ + ++--------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| - **true**: **(Default)** Users can trigger repeating notifications to | - System Config path: **Site Configuration > Posts** | +| mentioned recipients of urgent messages. | - ``config.json`` setting: ``.ServiceSettings.AllowPersistentNotifications: true`` | +| - **false**: Disables the ability to send repeating notifications. | - Environment variable: ``MM_SERVICESETTINGS_ALLOWPERSISTENTNOTIFICATIONS`` | ++--------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ + +.. config:setting:: posts-maxnumberofrecipientsforpersistentnotifications + :displayname: Maximum number of recipients for persistent notifications (Posts) + :systemconsole: Site Configuration > Posts + :configjson: .ServiceSettings.PersistentNotificationMaxRecipients + :environment: MM_SERVICESETTINGS_PERSISTENTNOTIFICATIONSMAXRECIPIENTS + :description: The maximum number of recipients users may send persistent notifications to. Default is **5**. + +Maximum number of recipients for persistent notifications +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++---------------------------------------------------------------+-----------------------------------------------------------------------------------------+ +| The maximum number of recipients users may send persistent | - System Config path: **Site Configuration > Posts** | +| notifications to. | - ``config.json`` setting: ``.ServiceSettings.PersistentNotificationMaxRecipients: 5`` | +| | - Environment variable: ``MM_SERVICESETTINGS_PERSISTENTNOTIFICATIONSMAXRECIPIENTS`` | +| Numerical input. Default is **5**. | | ++---------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + +.. config:setting:: posts-frequencyofpersistentnotifications + :displayname: Frequency of persistent notifications (Posts) + :systemconsole: Site Configuration > Posts + :configjson: .ServiceSettings.PersistentNotificationIntervalMinutes + :environment: MM_SERVICESETTINGS_PERSISTENTNOTIFICATIONINTERVALMINUTES + :description: The number of minutes between repeated notifications for urgent messages sent with persistent notifications. Default is **5**. + +Frequency of persistent notifications +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++---------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| The number of minutes between repeated notifications for | - System Config path: **Site Configuration > Posts** | +| urgent messages sent with persistent notifications. | - ``config.json`` setting: ``.ServiceSettings.PersistentNotificationIntervalMinutes: 5`` | +| | - Environment variable: ``MM_SERVICESETTINGS_PERSISTENTNOTIFICATIONINTERVALMINUTES`` | +| Numerical input. Default is **5**. Minimum is **2**. | | ++---------------------------------------------------------------+-------------------------------------------------------------------------------------------+ + +.. config:setting:: posts-totalnumberofpersistentnotificationsperpost + :displayname: Total number of persistent notifications per post (Posts) + :systemconsole: Site Configuration > Posts + :configjson: .ServiceSettings.PersistentNotificationMaxCount + :environment: MM_SERVICESETTINGS_PERSISTENTNOTIFICATIONMAXCOUNT + :description: The maximum number of times users may receive persistent notifications. Default is **6**. + +Total number of persistent notifications per post +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++-------------------------------------------------------------+------------------------------------------------------------------------------------+ +| The maximum number of times users may receive persistent | - System Config path: **Site Configuration > Posts** | +| notifications. | - ``config.json`` setting: ``.ServiceSettings.PersistentNotificationMaxCount: 6`` | +| | - Environment variable: ``MM_SERVICESETTINGS_PERSISTENTNOTIFICATIONMAXCOUNT`` | +| Numerical input. Default is **6**. | | ++-------------------------------------------------------------+------------------------------------------------------------------------------------+ + .. config:setting:: posts-enablelinkpreviews :displayname: Enable website link previews (Posts) :systemconsole: Site Configuration > Posts @@ -1245,6 +1323,29 @@ Google API key | - This key is used in client-side Javascript. | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +.. config:setting:: posts-AllowSyncedDrafts + :displayname: Enable server syncing of message drafts (Posts) + :systemconsole: Site Configuration > Posts + :configjson: .ServiceSettings.AllowSyncedDrafts + :environment: MM_SERVICESETTINGS_ALLOWSYNCEDDRAFTS + :description: Enable or disable the ability to synchronize draft messages across all supported Mattermost clients. + +Enable server syncing of message drafts +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++------------------------------------------------------+--------------------------------------------------------------------------------------+ +| Enable or disable the ability to synchronize draft | - System Config path: **Site Configuration > Posts** | +| messages across all supported Mattermost clients. | - ``config.json`` setting: ``".ServiceSettings.AllowSyncedDrafts: true,`` | +| | - Environment variable: ``MM_SERVICESETTINGS_ALLOWSYNCEDDRAFTS`` | +| - **true**: **(Default)** Message drafts are saved | | +| on the server and may be accessed from different | | +| clients. Users may still disable server | | +| synchronization of draft messages by going | | +| to **Settings > Advanced Settings**. | | +| - **false**: Draft messages are stored locally | | +| on each device. | | ++------------------------------------------------------+--------------------------------------------------------------------------------------+ + ---- File sharing and downloads diff --git a/source/configure/user-management-configuration-settings.rst b/source/configure/user-management-configuration-settings.rst index c931fd75069..76d2abf8f0b 100644 --- a/source/configure/user-management-configuration-settings.rst +++ b/source/configure/user-management-configuration-settings.rst @@ -26,6 +26,15 @@ Users | to other teams, and view the teams they are on and what | - Environment variable: N/A | | their role is on a team. | | +---------------------------------------------------------------+-------------------------------------------------------------+ +| **Note**: You can search for users by partial first name, last name, nickname, or username. | ++---------------------------------------------------------------+-------------------------------------------------------------+ + +Deactivate user accounts +~~~~~~~~~~~~~~~~~~~~~~~~ + +If you need to remove a user from your Mattermost deployment, you can deactivate the user account. Deactivated users have an inactive status, are logged out of Mattermost as soon as they are deactivated, and deactivated users can no longer log back in. While a user account is deactivated, you can manage the user's role, password, and email address. + +Deactivate a user account by selecting their role, then select **Deactivate**. You can re-activate that user account later by selecting **Activate**. ---- @@ -71,10 +80,11 @@ Channels | | - ``config.json setting``: N/A | | | - Environment variable: N/A | +-------------------------------------------------------------------------+-------------------------------------------------------------+ -| Channels can be deleted with all content, including posts in the database, using the `mmctl channel delete | -| `__ tool. | -+-------------------------------------------------------------------------+-------------------------------------------------------------+ -| **Note**: You can search for channels by channel name or by channel ID. | +| **Notes**: | +| | +| - Channels can be deleted with all content, including posts in the database, using the `mmctl channel delete `__ tool. | +| - You can search for channels by channel name or by channel ID. | +-------------------------------------------------------------------------+-------------------------------------------------------------+ ---- @@ -108,4 +118,4 @@ System roles | | - Environment variable: N/A | +----------------------------------------------------------------------+------------------------------------------------------------+ | See `additional system admin roles `__ documentation for details | -+----------------------------------------------------------------------+------------------------------------------------------------+ ++----------------------------------------------------------------------+------------------------------------------------------------+ \ No newline at end of file diff --git a/source/deploy/backup-disaster-recovery.rst b/source/deploy/backup-disaster-recovery.rst index 3084d7668e5..eac6a3571c4 100644 --- a/source/deploy/backup-disaster-recovery.rst +++ b/source/deploy/backup-disaster-recovery.rst @@ -13,11 +13,8 @@ The state of your Mattermost server is contained in multiple data stores that ne To back up your Mattermost server: -1. Back up your Mattermost database using standard MySQL or PostgreSQL procedures depending on your database version. +1. Back up your Mattermost database using standard procedures depending on your database version. `PostgreSQL SQL Dump backup documentation `__ is available online. Use the navigation at the top of the page to select your PostgreSQL version. - - `MySQL backup documentation `__ is available online. Use the selector on the page to choose your MySQL version. - - `PostgreSQL SQL Dump backup documentation `__ is available online. Use the navigation at the top of the page to select your PostgreSQL version. - 2. Back up your server settings stored in ``config/config.json``. - If you are using SAML configuration for Mattermost, your SAML certificate files will be saved in the ``config`` directory. Therefore, it is recommended to back up the entire directory. diff --git a/source/deploy/deployment-overview.rst b/source/deploy/deployment-overview.rst index 5b5678dc26d..0c9b0962339 100644 --- a/source/deploy/deployment-overview.rst +++ b/source/deploy/deployment-overview.rst @@ -173,7 +173,7 @@ Data stores Databases ^^^^^^^^^^ -Mattermost uses a MySQL or Postgres database to store and retrieve system data and to execute full text search. Solid State Drives (SSDs) can be used for faster read times to increase performance. +Mattermost uses a Postgres database to store and retrieve system data and to execute full text search. Solid State Drives (SSDs) can be used for faster read times to increase performance. See `Database requirements `__ for full details. diff --git a/source/deploy/encryption-options.rst b/source/deploy/encryption-options.rst index d51925401e8..c042c3bc115 100644 --- a/source/deploy/encryption-options.rst +++ b/source/deploy/encryption-options.rst @@ -32,7 +32,7 @@ Encryption-at-rest Database ~~~~~~~~ -Encryption-at-rest is available for messages via hardware and software disk encryption solutions applied to the Mattermost database, which resides on its own server within your infrastructure. Encryption options at the disk level are documented both for `MySQL `__ and `PostgreSQL `__. +Encryption-at-rest is available for messages via hardware and software disk encryption solutions applied to the Mattermost database, which resides on its own server within your infrastructure. See the `PostgreSQL `__ database documentation for details on encryption options at the disk level. File storage ~~~~~~~~~~~~~ diff --git a/source/deploy/mobile-hpns.rst b/source/deploy/mobile-hpns.rst index d9dd1cdb577..3b38002ec48 100644 --- a/source/deploy/mobile-hpns.rst +++ b/source/deploy/mobile-hpns.rst @@ -62,20 +62,16 @@ Configuring your existing Mattermost instance to use the Mattermost HPNS is a si 3. Set **Enable Push Notifications** to **Use HPNS connection with uptime SLA to send notifications to iOS and Android apps**. Note that this option is only available in Mattermost Enterprise Edition. -4. Specify the URL of the **Push Notification Server** based on your Mattermost edition. +4. Mattermost Enterprise and Professional customers: Specify the physical location of the **Push Notification Server**. -- Mattermost Team Edition: ``https://push-test.mattermost.com`` -- Mattermost Enterprise Edition: ``https://push.mattermost.com`` + - United States: ``https://push.mattermost.com`` + - Germany: ``https://hpns-de.mattermost.com`` .. image:: ../images/mobile_hpns.png :alt: Configure a licensed self-hosted Mattermost deployment to use the Mattermost Hosted Push Notification Server (HPNS) in the System Console by going to Environment > Push Notification Server. Select the HPNS option, then specify the server URL. 5. Review the Mattermost Terms of Service and the Mattermost Privacy Policy, then select the box "I understand and accept the Mattermost Hosted Push Notification Service Terms of Service and Privacy Policy" to acknowledge that you understand the terms of use. -.. note:: - - The default **Push Notification Server** address is ``https://push.mattermost.com``. The server is hosted inside the United States. Mattermost also offers a push notification server hosted in Germany. If you wish to use the server in Germany, update the **Push Notification Server** address to ``https://hpns-de.mattermost.com/``. - 6. Select **Save** After setup, test push notifications to confirm they are working. diff --git a/source/getting-started/architecture-overview.rst b/source/getting-started/architecture-overview.rst index b35f5d7ee8a..6c15edb0a42 100644 --- a/source/getting-started/architecture-overview.rst +++ b/source/getting-started/architecture-overview.rst @@ -21,7 +21,7 @@ It is configured using `config/config.json `__ and whether `Elasticsearch `__ is most appropriate for your deployment. + - A PostgreSQL database in stand-alone or high-availability configurations (master with read replicas). When choosing the database, consider the `inherent search limitations of the database type `__ and whether `Elasticsearch `__ is most appropriate for your deployment. - **Mattermost Push Notification Service** - Hosted or on-premise service that pushes notifications to Mattermost Android and Mattermost iOS mobile applications. - **Mattermost Client Applications** @@ -89,7 +89,7 @@ This section provides a bibliography of key project references and deliverables - Mattermost Software/Hardware Requirements: https://docs.mattermost.com/install/software-hardware-requirements.html - Mattermost Security Features: https://docs.mattermost.com/about/security.html - Mattermost Channels: https://docs.mattermost.com/guides/channels.html -- Mattermost Playbooks: https://docs.mattermost.com/guides/playbooks.html +- Mattermost Playbooks plugin: https://docs.mattermost.com/guides/playbooks.html - Mattermost Boards: https://docs.mattermost.com/guides/boards.html 2.4 Glossary @@ -155,7 +155,7 @@ Build out the required deployment environments (development, staging, production 3.3.4 Install software ^^^^^^^^^^^^^^^^^^^^^^ -Install and configure Mattermost and its component software (MySQL or PostgreSQL, Nginx or another proxy, etc.) +Install and configure Mattermost and its component software (PostgreSQL, Nginx or another proxy, etc.) **Reference**: https://docs.mattermost.com/guides/deployment.html#install-guides diff --git a/source/getting-started/light-install.rst b/source/getting-started/light-install.rst index 676760ad878..167010cec26 100644 --- a/source/getting-started/light-install.rst +++ b/source/getting-started/light-install.rst @@ -62,7 +62,7 @@ You can find and install integrations and plugins via **Product menu > Marketpla Get started with GitHub, Jira, and Jenkins: * Connect your GitHub organization to Mattermost using a slash command, to manage your reviews, pull requests, comments, and merges. GitHub is pre-packaged in Mattermost. Follow the `configuration steps `_, and then let your team know to run /github connect so they can receive notifications. -* Connect your Jira account to Mattermost and set up a channel for the bot to post issues so your team is always up to date. Visit the `configuration guide `_ to get started. Once configured, share the `end user documentation `_ with your team so they can start receiving notifications. +* Connect your Jira account to Mattermost and set up a channel for the bot to post issues so your team is always up to date. Visit the `configuration guide `_ to get started. Once configured, share the `end user documentation `_ with your team so they can start receiving notifications. * Connect your Jenkins server to Mattermost to centralize your workflows and manage builds. Visit the `installation guide `_ to get started. Share the `features list `_ with your team so they can ramp up quickly. **Next:** `Learn more about organizing conversations `_ and setting up `Mattermost on your mobile device `_. diff --git a/source/guides/deployment.rst b/source/guides/deployment.rst index 55539607c5b..59562beb526 100644 --- a/source/guides/deployment.rst +++ b/source/guides/deployment.rst @@ -58,7 +58,7 @@ These guides will help you prepare for your Mattermost deployment. * :doc:`Welcome email template ` - Use our sample email template when you’re ready to invite users to your server. Deployment guides ----------------- +------------------ These deployment guides are for administrators who are ready to integrate Mattermost with their organization’s IT infrastructure. diff --git a/source/guides/playbooks.rst b/source/guides/playbooks.rst index ee05847b1d9..e353b847390 100644 --- a/source/guides/playbooks.rst +++ b/source/guides/playbooks.rst @@ -1,15 +1,15 @@ -Mattermost Playbooks -==================== +Mattermost Playbooks plugin +=========================== .. include:: ../_static/badges/allplans-cloud-selfhosted.rst :start-after: :nosearch: -Mattermost Playbooks are pre-built, configurable checklists that define a repeatable process for teams to achieve specific and predictable outcomes. With Playbooks, development teams can orchestrate prescribed workflows and define, streamline, and document complex, recurring operations. Playbooks help you stay in command with integrated communication, collaboration, and status dashboards to manage your entire workflow lifecycle. +The Mattermost Playbooks plugin enables you to create and manage pre-built, configurable checklists that define a repeatable process for teams to achieve specific and predictable outcomes. With playbooks, development teams can orchestrate prescribed workflows and define, streamline, and document complex, recurring operations. Playbooks help you stay in command with integrated communication, collaboration, and status dashboards to manage your entire workflow lifecycle. .. image:: ../images/Playbooks_Hero.png - :alt: An example of the Mattermost Playbooks screen that includes active run details in the right-hand pane. + :alt: An example of the Mattermost Playbooks plugin screen that includes active run details in the right-hand pane. -This Mattermost Playbooks User Guide is for anyone who needs help using Mattermost workflow capabilities. +This Mattermost Playbooks plugin documentation is for anyone who needs help using Mattermost workflow capabilities. .. toctree:: :hidden: @@ -23,7 +23,7 @@ This Mattermost Playbooks User Guide is for anyone who needs help using Mattermo Share and collaborate Interact with playbooks -* :doc:`Overview ` - Learn about Mattermost Playbooks features. +* :doc:`Overview ` - Learn about Mattermost Playbooks plugin features. * :doc:`Work with playbooks ` - Customize a playbook for successful runs. * :doc:`Work with runs ` - Edit triggers and actions in an active run. * :doc:`Work with tasks ` - Work with tasks and the task inbox. diff --git a/source/guides/welcome-to-mattermost.rst b/source/guides/welcome-to-mattermost.rst index 8b0bd99a6c9..e30c25e13aa 100644 --- a/source/guides/welcome-to-mattermost.rst +++ b/source/guides/welcome-to-mattermost.rst @@ -29,7 +29,7 @@ Mattermost basics :hidden: Get started with Mattermost Channels - Get started with Mattermost Playbooks + Get started with the Mattermost Playbooks plugin Get started with Mattermost Boards Manage custom groups About teams @@ -37,10 +37,9 @@ Mattermost basics Team keyboard shortcuts About user roles Add people to your workspace - About insights * :doc:`Get started with Mattermost Channels ` - Learn how to communicate and collaborate with your team using Mattermost Channels. -* :doc:`Get started with Mattermost Playbooks ` - Learn how to create and refine repeatable, measurable workflows for a range of scenarios using Mattermost Playbooks. +* :doc:`Get started with the Mattermost Playbooks plugin ` - Learn how to create and refine repeatable, measurable workflows for a range of scenarios using the Mattermost Playbooks plugin. * :doc:`Get started with Mattermost Boards ` - Learn how to create and manage projects using customizable cards to increase your team's productivity using Mattermost Boards. * :doc:`Manage custom groups ` - Learn how to define custom groups of users, such as a team or department, you can @mention in Mattermost. * :doc:`About teams ` - Learn about the digital workspaces where you and your teammates collaborate together in Mattermost. @@ -48,7 +47,6 @@ Mattermost basics * :doc:`Team keyboard shortcuts ` Make more efficient use of your keyboard with keyboard shortcuts. * :doc:`About user roles ` - Learn more about the six types of user roles and their permissions in Mattermost. * :doc:`Add people to your workspace ` - Learn how to add new users to Mattermost and add users to existing teams and channels. -* :doc:`Insights ` - Get insights into the most important events happening on each team within your Mattermost workspace. Customize your Mattermost experience ------------------------------------ diff --git a/source/images/ESR_graphic.png b/source/images/ESR_graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..e3583a72c7bca58dbf1bb48c5ac45cc3e52d75a4 GIT binary patch literal 246579 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%0DHn6f|vMHtbYDazDcf^mX>>EE!AW*I-o}}j1 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 literal 0 HcmV?d00001 diff --git a/source/images/profile-log-out-mobile.png b/source/images/profile-log-out-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..76f0cda693dbd6df3cc1cffb3ba811d30b9e7635 GIT binary patch literal 207112 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 literal 0 HcmV?d00001 diff --git a/source/images/profile-log-out.png b/source/images/profile-log-out.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c152ae50d2f919f24ba8fe2fe28e21a67f5174 GIT binary patch literal 35678 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 literal 0 HcmV?d00001 diff --git a/source/index.rst b/source/index.rst index d4789efd4d4..e88b736e100 100644 --- a/source/index.rst +++ b/source/index.rst @@ -20,7 +20,7 @@ Mattermost product documentation Mattermost administration Welcome to Mattermost Mattermost Channels - Mattermost Playbooks + Mattermost Playbooks plugin Mattermost Boards Mattermost for developers Get help with Mattermost diff --git a/source/install/cloud-changelog.md b/source/install/cloud-changelog.md index b766f482c83..7f2649172c6 100644 --- a/source/install/cloud-changelog.md +++ b/source/install/cloud-changelog.md @@ -511,7 +511,7 @@ Latest Mattermost Cloud releases: - Fixed an issue where the metrics server restarted for every config change. - Prevented browsers and CDNs from caching remote entrypoint files. - Fixed a potential read-after-write issue when uploading data through the resumable uploads API. - - Fixed the position of the Boards icon in the app bar when Boards is running without a plugin. + - Fixed the position of the Boards icon in the Apps Bar when Boards is running without a plugin. - Fixed ability to create a board when Boards is running without a plugin. - Fixed Boards tour tips not appearing when Boards is running without a plugin. - Fixed the slash command description help text. diff --git a/source/install/common-prod-deploy-omnibus.rst b/source/install/common-prod-deploy-omnibus.rst index 65a1052cfd1..2ea094d8455 100644 --- a/source/install/common-prod-deploy-omnibus.rst +++ b/source/install/common-prod-deploy-omnibus.rst @@ -7,7 +7,7 @@ Mattermost bundles the components of a Mattermost deployment into a single insta **Minimum system requirements** - Hardware: 2 vCPUs/cores with 4GB RAM (support for 1,000-2,000 users) -- Database: MySQL v8+ or PostgreSQL v12+ +- Database: PostgreSQL v12+ or MySQL v8+ - Network ports required: - Application ports 80/443, TLS, TCP Inbound diff --git a/source/install/common-prod-deploy-tar.rst b/source/install/common-prod-deploy-tar.rst index 7dec133222a..bffa69cb3ce 100644 --- a/source/install/common-prod-deploy-tar.rst +++ b/source/install/common-prod-deploy-tar.rst @@ -10,7 +10,7 @@ These instructions outline how to install Mattermost Server on a 64-bit Linux ho **Minimum system requirements** - Hardware: 2 vCPUs/cores with 4GB RAM (support for 1,000-2,000 users) -- Database: MySQL v8+ or PostgreSQL v12+ +- Database: PostgreSQL v12+ or MySQL v8+ - Network ports required: - Application ports 80/443, TLS, TCP Inbound @@ -19,7 +19,7 @@ These instructions outline how to install Mattermost Server on a 64-bit Linux ho **Deploy Generic Linux** -1. Install and configure a MySQL or PostgreSQL database. Refer to one of the guides below to deploy the database based on your operating system: +1. Install and configure a PostgreSQL or MySQL database. Refer to one of the guides below to deploy the database based on your operating system: - `Ubuntu `__ - `Debian `__ @@ -141,7 +141,7 @@ These instructions outline how to install Mattermost Server on a 64-bit Linux ho .. note:: * If you're using MySQL, replace ``postgresql.service`` with ``mysql.service`` in two places in the ``[Unit]`` section. - * If you've installed MySQL or PostgreSQL on a dedicated server, you need to remove the ``After=mysql.service`` and ``BindsTo=mysql.service`` or the ``After=postgresql.service`` and ``BindsTo=postgresql.service`` lines in the ``[Unit]`` section or the Mattermost service won't start. + * If you've installed PostgreSQL or MySQL on a dedicated server, you need to remove the ``After=postgresql.service`` and ``BindsTo=postgresql.service`` or ``After=mysql.service`` and ``BindsTo=mysql.service`` lines in the ``[Unit]`` section or the Mattermost service won't start. c. Make systemd load the new unit. diff --git a/source/install/deploying-team-edition-on-bitnami.rst b/source/install/deploying-team-edition-on-bitnami.rst index 72646f9581a..18c8b4906c4 100644 --- a/source/install/deploying-team-edition-on-bitnami.rst +++ b/source/install/deploying-team-edition-on-bitnami.rst @@ -11,6 +11,4 @@ Deployment options include: - `Microsoft Azure `__ - `Google Cloud Platform `__ -Alternatively, you may also deploy to `Debian 9 VMware virtual machines `__. - -If you migrate from Bitnami to a self-hosted installation with MySQL database, read these notes in our migration guide: `Migrating from Bitnami `__. +Alternatively, you may also deploy to `Debian 9 VMware virtual machines `__. \ No newline at end of file diff --git a/source/install/deprecated-features.rst b/source/install/deprecated-features.rst index 68617cd910b..b2dab35ff8a 100644 --- a/source/install/deprecated-features.rst +++ b/source/install/deprecated-features.rst @@ -4,24 +4,25 @@ Removed and deprecated features for Mattermost This page describes features that are removed from support for Mattermost, or will be removed in a future update (deprecated), and provides early notice about future changes that might affect your use of Mattermost. This information is subject to change with future releases, and might not include each deprecated feature. Removed features in upcoming versions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Mattermost Server v8.0.0 -^^^^^^^^^^^^^^^^^^^^^^^^ - -- Removing ``ExperimentalSettings.PatchPluginsReactDOM``. If this setting was previously enabled, confirm that: - 1. All Mattermost-supported plugins are updated to the latest versions. - 2. Any other plugins have been updated to support React 17. See the `Important Upgrade Notes `__ for v7.7 for more information. -- Removing deprecated ``PermissionUseSlashCommands``. -- Removing deprecated ``model.CommandArgs.Session``. -- Removing support for PostgreSQL v10. The new minimum PostgreSQL version will be v11. -- Deprecating the ``AdvancedLoggingConfig`` fields, and replacing them with ``AdvancedLoggingJSON`` fields which accept inline JSON or a filename. +------------------------------------- Removed features by Mattermost version ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Mattermost Server v8.0.0 +~~~~~~~~~~~~~~~~~~~~~~~~ + +- Removed ``ExperimentalSettings.PatchPluginsReactDOM``. If this setting was previously enabled, confirm that: + - All Mattermost-supported plugins are updated to the latest versions. + - Any other plugins have been updated to support React 17. See the [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html) for v7.7 for more information. +- Deprecated Insights for all new instances and for existing servers that upgrade to Mattermost v8.0. +- Removed deprecated ``PermissionUseSlashCommands``. +- Removed deprecated ``model.CommandArgs.Session``. +- Removed support for PostgreSQL v10. The new minimum PostgreSQL version is now v11. +- Deprecated the ``AdvancedLoggingConfig`` fields, and replaced them with ``AdvancedLoggingJSON`` fields which accept inline JSON or a filename. + Mattermost Server v6.0.0 -^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~ - `Legacy Command Line Tools `__. Most commands have been replaced by `mmctl `_ and new commands have been added over the last few months, making this tool a full and robust replacement. - `Slack Import via the web app `_. The Slack import tool accessible via the Team Setting menu is being replaced by the mmetl tool that is much more comprehensive for the types of data it can assist in uploading. @@ -44,43 +45,43 @@ Mattermost Server v6.0.0 - Changes to mattermost-server/model for naming consistency. Mattermost Server v5.38.0 -^^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - In the v5.38 release (August 16, 2021), the “config watcher” (the mechanism that automatically reloads the “config.json“ file), has been removed in favor of the “mmctl config“ command that will need to be run to apply configuration changes after they are made. This change will improve configuration performance and robustness. Mattermost Server v5.37.0 -^^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - The “platform“ binary and “–platform” flag have been removed. If you are using the “–platform” flag or are using the “platform“ binary directly to run the Mattermost server application via a systemd file or custom script, you will be required to use only the “mattermost“ binary. Mattermost Server v5.32.0 -^^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - TLS versions 1.0 and 1.1 have been deprecated by browser vendors. Starting in Mattermost Server v5.32 (February 16), mmctl returns an error when connected to Mattermost servers deployed with these TLS versions and System Admins will need to explicitly add a flag in their commands to continue to use them. We recommend upgrading to TLS version 1.2 or higher. Mattermost Server v5.30.0 -^^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - PostgreSQL ended long-term support for `version 9.4 in February 2020 `_. From v5.26 Mattermost officially supports PostgreSQL version 10 as PostgreSQL 9.4 is no longer supported. New installs will require PostgreSQL 10+. Previous Mattermost versions, including our current ESR, will continue to be compatible with PostgreSQL 9.4. PostgreSQL 9.4 and all 9.x versions are now fully deprecated in our v5.30 release (December 16). Please follow the instructions under the Upgrading Section within `the PostgreSQL documentation `_. Mattermost Server v5.16.0 -^^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - Removed support for Internet Explorer (IE11) in Mattermost v5.16.0. Learn more in our `forum post `_. Mattermost Server v5.12.0 -^^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - ExperimentalEnablePostMetadata setting was removed. Post metadata, including post dimensions, is now stored in the database to correct scroll position and eliminate scroll jumps as content loads in a channel. Mattermost Server v5.6.0 -^^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - Removed support for WebRTC in beta, and replaced it with other video and audio calling solutions. Learn more in our `documentation `_. - Removed support for IE11 Mobile View due to low usage and instability in order to invest that effort in maintaining a high quality experience on other more used browsers. End users on IE11 will thus have an increased minimum screen size. Mobile View is still supported on Chrome, Firefox, Safari, Edge as well as the desktop apps. Mattermost Server v5.0.0 -^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - All API v3 endpoints removed. API v3 endpoints are no longer supported as of Mattermost v4.6 release on January 16th, 2018, and are replaced by API v4 endpoints which were released on July 16th, 2017. See `https://api.mattermost.com `_ to learn more. - Desktop Notification Duration in Account Settings removed due to inconsistencies on various browsers and operating systems. @@ -91,12 +92,12 @@ Mattermost Server v5.0.0 - A new ``config.json`` setting to disable the `permanent APIv4 delete team parameter `_ added. The setting is off by default for all new and existing installs, except those deployed on GitLab Omnibus. A System Admin can enable the API v4 endpoint from the ``config.json`` file. Mattermost Server v4.9.0 -^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - A number of permissions configuration settings will be migrated to roles in the database, and changing their config.json values will no longer take effect. These permissions can still be modified by their respective System Console settings. See `changelog `_ for more details. Mattermost Server v4.0.0 -^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - System Console settings in **Files > Images**, including: @@ -108,7 +109,7 @@ Mattermost Server v4.0.0 - Teammate Name Display setting moved to the System Console Mattermost Server v3.8.0 -^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - Old CLI tool (replaced by `an upgraded CLI tool `_) - APIv3 endpoints: @@ -119,6 +120,6 @@ Mattermost Server v3.8.0 - “POST at /users/status/set_active_channel” (replaced by “/channels/view”) Mattermost Server v3.7.0 -^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - “ServiceSettings: SegmentDeveloperKey” setting in ``config.json`` diff --git a/source/install/desktop-app-changelog.rst b/source/install/desktop-app-changelog.rst index 6963c244ef8..c87cf1fb10e 100644 --- a/source/install/desktop-app-changelog.rst +++ b/source/install/desktop-app-changelog.rst @@ -129,7 +129,7 @@ All Platforms - Fixed an issue with maximizing the main window when a monitor is removed. - Fixed an issue where special characters in the server name caused the top bar of the Desktop App to disappear. - Fixed an issue where OneLogin users wouldn't have their credentials remembered. -- Fixed an issue with plugin navigation displaying a white empty bar between the plugin UI and the Desktop app bar. +- Fixed an issue with plugin navigation displaying a white empty bar between the plugin UI and the Desktop Apps Bar. Known Issues ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/source/install/desktop-msi-installer-and-group-policy-install.rst b/source/install/desktop-msi-installer-and-group-policy-install.rst index 47104cce22b..bb139bf2c32 100644 --- a/source/install/desktop-msi-installer-and-group-policy-install.rst +++ b/source/install/desktop-msi-installer-and-group-policy-install.rst @@ -22,7 +22,7 @@ Download group policy and MSI installer files .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00001.png :alt: When downloading group policy and MIS installer files, ensure to use a Windows version that supports Edit group policy. -2. Navigate to the `Mattermost Desktop `__ repo on `Github.com `__. +2. Navigate to the `Mattermost Desktop `__ repository on `Github.com `__. .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00002.png :alt: Go to the mattermost/desktop repository on GitHub. @@ -34,8 +34,8 @@ Download group policy and MSI installer files .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00003.png :alt: In the mattermost/desktop repository on GitHub, go to the release page for the latest desktop release, then download the installer for your version of Windows. Download the source.zip file as well to extract group policy files. -Instal group policy files locally ---------------------------------- +Install group policy files locally +----------------------------------- 1. Browse to the folder the above files were downloaded to and unzip the ``desktop-5.4.0.zip`` file in place. @@ -70,17 +70,17 @@ Instal group policy files locally Configure Mattermost using group policy settings ------------------------------------------------- -1. Run the ``Edit group policy`` application by selecting ``Start``, typing ``gpedit`` into the search field, then selecting the resulting ``Edit group policy`` search option. +1. Run the ``Edit group policy`` application by selecting **Start**, typing ``gpedit`` into the search field, then selecting the resulting **Edit group policy** search option. .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00009.png :alt: When configuring Mattermost using group policy settings, run the Edit group policy application by going to Start, typing gpedit into the search field, then selecting the resulting Edit group policy search option. -2. In the ``Edit group policy`` window, navigate to ``Local Computer Policy\Computer Configuration\Administrative Templates\Mattermost``. In this example, double-click on ``DefaultServerList`` to set one or more default servers that will appear on app launch. +2. In the **Edit group policy** window, navigate to ``Local Computer Policy\Computer Configuration\Administrative Templates\Mattermost``. In this example, double-click on ``DefaultServerList`` to set one or more default servers that will appear on app launch. .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00010.png :alt: In the Edit group policy window, go to Local Computer Policy > Computer Configuration > Administrative Templates > Mattermost. To set one or more default servers to appear on app launch, for example, double-click on DefaultServerList to begin. -3. In the resulting window for ``DefaultServerList``, select **Enabled** to turn the feature on, then select the **Show…** button in the **Options:** section of the window to add default servers. +3. In the resulting window for **DefaultServerList**, select **Enabled** to turn the feature on, then select the **Show…** button in the **Options:** section of the window to add default servers. .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00011.png :alt: In the DefaultServerList window, enable the feature, then select Show..., located under Options, to add the default servers. @@ -95,7 +95,7 @@ Configure Mattermost using group policy settings Verify group policy settings have been applied ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -1. Open up the ``Registry Editor`` by selecting **Start**, typing ``Registry Editor`` in the search field, then selecting the **Registry Editor** option in the search results. +1. Open up the Registry Editor by selecting **Start**, typing ``Registry Editor`` in the search field, then selecting the **Registry Editor** option in the search results. .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00013.png :alt: When verifying group policy settings, open the Registery Editor by going to Start, typing Registry Editor into the search field, then selecting the resulting Registry Editor search option. @@ -120,7 +120,7 @@ Install the Mattermost Desktop App using the MSI installer .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00016.png :alt: You'll be prompted to allow the Mattermost Desktop App to make changes to your system. You must select Yes to continue with the installation process. -3. Select ``Finish`` when the installation is complete. +3. Select **Finish** when the installation is complete. .. image:: ../images/desktop/msi_gpo/msi_gpo_installation_test_00017.png :alt: When the installation is complete, select Finish. diff --git a/source/install/install-debian.rst b/source/install/install-debian.rst index ccaab37791e..8df64d38b2b 100644 --- a/source/install/install-debian.rst +++ b/source/install/install-debian.rst @@ -15,7 +15,6 @@ Install a production-ready Mattermost system on up to three machines. :depth: 2 .. include:: install-tar.rst - :start-after: :nosearch: Install a database ------------------ diff --git a/source/install/install-tar.rst b/source/install/install-tar.rst index 3ef6f6bbc06..34d578a8da4 100644 --- a/source/install/install-tar.rst +++ b/source/install/install-tar.rst @@ -63,7 +63,7 @@ Using ``wget``, download the Mattermost Server release you want to install.
- wget https://releases.mattermost.com/7.10.4/mattermost-7.10.4-linux-amd64.tar.gz + wget https://releases.mattermost.com/8.0.0/mattermost-8.0.0-linux-amd64.tar.gz Copied to clipboard
diff --git a/source/install/prepare-mattermost-database.rst b/source/install/prepare-mattermost-database.rst index 56aa3124479..b15a1368e8c 100644 --- a/source/install/prepare-mattermost-database.rst +++ b/source/install/prepare-mattermost-database.rst @@ -3,158 +3,143 @@ Prepare your Mattermost database .. include:: ../_static/badges/allplans-selfhosted.rst :start-after: :nosearch: - -.. note:: - You need one database: either PostgreSQL or MySQL, and PostgreSQL is our preferred database of choice. See the `database software `__ documentation for details on database version support. +You need a PostgreSQL database. See the `database software `__ documentation for details on database version support. -.. tabs:: +.. tip:: - .. tab:: Install PostgreSQL + Looking for information on working with a MySQL database? See the `prepare your Mattermost MySQL database `__ documentation for details. - Install and set up a PostgreSQL database for use by the Mattermost server. These instructions assume that the IP address of this server is ``10.10.10.1``. +To set up a PostgreSQL database for use by the Mattermost server: - 1. Log in to the server that will host the database, and install PostgreSQL. See the `PostgreSQL `__ documentation for details. When the installation is complete, the PostgreSQL server is running, and a Linux user account called *postgres* has been created. +1. Log in to the server that will host the database, and install PostgreSQL. See the `PostgreSQL `__ documentation for details. When the installation is complete, the PostgreSQL server is running, and a Linux user account called *postgres* has been created. - 2. Access PostgreSQL by running: +2. Access PostgreSQL by running: - .. code-block:: none - :class: mm-code-block + .. code-block:: none + :class: mm-code-block - sudo -u postgres psql + sudo -u postgres psql - 3. Create the Mattermost database by running: +3. Create the Mattermost database by running: - .. code-block:: none - :class: mm-code-block + .. code-block:: none + :class: mm-code-block - postgres=# CREATE DATABASE mattermost; + postgres=# CREATE DATABASE mattermost; - 4. Create the Mattermost user *mmuser* by running the following command. Ensure you use a password that's more secure than ``mmuser-password``. +4. Create the Mattermost user *mmuser* by running the following command. Ensure you use a password that's more secure than ``mmuser-password``. - .. code-block:: none - :class: mm-code-block + .. code-block:: none + :class: mm-code-block - postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser-password'; + postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser-password'; - 5. If you're configuring PostgreSQL v15.x or later: +5. If you're configuring PostgreSQL v15.x or later: - a. Grant the user access to the Mattermost database by running: + a. Grant the user access to the Mattermost database by running: - .. code-block:: none - :class: mm-code-block + .. code-block:: none + :class: mm-code-block - postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser; + postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser; - b. Grant access to objects contained in the specified schema by running: + b. Grant access to objects contained in the specified schema by running: - .. code-block:: none - :class: mm-code-block + .. code-block:: none + :class: mm-code-block - GRANT USAGE, CREATE ON SCHEMA PUBLIC TO mmuser; + GRANT USAGE, CREATE ON SCHEMA PUBLIC TO mmuser; - 6. Exit the PostgreSQL interactive terminal by running: +6. Exit the PostgreSQL interactive terminal by running: - .. code-block:: none - :class: mm-code-block + .. code-block:: none + :class: mm-code-block - postgres=# \q + postgres=# \q - 7. (Optional) If you use separate servers for your database and the Mattermost server, you may allow PostgreSQL to listen on all assigned IP addresses by opening ``/etc/postgresql/{version}/main/postgresql.conf`` as *root* in a text editor, and replacing ``{version}`` with the version of PostgreSQL that's currently running. +7. (Optional) If you use separate servers for your database and the Mattermost server, you may allow PostgreSQL to listen on all assigned IP addresses by opening ``/etc/postgresql/{version}/main/postgresql.conf`` as *root* in a text editor, and replacing ``{version}`` with the version of PostgreSQL that's currently running. - As a best practice, ensure that only the Mattermost server is able to connect to the PostgreSQL port using a firewall. + As a best practice, ensure that only the Mattermost server is able to connect to the PostgreSQL port using a firewall. - a. Find the following line: ``#listen_addresses = 'localhost'`` + a. Find the following line: ``#listen_addresses = 'localhost'`` - b. Uncomment the line and change ``localhost`` to ``*``: ``listen_addresses = '*'`` + b. Uncomment the line and change ``localhost`` to ``*``: ``listen_addresses = '*'`` - c. Restart PostgreSQL for the change to take effect by running: + c. Restart PostgreSQL for the change to take effect by running: - .. code-block:: none - :class: mm-code-block + .. code-block:: none + :class: mm-code-block - sudo systemctl restart postgresql + sudo systemctl restart postgresql - 8. Modify the file ``pg_hba.conf`` to allow the Mattermost server to communicate with the database by ensuring host connection types are set to ``trust``. +8. Modify the file ``pg_hba.conf`` to allow the Mattermost server to communicate with the database by ensuring host connection types are set to ``trust``. - **Note**: These host connections are specific to Ubuntu 20.04, and will differ depending on the operating system you're running. For example, in Ubuntu 22.04, the ``peer`` connection types are listed as ``sha-256`` instead. + **Note**: + + These host connections are specific to Ubuntu 20.04, and will differ depending on the operating system you're running. For example, in Ubuntu 22.04, the ``peer`` connection types are listed as ``sha-256`` instead. - **If the Mattermost server and the database are on the same machine:** +.. tabs:: - a. Open ``/etc/postgresql/{version}/main/pg_hba.conf`` as *root* in a text editor. + .. tab:: Single server deployment - b. Find the following lines: + If the Mattermost server and the database are on the same machine: - ``local all all peer`` - - ``host all all ::1/128 ident`` + a. Open ``/etc/postgresql/{version}/main/pg_hba.conf`` as *root* in a text editor. - c. Change ``peer`` and ``ident`` to ``trust``: + b. Find the following lines: - ``local all all trust`` + ``local all all peer`` - ``host all all ::1/128 trust`` - - **If the Mattermost server and the database are on different machines:** + ``host all all ::1/128 ident`` - a. Open ``/etc/postgresql/{version}/main/pg_hba.conf`` in a text editor as *root* user. + c. Change ``peer`` and ``ident`` to ``trust``: - b. Add the following line to the end of the file, where ``{mattermost-server-IP}`` is the IP address of the Mattermost server: ``host all all {mattermost-server-IP}/32 md5``. - - 9. Reload PostgreSQL by running . - - .. code-block:: none - :class: mm-code-block - - sudo systemctl reload postgresql + ``local all all trust`` + + ``host all all ::1/128 trust`` - 10. Verify that you can connect with the user *mmuser*. + .. tab:: Multi-server deployment + + If the Mattermost server and the database are on different machines: - If the Mattermost server and the database are on the same machine, use the following command: + a. Open ``/etc/postgresql/{version}/main/pg_hba.conf`` in a text editor as *root* user. - .. code-block:: none - :class: mm-code-block - - psql --dbname=mattermost --username=mmuser --password + b. Add the following line to the end of the file, where ``{mattermost-server-IP}`` is the IP address of the Mattermost server: ``host all all {mattermost-server-IP}/32 md5``. - If the Mattermost server is on a different machine, log into that machine and use the following command: +9. Reload PostgreSQL by running . - .. code-block:: none - :class: mm-code-block + .. code-block:: none + :class: mm-code-block - psql --host={postgres-server-IP} --dbname=mattermost --username=mmuser --password + sudo systemctl reload postgresql - .. note:: +10. Verify that you can connect with the user *mmuser*. - You might have to install the PostgreSQL client software to use the command. +.. tabs:: - The PostgreSQL interactive terminal starts. To exit the PostgreSQL interactive terminal, type ``\q`` and press :kbd:`Enter` on Windows or Linux, or :kbd:`↵` on Mac. + .. tab:: Single server deployment - When the PostgreSQL database is installed, and the initial setup complete, you can install the Mattermost server. + If the Mattermost server and the database are on the same machine, use the following command: - .. tab:: Install MySQL + .. code-block:: none + :class: mm-code-block - Install and set up a MySQL database for use by the Mattermost server. - - 1. Log into the server that will host the database, and open a terminal window. - - 2. Install MySQL. + psql --dbname=mattermost --username=mmuser --password - 3. Run ``sudo mysql_secure_installation`` and follow the instructions. - - 4. Log in to MySQL as *root* by running ``sudo mysql``. + .. tab:: Multi-server deployment + + If the Mattermost server is on a different machine, log into that machine and use the following command: - 5. Create the Mattermost user *mmuser* by running ``mysql> create user 'mmuser'@'%' identified by 'mmuser-password';``. + .. code-block:: none + :class: mm-code-block - - Use a password that is more secure than ``mmuser-password``. - - The ``%`` means that mmuser can connect from any machine on the network. However, it's more secure to use the IP address of the machine that hosts Mattermost. For example, if you install Mattermost on the machine with IP address 10.10.10.2, then use the following command: ``mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';`` + psql --host={postgres-server-IP} --dbname=mattermost --username=mmuser --password - 6. Create the Mattermost database by running ``mysql> create database mattermost;``. + .. note:: - 7. Grant access privileges to the user *mmuser* by running ``mysql> grant all privileges on mattermost.* to 'mmuser'@'%';``. + You might have to install the PostgreSQL client software to use the command. - .. note:: - - This query grants the MySQL user we just created all privileges on the database for convenience. If you need more security, use the following query to grant the user only the privileges necessary to run Mattermost: ``mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, REFERENCES ON mattermost.* TO 'mmuser'@'%';`` +The PostgreSQL interactive terminal starts. To exit the PostgreSQL interactive terminal, type ``\q`` and press :kbd:`Enter` on Windows or Linux, or :kbd:`↵` on Mac. - 8. Log out of MySQL by running ``mysql> exit``. Once the database is installed and the initial setup is complete, you can install the Mattermost server. \ No newline at end of file +When the PostgreSQL database is installed, and the initial setup complete, you can install the Mattermost server. \ No newline at end of file diff --git a/source/install/prepare-mattermost-mysql-database.rst b/source/install/prepare-mattermost-mysql-database.rst new file mode 100644 index 00000000000..dbf3118a58f --- /dev/null +++ b/source/install/prepare-mattermost-mysql-database.rst @@ -0,0 +1,294 @@ +Prepare your Mattermost MySQL database +====================================== + +.. include:: ../_static/badges/allplans-selfhosted.rst + :start-after: :nosearch: + +.. contents:: On this page: + :backlinks: top + :local: + :depth: 1 + +.. important:: + + PostgreSQL is our preferred database of choice. See the `database software `__ documentation for details on database version support. + +Set up the Mattermost MySQL database +------------------------------------ + +To set up a MySQL database for use by the Mattermost server: + +1. Log into the server that will host the database, ands install MySQL. + +2. Log in to MySQL as *root* by running ``sudo mysql``. + +3. Create the Mattermost user *mmuser* by running ``mysql> create user 'mmuser'@'%' identified by 'mmuser-password';``. + + - Use a password that is more secure than ``mmuser-password``. + - The ``%`` means that ``mmuser`` can connect from any machine on the network. However, it's more secure to use the IP address of the machine that hosts Mattermost. For example, if you install Mattermost on the machine with IP address ``10.10.10.2``, then use the following command: ``mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';`` + +4. Create the Mattermost database by running ``mysql> create database mattermost;``. + +5. Grant access privileges to the user ``mmuser`` by running ``mysql> grant all privileges on mattermost.* to 'mmuser'@'%';``. + + .. note:: + + This query grants the MySQL user we just created all privileges on the database for convenience. If you need more security, use the following query to grant the user only the privileges necessary to run Mattermost: ``mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, REFERENCES ON mattermost.* TO 'mmuser'@'%';`` + +6. Log out of MySQL by running ``mysql> exit``. Once the database is installed and the initial setup is complete, you can install the Mattermost server.\ + +.. note:: + + If you have installed MySQL on its own server, edit the ``/etc/mysql/mysql.conf.d/mysqld.cnf`` file and comment out the ``bind-address = 127.0.0.1`` using the ``#`` symbol, then restart your database server. + +Back up the database +-------------------- + +Back up your Mattermost database using standard procedures depending on your database version. `MySQL backup documentation `__ is available online. Use the selector on the page to choose your MySQL version. + +Upgrade Mattermost +------------------- + +.. tabs:: + + .. tab:: Upgrade to v7.1 + + Mattermost v7.1 introduces schema changes in the form of a new column and its index. Our test results for the schema changes include: 12M Posts, 2.5M Reactions - ~1min 34s (instance: PC with 8 cores, 16GB RAM). + + You can run the following SQL queries before the upgrade that obtains a lock on ``Reactions`` table. + + ``ALTER TABLE Reactions ADD COLUMN ChannelId varchar(26) NOT NULL DEFAULT "";`` + + ``UPDATE Reactions SET ChannelId = COALESCE((select ChannelId from Posts where Posts.Id = Reactions.PostId), '') WHERE ChannelId="";`` + + ``CREATE INDEX idx_reactions_channel_id ON Reactions(ChannelId) LOCK=NONE;`` + + Users' reactions posted during this time won't be reflected in the database until the migrations are complete. This is fully backwards-compatible. + + If your connection collation and table collations are different, this can result in the error `Illegal mix of collations`. To resolve this error, set the same collation for both the connection and the table. There are different collations at different levels - connection, database, table, column, and database administrators may choose to set different collation levels for different objects. + + .. tab:: Upgrade to v7.0 + + Self-hosted Mattermost customers using MySQL databases may notice the migration to release v7.0 taking longer than usual when there are a large number of rows in the ``FileInfo`` table. See the `important upgrade notes `__ documentation for details. + + .. tab:: Upgrade to v6.7 + + Mattermost v6.7 introduces schema changes in the form of a new index. The following notes our test results for the schema changes: + + - 7M Posts - ~17s (instance: db.r5.xlarge) + - 9M Posts - 2min 12s (instance: db.r5.large) + + If you want a zero downtime upgrade, you can apply this index prior to doing the upgrade: + + ``CREATE INDEX idx_posts_create_at_id on Posts(CreateAt, Id) LOCK=NONE;`` + + This is fully backwards-compatible and will not acquire any table lock or affect any existing operations on the table. + + .. tab:: v6.0 database schema migrations + + The release of v6.0 introduces database schema changes and longer migration times should be expected, especially on MySQL installations. + + Mattermost v6.0 introduces several database schema changes to improve both database and application performance. The upgrade will run significant database schema changes that can cause an extended startup time depending on the dataset size. We've conducted extensive tests on supported MySQL database drivers, using realistic datasets of more than 10 million posts and more than 72 million posts. + + A migration to v6.0 of 10+ million posts will take approximately 1 hour and 22 minutes to complete for a MySQL database. See the `Mattermost v6.0 DB schema migrations analysis `__ documentation for test specifications, data sizes, and test results. + + A large migration from v5.39 to v6.0 of 72+ million posts will take approximately 3 hours and 40 minutes to complete for a MySQL database. See the `Migration results analysis `__ documentation for test specifications, data sizes, and test results. + + The following queries, executed during the migration process on an environment with 10+ million posts, will have a significant impact on database CPU usage and write operation restrictions for the duration of the query: + + ``ALTER TABLE Posts MODIFY Props JSON;`` (~26 minutes) + + ``ALTER TABLE Posts DROP COLUMN ParentId;`` (~26 minutes) + + ``ALTER TABLE Posts MODIFY COLUMN FileIds text;`` (~26 minutes) + + For a complete breakdown of MySQL queries, as well as their impact and duration, see the `Mattermost v6.0 DB schema migrations analysis `__ documentation. + + **MySQL Mitigation Strategies** + + Run combined queries prior to the upgrade. The previous queries can be combined when run prior to the upgrade as follows: + + ``ALTER TABLE Posts MODIFY COLUMN FileIds text, MODIFY COLUMN Props JSON;`` + + This limits the time taken to that of a single query of that type. + + **Online migration**: An online migration that avoids locking can be attempted on MySQL installations, especially for particularly heavy queries or very big datasets (tens of millions of posts or more). This can be done through an external tool like `pt-online-schema-change `__. However, the online migration process can cause a significant spike in CPU usage on the database instance it runs. + + See the `Mattermost v6.0 DB schema migrations analysis `__ documentation for a sample execution and additional caveats. + +High availabiilty configuration setting recommendations +-------------------------------------------------------- + +For MySQL, we recommend the following configuration options for high performance: + +- ``innodb_buffer_pool_size``: Set to ~70% of your total RAM. +- ``innodb_log_file_size``: Set to 256 MB. Increasing this helps in write intensive operations. Recovery times will be longer. +- ``innodb_flush_log_at_trx_commit``: 2. This can potentially cause up to one second of loss of transaction data. +- ``max_heap_table_size``: 64 MB. +- ``tmp_table_size``: 64 MB. + +Encryption-at-rest +------------------ + +Encryption-at-rest is available for messages via hardware and software disk encryption solutions applied to the Mattermost database, which resides on its own server within your infrastructure. See the `MySQL `__ database documentation for details on encryption options at the disk level. + +Use sockets for the database +---------------------------- + +.. code-block:: bash + + $ mysql -u root -p + CREATE DATABASE mattermostdb; + CREATE USER mmuser IDENTIFIED BY 'mmuser_password'; + GRANT ALL ON mattermostdb.* TO mmuser; + +Mattermost is configured in ``/etc/webapps/mattermost/config.json``, and strings need to be quoted. + +- set ``DriverName`` to ``mysql``. +- set ``DataSource`` to ``mmuser:mmuser_password@unix(/run/mysqld/mysqld.sock)/mattermostdb?charset=utf8mb4,utf8``. + +Mattermost configuration in the database +---------------------------------------- + +You can use the database as the single source of truth for the active configuration of your Mattermost installation. This changes the Mattermost binary from reading the default ``config.json`` file to reading the configuration settings stored within a configuration table in the database. + +.. code-block:: text + + mysql://mmuser:really_secure_password@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s + +Create an environment file +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. note:: + + If you're running Mattermost in a High Availability cluster, this step must be done on all servers in the cluster. + +Create the file ``/opt/mattermost/config/mattermost.environment`` to set the ``MM_CONFIG`` environment variable to the database connection string. For example: + +.. code-block:: text + + MM_CONFIG='mysql://mmuser:mostest@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s' + +.. note:: + + Be sure to escape any single quotes in the database connection string by placing a ``\`` in front of them like this ``\'``. For example: ``MM_CONFIG='mysql://mmuser:it\'s-a-password!@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s'`` + +.. code-block:: text + + MM_CONFIG='mysql://mmuser:it\'s-a-password!@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s' + +Finally, run this command to verify the permissions on your Mattermost directory: + +.. code-block:: bash + + sudo chown -R mattermost:mattermost /opt/mattermost + +Modify the Mattermost ``systemd`` file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +First, find the ``mattermost.service`` file using: + +.. code-block:: bash + + sudo systemctl status mattermost.service + +The second line of output will have the location of the running ``mattermost.service``. + +.. code-block:: text + + Loaded: loaded (/lib/systemd/system/mattermost.service; enabled; vendor preset: enabled) + +Edit this file as *root* to add the below text just above the line that begins with ``ExecStart``\ : + +.. code-block:: text + + EnvironmentFile=/opt/mattermost/config/mattermost.environment + +Here's a complete ``mattermost.service`` file with the ``EnvironmentFile`` line added: + +.. code-block:: text + + [Unit] + Description=Mattermost + After=network.target + After=mysql.service + Requires=mysql.service + + [Service] + Type=notify + EnvironmentFile=/opt/mattermost/config/mattermost.environment + ExecStart=/opt/mattermost/bin/mattermost + TimeoutStartSec=3600 + KillMode=mixed + Restart=always + RestartSec=10 + WorkingDirectory=/opt/mattermost + User=mattermost + Group=mattermost + LimitNOFILE=49152 + + [Install] + WantedBy=mysql.service + +Technical notes about searching +------------------------------- + +By default, Mattermost uses full text search support included in MySQL. Select the **product menu** |product-list| then select **About Mattermost** to see which database you’re using. + +- Stop words are filtered out of search results. See `MySQL `__ database documentation for a full list of applicable stop words. +- Hashtags or recent mentions of usernames containing a dot don't return results. +- Avoid using underline ``_`` symbol to `perform a wildcard search <#wildcards>`__. Use the asterisk ``*`` symbol instead. +- Stop words that are excluded from search in MySQL include: ``"a", "about", "an", "are", "as", "at", "be", "by", "com", "de", "en", "for", "from", "how", "i", "in", "is", "it", "la", "of", "on", "or", "that", "the", "this", "to", "was", "what", "when", "where", "who", "will", "with", "und", "the", "www"``. + +Perform searches in Chinese, Korean, and Japanese +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The best experience for searching in Chinese, Korean, and Japanese is to use MySQL 5.7.6 or later with special configuration. See the `Chinese, Japanese and Korean Search documentation `__ for details. + +You can perform searches without this configuration by adding wildcards ``*`` to the end of search terms. + +Migrate from Bitnami to a self-hosted Mattermost deployment +------------------------------------------------------------ + +If you're planning a migration from Bitnami to a self-hosted Mattermost installation with a MySQL database, read these notes in our migration guide: `Migrating from Bitnami `__. + + + +Downgrade Mattermost v6.0 to v5.38 +----------------------------------- + +.. code-block:: sh + + INSERT INTO Systems (Name,Value) VALUES ('Version','5.38.0') ON DUPLICATE KEY UPDATE Value = '5.38.0'; + + CREATE INDEX idx_status_status ON Status (Status); + DROP INDEX idx_status_status_dndendtime ON Status; + CREATE INDEX idx_channelmembers_user_id ON ChannelMembers (UserId); + DROP INDEX idx_channelmembers_channel_id_scheme_guest_user_id ON ChannelMembers; + DROP INDEX idx_channelmembers_user_id_channel_id_last_viewed_at ON ChannelMembers; + CREATE INDEX idx_threads_channel_id ON Threads (ChannelId); + DROP INDEX idx_threads_channel_id_last_reply_at ON Threads; + CREATE INDEX idx_channels_team_id ON Channels (TeamId); + DROP INDEX idx_channels_team_id_type ON Channels; + DROP INDEX idx_channels_team_id_display_name ON Channels; + CREATE INDEX idx_posts_root_id ON Posts (RootId); + DROP INDEX idx_posts_root_id_delete_at ON Posts; + + ALTER TABLE CommandWebhooks ADD COLUMN ParentId varchar(26); + UPDATE CommandWebhooks SET ParentId = ''; + ALTER TABLE Posts ADD COLUMN ParentId varchar(26); + UPDATE Posts SET ParentId = ''; + + ALTER TABLE Users MODIFY Timezone text; + ALTER TABLE Users MODIFY NotifyProps text; + ALTER TABLE Users MODIFY Props text; + ALTER TABLE Threads MODIFY Participants longtext; + ALTER TABLE Sessions MODIFY Props text; + ALTER TABLE Posts MODIFY Props text; + ALTER TABLE Jobs MODIFY Data text; + ALTER TABLE LinkMetadata MODIFY Data text; + ALTER TABLE ChannelMembers MODIFY NotifyProps text; + +.. note:: + + The inverse of `the final v6.0 upgrade query `__ is intentionally omitted from these downgrade queries because its result is backwards compatible, and running the query would unnecessarily delay the downgrade process. diff --git a/source/install/self-managed-changelog.md b/source/install/self-managed-changelog.md index d5cb1399cad..e110a486e1b 100644 --- a/source/install/self-managed-changelog.md +++ b/source/install/self-managed-changelog.md @@ -6,14 +6,208 @@ See the [changelog in progress](https://bit.ly/2nK3cVf) for the upcoming release Latest Mattermost Releases: +- [Release v8.0 - Major Release](#release-v8-0-major-release) - [Release v7.11 - Feature Release](#release-v7-11-feature-release) - [Release v7.10 - Feature Release](#release-v7-10-feature-release) - [Release v7.9 - Feature Release](#release-v7-9-feature-release) - [Release v7.8 - Extended Support Release](#release-v7-8-extended-support-release) +## Release v8.0 - [Major Release](https://docs.mattermost.com/upgrade/release-definitions.html#major-release) + +**Release Day: July 14, 2023** + +### Important Upgrade Notes + + - Insights has been deprecated for all new instances and for existing servers that upgrade to v8.0. See more details in [this forum post](https://forum.mattermost.com/t/proposal-to-revise-our-insights-feature-due-to-known-performance-issues/16212) on why Insights has been deprecated. + - The Focalboard plugin is now disabled by default for all new instances and can be enabled in the **System Console > Plugin settings**. + - The Channel Export and Apps plugins are now disabled by default. + - Apps Bar is now enabled by default for on-prem servers. ``ExperimentalSettings.EnableAppBar`` was also renamed to ``ExperimentalSettings.DisableAppBar``. See more details at: + - https://docs.mattermost.com/configure/experimental-configuration-settings.html#disable-app-bar + - https://forum.mattermost.com/t/channel-header-plugin-changes/13551 + - Introduced the [public](https://github.com/mattermost/mattermost/tree/master/server/public) submodule, housing the familiar `model` and `plugin` packages, but now discretely versioned from the server. It is no longer necessary to `go get` a particular commit hash, as Go programs and plugins can now opt-in to importing `github.com/mattermost/mattermost-server/server/public` and managing versions idiomatically. While this submodule has not yet shipped a v1 and will introduce breaking changes before stabilizing the API, it remains both forwards and backwards compatible with the Mattermost server itself. + - In the main `server package`, the Go module path has changed from ``github.com/mattermost/mattermost-server/server/v8`` to ``github.com/mattermost/mattermost/server/v8``. But with the introduction of the `public` submodule, it should no longer be necessary for third-party code to import this `server` package. + - As part of the `public` submodule above, a ``context.Context`` is now passed to ``model.Client4`` methods. + - Removed support for PostgreSQL v10. The new minimum PostgreSQL version is now v11. + - The Mattermost public API for Go is now available as a distinctly versioned package. Instead of pinning a particular commit hash, use idiomatic Go to add this package as a dependency: go get ``github.com/mattermost/mattermost-server/server/public``. This relocated Go API maintains backwards compatibility with Mattermost v7. Furthermore, the existing Go API previously at github.com/mattermost/mattermost-server/v6/model remains forward compatible with Mattermost v8, but may not contain newer features. Plugins do not need to be recompiled, but developers may opt in to using the new package to simplify their build process. The new public package is shipping alongside Mattermost v8 as version 0.5.0 to allow for some additional code refactoring before releasing as v1 later this year. + - Three configuration fields have been added, ``LogSettings.AdvancedLoggingJSON``, ``ExperimentalAuditSettings.AdvancedLoggingJSON``, and ``NotificationLogSettings.AdvancedLoggingJSON`` which support multi-line JSON, escaped JSON as a string, or a filename that points to a file containing JSON. The ``AdvancedLoggingConfig`` fields have been deprecated. + - The Go MySQL driver has changed the ``maxAllowedPacket`` size from 4MiB to 64MiB. This is to make it consistent with the change in the server side default value from MySQL 5.7 to MySQL 8.0. If your ``max_allowed_packet`` setting is not 64MiB, then please update the MySQL config DSN with an additional param of ``maxAllowedPacket`` to match with the server side value. Alternatively, a value of 0 can be set to to automatically fetch the server side value, on every new connection, which has a performance overhead. + - Removed ``ExperimentalSettings.PatchPluginsReactDOM``. If this setting was previously enabled, confirm that: + + 1. All Mattermost-supported plugins are updated to the latest versions. + 2. Any other plugins have been updated to support React 17. See the [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html) for v7.7 for more information. + + - Removed deprecated ``PermissionUseSlashCommands``. + - Removed deprecated ``model.CommandArgs.Session``. + - Pass a ``context.Context`` to Client4 methods. + - For servers wanting to allow websockets to connect from other origins, please set the ``ServiceSettings.AllowCorsFrom`` [configuration setting](https://docs.mattermost.com/configure/integrations-configuration-settings.html#enable-cross-origin-requests-from). + - In v8.0, the following repositories are merged into one: ``mattermost-server``, ``mattermost-webapp`` and ``mmctl``. Developers should read the updated [Developer Guide](https://developers.mattermost.com/contribute/developer-setup/) for details. + - Fixed an issue caused by a migration in the previous release. Query takes around 11ms on a PostgreSQL 14 DB t3.medium RDS instance. Locks on the preferences table will only be acquired if there are rows to delete, but the time taken is negligible. + - Fixed an issue where a user would still see threads in the threads view of channels they have left. Migration execution time in PostgreSQL: Execution time: 58.11 sec, DELETE 2766690. Migration execution time in MySQL: Query OK, 2766769 rows affected (4 min 47.57 sec). + - The file info stats query is now optimized by denormalizing the ``channelID`` column into the table itself. This will speed up the query to get the file count for a channel when selecting the right-hand pane. Migration times: + + - On a PostgreSQL 12.14 DB with 1731 rows in FileInfo and 11M posts, it took around 0.27s + - On a MySQL 8.0.31 DB with 1405 rows in FileInfo and 11M posts, it took around 0.3s + +**IMPORTANT:** If you upgrade from a release earlier than v7.10, please read the other [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html). + +### Highlights + +#### Private cloud LLMs, Azure AI, and OpenAI integrations + - Mattermost provides an OpenOps framework to integrate with private cloud LLMs, Azure AI, and OpenAI models to embed generative AI assistance in collaborative workflows and automation. [Learn more about OpenOps here](https://github.com/mattermost/openops). + +#### Mattermost for Microsoft Teams + - We’re extending our integration with the Microsoft 365 platform with a new embedded experience directly inside Microsoft Teams, as well as our updated MS Teams Connector. + +#### Mattermost for Atlassian Suite + - Uplevel your workflows within Mattermost using your Atlassian toolset. [Learn more about Mattermost for Atlassian Suite here](https://mattermost.com/atlassian/). + +#### Performance and efficiency with PostgreSQL + - To simplify management and scalability challenges, Mattermost 8.0 recommends deploying PostgreSQL over MySQL. + +#### New End User Training + - We’re introducing [10 new training modules](https://academy.mattermost.com/p/mattermost-end-user-onboarding) dedicated to educating users on the key components of the Mattermost platform and an additional [10 new use case modules](https://academy.mattermost.com/courses/category/use-case-training) tackling technical scenarios within DevOps, Security Ops, and Incident Management. + +### Improvements + +#### User Interface (UI) + - Persistent notifications allow users to notify recipients repeatedly until action is taken on an urgent message. Check out [our documentation](https://docs.mattermost.com/channels/message-priority.html#send-persistent-notifications) for more details. + - The apps bar is now enabled by default for on-prem servers. ``ExperimentalSettings.EnableAppBar`` was also renamed to ``ExperimentalSettings.DisableAppBar``. See more details at: + - https://docs.mattermost.com/configure/experimental-configuration-settings.html#disable-app-bar + - https://forum.mattermost.com/t/channel-header-plugin-changes/13551 + - Added a **Mattermost Marketplace** option to the bottom of the apps bar. The option is visible when the Marketplace is enabled, and the user has ``SYSCONSOLE_WRITE_PLUGINS`` permissions. + - Calls v0.17.0 introduces a new ringing feature (Beta): Calls in Direct and Group Message channels will ring and pop up a visual notification for the incoming call. Check out the Calls v0.17.0 release notes and [Calls documentation](https://docs.mattermost.com/channels/make-calls.html) for more details. + - Added an **Add channels** button to the bottom of the left-hand sidebar to make the action more obvious for users who want to create or join channels. + - Removed the Webapp Build Hash from **Main Menu > About Mattermost** since it is now identical to Server Build Hash. + - Replaced the ``compass-components`` icon component with ``compass-icons``. + - Added **hours ahead** timezone details to the user profile popover. + - Added an experimental feature to disable re-fetching of channel and channel members on browser focus. + - Bot users are now hidden in the user selector in apps forms. + - Removed the fetching of archived channels on page load. + - The **Channel Type** dropdown within the **Browse Channels** modal can now be focused. + - Removed in-app help pages that were no longer accessible. + - Removed system join/leave messages from thread replies and post them instead in the main channel. + - Added [an experimental setting](https://docs.mattermost.com/configure/experimental-configuration-settings.html#delay-channel-autocomplete) to make the channel autocomplete only appear after typing two characters instead of immediately after the tilde (~). + - Default user profile pictures will now regenerate a new picture when the username changes. + - Implemented URL auto generation on channel creation for when there's no URL-safe characters on its name. + - Added a new option to auto-follow all threads in the channel **Notification Preference** settings. + - ``CTRL/CMD + K`` shortcut can now be used to insert link formatting when text is selected. + - ``pas`` and ``pascal`` code blocks are now higlighted. + - Removed websocket state effects for the collapse/expand state of categories. + - Pre-packaged Jira plugin version 3.2.5. + - Pre-packaged GitHub plugin version 2.1.6. + - Pre-packaged Autolink plugin version 1.4.0. + - Pre-packaged Welcomebot plugin version 1.3.0. + - Pre-packaged NPS plugin version 1.3.2. + - Prepackaged Focalboard plugin version 7.11.0. + - Prepackaged Playbooks plugin version 1.37.0. + - Added support to specify different desktop notification sounds per channel. + - Calls: Ringing sounds can be enabled/disabled and selected in the **Desktop Notifications** preferences panel. + +#### Administration + - Added a new ``ConfigurationWillBeSaved`` plugin hook which is invoked before the configuration object is committed to the backing store. + - Admins can now specify index names to ignore while purging indexes from Elasticsearch with the ``ElasticsearchSettings.IgnoredPurgeIndexes`` setting. + - Added an option to use the German HPNS notification proxy. + - New flags were added to the [database migrate command](https://docs.mattermost.com/manage/command-line-tools.html#mattermost-db-migrate) as following: + + - ``auto-recover``: If the migration plan receives an error during migrations, this command will try to rollback migrations already applied within the plan. This option is not recommended to be added without reviewing migration plan. You can review the plan by combining ``--save-plan`` and ``--dry-run`` flags. + - ``save-plan``: The plan for the migration will be saved into the file store so that it can be used for reviewing the plan or to be used for downgrading. + - ``dry-run``: Does not apply the migrations, but it validates how the migration would run with the given conditions. + + - A new [database subcommand](https://docs.mattermost.com/manage/command-line-tools.html#mattermost-db-downgrade) "downgrade" was added to be able to rollback database migrations. The command either requires an update plan to rollback, or comma separated version numbers. + - Removed ``/api/v4/users/stats`` network request from ``InviteMembersButton``. + - Self-hosted admins can now define a separate shipping address during in-product license purchase. + - Added updates to the trial request forms to allow for a more tailored trial experience. + - First admins will now have an onboarding experience that includes first team creation based on company name and invite members link steps. + - Adds the ability to expand seats in-product for self-hosted servers. + - Added a new section in the **System Console > Products** for Boards. + - Added the ability to search a partial first name, last name, nickname, or username on the **System Console > Users** page. + - **Contact Support** now redirects users to Zendesk and pre-fills known information. + - Added a mechanism for public routes on products and used it to support publicly shared Board links. + - The database section in the **System Console** now has an additional read-only section which shows the active search backend in use. This can be helpful to confirm which search engine is currently active when there are multiple configured. + - Updated Docker Base Image from Debian to Ubuntu 22.04 LTS. + - Type-generated settings will now be generated (only for future generations) with a URL-safe version of base64 encoding. + - Mattermost is now resilient against database replica outages and will dynamically choose a replica if it's alive. Also a config parameter ``ReplicaMonitorIntervalSeconds`` was added and the default value is 5. This controls how frequently unhealthy replicas will be monitored for liveness check. + +#### Performance + - Improved the performance of webapp related to timezone calculations. + - Improved performance of code used for post list screen reader support. + +### API Changes + - An underscore is now used in the timeline API (``event-id`` -> ``event_id``) for consistency with other API arguments. + +### Bug Fixes + - Fixed a scrolling issue in the purchase modals. + - Fixed an issue where the experimental Shared Channels feature failed to synchronize if a previously removed table column was still present. + - Fixed an issue where clicking on a channel link (for a channel the user was not a part of) caused the webapp to refresh, dropping the user from a call. + - Fixed an issue with PDF preview rendering for certain Japanese characters. + - Fixed an issue where the screen reader did not announce the action of copying the link in the invite modal. + - Fixed an issue with post metadata not generating correctly for images due to missing content-type in response. This would result in certain embedded images not to display on mobile clients. + - Fixed an issue where edits to messages persisted after canceling. + - Added a condition for bot tags for webhook posts when a bot account is used for webhooks. + - Fixed the sorting value of categories in ``CreateSidebarCategoryForTeamForUser``. + - Fixed a potential crash when opening the user profile popover. + - Fixed permalink and thread reply navigation between teams. + - Fixed an issue with the installation of pre-packaged plugins that are not in the Marketplace. + - Fixed an issue caused by a migration in a previous release. The query takes around 11ms on a PostgreSQL 14 DB t3.medium RDS instance. Locks on the preferences table will only be acquired if there are rows to delete, but the time taken is negligible. + - Fixed an issue where modals did not close when clicking below them on certain screen sizes. + - Fixed an issue with a few translation labels that couldn't be translated. + - Fixed an issue where the server log UI for plain text formatting was unexpectedly removed in a previous release. + - Fixed an issue where combined system messages did not display in chronological order. + - Fixed an issue where the current user and status were not updated on WebSocket reconnect. + - Fixed an issue where certain hashtags were not searchable when using database search. + - Fixed the **New Messages** line overlapping date lines in the post list. + - Fixed an issue where post reactions disappeared when the search sidebar was open. + - Fixed an issue with broken "medical_symbol", "male_sign", and "female_sign" emojis. + - Fixed a panic where a JSON null value was passed as a channel update. + - Fixed an issue where the draft counter badge remained in cases where a deleted parent post was removed. + - Fixed an issue where posts were not fully sanitized for audit output when a link preview was included. + - Fixed an issue where the footer with **Save/Cancel** buttons did not get anchored properly in the System Console. + - Fixed an issue where the undo history was erased when links, tables, or code was pasted into the textbox. + - Fixed an issue where Elasticsearch didn't properly start on startup when enabled. Also added a missing ``IsEnabled`` method to Elasticsearch. + - Fixed an issue where text couldn't be copied from the post textbox. + +### config.json +Multiple setting options were added to ``config.json``. Below is a list of the additions and their default values on install. The settings can be modified in ``config.json``, or the System Console when available. + +#### Changes to Team Edition and Enterprise Edition: + - Removed ``EnableInactivityEmail`` config setting. + - Added a new config setting section ``ProductSettings``. + - Under ``ServiceSettings`` in ``config.json``: + - Added new configuration settings ``AllowPersistentNotifications``, ``PersistentNotificationIntervalMinutes``, ``PersistentNotificationMaxCount``, ``PersistentNotificationMaxRecipients``, to add a persistent notification option when sending urgent priority posts. + - Under ``ExperimentalSettings`` in ``config.json``: + - Added ``DelayChannelAutocomplete``, to make the channel autocomplete only appear after typing a couple letters instead of immediately after a tilde. + - Added ``DisableRefetchingOnBrowserFocus``, to disable re-fetching of channel and channel members on browser focus. + - Added ``DisableAppBar`` to enable apps bar by default. + - Under ``ElasticsearchSettings`` in ``config.json``: + - Now you can specify index names to ignore while purging indexes from Elasticsearch with the ``IgnoredPurgeIndexes`` setting. + - Three configuration fields have been added, ``LogSettings.AdvancedLoggingJSON``, ``ExperimentalAuditSettings.AdvancedLoggingJSON``, and ``NotificationLogSettings.AdvancedLoggingJSON`` which support multi-line JSON, escaped JSON as a string, or a filename that points to a file containing JSON. The ``AdvancedLoggingConfig`` fields have been deprecated. + +### Go Version + - v8.0 is built with Go ``v1.19.5``. + +### Open Source Components: + - Added ``date-fns`` to https://github.com/mattermost/mattermost/. + +### Known Issues + - White screen might appear when creating a slash command [MM-53665](https://mattermost.atlassian.net/browse/MM-53665). + - When sending a draft message in a Thread, the message is not cleared if the thread is open in the right-hand side [MM-53520](https://mattermost.atlassian.net/browse/MM-53520). + - Channel and team names are missing from **Saved Posts** in the right-hand side [MM-53636](https://mattermost.atlassian.net/browse/MM-53636). + - Adding an @mention at the start of a post draft and pressing the left or right arrow key can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823). + - Google login fails on the Classic mobile apps. + - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off. + - Searching stop words in quotation marks with Elasticsearch enabled returns more than just the searched terms. + - The team sidebar on the desktop app does not update when channels have been read on mobile. + - Slack import through the CLI fails if email notifications are enabled. + - Push notifications don't always clear on iOS when running Mattermost in High Availability mode. + - The Playbooks left-hand sidebar doesn't update when a user is added to a run or playbook without a refresh. + - If a user isn't a member of a configured broadcast channel, posting a status update might fail without any error feedback. As a temporary workaround, join the configured broadcast channels, or remove those channels from the run configuration. + +### Contributors + - [agarciamontoro](https://github.com/agarciamontoro), [agnivade](https://github.com/agnivade), [akaMrDC](https://translate.mattermost.com/user/akaMrDC), [akaravashkin](https://github.com/akaravashkin), [amyblais](https://github.com/amyblais), [andriusbal](https://github.com/andriusbal), [andrleite](https://github.com/andrleite), [aqurilla](https://github.com/aqurilla), [asaadmahmood](https://github.com/asaadmahmood), [ayusht2810](https://github.com/ayusht2810), [azigler](https://github.com/azigler), [bbodenmiller](https://github.com/bbodenmiller), [BenCookie95](https://github.com/BenCookie95), [calebroseland](https://github.com/calebroseland), [chenilim](https://github.com/chenilim), [chumano](https://translate.mattermost.com/user/chumano), [CI-YU](https://translate.mattermost.com/user/CI-YU), [coltoneshaw](https://github.com/coltoneshaw), [cpoile](https://github.com/cpoile), [creeper-0910](https://translate.mattermost.com/user/creeper-0910), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://translate.mattermost.com/user/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [devinbinnie](https://github.com/devinbinnie), [diciwall](https://translate.mattermost.com/user/diciwall), [DieAkuteSense](https://github.com/DieAkuteSense), [dirosv-eden](https://github.com/dirosv-eden), [Ele7o](https://translate.mattermost.com/user/Ele7o), [Eleferen](https://translate.mattermost.com/user/Eleferen), [enahum](https://github.com/enahum), [Esterjudith](https://github.com/Esterjudith), [fmartingr](https://github.com/fmartingr), [fnogcps](https://github.com/fnogcps), [gabrieljackson](https://github.com/gabrieljackson), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hmhealey](https://github.com/hmhealey), [ifoukarakis](https://github.com/ifoukarakis), [ilies-bel](https://github.com/ilies-bel), [invalid-email-address](https://github.com/invalid-email-address), [isacikgoz](https://github.com/isacikgoz), [it33](https://github.com/it33), [ivalkshfoeif](https://github.com/ivalkshfoeif), [iyampaul](https://github.com/iyampaul), [janostgren](https://github.com/janostgren), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jprusch](https://github.com/jprusch), [JulienTant](https://github.com/JulienTant), [jupenur](https://github.com/jupenur), [kaakaa](https://translate.mattermost.com/user/kaakaa), [karan2704](https://github.com/karan2704), [kayazeren](https://github.com/kayazeren), [kostaspt](https://github.com/kostaspt), [krmh04](https://github.com/krmh04), [kyeongsoosoo](https://github.com/kyeongsoosoo), [larkox](https://github.com/larkox), [leonambeez](https://github.com/leonambeez), [LeonardJouve](https://github.com/LeonardJouve), [lieut-data](https://github.com/lieut-data), [lmedoshvili](https://translate.mattermost.com/user/lmedoshvili), [lynn915](https://github.com/lynn915), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [mahaker](https://github.com/mahaker), [majo](https://translate.mattermost.com/user/majo), [manojmalik20](https://github.com/manojmalik20), [marianunez](https://github.com/marianunez), [master7](https://translate.mattermost.com/user/master7), [matt-w99](https://github.com/matt-w99), [matthew-src](https://github.com/matthew-src), [matthew-w](https://translate.mattermost.com/user/matthew-w), [MattSilvaa](https://github.com/MattSilvaa), [mgdelacroix](https://github.com/mgdelacroix), [mickmister](https://github.com/mickmister), [milotype](https://github.com/milotype), [morgancz](https://github.com/morgancz), [muratbayan](https://translate.mattermost.com/user/muratbayan), [mvitale1989](https://github.com/mvitale1989), [natalie-hub](https://github.com/natalie-hub), [nathanaelhoun](https://translate.mattermost.com/user/nathanaelhoun), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [nihaldivyam](https://github.com/nihaldivyam), [pablo-suazo](https://github.com/pablo-suazo), [panklobouk](https://translate.mattermost.com/user/panklobouk), [Partizann](https://github.com/Partizann), [phoinix-mm-test](https://github.com/phoinix-mm-test), [phoinixgrr](https://github.com/phoinixgrr), [pjenicot](https://translate.mattermost.com/user/pjenicot), [pvev](https://github.com/pvev), [raghavaggarwal2308](https://github.com/raghavaggarwal2308), [ridwankabeer435](https://github.com/ridwankabeer435), [rOt779kVceSgL](https://translate.mattermost.com/user/rOt779kVceSgL), [RoyI99](https://github.com/RoyI99), [saideepesh000](https://github.com/saideepesh000), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [shivamjosh](https://github.com/shivamjosh), [sinansonmez](https://github.com/sinansonmez), [SkyLuke91](https://translate.mattermost.com/user/SkyLuke91), [spirosoik](https://github.com/spirosoik), [sri-byte](https://github.com/sri-byte), [stafot](https://github.com/stafot), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [tejaskarelia17](https://github.com/tejaskarelia17), [tfromont](https://translate.mattermost.com/user/tfromont), [ThrRip](https://translate.mattermost.com/user/ThrRip), [timmycheng](https://github.com/timmycheng), [toninis](https://github.com/toninis), [tsabi](https://translate.mattermost.com/user/tsabi), [ujwalkumar1995](https://github.com/ujwalkumar1995), [vish9812](https://github.com/vish9812), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [yasserfaraazkhan](https://github.com/yasserfaraazkhan), [yomiadetutu1](https://github.com/yomiadetutu1), [zhsj](https://github.com/zhsj) + ## Release v7.11 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html#feature-release) - - The Mattermost v7.11 release has been canceled as we are working on architectural changes for the Mattermost Suite (Channels, Playbooks, Boards, and Calls). The next scheduled release is v8.0 this summer. + - The Mattermost v7.11 release has been canceled as we are working on architectural changes for the Mattermost platform. The next scheduled release is v8.0 this summer. ## Release v7.10 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html#feature-release) @@ -102,7 +296,7 @@ Multiple setting options were added to ``config.json``. Below is a list of the a - Updating from v7.9.x to Focalboard 7.10.4 causes Boards attachments to be lost [MM-53240](https://mattermost.atlassian.net/browse/MM-53240). - Users have trouble logging into Mattermost mobile app when the DiagnosticId is not properly stored in cache after startup [MM-53195](https://mattermost.atlassian.net/browse/MM-53195). - Users are unexpectedly forced to enable JSON logging [MM-51453](https://mattermost.atlassian.net/browse/MM-51453). - - The new Insights feature has some performance costs that we are working to optimize. This feature can be disabled by setting the ``MM_FEATUREFLAGS_INSIGHTSENABLED`` environment variable to ``false``. + - The new Insights feature has some performance costs that we are working to optimize. This feature can be disabled by setting the ``MM_FEATUREFLAGS_INSIGHTSENABLED`` environment variable to ``false``. See the `Insights `__ documentation for details. - Adding an @mention at the start of a post draft and pressing the left or right arrow key can clear the post draft and the undo history [MM-33823](https://mattermost.atlassian.net/browse/MM-33823). - Google login fails on the Classic mobile apps. - Status may sometimes get stuck as **Away** or **Offline** in High Availability mode with IP Hash turned off. @@ -117,22 +311,6 @@ Multiple setting options were added to ``config.json``. Below is a list of the a ### Contributors - [11sma](https://github.com/11sma), [adj2908](https://github.com/adj2908), [agarciamontoro](https://github.com/agarciamontoro), [AGMETEOR](https://github.com/AGMETEOR), [agnivade](https://github.com/agnivade), [amyblais](https://github.com/amyblais), [amynicol1985](https://github.com/amynicol1985), [andrius.balsevicius](https://translate.mattermost.com/user/andrius.balsevicius), [angeloskyratzakos](https://github.com/angeloskyratzakos), [AntalaFilip](https://github.com/AntalaFilip), [anx-ag](https://github.com/anx-ag), [aputtu](https://github.com/aputtu), [asaadmahmood](https://github.com/asaadmahmood), [AshishDhama](https://github.com/AshishDhama), [avas27JTG](https://github.com/avas27JTG), [ayusht2810](https://github.com/ayusht2810), [BenCookie95](https://github.com/BenCookie95), [bfontaine](https://github.com/bfontaine), [byigorv](https://github.com/byigorv), [calebroseland](https://github.com/calebroseland), [coltoneshaw](https://github.com/coltoneshaw), [ConorMacpherson](https://github.com/ConorMacpherson), [cpoile](https://github.com/cpoile), [creeper-0910](https://translate.mattermost.com/user/creeper-0910), [crspeller](https://github.com/crspeller), [ctlaltdieliet](https://github.com/ctlaltdieliet), [cwarnermm](https://github.com/cwarnermm), [d-wierdsma](https://github.com/d-wierdsma), [DaDummy](https://github.com/DaDummy), [devinbinnie](https://github.com/devinbinnie), [Dmitry](https://translate.mattermost.com/user/Dmitry), [dylanrichards](https://github.com/dylanrichards), [EduardoSellanes](https://github.com/EduardoSellanes), [Eleferen](https://translate.mattermost.com/user/Eleferen), [Elpunical](https://github.com/Elpunical), [emdecr](https://github.com/emdecr), [enahum](https://github.com/enahum), [ericgaspar](https://github.com/ericgaspar), [esarafianou](https://github.com/esarafianou), [ewwollesen](https://github.com/ewwollesen), [fmartingr](https://github.com/fmartingr), [fnogcps](https://github.com/fnogcps), [furqanmlk](https://github.com/furqanmlk), [gabrieljackson](https://github.com/gabrieljackson), [gitstart](https://github.com/gitstart), [hanzei](https://github.com/hanzei), [harshilsharma63](https://github.com/harshilsharma63), [hattori611](https://github.com/hattori611), [hmhealey](https://github.com/hmhealey), [ialorro](https://github.com/ialorro), [ifoukarakis](https://github.com/ifoukarakis), [isaacbegit](https://github.com/isaacbegit), [isacikgoz](https://github.com/isacikgoz), [jasonblais](https://github.com/jasonblais), [jespino](https://github.com/jespino), [jnsgruk](https://github.com/jnsgruk), [Johennes](https://github.com/Johennes), [johnsonbrothers](https://github.com/johnsonbrothers), [jprusch](https://github.com/jprusch), [JulienTant](https://github.com/JulienTant), [julmondragon](https://github.com/julmondragon), [justinegeffen](https://github.com/justinegeffen), [kaakaa](https://github.com/kaakaa), [kayazeren](https://github.com/kayazeren), [kaykayehnn](https://github.com/kaykayehnn), [KBeDevel](https://github.com/KBeDevel), [khoipro](https://github.com/khoipro), [kmaed](https://github.com/kmaed), [komoon8934](https://translate.mattermost.com/user/komoon8934), [koox00](https://github.com/koox00), [kostaspt](https://github.com/kostaspt), [Kshitij-Katiyar](https://github.com/Kshitij-Katiyar), [kwiersgalla](https://github.com/kwiersgalla), [larkox](https://github.com/larkox), [leonambeez](https://translate.mattermost.com/user/leonambeez), [lieut-data](https://github.com/lieut-data), [lynn915](https://github.com/lynn915), [M-ZubairAhmed](https://github.com/M-ZubairAhmed), [m1lt0n](https://github.com/m1lt0n), [majo](https://translate.mattermost.com/user/majo), [manojmalik20](https://github.com/manojmalik20), [marianunez](https://github.com/marianunez), [maruTA-bis5](https://translate.mattermost.com/user/maruTA-bis5), [master7](https://translate.mattermost.com/user/master7), [matt-w99](https://github.com/matt-w99), [matthew-src](https://github.com/matthew-src), [matthew-w](https://translate.mattermost.com/user/matthew-w), [MatthewDorner](https://github.com/MatthewDorner), [MattSilvaa](https://github.com/MattSilvaa), [metanerd](https://github.com/metanerd), [mgdelacroix](https://github.com/mgdelacroix), [michael_kim](https://translate.mattermost.com/user/michael_kim), [mickmister](https://github.com/mickmister), [milotype](https://github.com/milotype), [mini-bomba](https://github.com/mini-bomba), [mirshahriar](https://github.com/mirshahriar), [moatasim](https://translate.mattermost.com/user/moatasim), [MoatazMuhammad51](https://github.com/MoatazMuhammad51), [Mshahidtaj](https://github.com/Mshahidtaj), [munish7771](https://github.com/munish7771), [muratbayan](https://translate.mattermost.com/user/muratbayan), [mvitale1989](https://github.com/mvitale1989), [natalie-hub](https://github.com/natalie-hub), [neallred](https://github.com/neallred), [nevyangelova](https://github.com/nevyangelova), [nickmisasi](https://github.com/nickmisasi), [Nityanand13](https://github.com/Nityanand13), [NixemDEV](https://translate.mattermost.com/user/NixemDEV), [oraliahdz](https://github.com/oraliahdz), [paolo-rossi](https://github.com/paolo-rossi), [Peytob](https://github.com/Peytob), [phoinixgrr](https://github.com/phoinixgrr), [pjenicot](https://translate.mattermost.com/user/pjenicot), [plant99](https://github.com/plant99), [plut0s](https://translate.mattermost.com/user/plut0s), [potatogim](https://translate.mattermost.com/user/potatogim), [pureiris](https://github.com/pureiris), [pvev](https://github.com/pvev), [Qui3t0wL](https://github.com/Qui3t0wL), [raghavaggarwal2308](https://github.com/raghavaggarwal2308), [roadt](https://github.com/roadt), [Rutboy](https://translate.mattermost.com/user/Rutboy), [saturninoabril](https://github.com/saturninoabril), [sbishel](https://github.com/sbishel), [Sharuru](https://github.com/Sharuru), [sibasankarnayak](https://github.com/sibasankarnayak), [simcard0000](https://github.com/simcard0000), [sinansonmez](https://github.com/sinansonmez), [Sjazz](https://github.com/Sjazz), [smallcms](https://github.com/smallcms), [spirosoik](https://github.com/spirosoik), [sri-byte](https://github.com/sri-byte), [srkgupta](https://github.com/srkgupta), [stafot](https://github.com/stafot), [stevemudie](https://github.com/stevemudie), [streamer45](https://github.com/streamer45), [stylianosrigas](https://github.com/stylianosrigas), [tanmay-des](https://github.com/tanmay-des), [tanmaythole](https://github.com/tanmaythole), [Tasy218](https://translate.mattermost.com/user/Tasy218), [toninis](https://github.com/toninis), [trilopin](https://github.com/trilopin), [varghesejose2020](https://github.com/varghesejose2020), [Wainwright0830](https://github.com/Wainwright0830), [wiersgallak](https://github.com/wiersgallak), [wiggin77](https://github.com/wiggin77), [Willyfrog](https://github.com/Willyfrog), [wuwinson](https://github.com/wuwinson), [xiao](https://translate.mattermost.com/user/xiao), [yasserfaraazkhan](https://github.com/yasserfaraazkhan), [yomiadetutu1](https://github.com/yomiadetutu1) -### Upcoming Deprecations and Breaking Changes in Mattermost v8.0 - -The following deprecations and breaking changes are planned for the Mattermost v8.0 release, which is scheduled for the summer of 2023. This list is subject to change prior to the release. - -1. Update module version to v8.0. Clients will have to change their module path to the new structure. Very minimal change. There are no API level breaking changes that would require code changes. -2. Remove ``ExperimentalSettings.PatchPluginsReactDOM``. If this setting was previously enabled, confirm that: - 1. All Mattermost-supported plugins are updated to the latest versions. - 2. Any other plugins have been updated to support React 17. See the [Important Upgrade Notes](https://docs.mattermost.com/upgrade/important-upgrade-notes.html) for v7.7 for more information. -3. Three configuration fields have been added, ``LogSettings.AdvancedLoggingJSON``, ``ExperimentalAuditSettings.AdvancedLoggingJSON``, and ``NotificationLogSettings.AdvancedLoggingJSON`` which support multi-line JSON, escaped JSON as a string, or a filename that points to a file containing JSON. The ``AdvancedLoggingConfig`` fields have been deprecated. -4. Remove deprecated ``PermissionUseSlashCommands``. -5. Remove deprecated ``model.CommandArgs.Session``. -6. Remove support for PostgreSQL v10. The new minimum PostgreSQL version will be v11. -7. Enable Apps Bar by default. -8. Pass a ``context.Context`` to Client4 methods. -9. The Mattermost public API for Go is now available as a distinctly versioned package. Instead of pinning a particular commit hash, use idiomatic Go to add this package as a dependency: go get github.com/mattermost/mattermost-server/server/public. This relocated Go API maintains backwards compatibility with Mattermost v7. Furthermore, the existing Go API previously at github.com/mattermost/mattermost-server/v6/model remains forward compatible with Mattermost v8, but may not contain newer features. Plugins do not need to be recompiled, but developers may opt in to using the new package to simplify their build process. The new public package is shipping alongside Mattermost v8 as version 0.5.0 to allow for some additional code refactoring before releasing as v1 later this year. - ## Release v7.9 - [Feature Release](https://docs.mattermost.com/upgrade/release-definitions.html#feature-release) - **v7.9.6, released 2023-07-12** @@ -562,7 +740,7 @@ Mattermost v7.7.0 contains low severity level security fixes. [Upgrading](https: - Fixed an issue where the unreads button in the channel sidebar was missing alternative text for screen readers. - Fixed a potential read-after-write issue when uploading data through the resumable uploads API. - Removed duplicate text in the self-hosted pricing modal. - - Fixed the position of the Boards icon in the app bar when Boards is running without a plugin. + - Fixed the position of the Boards icon in the Apps Bar when Boards is running without a plugin. - Fixed ability to create a board when Boards is running without a plugin. - Fixed Boards tour tips not appearing when Boards is running without a plugin. - Fixed an issue where a confusing System Console banner was displayed when a license was set to expire. diff --git a/source/install/setting-up-socket-based-mattermost-database.rst b/source/install/setting-up-socket-based-mattermost-database.rst index d84786be74c..7badf3eb55d 100644 --- a/source/install/setting-up-socket-based-mattermost-database.rst +++ b/source/install/setting-up-socket-based-mattermost-database.rst @@ -4,24 +4,9 @@ Using sockets for database .. include:: ../_static/badges/allplans-selfhosted.rst :start-after: :nosearch: -Mattermost requires a database back-end. If you plan to run it on the machine, -install MySQL or PostgreSQL as the database. In this document let's understand how +Mattermost requires a database back-end, and PostgreSQL is our database of choice. In this document let's understand how you can use sockets for setting up the database. -MySQL ------ - -.. code-block:: bash - - $ mysql -u root -p - CREATE DATABASE mattermostdb; - CREATE USER mmuser IDENTIFIED BY 'mmuser_password'; - GRANT ALL ON mattermostdb.* TO mmuser; - - -PostgreSQL ----------- - - Install and configure PostgreSQL. - Choose between TCP or UNIX Socket, and jump to the corresponding section. @@ -97,14 +82,9 @@ Configuring Mattermost - Mattermost is configured in ``/etc/webapps/mattermost/config.json``. Strings need to be quoted. -- The ``DriverName`` setting: ``mysql`` for MySQL and ``postgres`` for PostgreSQL. - - The ``DataSource``: +- Set ``DriverName`` to ``postgres``. - - For MySQL, set it to ``mmuser:mmuser_password@unix(/run/mysqld/mysqld.sock)/mattermostdb?charset=utf8mb4,utf8``. - - For PostgreSQL - - - TCP socket: ``postgres://mmuser:mmuser_password@127.0.0.1:5432/mattermostdb?sslmode=disable&connect_timeout=10`` - - - Unix socket: ``postgres:///mattermostdb?host=/run/postgresql``, where ``mattermostdb`` is the name of the database and ``/run/postgresql`` is the directory containing the Unix socket. + Set ``DataSource``: + - TCP socket: ``postgres://mmuser:mmuser_password@127.0.0.1:5432/mattermostdb?sslmode=disable&connect_timeout=10`` + - Unix socket: ``postgres:///mattermostdb?host=/run/postgresql``, where ``mattermostdb`` is the name of the database and ``/run/postgresql`` is the directory containing the Unix socket. \ No newline at end of file diff --git a/source/install/software-hardware-requirements.rst b/source/install/software-hardware-requirements.rst index 337186ba8e8..037165b6df9 100644 --- a/source/install/software-hardware-requirements.rst +++ b/source/install/software-hardware-requirements.rst @@ -37,7 +37,11 @@ Desktop apps Though not officially supported, the Linux desktop app also runs on RHEL/CentOS 7+. -`*` Integrated Windows Authentication is not supported by Mattermost desktop apps. If you use ADFS we recommend `configuring intranet forms-based authentication for devices that do not support WIA `_. +.. note:: + + - `*` Integrated Windows Authentication is not supported by Mattermost desktop apps. If you use ADFS we recommend `configuring intranet forms-based authentication for devices that do not support WIA `_. + + - The minimum content size is 769 x 600 pixels. When the width is 768 pixels or less, the desktop app switches to mobile view. When the height is below 600 pixels, screen elements may become misplaced. PC web ^^^^^^ @@ -61,7 +65,10 @@ Mobile apps "iOS", "iPhone 5s devices and later with iOS 12.1+" "Android", "Android devices with Android 7+" -`*` Integrated Windows Authentication is not supported by Mattermost mobile apps. If you use ADFS we recommend `configuring intranet forms-based authentication for devices that do not support WIA `_. +.. note:: + + - `*` Integrated Windows Authentication is not supported by Mattermost mobile apps. If you use ADFS we recommend `configuring intranet forms-based authentication for devices that do not support WIA `_. + - The minimum and target content size is 320 x 460 pixels, matching the available space when the mobile app is opened in Safari on the minimum supported iOS device. Mobile web ^^^^^^^^^^ @@ -93,7 +100,7 @@ While community support exists for Fedora, FreeBSD, and Arch Linux, Mattermost d Database software ^^^^^^^^^^^^^^^^^ -- PostgreSQL 10.0+ +- PostgreSQL 11.0+ - MySQL 5.7.12, 8.0.12+ (see note below on MySQL 8 support) Amazon Aurora equivalents of both PostgreSQL and MySQL are also supported. diff --git a/source/install/trouble-postgres.rst b/source/install/trouble-postgres.rst index 912dd8c953a..81e982a3b77 100644 --- a/source/install/trouble-postgres.rst +++ b/source/install/trouble-postgres.rst @@ -1,12 +1,12 @@ PostgreSQL installation troubleshooting ======================================= -Mattermost supports PostgreSQL v10+. +Mattermost supports PostgreSQL v11+. PostgreSQL v15 introduces changes that may affect compatibility with previous releases. If you're deploying a fresh installation of PostgreSQL v15, run this command: ``GRANT CREATE ON SCHEMA public TO PUBLIC`` to ensure that you can use Mattermost. PostgresSQL full-text search fails to use indexes with non-english ``default_text_search_config`` ------------------------------------------------------------------------------------------------- +-------------------------------------------------------------------------------------------------- Mattermost uses ``default_text_search_config`` for full-text search in PostgresSQL databases, as opposed to a hardcoded text search config. However, indexes are still created with a hardcoded text search config (english) and as a result, full-text search may never use the indexes. diff --git a/source/install/trouble_mysql.rst b/source/install/trouble_mysql.rst index e9ecea9ed6a..b65b4804039 100644 --- a/source/install/trouble_mysql.rst +++ b/source/install/trouble_mysql.rst @@ -216,4 +216,11 @@ Mattermost customers using v7.7 or earlier may see an errors occur on servers us - `Windows `__ .. note:: - This issue has been addressed from Mattermost v7.8. \ No newline at end of file + This issue has been addressed from Mattermost v7.8. + +Maximum allowed packet +----------------------- + +The Go MySQL driver has changed the ``maxAllowedPacket`` size from 4MiB to 64MiB. This is to make it consistent with the change in the server-side default value from MySQL 5.7 to MySQL 8.0. + +If your ``max_allowed_packet`` setting is not 64MiB, update the MySQL configuration DSN with an additional parameter of ``maxAllowedPacket`` to match with the server-side value. Alternatively, set a value of ``0`` to fetch the server-side value automatically on every new connection which has a performance overhead. \ No newline at end of file diff --git a/source/install/troubleshooting.rst b/source/install/troubleshooting.rst index 911ddbc74cb..27964431edc 100644 --- a/source/install/troubleshooting.rst +++ b/source/install/troubleshooting.rst @@ -250,7 +250,7 @@ The location of these depend on your proxy configuration, but a good place to st **Database** -MySQL and PostgreSQL have different logs, and their location varies based on your configuration. If the issue is related to database connectivity, check the database documentation to locate the logs. +PostgreSQL and MySQL have different logs, and their location varies based on your configuration. If the issue is related to database connectivity, check the database documentation to locate the logs. **SAML, LDAP, and other systems** @@ -287,7 +287,7 @@ If the compressed file is still too big, use these commands to split the compres The compressed files will be located on the server at ``/tmp/mattermost-logs`` and be named ``mattermost.log.tgz.aa``, ``mattermost.log.tgz.ab``, and so on. Use a file transfer client that supports SSH/SFTP, such as Cyberduck, to copy these files from the server. -If you are experiencing issues with Elasticsearch, SAML, LDAP, or the database, you can enable trace logging in ``config.json`` by setting ``Trace`` to ``true`` under their respective settings. Combining this with ``DEBUG`` level file log output will result in huge log files, so only leave trace logging on long enough to replicate the behavior. The resulting logs will also contain a lot more sensitive data, including user data, so be sure to sanitize it completely before sharing it with us. +If you are experiencing issues with Elasticsearch, LDAP, or the database, you can enable trace logging in ``config.json`` by setting ``Trace`` to ``true`` under their respective settings. Combining this with ``DEBUG`` level file log output will result in huge log files, so only leave trace logging on long enough to replicate the behavior. The resulting logs will also contain a lot more sensitive data, including user data, so be sure to sanitize it completely before sharing it with us. **System logs** diff --git a/source/manage/command-line-tools.rst b/source/manage/command-line-tools.rst index 5d83358be53..1b6b9cc9f6c 100644 --- a/source/manage/command-line-tools.rst +++ b/source/manage/command-line-tools.rst @@ -6,11 +6,7 @@ Command line tools In self-managed deployments, a ``mattermost`` command is available for configuring the system from the directory where the Mattermost server is installed. For an overview of the Mattermost command line interface (CLI), `read this article `__ from Santos. -.. note:: - - As of Mattermost v6.0, this CLI has been replaced with the `mmctl command line tool `__. However, `mattermost import `__ commands, `mattermost export `__ commands, and related subcommands, remain available and fully supported from Mattermost v6.0. - - The CLI is run in a single node which bypasses the mechanisms that a `High Availability environment `__ uses to perform actions across all nodes in the cluster. As a result, when running `CLI commands `__ in a High Availability environment, tasks such as creating and deleting users or changing configuration settings require a server restart. - -These ``mattermost`` commands include: +These ``mattermost`` commands include the following functionality: **General administration** @@ -41,1894 +37,1951 @@ These ``mattermost`` commands include: - Analyze the database for relational consistency -.. contents:: - :backlinks: top - :local: +.. note:: + - As of Mattermost v6.0, this CLI has been replaced with the `mmctl command line tool `__. However, `mattermost import `__ commands, `mattermost export `__ commands, and related subcommands, remain available and fully supported from Mattermost v6.0. + - The CLI is run in a single node which bypasses the mechanisms that a `High Availability environment `__ uses to perform actions across all nodes in the cluster. As a result, when running `CLI commands `__ in a High Availability environment, tasks such as creating and deleting users or changing configuration settings require a server restart. + - Parameters in CLI commands are order-specific. + - If special characters (``!``, ``|``, ``(``, ``)``, ``\``, ``'``, and ``"``) are used, the entire argument needs to be surrounded by single quotes (e.g. ``-password 'mypassword!'``, or the individual characters need to be escaped out (e.g. ``-password mypassword\!``). + - Team name and channel name refer to the handles, not the display names. So in the URL ``https://community.mattermost.com/core/channels/town-square`` team name would be ``core`` and channel name would be ``town-square``. Use the CLI ----------- -To run the CLI commands, you must be in the Mattermost root directory. On a default installation of Mattermost, the root directory is ``/opt/mattermost``. If you followed our standard `installation process <../guides/administrator.html#installing-mattermost>`__, you must run the commands as the user ``mattermost``. The name of the executable is ``mattermost``, and it can be found in the ``/opt/mattermost/bin`` directory. +.. tabs:: -**For example, to get the Mattermost version on a default installation of Mattermost:** + .. tab:: Via Mattermost -.. code-block:: bash + To run the CLI commands, you must be in the Mattermost root directory. On a default installation of Mattermost, the root directory is ``/opt/mattermost``. If you followed our standard `installation process <../guides/administrator.html#installing-mattermost>`__, you must run the commands as the user ``mattermost``. The name of the executable is ``mattermost``, and it can be found in the ``/opt/mattermost/bin`` directory. - cd /opt/mattermost/ - sudo -u mattermost bin/mattermost version + For example, to get the Mattermost version on a default installation of Mattermost: -.. note:: + .. code-block:: bash - Ensure you run the Mattermost binary as the ``mattermost`` user. Running it as ``root`` user (for example) may cause complications with permissions as the binary initiates plugins and accesses various files when running CLI commands. Running the server as ``root`` may result in ownership of the plugins and files to be overwritten as well as other potential permissions errors. + cd /opt/mattermost/ + sudo -u mattermost bin/mattermost version -.. note:: + .. note:: - When running CLI commands on a Mattermost installation that has the configuration stored in the database, you might need to pass the database connection string as: + - Ensure you run the Mattermost binary as the ``mattermost`` user. Running it as ``root`` user (for example) may cause complications with permissions as the binary initiates plugins and accesses various files when running CLI commands. Running the server as ``root`` may result in ownership of the plugins and files to be overwritten as well as other potential permissions errors. + - When running CLI commands on a Mattermost installation that has the configuration stored in the database, you might need to pass the database connection string as: -.. code-block:: bash + .. code-block:: bash - bin/mattermost --config="postgres://mmuser:mostest@localhost:5432/mattermost_test?sslmode=disable\u0026connect_timeout=10" + bin/mattermost --config="postgres://mmuser:mostest@localhost:5432/mattermost_test?sslmode=disable\u0026connect_timeout=10" -Use the CLI on GitLab Omnibus ------------------------------- + .. tab:: Via GitLab Omnibus -On GitLab Omnibus, you must be in the following directory when you run CLI commands: ``/opt/gitlab/embedded/service/mattermost``. Also, you must run the commands as the user *mattermost* and specify the location of the configuration file. The executable is ``/opt/gitlab/embedded/bin/mattermost``. + On GitLab Omnibus, you must be in the following directory when you run CLI commands: ``/opt/gitlab/embedded/service/mattermost``. Also, you must run the commands as the user *mattermost* and specify the location of the configuration file. The executable is ``/opt/gitlab/embedded/bin/mattermost``. -**For example, to get the Mattermost version on GitLab Omnibus:** + For example, to get the Mattermost version on GitLab Omnibus: -.. code-block:: bash + .. code-block:: bash - cd /opt/gitlab/embedded/service/mattermost - sudo /opt/gitlab/embedded/bin/chpst -e /opt/gitlab/etc/mattermost/env -P -U mattermost:mattermost -u mattermost:mattermost /opt/gitlab/embedded/bin/mattermost version + cd /opt/gitlab/embedded/service/mattermost + sudo /opt/gitlab/embedded/bin/chpst -e /opt/gitlab/etc/mattermost/env -P -U mattermost:mattermost -u mattermost:mattermost /opt/gitlab/embedded/bin/mattermost version -.. note:: + .. note:: - The example commands in the documentation are for a default installation of Mattermost. You must modify the commands so that they work on GitLab Omnibus. - -Use the CLI on Docker Install ------------------------------ - -On Docker install, the ``/mattermost/bin`` directory was added to ``PATH``, so you can use the CLI directly with the ``docker exec`` command. Note that the container name may be ``mattermostdocker_app_1`` if you installed Mattermost with ``docker-compose.yml``. + The example commands on this documentation page are for a default installation of Mattermost. You must modify the commands so that they work on GitLab Omnibus. -**For example, to get the Mattermost version on a Docker install:** + .. tab:: Via Docker Install -.. code-block:: bash + On Docker install, the ``/mattermost/bin`` directory was added to ``PATH``, so you can use the CLI directly with the ``docker exec`` command. Note that the container name may be ``mattermostdocker_app_1`` if you installed Mattermost with ``docker-compose.yml``. - docker exec -it mattermost version + For example, to get the Mattermost version on a Docker Install: -Use the CLI on Docker Preview ------------------------------ + .. code-block:: bash -The preceding documentation and command reference below also applies to the `Mattermost docker preview image `__. + docker exec -it mattermost version -Mattermost 3.6 and later -~~~~~~~~~~~~~~~~~~~~~~~~ + .. tab:: Via Docker Preview -The new CLI tool is supported in Mattermost v3.6 and later. + The Docker Install tab details and command references below also apply to the `Mattermost docker preview image `__. -.. note:: +mattermost cli commands +----------------------- - - Parameters in CLI commands are order-specific. - - If special characters (``!``, ``|``, ``(``, ``)``, ``\``, ``'``, and ``"``) are used, the entire argument needs to be surrounded by single quotes (e.g. ``-password 'mypassword!'``, or the individual characters need to be escaped out (e.g. ``-password mypassword\!``). - - Team name and channel name refer to the handles, not the display names. So in the URL ``https://community.mattermost.com/core/channels/town-square`` team name would be ``core`` and channel name would be ``town-square``. - -.. tip:: - - If you automate user creation through the CLI tool with SMTP enabled, emails will be sent to all new users created. If you run such a load script, it is best to disable SMTP or to use test accounts so that new account creation emails aren't unintentionally sent to people at your organization who aren't expecting them. - -mattermost ----------- - - Description - Commands for configuring and managing your Mattermost instance and users. - - Options - .. code-block:: none - - -c, --config {string} Configuration file to use. (default "config.json") - --disableconfigwatch {boolean} When true, the config.json file will not be reloaded automatically when another process changes it (default "false") - - Child Commands - - `mattermost channel`_ - Management of channels - - `mattermost command`_ - Management of slash commands - - `mattermost config`_ - Work with the configuration file - - `mattermost export`_ - Compliance export commands - - `mattermost group`_ - Management of Mattermost groups - - `mattermost help`_ - Generate full documentation for the CLI - - `mattermost import`_ - Import data - - `mattermost jobserver`_ - Start the Mattermost job server - - `mattermost ldap`_ - AD/LDAP related utilities - - `mattermost license`_ - Licensing commands - - `mattermost logs`_ - Display human-readable logs - - `mattermost permissions`_ - Management of the permissions system - - `mattermost plugin`_ - Management of plugins - - `mattermost reset`_ - Reset the database to initial state - - `mattermost roles`_ - Management of user roles - - `mattermost sampledata`_ - Sample data generation - - `mattermost server`_ - Run the Mattermost server - - `mattermost team`_ - Management of teams - - `mattermost user`_ - Management of users - - `mattermost version`_ - Display version information - - `mattermost webhook`_ - Management of webhooks +Description + Commands for configuring and managing your Mattermost instance and users. + +Options + .. code-block:: none + + -c, --config {string} Configuration file to use. (default "config.json") + --disableconfigwatch {boolean} When true, the config.json file will not be reloaded automatically when another process changes it (default "false") + +Child Commands + - `mattermost channel`_ - Management of channels + - `mattermost command`_ - Management of slash commands + - `mattermost config`_ - Work with the configuration file + - `mattermost db init`_ - Initialize the database, execute migrations, and load custom defaults + - `mattermost db migrate`_ - Migrate the database schema for unapplied migrations + - `mattermost export`_ - Compliance export commands + - `mattermost extract-documents-content`_ - Extract and index the contents of files shared for legacy Mattermost Servers + - `mattermost group`_ - Management of Mattermost groups + - `mattermost group channel`_ - Manage Mattermost groups linked to a channel + - `mattermost group team`_ - Manage Mattermost groups linked to a team + - `mattermost help`_ - Generate full documentation for the CLI + - `mattermost import`_ - Import data + - `mattermost integrity`_ - Check database schema integrity as well as referential integrity of channels, slash commands, webhooks, posts, schemes, sessions, users, and teams + - `mattermost jobserver`_ - Start the Mattermost job server + - `mattermost ldap`_ - AD/LDAP related utilities + - `mattermost license`_ - Licensing commands + - `mattermost logs`_ - Display human-readable logs + - `mattermost permissions`_ - Management of the permissions system + - `mattermost plugin`_ - Management of plugins + - `mattermost reset`_ - Reset the database to initial state + - `mattermost roles`_ - Management of user roles + - `mattermost sampledata`_ - Sample data generation + - `mattermost server`_ - Run the Mattermost server + - `mattermost team`_ - Management of teams + - `mattermost user`_ - Management of users + - `mattermost version`_ - Display version information + - `mattermost webhook`_ - Management of webhooks mattermost channel ------------------ - Description - Commands for channel management. - - Child Commands - - `mattermost channel add`_ - Add users to a channel - - `mattermost channel archive`_ - Archive a channel - - `mattermost channel create`_ - Create a channel - - `mattermost channel delete`_ - Delete a channel - - `mattermost channel list`_ - List all channels on specified teams - - `mattermost channel modify`_ - Modify a channel's public/private type - - `mattermost channel move`_ - Move a channel to another team - - `mattermost channel remove`_ - Remove users from a channel - - `mattermost channel rename`_ - Rename a channel - - `mattermost channel restore`_ - Restore a channel from the archive - - `mattermost channel search`_ - Search a channel by name +Description + Commands for channel management. + +Child Commands + - `mattermost channel add`_ - Add users to a channel + - `mattermost channel archive`_ - Archive a channel + - `mattermost channel create`_ - Create a channel + - `mattermost channel delete`_ - Delete a channel + - `mattermost channel list`_ - List all channels on specified teams + - `mattermost channel modify`_ - Modify a channel's public/private type + - `mattermost channel move`_ - Move a channel to another team + - `mattermost channel remove`_ - Remove users from a channel + - `mattermost channel rename`_ - Rename a channel + - `mattermost channel restore`_ - Restore a channel from the archive + - `mattermost channel search`_ - Search a channel by name .. _channel-value-note: .. note:: - **{channel} value** + **{channel} value** - For the *add*, *archive*, *delete*, *remove*, and *restore* commands, you can specify the *{channels}* value by {team}:{channel} using the team and channel URLs, or by using channel IDs. Channel IDs can be obtained via the `API `_ or the `mattermost channel search `__ command. - - For example, in the following URL the *{channels}* value is *myteam:mychannel*: + For the *add*, *archive*, *delete*, *remove*, and *restore* commands, you can specify the *{channels}* value by {team}:{channel} using the team and channel URLs, or by using channel IDs. Channel IDs can be obtained via the `API `_ or the `mattermost channel search `__ command. - ``https://example.com/myteam/channels/mychannel`` + For example, in the following URL the *{channels}* value is *myteam:mychannel*: ``https://example.com/myteam/channels/mychannel`` - Also, the team and channel names in the URL should be written in lowercase. + Also, the team and channel names in the URL should be written in lowercase. mattermost channel add ~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel add `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel add `__. Description - Add users to a channel. If adding multiple users, use a space-separated list. + Add users to a channel. If adding multiple users, use a space-separated list. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost channel add {channel} {users} + mattermost channel add {channel} {users} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost channel add 8soyabwthjnf9qibfztje5a36h user@example.com username - bin/mattermost channel add myteam:mychannel user@example.com username + bin/mattermost channel add 8soyabwthjnf9qibfztje5a36h user@example.com username + bin/mattermost channel add myteam:mychannel user@example.com username mattermost channel archive ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel archive `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel archive `__. Description - Archive a channel. Archived channels are not accessible to users, but remain in the database. To restore a channel from the archive, see `mattermost channel restore`_. Channels can be specified by {team}:{channel} using the team and channel names, or by using channel IDs. Channel IDs can be obtained via the `API `_ or the `mattermost channel search `__ command. + Archive a channel. Archived channels are not accessible to users, but remain in the database. To restore a channel from the archive, see `mattermost channel restore`_. Channels can be specified by {team}:{channel} using the team and channel names, or by using channel IDs. Channel IDs can be obtained via the `API `_ or the `mattermost channel search `__ command. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost channel archive {channels} + mattermost channel archive {channels} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost channel archive 8soyabwthjnf9qibfztje5a36h - bin/mattermost channel archive myteam:mychannel + bin/mattermost channel archive 8soyabwthjnf9qibfztje5a36h + bin/mattermost channel archive myteam:mychannel mattermost channel create ~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel create `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel create `__. Description - Create a channel. + Create a channel. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost channel create + mattermost channel create - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost channel create --team myteam --name mynewchannel --display_name "My New Channel" - bin/mattermost channel create --team myteam --name mynewprivatechannel --display_name "My New Private Channel" --private + bin/mattermost channel create --team myteam --name mynewchannel --display_name "My New Channel" + bin/mattermost channel create --team myteam --name mynewprivatechannel --display_name "My New Private Channel" --private - Options - .. code-block:: none +Options + .. code-block:: none - --display_name string Channel Display Name - --header string Channel header - --name string Channel Name - --private Create a private channel. - --purpose string Channel purpose - --team string Team name or ID + --display_name string Channel Display Name + --header string Channel header + --name string Channel Name + --private Create a private channel. + --purpose string Channel purpose + --team string Team name or ID mattermost channel delete ~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel delete `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel delete `__. Description - Permanently delete a channel along with all related information, including posts from the database. Channels can be specified by {team}:{channel} using the team and channel names, or by using channel IDs. Channel IDs can be obtained via the `API `_ or the `mattermost channel search `__ command. + Permanently delete a channel along with all related information, including posts from the database. Channels can be specified by {team}:{channel} using the team and channel names, or by using channel IDs. Channel IDs can be obtained via the `API `_ or the `mattermost channel search `__ command. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost channel delete {channels} + mattermost channel delete {channels} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost channel delete 8soyabwthjnf9qibfztje5a36h - bin/mattermost channel delete myteam:mychannel + bin/mattermost channel delete 8soyabwthjnf9qibfztje5a36h + bin/mattermost channel delete myteam:mychannel mattermost channel list ~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel list `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel list `__. Description - List all channels on a specified team. Private channels are appended with ``(private)`` and archived channels are appended with ``(archived)``. + List all channels on a specified team. Private channels are appended with ``(private)`` and archived channels are appended with ``(archived)``. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost channel list {teams} + mattermost channel list {teams} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost channel list myteam + bin/mattermost channel list myteam mattermost channel modify ~~~~~~~~~~~~~~~~~~~~~~~~~ Description - Modify a channel's public/private type. + Modify a channel's public/private type. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost channel modify + mattermost channel modify - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost channel modify myteam:mychannel --username myusername --private + bin/mattermost channel modify myteam:mychannel --username myusername --private - Options - .. code-block:: none +Options + .. code-block:: none - --username [REQUIRED] Username of the user who is changing the channel privacy. - --public Change a private channel to be public. - --private Change a public channel to be private. + --username [REQUIRED] Username of the user who is changing the channel privacy. + --public Change a private channel to be public. + --private Change a public channel to be private. mattermost channel move ~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel move `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel move `__. Description - Move channels to another team. The command validates that all users in the channel belong to the target team. Incoming/outgoing webhooks are moved along with the channel. Channels can be specified by ``[team]:[channel]`` or by using channel IDs. Channel IDs can be obtained via the `API `_ or the `mattermost channel search `__ command. + Move channels to another team. The command validates that all users in the channel belong to the target team. Incoming/outgoing webhooks are moved along with the channel. Channels can be specified by ``[team]:[channel]`` or by using channel IDs. Channel IDs can be obtained via the `API `_ or the `mattermost channel search `__ command. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost channel move + mattermost channel move - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost channel move newteam 8soyabwthjnf9qibfztje5a36h --username myusername - bin/mattermost channel move newteam myteam:mychannel --username myusername + bin/mattermost channel move newteam 8soyabwthjnf9qibfztje5a36h --username myusername + bin/mattermost channel move newteam myteam:mychannel --username myusername - Options - .. code-block:: none +Options + .. code-block:: none - --username [REQUIRED] Username of the user who is moving the team. - --remove-deactivated-users [OPTIONAL] When moving the channel, remove any users who have been deactivated who may be preventing the move. + --username [REQUIRED] Username of the user who is moving the team. + --remove-deactivated-users [OPTIONAL] When moving the channel, remove any users who have been deactivated who may be preventing the move. mattermost channel remove ~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel remove `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel remove `__. Description - Remove users from a channel. + Remove users from a channel. - Format - .. code-block:: none +Format + .. code-block:: none mattermost channel remove {channel} {users} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost channel remove 8soyabwthjnf9qibfztje5a36h user@example.com username - bin/mattermost channel remove myteam:mychannel user@example.com username - bin/mattermost channel remove myteam:mychannel --all-users + bin/mattermost channel remove 8soyabwthjnf9qibfztje5a36h user@example.com username + bin/mattermost channel remove myteam:mychannel user@example.com username + bin/mattermost channel remove myteam:mychannel --all-users - Options - .. code-block:: none +Options + .. code-block:: none - --all-users string Remove all users from the channel. + --all-users string Remove all users from the channel. mattermost channel rename ~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel rename `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel rename `__. Description - Rename a channel. Channels can be specified by *{team}:{channel}* using the team and channel names, or by using channel IDs. Channel IDs can be obtained via the `API `_ or the `mattermost channel search `__ command. + Rename a channel. Channels can be specified by *{team}:{channel}* using the team and channel names, or by using channel IDs. Channel IDs can be obtained via the `API `_ or the `mattermost channel search `__ command. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost channel rename {channel} newchannelname --display_name "New Display Name" + mattermost channel rename {channel} newchannelname --display_name "New Display Name" - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost channel rename 8soyabwthjnf9qibfztje5a36h newchannelname --display_name "New Display Name" - bin/mattermost channel rename myteam:mychannel newchannelname --display_name "New Display Name" + bin/mattermost channel rename 8soyabwthjnf9qibfztje5a36h newchannelname --display_name "New Display Name" + bin/mattermost channel rename myteam:mychannel newchannelname --display_name "New Display Name" - Options - .. code-block:: none +Options + .. code-block:: none - --display_name string Channel Display Name + --display_name string Channel Display Name mattermost channel restore ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel restore `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel restore `__. Description - Restore a channel from the archive. Channels can be specified by {team}:{channel} using the team and channel names, or by using channel IDs. Channel IDs can be obtained via the `API `_ or the `mattermost channel search `__ command. + Restore a channel from the archive. Channels can be specified by {team}:{channel} using the team and channel names, or by using channel IDs. Channel IDs can be obtained via the `API `_ or the `mattermost channel search `__ command. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost channel restore {channels} + mattermost channel restore {channels} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost channel restore 8soyabwthjnf9qibfztje5a36h - bin/mattermost channel restore myteam:mychannel + bin/mattermost channel restore 8soyabwthjnf9qibfztje5a36h + bin/mattermost channel restore myteam:mychannel mattermost channel search ~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel search `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl channel search `__. Description - Search for a channel by channel name. Returns channel display name, channel Id, and indicates if it is private or archived. Private channels are appended with ``(private)`` and archived channels are appended with ``(archived)``. + Search for a channel by channel name. Returns channel display name, channel Id, and indicates if it is private or archived. Private channels are appended with ``(private)`` and archived channels are appended with ``(archived)``. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost channel search {channelName} + mattermost channel search {channelName} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost channel search mychannel - bin/mattermost channel search --team myteam mychannel - bin/mattermost channel search --team f1924a8db44ff3bb41c96424cdc20676 mychannel + bin/mattermost channel search mychannel + bin/mattermost channel search --team myteam mychannel + bin/mattermost channel search --team f1924a8db44ff3bb41c96424cdc20676 mychannel - Options - .. code-block:: none +Options + .. code-block:: none - --team Team Name or Team ID + --team Team Name or Team ID + +---- mattermost command ------------------ - Description - Commands for slash command management. +Description + Commands for slash command management. - Child Commands - - `mattermost command create`_ - Create a custom slash command for a specified team. - - `mattermost command delete`_ - Delete a slash command. - - `mattermost command list`_ - List all commands on specified teams or all teams by default. - - `mattermost command modify`_ - Modify a slash command. - - `mattermost command move`_ - Move a slash command to a different team. - - `mattermost command show`_ - Show a custom slash command. +Child Commands + - `mattermost command create`_ - Create a custom slash command for a specified team. + - `mattermost command delete`_ - Delete a slash command. + - `mattermost command list`_ - List all commands on specified teams or all teams by default. + - `mattermost command modify`_ - Modify a slash command. + - `mattermost command move`_ - Move a slash command to a different team. + - `mattermost command show`_ - Show a custom slash command. mattermost command create ~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl command create `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl command create `__. Description - Create a custom slash command for a specified team. + Create a custom slash command for a specified team. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost command create + mattermost command create - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost command create myteam --title MyCommand --description "My Command Description" --trigger-word mycommand --url http://localhost:8000/my-slash-handler --creator myusername --response-username my-bot-username --icon http://localhost:8000/my-slash-handler-bot-icon.png --autocomplete --post + bin/mattermost command create myteam --title MyCommand --description "My Command Description" --trigger-word mycommand --url http://localhost:8000/my-slash-handler --creator myusername --response-username my-bot-username --icon http://localhost:8000/my-slash-handler-bot-icon.png --autocomplete --post - Options - .. code-block:: none +Options + .. code-block:: none - --title string Command Title - --description string Command Description - --trigger-word string [REQUIRED] Command Trigger Word - --url string [REQUIRED] Command Callback URL - --creator string [REQUIRED] Command Creator's Username - --response-username string Command Response Username - --icon string Command icon URL - --autocomplete bool Show command in autocomplete list - --autocompleteDesc string Short command description for autocomplete list - --autocompleteHint string Command arguments displayed as help in autocomplete list - --post bool Use POST method for callback URL + --title string Command Title + --description string Command Description + --trigger-word string [REQUIRED] Command Trigger Word + --url string [REQUIRED] Command Callback URL + --creator string [REQUIRED] Command Creator's Username + --response-username string Command Response Username + --icon string Command icon URL + --autocomplete bool Show command in autocomplete list + --autocompleteDesc string Short command description for autocomplete list + --autocompleteHint string Command arguments displayed as help in autocomplete list + --post bool Use POST method for callback URL mattermost command delete ~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl command delete `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl command delete `__. Description - Delete a slash command. Commands can be specified by command ID. + Delete a slash command. Commands can be specified by command ID. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost command delete {commandID} + mattermost command delete {commandID} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost command delete commandID + bin/mattermost command delete commandID mattermost command list ~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl command list `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl command list `__. Description - List all commands on specified teams or all teams by default. + List all commands on specified teams or all teams by default. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost command list {team} + mattermost command list {team} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost command list myteam + bin/mattermost command list myteam mattermost command modify ~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Modify a slash command. Commands can be specified by command ID. +Description + Modify a slash command. Commands can be specified by command ID. .. note:: - Only fields that you want to modify need to be specified. Also, when modifying the command's creator, the new creator specified must have the permission to create commands. + Only fields that you want to modify need to be specified. Also, when modifying the command's creator, the new creator specified must have the permission to create commands. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost command modify {commandID} + mattermost command modify {commandID} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost command modify commandID --title MyModifiedCommand --description "My Modified Command Description" --trigger-word mycommand --url http://localhost:8000/my-slash-handler --creator myusername --response-username my-bot-username --icon http://localhost:8000/my-slash-handler-bot-icon.png --autocomplete --post + bin/mattermost command modify commandID --title MyModifiedCommand --description "My Modified Command Description" --trigger-word mycommand --url http://localhost:8000/my-slash-handler --creator myusername --response-username my-bot-username --icon http://localhost:8000/my-slash-handler-bot-icon.png --autocomplete --post - Options - .. code-block:: none +Options + .. code-block:: none - --title string Command Title - --description string Command Description - --trigger-word string Command Trigger Word - --url string Command Callback URL - --creator string Command Creator's Username - --response-username string Command Response Username - --icon string Command Icon URL - --autocomplete bool Show command in autocomplete list - --autocompleteDesc string Short command description for autocomplete list - --autocompleteHint string Command arguments displayed as help in autocomplete list - --post bool Use POST method for callback URL, else use GET method + --title string Command Title + --description string Command Description + --trigger-word string Command Trigger Word + --url string Command Callback URL + --creator string Command Creator's Username + --response-username string Command Response Username + --icon string Command Icon URL + --autocomplete bool Show command in autocomplete list + --autocompleteDesc string Short command description for autocomplete list + --autocompleteHint string Command arguments displayed as help in autocomplete list + --post bool Use POST method for callback URL, else use GET method mattermost command move ~~~~~~~~~~~~~~~~~~~~~~~ - Description - Move a slash command to a different team. Commands can be specified by {team}:{command-trigger-word}, or by using command IDs. +Description + Move a slash command to a different team. Commands can be specified by {team}:{command-trigger-word}, or by using command IDs. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost command move + mattermost command move - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost command move newteam oldteam:command-trigger-word - bin/mattermost command move newteam o8soyabwthjnf9qibfztje5a36h + bin/mattermost command move newteam oldteam:command-trigger-word + bin/mattermost command move newteam o8soyabwthjnf9qibfztje5a36h mattermost command show ~~~~~~~~~~~~~~~~~~~~~~~ - Description - Show a custom slash command. Commands can be specified by command ID. Returns command ID, team ID, trigger word, display name and creator username. +Description + Show a custom slash command. Commands can be specified by command ID. Returns command ID, team ID, trigger word, display name and creator username. - Format - .. code-block:: none +Format + .. code-block:: none - command show {commandID} + command show {commandID} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost command show commandID + bin/mattermost command show commandID + +---- mattermost config ----------------- - Description - Commands for managing the configuration file. +Description + Commands for managing the configuration file. - Child Command - - `mattermost config get`_ - Retrieve the value of a config setting by its name in dot notation. - - `mattermost config migrate`_ - Migrate a file-based configuration to (or from) a database-based configuration. - - `mattermost config reset`_ - Resets the value of a config setting by its name in dot notation or a setting section. - - `mattermost config set`_ - Set the value of a config setting by its name in dot notation. - - `mattermost config show`_ - Print the current mattermost configuration in an easy to read format. - - `mattermost config validate`_ - Validate the configuration file. +Child Command + - `mattermost config get`_ - Retrieve the value of a config setting by its name in dot notation. + - `mattermost config migrate`_ - Migrate a file-based configuration to (or from) a database-based configuration. + - `mattermost config reset`_ - Resets the value of a config setting by its name in dot notation or a setting section. + - `mattermost config set`_ - Set the value of a config setting by its name in dot notation. + - `mattermost config show`_ - Print the current mattermost configuration in an easy to read format. + - `mattermost config validate`_ - Validate the configuration file. mattermost config get ~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl config get `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl config get `__. Description - Retrieve the value of a config setting by its name in dot notation. + Retrieve the value of a config setting by its name in dot notation. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost config get {config.name} + mattermost config get {config.name} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost config get SqlSettings.DriverName + bin/mattermost config get SqlSettings.DriverName - Options - .. code-block:: none +Options + .. code-block:: none - --path string Optional subpath; defaults to value in Site URL. + --path string Optional subpath; defaults to value in Site URL. mattermost config migrate ~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Migrate a file-based configuration to (or from) a database-based configuration. Point the Mattermost server at the target configuration to start using it. If using SAML, ensure the SAML certificates and keys are accessible to also migrate into the database. +Description + Migrate a file-based configuration to (or from) a database-based configuration. Point the Mattermost server at the target configuration to start using it. If using SAML, ensure the SAML certificates and keys are accessible to also migrate into the database. .. note:: - If a ``from`` parameter is not specified, the command will fall back to what is specified in --config. + If a ``from`` parameter is not specified, the command will fall back to what is specified in --config. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost config migrate {config to read} {config to write} + mattermost config migrate {config to read} {config to write} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost config migrate path/to/config.json "postgres://mmuser:mostest@dockerhost:5432/mattermost_test?sslmode=disable&connect_timeout=10" + bin/mattermost config migrate path/to/config.json "postgres://mmuser:mostest@dockerhost:5432/mattermost_test?sslmode=disable&connect_timeout=10" mattermost config reset ~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Resets the value of a config setting by its name in dot notation or a setting section to the default value. Accepts multiple values for array settings. When no parameters are given, it will reset all config settings. +Description + Resets the value of a config setting by its name in dot notation or a setting section to the default value. Accepts multiple values for array settings. When no parameters are given, it will reset all config settings. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost config reset {config.name} {setting section} + mattermost config reset {config.name} {setting section} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost config reset SqlSettings.DriverName LogSettings + bin/mattermost config reset SqlSettings.DriverName LogSettings - Options - .. code-block:: none +Options + .. code-block:: none - --confirm Confirm you really want to reset the config setting and a backup has been performed. + --confirm Confirm you really want to reset the config setting and a backup has been performed. mattermost config set ~~~~~~~~~~~~~~~~~~~~~ - Description +Description Set the value of a config setting by its name in dot notation. Accepts multiple values for array settings. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost config set {config.name} {setting new value} + mattermost config set {config.name} {setting new value} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost config set SqlSettings.DriverName mysql + bin/mattermost config set SqlSettings.DriverName postgres - Options - .. code-block:: none +Options + .. code-block:: none - --path string Optional subpath; defaults to value in Site URL. + --path string Optional subpath; defaults to value in Site URL. mattermost config show ~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl config `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl config `__. Description - Print the current mattermost configuration in an easy to read format. + Print the current mattermost configuration in an easy to read format. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost config show + mattermost config show - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost config show + bin/mattermost config show mattermost config validate ~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Makes sure the configuration file has the following properties: +Description + Makes sure the configuration file has the following properties: + + - Is valid JSON. + - Has attributes of the correct type, such as *bool*, *int*, and *str*. + - All entries are valid. For example, checks that entries are below the maximum length. - - Is valid JSON. - - Has attributes of the correct type, such as *bool*, *int*, and *str*. - - All entries are valid. For example, checks that entries are below the maximum length. +Format + .. code-block:: none - Format - .. code-block:: none + mattermost config validate - mattermost config validate +Example + .. code-block:: none - Example - .. code-block:: none + bin/mattermost config validate + +---- - bin/mattermost config validate - mattermost db init ------------------ - Description +Description Initializes the database for a given data source name (DSN), executes migrations, and loads custom defaults when specified. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost db init + mattermost db init - Examples - - Use the ``config`` flag to pass the DSN: +Examples + Use the ``config`` flag to pass the DSN: - .. code-block:: none + .. code-block:: none - mattermost db init --config postgres://localhost/mattermost + mattermost db init --config postgres://localhost/mattermost - Run this command to use the ``MM_CONFIG`` environment variable: + Run this command to use the ``MM_CONFIG`` environment variable: - .. code-block:: none + .. code-block:: none - MM_CONFIG=postgres://localhost/mattermost mattermost db init + MM_CONFIG=postgres://localhost/mattermost mattermost db init - Run this command to set a custom defaults file to be loaded into the database: + Run this command to set a custom defaults file to be loaded into the database: - .. code-block:: none + .. code-block:: none - MM_CUSTOM_DEFAULTS_PATH=custom.json MM_CONFIG=postgres://localhost/mattermost mattermost db init - + MM_CUSTOM_DEFAULTS_PATH=custom.json MM_CONFIG=postgres://localhost/mattermost mattermost db init + +---- + mattermost db migrate --------------------- - Description - Migrates the database schema if there are any unapplied migrations. +Description + Migrates the database schema if there are any unapplied migrations. + +Child Commands + - `mattermost db downgrade`_ - Roll back database migrations. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost db migrate + mattermost db migrate - Examples - - .. code-block:: none +Example + .. code-block:: none + + mattermost db migrate + +Options + .. code-block:: none + + --auto-recover bool If the migration plan receives an error during migrations, this command will try to rollback migrations already applied within the plan. Not recommended without reviewing migration plan by combining --save-plan and --dry-run options. + --save-plan bool Saves the plan for the migration into the file store so that it can be used for reviewing the plan or for downgrading. + --dry-run bool Does not apply the migrations, but it validates how the migration would run based on the given conditions. + +mattermost db downgrade +~~~~~~~~~~~~~~~~~~~~~~~ + +Description + Rolls back database migrations. Requires either an update plan to roll back to, or comma-separated version numbers to be rolled back. + +Format + .. code-block:: none + + mattermost db downgrade + +Example + .. code-block:: none + + mattermost db downgrade 99,100,101 + +Options + .. code-block:: none + + -- string Runs the rollback migrations defined in the plan file. - mattermost db migrate +---- mattermost export ----------------- - Description - Commands for exporting data for compliance and for merging multiple Mattermost instances. +Description + Commands for exporting data for compliance and for merging multiple Mattermost instances. - Child Commands - - `mattermost export actiance`_ - Export data from Mattermost in Actiance XML format. Requires a Mattermost Enterprise subscription plan. - - `mattermost export bulk`_ - Export data to a file compatible with the Mattermost `Bulk Import format `__ - - `mattermost export csv`_ - Export data from Mattermost in CSV format. Requires a Mattermost Enterprise subscription plan. - - `mattermost export global-relay-zip`_ - Export data from Mattermost into a ZIP file containing emails to send to Global Relay for debug and testing purposes only. Requires a Mattermost Enterprise subscription plan. - - `mattermost export schedule`_ - Schedule an export job +Child Commands + - `mattermost export actiance`_ - Export data from Mattermost in Actiance XML format. Requires a Mattermost Enterprise subscription plan. + - `mattermost export bulk`_ - Export data to a file compatible with the Mattermost `Bulk Import format `__ + - `mattermost export csv`_ - Export data from Mattermost in CSV format. Requires a Mattermost Enterprise subscription plan. + - `mattermost export global-relay-zip`_ - Export data from Mattermost into a ZIP file containing emails to send to Global Relay for debug and testing purposes only. Requires a Mattermost Enterprise subscription plan. + - `mattermost export schedule`_ - Schedule an export job mattermost export actiance ~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description +Description Export data from Mattermost in Actiance XML format. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost export actiance + mattermost export actiance - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost export actiance --exportFrom=1513102632 + bin/mattermost export actiance --exportFrom=1513102632 - Options - .. code-block:: none +Options + .. code-block:: none - --exportFrom string Unix timestamp (milliseconds since epoch, UTC) to export data from. - --batchSize int The number of posts to export. The default of -1 means no limit. + --exportFrom string Unix timestamp (milliseconds since epoch, UTC) to export data from. + --batchSize int The number of posts to export. The default of -1 means no limit. mattermost export bulk ~~~~~~~~~~~~~~~~~~~~~~ - Description - Export data to a file compatible with the Mattermost `Bulk Import format `__. +Description + Export data to a file compatible with the Mattermost `Bulk Import format `__. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost export bulk + mattermost export bulk - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost export bulk file.json --all-teams + bin/mattermost export bulk file.json --all-teams - Options - .. code-block:: none +Options + .. code-block:: none - --all-teams bool [REQUIRED] Export all teams from the server. - --attachments bool Also export file attachments. - --archive bool Outputs a single archive file. + --all-teams bool [REQUIRED] Export all teams from the server. + --attachments bool Also export file attachments. + --archive bool Outputs a single archive file. mattermost export csv ~~~~~~~~~~~~~~~~~~~~~ - Description - Export data from Mattermost in CSV format. +Description + Export data from Mattermost in CSV format. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost export csv + mattermost export csv - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost export csv --exportFrom=1513102632 + bin/mattermost export csv --exportFrom=1513102632 - Options - .. code-block:: none +Options + .. code-block:: none - --exportFrom string Unix timestamp (seconds since epoch, UTC) to export data from. - --batchSize int The number of posts to export. The default of -1 means no limit. + --exportFrom string Unix timestamp (seconds since epoch, UTC) to export data from. + --batchSize int The number of posts to export. The default of -1 means no limit. mattermost export global-relay-zip ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Export data from Mattermost into a zip file containing emails to send to Global Relay for debug and testing purposes only. This does not archive any information in Global Relay. +Description + Export data from Mattermost into a zip file containing emails to send to Global Relay for debug and testing purposes only. This does not archive any information in Global Relay. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost export global-relay-zip + mattermost export global-relay-zip - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost export global-relay-zip --exportFrom=1513102632 + bin/mattermost export global-relay-zip --exportFrom=1513102632 - Options - .. code-block:: none +Options + .. code-block:: none - --exportFrom string Unix timestamp (seconds since epoch, UTC) to export data from. - --batchSize int The number of posts to export. The default of -1 means no limit. + --exportFrom string Unix timestamp (seconds since epoch, UTC) to export data from. + --batchSize int The number of posts to export. The default of -1 means no limit. mattermost export schedule ~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description +Description Schedule an export job in a format suitable for importing into a third-party archive system. - Format - .. code-block:: none +Format + .. code-block:: none + + mattermost export schedule - mattermost export schedule +Example + .. code-block:: none - Example - .. code-block:: none + bin/mattermost export schedule --format=actiance --exportFrom=1513102632 - bin/mattermost export schedule --format=actiance --exportFrom=1513102632 +Options + .. code-block:: none - Options - .. code-block:: none + --format string Output file format. Currently, only ``actiance`` is supported. + --exportFrom string Unix timestamp (seconds since epoch, UTC) to export data from. + --timeoutSeconds string Set how long the export should run for before timing out. - --format string Output file format. Currently, only ``actiance`` is supported. - --exportFrom string Unix timestamp (seconds since epoch, UTC) to export data from. - --timeoutSeconds string Set how long the export should run for before timing out. +---- mattermost extract-documents-content ------------------------------------- - Description - Extracts and indexes the contents of files shared prior to upgrading to Mattermost Server v5.35. Running this command is strongly recommended since search results for past file contents may be incomplete. If this command isn't run, users can search older files based on filename only. +Description + Extracts and indexes the contents of files shared prior to upgrading to Mattermost Server v5.35. Running this command is strongly recommended since search results for past file contents may be incomplete. If this command isn't run, users can search older files based on filename only. - If you're using `Elasticsearch `__ search, you must rebuild the search index after running the content extraction command. + If you're using `Elasticsearch `__ search, you must rebuild the search index after running the content extraction command. - If you're using `Bleve `__ search, you must disable Bleve before running the content extraction command. Once extraction is complete, re-enable Bleve, then rebuild the search index. + If you're using `Bleve `__ search, you must disable Bleve before running the content extraction command. Once extraction is complete, re-enable Bleve, then rebuild the search index. - You can run this extraction command while the server is running. Running this command adds load to your server. For large deployments, or teams that share many large, text-heavy documents, we recommended you review our `hardware requirements `__, and test `enabling content search `__ in a staging environment before enabling it in a production environment. + You can run this extraction command while the server is running. Running this command adds load to your server. For large deployments, or teams that share many large, text-heavy documents, we recommended you review our `hardware requirements `__, and test `enabling content search `__ in a staging environment before enabling it in a production environment. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost extract-documents-content + mattermost extract-documents-content - Example - .. code-block:: none +Example + .. code-block:: none - extract-documents-content --from=12345 + extract-documents-content --from=12345 - Options - .. code-block:: none +Options + .. code-block:: none - --from Optional. Unix timestamp (seconds since epoch, UTC) of the earliest file to extract. (default 0) - --to Optional. Unix timestamp (seconds since epoch, UTC) of the latest file to extract. (default now) + --from Optional. Unix timestamp (seconds since epoch, UTC) of the earliest file to extract. (default 0) + --to Optional. Unix timestamp (seconds since epoch, UTC) of the latest file to extract. (default now) + +---- mattermost group ----------------- - Description - Commands for managing Mattermost groups. For more information on Mattermost groups please see `this documentation. `__. +Description + Commands for managing Mattermost groups. For more information on Mattermost groups please see `this documentation. `__. - Child Commands - - `mattermost group channel`_ - Management of Mattermost groups linked to channels - - `mattermost group team`_ - Management of Mattermost groups linked to teams +Child Commands + - `mattermost group channel`_ - Management of Mattermost groups linked to channels + - `mattermost group team`_ - Management of Mattermost groups linked to teams + +---- mattermost group channel ------------------------ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel `__. - Description - Commands for managing Mattermost groups linked to a channel. +Description + Commands for managing Mattermost groups linked to a channel. - Child Commands - - `mattermost group channel enable`_ - Enables group constraint on the specified channel - - `mattermost group channel disable`_ - Disables group constraint on the specified channel - - `mattermost group channel list`_ - Lists the groups associated with a channel - - `mattermost group channel status`_ - Shows the group constraint status of the specified channel +Child Commands + - `mattermost group channel enable`_ - Enables group constraint on the specified channel + - `mattermost group channel disable`_ - Disables group constraint on the specified channel + - `mattermost group channel list`_ - Lists the groups associated with a channel + - `mattermost group channel status`_ - Shows the group constraint status of the specified channel mattermost group channel enable ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel enable `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel enable `__. - Description - Enables group constraint on the specified channel. When a channel is group constrained, channel membership is managed by linked groups instead of managed by manually adding and removing users. +Description + Enables group constraint on the specified channel. When a channel is group constrained, channel membership is managed by linked groups instead of managed by manually adding and removing users. .. note:: To enable a group constraint on a specific channel, you must already have at least one group associated. See `AD/LDAP Group documentation `_ for more details on how to associate a group to a channel. +Format + .. code-block:: none - Format - .. code-block:: none + mattermost group channel enable {team}:{channel} - mattermost group channel enable {team}:{channel} +Examples + .. code-block:: none - Examples - .. code-block:: none - - bin/mattermost group channel enable myteam:mychannel + bin/mattermost group channel enable myteam:mychannel mattermost group channel disable ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel disable `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel disable `__. Description Disables group constraint on the specified channel. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost group channel disable {team}:{channel} + mattermost group channel disable {team}:{channel} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost group channel disable myteam:mychannel + bin/mattermost group channel disable myteam:mychannel mattermost group channel list ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel list `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel list `__. Description Lists the groups associated with a channel. - Format - .. code-block:: none - - mattermost group channel list {team}:{channel} +Format + .. code-block:: none - Examples - .. code-block:: none + mattermost group channel list {team}:{channel} - bin/mattermost group channel list myteam:mychannel +Examples + .. code-block:: none + bin/mattermost group channel list myteam:mychannel mattermost group channel status ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel status `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group channel status `__. Description - Shows the group constraint status of the specified channel. Returns "Enabled" when channel membership is managed by linked groups. Returns "Disabled" when the channel membership is managed by manually adding and removing users. + Shows the group constraint status of the specified channel. Returns "Enabled" when channel membership is managed by linked groups. Returns "Disabled" when the channel membership is managed by manually adding and removing users. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost group channel status {team}:{channel} + mattermost group channel status {team}:{channel} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost group channel status myteam:mychannel + bin/mattermost group channel status myteam:mychannel + +---- mattermost group team ------------------------ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team `__. Description - Commands for managing Mattermost groups linked to a team. + Commands for managing Mattermost groups linked to a team. - Child Commands - - `mattermost group team enable`_ - Enables group constraint on the specified team - - `mattermost group team disable`_ - Disables group constraint on the specified team - - `mattermost group team list`_ - Lists the groups associated with a team - - `mattermost group team status`_ - Shows the group constraint status of the specified team +Child Commands + - `mattermost group team enable`_ - Enables group constraint on the specified team + - `mattermost group team disable`_ - Disables group constraint on the specified team + - `mattermost group team list`_ - Lists the groups associated with a team + - `mattermost group team status`_ - Shows the group constraint status of the specified team mattermost group team enable ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - TIn Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team enable `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team enable `__. Description - Enables group constraint on the specified team. When a team is group constrained, team membership is managed by linked groups instead of managed by manually inviting and removing users. + Enables group constraint on the specified team. When a team is group constrained, team membership is managed by linked groups instead of managed by manually inviting and removing users. .. note:: To enable a group constraint on a specific team, you must already have at least one group associated. See `AD/LDAP Group documentation `_ for more details on how to associate a group to a team. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost group team enable {team} + mattermost group team enable {team} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost group team enable myteam + bin/mattermost group team enable myteam mattermost group team disable ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team disable `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team disable `__. Description - Disables group constraint on the specified team. + Disables group constraint on the specified team. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost group team disable {team} + mattermost group team disable {team} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost group team disable myteam + bin/mattermost group team disable myteam mattermost group team list ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team list `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team list `__. Description - Lists the groups associated with a team. - - Format - .. code-block:: none + Lists the groups associated with a team. - mattermost group team list {team} +Format + .. code-block:: none - Examples - .. code-block:: none + mattermost group team list {team} - bin/mattermost group team list myteam +Examples + .. code-block:: none + bin/mattermost group team list myteam mattermost group team status -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team status `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl group team status `__. Description - Shows the group constraint status of the specified team. Returns "Enabled" when team membership is managed by linked groups. Returns "Disabled" when the team membership is managed by manually inviting and removing users. + Shows the group constraint status of the specified team. Returns "Enabled" when team membership is managed by linked groups. Returns "Disabled" when the team membership is managed by manually inviting and removing users. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost group team status {team} + mattermost group team status {team} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost group team status myteam + bin/mattermost group team status myteam + +---- mattermost help --------------- - Description - Generate full documentation in Markdown format for the Mattermost command line tools. +Description + Generate full documentation in Markdown format for the Mattermost command line tools. + +Format + .. code-block:: none - Format - .. code-block:: none + mattermost help {outputdir} - mattermost help {outputdir} +---- mattermost import ----------------- - Description - Import data into Mattermost. +Description + Import data into Mattermost. - Child Command - - `mattermost import bulk`_ - Import a Mattermost Bulk Import File. - - `mattermost import slack`_ - Import a team from Slack. +Child Command + - `mattermost import bulk`_ - Import a Mattermost Bulk Import File. + - `mattermost import slack`_ - Import a team from Slack. mattermost import bulk ~~~~~~~~~~~~~~~~~~~~~~ - Description +Description Import data from a Mattermost Bulk Import File. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost import bulk {file} + mattermost import bulk {file} - Options - .. code-block:: none +Options + .. code-block:: none - --apply Save the import data to the database. Use with caution - this cannot be reverted. - --validate Validate the import data without making any changes to the system. - --workers int How many workers to run whilst doing the import. (default 2) + --apply Save the import data to the database. Use with caution - this cannot be reverted. + --validate Validate the import data without making any changes to the system. + -workers int How many workers to run whilst doing the import. (default 2) - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost import bulk bulk-file.jsonl + bin/mattermost import bulk bulk-file.jsonl mattermost import slack ~~~~~~~~~~~~~~~~~~~~~~~ - Description - Import a team from a Slack export zip file. +Description + Import a team from a Slack export zip file. + +Format + . code-block:: none - Format - .. code-block:: none + mattermost import slack {team} {file} - mattermost import slack {team} {file} +Example + .. code-block:: none - Example - .. code-block:: none + bin/mattermost import slack myteam slack_export.zip - bin/mattermost import slack myteam slack_export.zip +---- mattermost integrity -------------------- - Description +Description Check database schema integrity as well as referential integrity of channels, slash commands, webhooks, posts, schemes, sessions, users, and teams. This process may temporarily affect live system performance, and should be used during off-peak periods. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost integrity + mattermost integrity - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost integrity --confirm --verbose + bin/mattermost integrity --confirm --verbose - Options - .. code-block:: none +Options + .. code-block:: none - --confirm Optional. Skip the confirmation message which indicates that the complete integrity check may temporarily harm system performance. This is not recommended in production environments. - --verbose Outputs a detailed report of number and type of orphaned records including ids (if any). + --confirm Optional. Skip the confirmation message which indicates that the complete integrity check may temporarily harm system performance. This is not recommended in production environments. + --verbose Outputs a detailed report of number and type of orphaned records including ids (if any). +---- .. _command-line-tools-mattermost-jobserver: mattermost jobserver -------------------- - Description - Start the Mattermost job server. +Description + Start the Mattermost job server. + +Format + .. code-block:: none - Format - .. code-block:: none + mattermost jobserver - mattermost jobserver +Example + .. code-block:: none - Example - .. code-block:: none + bin/mattermost jobserver - bin/mattermost jobserver +---- mattermost ldap --------------- - Description - Commands to configure and synchronize AD/LDAP. +Description + Commands to configure and synchronize AD/LDAP. - Child Command - - `mattermost ldap idmigrate`_ - Migrate the LDAP Id Attribute to a new value - - `mattermost ldap sync`_ - Synchronize now +Child Command + - `mattermost ldap idmigrate`_ - Migrate the LDAP Id Attribute to a new value + - `mattermost ldap sync`_ - Synchronize now mattermost ldap idmigrate ~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Migrate LDAP Id Attribute to new value. +Description + Migrate LDAP Id Attribute to new value. - Run this utility to change the value of your ID Attribute without your users losing their accounts. After running the command you can change the ID Attribute to the new value in your ``config.json``. For example, if your current ID Attribute was ``sAMAccountName`` and you wanted to change it to ``objectGUID``, you would: + Run this utility to change the value of your ID Attribute without your users losing their accounts. After running the command you can change the ID Attribute to the new value in your ``config.json``. For example, if your current ID Attribute was ``sAMAccountName`` and you wanted to change it to ``objectGUID``, you would: - 1. Wait for an off-peak time when your users won't be impacted by a server restart. - 2. Run the command ``mattermost ldap idmigrate objectGUID``. - 3. Edit your ``config.json`` and change your ``IdAttribute`` field to the new value ``objectGUID``. - 4. Restart the Mattermost server. + 1. Wait for an off-peak time when your users won't be impacted by a server restart. + 2. Run the command ``mattermost ldap idmigrate objectGUID``. + 3. Edit your ``config.json`` and change your ``IdAttribute`` field to the new value ``objectGUID``. + 4. Restart the Mattermost server. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost ldap idmigrate {attribute} + mattermost ldap idmigrate {attribute} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost ldap idmigrate objectGUID + bin/mattermost ldap idmigrate objectGUID mattermost ldap sync ~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl ldap sync `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl ldap sync `__. Description - Synchronize all AD/LDAP users now. + Synchronize all AD/LDAP users now. + +Format + .. code-block:: none - Format - .. code-block:: none + mattermost ldap sync - mattermost ldap sync +Example + .. code-block:: none - Example - .. code-block:: none + bin/mattermost ldap sync - bin/mattermost ldap sync +---- mattermost license ------------------ - Description - Commands to manage licensing. +Description + Commands to manage licensing. - Child Command - - `mattermost license upload`_ - Upload a license. +Child Command + - `mattermost license upload`_ - Upload a license. mattermost license upload ~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl license upload `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl license upload `__. Description - Upload a license. This command replaces the current license if one is already uploaded. + Upload a license. This command replaces the current license if one is already uploaded. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost license upload {license} + mattermost license upload {license} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost license upload /path/to/license/mylicensefile.mattermost-license + bin/mattermost license upload /path/to/license/mylicensefile.mattermost-license .. note:: The Mattermost server needs to be restarted after uploading a license file for any changes to take effect. Also, for cluster setups the license file needs to be uploaded to every node. +---- + mattermost logs ------------------- +---------------- .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl logs `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl logs `__. Description - Displays Mattermost logs in a human-readable format. + Displays Mattermost logs in a human-readable format. - Format - .. code-block:: none +Format + .. code-block:: none mattermost logs - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost logs --logrus + bin/mattermost logs --logrus - Options - .. code-block:: none +Options + .. code-block:: none - --logrus Displays Mattermost logs in `logrus format `_. Else, standard output is returned. + --logrus Displays Mattermost logs in `logrus format `_. Else, standard output is returned. +---- mattermost permissions ---------------------- - Description - Commands to manage advanced permissions. +Description + Commands to manage advanced permissions. - Child Commands - - `mattermost permissions export`_ - Export Schemes and Roles. - - `mattermost permissions import`_ - Import Schemes and Roles from a permissions export. - - `mattermost permissions reset`_ - Reset the permissions system to its default state on new installs. +Child Commands + - `mattermost permissions export`_ - Export Schemes and Roles. + - `mattermost permissions import`_ - Import Schemes and Roles from a permissions export. + - `mattermost permissions reset`_ - Reset the permissions system to its default state on new installs. mattermost permissions export ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Prints to stdout a jsonl representation of Schemes and Roles from a Mattermost instance. Used to export - Roles and Schemes from one Mattermost instance to another. The output is a jsonl representation with - each line containing a json representation of a Scheme and its associated Roles. The output is intended - to be used as the input of `mattermost permissions import`. +Description + Prints to stdout a jsonl representation of Schemes and Roles from a Mattermost instance. Used to export + Roles and Schemes from one Mattermost instance to another. The output is a jsonl representation with + each line containing a json representation of a Scheme and its associated Roles. The output is intended + to be used as the input of `mattermost permissions import`. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost permissions export + mattermost permissions export - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost permissions export > my-permissions-export.jsonl + bin/mattermost permissions export > my-permissions-export.jsonl mattermost permissions import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Creates Roles and Schemes on a Mattermost instance from a jsonl input file in the format outputted by - `mattermost permissions export`. +Description + Creates Roles and Schemes on a Mattermost instance from a jsonl input file in the format outputted by + `mattermost permissions export`. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost permissions import {file} + mattermost permissions import {file} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost permissions import my-permissions-export.jsonl + bin/mattermost permissions import my-permissions-export.jsonl mattermost permissions reset ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Reset permissions for all users, including Admins, to their default state on new installs. Note: **this will delete - all custom schemes**. +Description + Reset permissions for all users, including Admins, to their default state on new installs. Note: **this will delete + all custom schemes**. + +Format + .. code-block:: none - Format - .. code-block:: none + mattermost permissions reset - mattermost permissions reset +Example + .. code-block:: none - Example - .. code-block:: none + bin/mattermost permissions reset - bin/mattermost permissions reset +Options + .. code-block:: none - Options - .. code-block:: none + --confirm Confirm you really want to reset the permissions system and a DB backup has been performed. - --confirm Confirm you really want to reset the permissions system and a DB backup has been performed. +---- mattermost plugin ----------------- - Description - Commands to manage plugins. +Description + Commands to manage plugins. - Child Commands - - `mattermost plugin add`_ - Add plugins to your Mattermost server. - - `mattermost plugin delete`_ - Delete previously uploaded plugins. - - `mattermost plugin disable`_ - Disable plugins. - - `mattermost plugin enable`_ - Enable plugins for use. - - `mattermost plugin list`_ - List plugins installed on your Mattermost server. +Child Commands + - `mattermost plugin add`_ - Add plugins to your Mattermost server. + - `mattermost plugin delete`_ - Delete previously uploaded plugins. + - `mattermost plugin disable`_ - Disable plugins. + - `mattermost plugin enable`_ - Enable plugins for use. + - `mattermost plugin list`_ - List plugins installed on your Mattermost server. mattermost plugin add ~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin add `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin add `__. Description - Add plugins to your Mattermost server. If adding multiple plugins, use a space-separated list. + Add plugins to your Mattermost server. If adding multiple plugins, use a space-separated list. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost plugin add {plugin tar file} + mattermost plugin add {plugin tar file} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost plugin add hovercardexample.tar.gz pluginexample.tar.gz + bin/mattermost plugin add hovercardexample.tar.gz pluginexample.tar.gz mattermost plugin delete ~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin delete `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin delete `__. Description - Delete previously uploaded plugins from your Mattermost server. If deleting multiple plugins, use a space-separated list. + Delete previously uploaded plugins from your Mattermost server. If deleting multiple plugins, use a space-separated list. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost plugin delete {plugin_id} + mattermost plugin delete {plugin_id} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost plugin delete hovercardexample pluginexample + bin/mattermost plugin delete hovercardexample pluginexample mattermost plugin disable ~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin disable `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin disable `__. Description - Disable plugins. Disabled plugins are immediately removed from the user interface and logged out of all sessions. If disabling multiple plugins, use a space-separated list. + Disable plugins. Disabled plugins are immediately removed from the user interface and logged out of all sessions. If disabling multiple plugins, use a space-separated list. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost plugin disable {plugin_id} + mattermost plugin disable {plugin_id} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost plugin disable hovercardexample pluginexample + bin/mattermost plugin disable hovercardexample pluginexample mattermost plugin enable ~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin enable `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin enable `__. Description - Enable plugins for use on your Mattermost server. If enabling multiple plugins, use a space-separated list. + Enable plugins for use on your Mattermost server. If enabling multiple plugins, use a space-separated list. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost plugin enable {plugin_id} + mattermost plugin enable {plugin_id} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost plugin enable hovercardexample pluginexample + bin/mattermost plugin enable hovercardexample pluginexample mattermost plugin list ~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin list `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl plugin list `__. Description - List all active and inactive plugins installed on your Mattermost server. + List all active and inactive plugins installed on your Mattermost server. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost plugin list + mattermost plugin list - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost plugin list + bin/mattermost plugin list + +---- mattermost reset ---------------- - Description - Completely erase the database causing the loss of all data. This resets Mattermost to its initial state. +Description + Completely erase the database causing the loss of all data. This resets Mattermost to its initial state. + +Format + .. code-block:: none - Format - .. code-block:: none + mattermost reset - mattermost reset +Options + .. code-block:: none - Options - .. code-block:: none + --confirm Confirm you really want to delete everything and a DB backup has been performed. - --confirm Confirm you really want to delete everything and a DB backup has been performed. +---- mattermost roles ---------------- - Description - Commands to manage user roles. +Description + Commands to manage user roles. - Child Commands - - `mattermost roles member`_ - Remove System Admin privileges from a user - - `mattermost roles system_admin`_ - Make a user into a System Admin +Child Commands + - `mattermost roles member`_ - Remove System Admin privileges from a user + - `mattermost roles system_admin`_ - Make a user into a System Admin mattermost roles member ~~~~~~~~~~~~~~~~~~~~~~~ - Description - Remove system admin privileges from a user. +Description + Remove system admin privileges from a user. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost roles member {users} + mattermost roles member {users} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost roles member user1 + bin/mattermost roles member user1 mattermost roles system\_admin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Promote a user to a System Admin. +Description + Promote a user to a System Admin. + +Format + .. code-block:: none - Format - .. code-block:: none + mattermost roles system_admin {users} - mattermost roles system_admin {users} +Example + .. code-block:: none - Example - .. code-block:: none + bin/mattermost roles system_admin user1 - bin/mattermost roles system_admin user1 +---- mattermost sampledata --------------------- - Description - .. versionadded:: 4.7 - Generate sample data and populate the Mattermost database. Supported in Mattermost v4.7 and later. +Description + Generate sample data and populate the Mattermost database. + + The command generates one user as the System Administrator with a username ``sysadmin`` and password ``Sys@dmin-sample1``. Other users are generated following an index, e.g. with username ``user-1`` and password ``SampleUs@r-1``. - The command generates one user as the System Administrator with a username ``sysadmin`` and password ``Sys@dmin-sample1``. Other users are generated following an index, e.g. with username ``user-1`` and password ``SampleUs@r-1``. +Format + .. code-block:: none - Format - .. code-block:: none + mattermost sampledata - mattermost sampledata +Example + .. code-block:: none - Example - .. code-block:: none + bin/mattermost sampledata --seed 10 --teams 4 --users 30 - bin/mattermost sampledata --seed 10 --teams 4 --users 30 +Options + .. code-block:: none - Options - .. code-block:: none + -u, --users int The number of sample users. (default 15) + --profile-images string Optional. Path to folder with images to randomly pick as user profile image. + -t, --teams int The number of sample teams. (default 2) + --team-memberships int The number of sample team memberships per user. (default 2) + --channels-per-team int The number of sample channels per team. (default 10) + --channel-memberships int The number of sample channel memberships per user in a team. (default 5) + --posts-per-channel int The number of sample post per channel. (default 100) + --direct-channels int The number of sample direct message channels. (default 30) + --group-channels int The number of sample group message channels. (default 15) + --posts-per-direct-channel int The number of sample posts per direct message channel. (default 15) + --posts-per-group-channel int The number of sample post per group message channel. (default 30) + -s, --seed int Seed used for generating the random data (Different seeds generate different data). (default 1) + -b, --bulk string Optional. Path to write a JSONL bulk file instead of loading into the database. + -w, --workers int How many workers to run during the import. (default 2) - -u, --users int The number of sample users. (default 15) - --profile-images string Optional. Path to folder with images to randomly pick as user profile image. - -t, --teams int The number of sample teams. (default 2) - --team-memberships int The number of sample team memberships per user. (default 2) - --channels-per-team int The number of sample channels per team. (default 10) - --channel-memberships int The number of sample channel memberships per user in a team. (default 5) - --posts-per-channel int The number of sample post per channel. (default 100) - --direct-channels int The number of sample direct message channels. (default 30) - --group-channels int The number of sample group message channels. (default 15) - --posts-per-direct-channel int The number of sample posts per direct message channel. (default 15) - --posts-per-group-channel int The number of sample post per group message channel. (default 30) - -s, --seed int Seed used for generating the random data (Different seeds generate different data). (default 1) - -b, --bulk string Optional. Path to write a JSONL bulk file instead of loading into the database. - -w, --workers int How many workers to run during the import. (default 2) +---- mattermost server ----------------- - Description - Runs the Mattermost server. +Description + Runs the Mattermost server. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost server + mattermost server + +---- mattermost team --------------- - Description - Commands to manage teams. - - Child Commands - - `mattermost team add`_ - Add users to a team. - - `mattermost team archive`_ - Archive teams based on name. - - `mattermost team create`_ - Create a team. - - `mattermost team delete`_ - Delete a team. - - `mattermost team list`_ - List all teams. - - `mattermost team modify`_ - Modify a team's public/private type. - - `mattermost team remove`_ - Remove users from a team. - - `mattermost team rename`_ - Rename a team. - - `mattermost team restore`_ - Restore a previously archived team. - - `mattermost team search`_ - Search for teams based on name. +Description + Commands to manage teams. + +Child Commands + - `mattermost team add`_ - Add users to a team. + - `mattermost team archive`_ - Archive teams based on name. + - `mattermost team create`_ - Create a team. + - `mattermost team delete`_ - Delete a team. + - `mattermost team list`_ - List all teams. + - `mattermost team modify`_ - Modify a team's public/private type. + - `mattermost team remove`_ - Remove users from a team. + - `mattermost team rename`_ - Rename a team. + - `mattermost team restore`_ - Restore a previously archived team. + - `mattermost team search`_ - Search for teams based on name. .. _team-value-note: .. note:: - **{team-name} value** + **{team-name} value** - For the *add*, *delete*, and *remove* commands, you can determine the *{team-name}* value from the URLs that you use to access your instance of Mattermost. For example, in the following URL the *{team-name}* value is *myteam*: + For the *add*, *delete*, and *remove* commands, you can determine the *{team-name}* value from the URLs that you use to access your instance of Mattermost. For example, in the following URL the *{team-name}* value is *myteam*: ``https://example.com/myteam/channels/mychannel`` - ``https://example.com/myteam/channels/mychannel`` - - Also, the team and channel names in the URL should be written in lowercase. + Also, the team and channel names in the URL should be written in lowercase. mattermost team add ~~~~~~~~~~~~~~~~~~~ .. note:: - TIn Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team add `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team add `__. Description Add users to a team. Before running this command, see the :ref:`note about {team-name} `. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost team add {team-name} {users} + mattermost team add {team-name} {users} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost team add myteam user@example.com username + bin/mattermost team add myteam user@example.com username mattermost team archive ~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team archive `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team archive `__. Description - Archive teams based on name. Before running this command, see the :ref:`note about {team-name} `. + Archive teams based on name. Before running this command, see the :ref:`note about {team-name} `. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost team archive {team} + mattermost team archive {team} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost team archive team1 + bin/mattermost team archive team1 mattermost team create ~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team create `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team create `__. Description - Create a team. + Create a team. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost team create + mattermost team create - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost team create --name mynewteam --display_name "My New Team" - bin/mattermost teams create --name private --display_name "My New Private Team" --private + bin/mattermost team create --name mynewteam --display_name "My New Team" + bin/mattermost teams create --name private --display_name "My New Private Team" --private - Options - .. code-block:: none +Options + .. code-block:: none - --display_name string Team Display Name - --email string Administrator Email (anyone with this email is automatically a team admin) - --name string Team Name - --private Create a private team. + --display_name string Team Display Name + --email string Administrator Email (anyone with this email is automatically a team admin) + --name string Team Name + --private Create a private team. mattermost team delete ~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team delete `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team delete `__. Description - Permanently delete a team along with all related information, including posts from the database. Before running this command, see the :ref:`note about {team-name} `. + Permanently delete a team along with all related information, including posts from the database. Before running this command, see the :ref:`note about {team-name} `. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost team delete {team-name} + mattermost team delete {team-name} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost team delete myteam + bin/mattermost team delete myteam - Options - .. code-block:: none +Options + .. code-block:: none - --confirm Confirm you really want to delete the team and a DB backup has been performed. + --confirm Confirm you really want to delete the team and a DB backup has been performed. mattermost team list ~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team list `__. - -*Supported in Mattermost v4.10 and later* + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team list `__. - Description - List all teams on the server. +Description + List all teams on the server. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost team list + mattermost team list - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost team list + bin/mattermost team list mattermost team modify ~~~~~~~~~~~~~~~~~~~~~~ - Description - Modify a team's public/private type. +Description + Modify a team's public/private type. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost team modify [team] [flag] + mattermost team modify [team] [flag] - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost modify team myteam --private - bin/mattermost modify team myteam --public + bin/mattermost modify team myteam --private + bin/mattermost modify team myteam --public mattermost team remove ~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team remove `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team remove `__. Description - Remove users from a team. Before running this command, see the :ref:`note about {team-name} `. + Remove users from a team. Before running this command, see the :ref:`note about {team-name} `. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost team remove {team-name} {users} + mattermost team remove {team-name} {users} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost team remove myteam user@example.com username + bin/mattermost team remove myteam user@example.com username mattermost team rename ~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team rename `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team rename `__. Description Rename a team. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost team rename {team} newteamname --display_name "New Display Name" + mattermost team rename {team} newteamname --display_name "New Display Name" - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost team rename myteam newteamname --display_name "New Display Name" + bin/mattermost team rename myteam newteamname --display_name "New Display Name" - Options - .. code-block:: none +Options + .. code-block:: none - --display_name string Team Display Name + --display_name string Team Display Name mattermost team restore ~~~~~~~~~~~~~~~~~~~~~~~ - Description - Restore a previously archived team. +Description + Restore a previously archived team. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost team restore {team} + mattermost team restore {team} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost team restore myteam + bin/mattermost team restore myteam mattermost team search ~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team search `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl team search `__. Description - Search for teams based on name. Before running this command, see the :ref:`note about {team-name} `. + Search for teams based on name. Before running this command, see the :ref:`note about {team-name} `. + +Format + .. code-block:: none - Format - .. code-block:: none + mattermost team search {team} - mattermost team search {team} +Examples + .. code-block:: none - Examples - .. code-block:: none + bin/mattermost team search team1 - bin/mattermost team search team1 +---- mattermost user --------------- - Description - Commands to manage users. - - Child Commands - - - `mattermost user activate`_ - Activate a user - - `mattermost user convert`_ - Convert a user to a bot, or a bot to a user - - `mattermost user create`_ - Create a user - - `mattermost user deactivate`_ - Deactivate a user - - `mattermost user delete`_ - Delete a user and all posts - - `mattermost user deleteall`_ - Delete all users and all posts - - `mattermost user email`_ - Set a user's email - - `mattermost user invite`_ - Send a user an email invitation to a team - - `mattermost user migrate_auth`_ - Mass migrate all user accounts to a new authentication type - - `mattermost user password`_ - Set a user's password - - `mattermost user resetmfa`_ - Turn off MFA for a user - - `mattermost user search`_ - Search for users based on username, email, or user ID - - `mattermost user verify`_ - Verify email address of a new user +Description + Commands to manage users. + +Child Commands + + - `mattermost user activate`_ - Activate a user + - `mattermost user convert`_ - Convert a user to a bot, or a bot to a user + - `mattermost user create`_ - Create a user + - `mattermost user deactivate`_ - Deactivate a user + - `mattermost user delete`_ - Delete a user and all posts + - `mattermost user deleteall`_ - Delete all users and all posts + - `mattermost user email`_ - Set a user's email + - `mattermost user invite`_ - Send a user an email invitation to a team + - `mattermost user migrate_auth`_ - Mass migrate all user accounts to a new authentication type + - `mattermost user password`_ - Set a user's password + - `mattermost user resetmfa`_ - Turn off MFA for a user + - `mattermost user search`_ - Search for users based on username, email, or user ID + - `mattermost user verify`_ - Verify email address of a new user ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1937,676 +1990,655 @@ mattermost user activate .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user activate `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user activate `__. Description - Activate users that have been deactivated. If activating multiple users, use a space-separated list. + Activate users that have been deactivated. If activating multiple users, use a space-separated list. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost user activate {emails, usernames, userIds} + mattermost user activate {emails, usernames, userIds} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost user activate user@example.com - bin/mattermost user activate username1 username2 + bin/mattermost user activate user@example.com + bin/mattermost user activate username1 username2 mattermost user convert ~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Convert a user to a bot, or convert a bot to a user account. +Description + Convert a user to a bot, or convert a bot to a user account. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost user convert {emails, usernames, userIds} --bot - OR - mattermost user convert {bot_id} --user --email {email_address} --password {new_password} + mattermost user convert {emails, usernames, userIds} --bot + OR + mattermost user convert {bot_id} --user --email {email_address} --password {new_password} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost user convert user@example.com --bot - bin/mattermost user convert username1 username2 --bot - bin/mattermost user convert old_bot --user --email real_user@example.com --password Password1 + bin/mattermost user convert user@example.com --bot + bin/mattermost user convert username1 username2 --bot + bin/mattermost user convert old_bot --user --email real_user@example.com --password Password1 - Options - .. code-block:: none +Options + .. code-block:: none - --bot string Convert user to bot. Supports converting multiple bots at once, use a space-separated list. - --user string Convert bot to user. Supports converting one account per command. The converted user will have the role of `system_user` set. + --bot string Convert user to bot. Supports converting multiple bots at once, use a space-separated list. + --user string Convert bot to user. Supports converting one account per command. The converted user will have the role of `system_user` set. mattermost user create ~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user create `__. - + - From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user create `__. + - If you automate user creation through the CLI tool with SMTP enabled, emails will be sent to all new users created. If you run such a load script, it is best to disable SMTP or to use test accounts so that new account creation emails aren't unintentionally sent to people at your organization who aren't expecting them. Description - Create a user. + Create a user. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost user create + mattermost user create - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost user create --email user@example.com --username userexample --password Password1 - bin/mattermost user create --firstname Joe --system_admin --email joe@example.com --username joe --password Password1 + bin/mattermost user create --email user@example.com --username userexample --password Password1 + bin/mattermost user create --firstname Joe --system_admin --email joe@example.com --username joe --password Password1 - Options - .. code-block:: none +Options + .. code-block:: none - --email string Email - --firstname string First Name - --lastname string Last Name - --locale string Locale (ex: en, fr) - --nickname string Nickname - --password string Password - --system_admin Make the user a system administrator - --username string Username + --email string Email + --firstname string First Name + --lastname string Last Name + --locale string Locale (ex: en, fr) + --nickname string Nickname + --password string Password + --system_admin Make the user a system administrator + --username string Username mattermost user deactivate ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user deactivate `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user deactivate `__. Description - Deactivate a user. Deactivated users are immediately logged out of all sessions and are unable to log back in. + Deactivate a user. Deactivated users are immediately logged out of all sessions and are unable to log back in. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost user deactivate {emails, usernames, userIds} + mattermost user deactivate {emails, usernames, userIds} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost user deactivate user@example.com - bin/mattermost user deactivate username + bin/mattermost user deactivate user@example.com + bin/mattermost user deactivate username - .. note:: - Users deactivated via this CLI command can continue to use Mattermost, if they are already logged in, until the user cache is manually purged or automatically after 30 minutes. Users who are deactivated when they're not logged in will not be able to log in to Mattermost again. +.. note:: + Users deactivated via this CLI command can continue to use Mattermost, if they are already logged in, until the user cache is manually purged or automatically after 30 minutes. Users who are deactivated when they're not logged in will not be able to log in to Mattermost again. - If you want to immediately terminate a deactivated user's session, purge all caches in **System Console > Web Server > Purge All Caches** after running this command. + If you want to immediately terminate a deactivated user's session, purge all caches in **System Console > Web Server > Purge All Caches** after running this command. - You can also use the `API command `_ to deactivate a user account and immediately terminate the session. + You can also use the `API command `_ to deactivate a user account and immediately terminate the session. mattermost user delete ~~~~~~~~~~~~~~~~~~~~~~ - Description - Permanently delete a user and all related information, including posts from the database. +Description + Permanently delete a user and all related information, including posts from the database. - Does not delete content from the file storage. You can manually delete all file uploads for a given user as uploads contain the ``CreatorId`` field. User profile pictures are stored in ``data/users//profile.png``. + Does not delete content from the file storage. You can manually delete all file uploads for a given user as uploads contain the ``CreatorId`` field. User profile pictures are stored in ``data/users//profile.png``. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost user delete {users} + mattermost user delete {users} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost user delete user@example.com + bin/mattermost user delete user@example.com - Options - .. code-block:: none +Options + .. code-block:: none - --confirm Confirm you really want to delete the user and a DB backup has been performed. + --confirm Confirm you really want to delete the user and a DB backup has been performed. mattermost user deleteall ~~~~~~~~~~~~~~~~~~~~~~~~~ - Description +Description Permanently delete all users and all related information, including posts. Does not delete content from the file storage. You can manually delete all file uploads and user profile pictures. All uploads contain the ``CreatorId`` field and user profile pictures are stored in ``data/users//profile.png``. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost user deleteall + mattermost user deleteall - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost user deleteall + bin/mattermost user deleteall - Options - .. code-block:: none +Options + .. code-block:: none - --confirm Confirm you really want to delete the user and a DB backup has been performed. + --confirm Confirm you really want to delete the user and a DB backup has been performed. mattermost user email ~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user email `__. - + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user email `__. Description - Set a user's email. + Set a user's email. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost user email {user} {new email} + mattermost user email {user} {new email} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost user email user@example.com newuser@example.com + bin/mattermost user email user@example.com newuser@example.com mattermost user invite ~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user invite `__. - + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user invite `__. Description - Send a user an email invite to a team. You can invite a user to multiple teams by listing the team names or team IDs. + Send a user an email invite to a team. You can invite a user to multiple teams by listing the team names or team IDs. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost user invite {email} {teams} + mattermost user invite {email} {teams} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost user invite user@example.com myteam - bin/mattermost user invite user@example.com myteam1 myteam2 + bin/mattermost user invite user@example.com myteam + bin/mattermost user invite user@example.com myteam1 myteam2 mattermost user migrate_auth ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. _cli-user-migrate-auth: - Description - Migrates all existing Mattermost user accounts from one authentication provider to another. For example, you can upgrade your authentication provider from email to AD/LDAP, or from AD/LDAP to SAML. Output will display any accounts that are not migrated successfully. These accounts might be blocked because of filters in your AD/LDAP configuration in the System Console. +Description + Migrates all existing Mattermost user accounts from one authentication provider to another. For example, you can upgrade your authentication provider from email to AD/LDAP, or from AD/LDAP to SAML. Output will display any accounts that are not migrated successfully. These accounts might be blocked because of filters in your AD/LDAP configuration in the System Console. **Migrate to AD/LDAP** - Parameters - - ``from_auth``: The authentication service from which to migrate user accounts. Supported options: ``email``, ``gitlab``, ``saml``. +Parameters + - ``from_auth``: The authentication service from which to migrate user accounts. Supported options: ``email``, ``gitlab``, ``saml``. + + - ``to_auth``: The authentication service to which to migrate user accounts. Supported options: ``ldap``. - - ``to_auth``: The authentication service to which to migrate user accounts. Supported options: ``ldap``. + - ``match_field``: The field that is guaranteed to be the same in both authentication services. For example, if the user emails are consistent set to email. Supported options: ``email``, ``username``. - - ``match_field``: The field that is guaranteed to be the same in both authentication services. For example, if the user emails are consistent set to email. Supported options: ``email``, ``username``. +Format + .. code-block:: none - Format - .. code-block:: none + mattermost user migrate_auth {from_auth} ldap {match_field} - mattermost user migrate_auth {from_auth} ldap {match_field} +Example + .. code-block:: none - Example - .. code-block:: none + bin/mattermost user migrate_auth email ldap email - bin/mattermost user migrate_auth email ldap email - Options - .. code-block:: none +Options + .. code-block:: none - --force Ignore duplicate entries on the AD/LDAP server. - --dryRun Run a simulation of the migration process without changing the database. + --force Ignore duplicate entries on the AD/LDAP server. + --dryRun Run a simulation of the migration process without changing the database. **Migrate to SAML** -*Supported in Mattermost v4.8 and later* +Parameters - Parameters + - ``from_auth``: The authentication service from which to migrate user accounts. Supported options: ``email``, ``gitlab``. ``ldap``. - - ``from_auth``: The authentication service from which to migrate user accounts. Supported options: ``email``, ``gitlab``. ``ldap``. + - ``to_auth``: The authentication service to which to migrate user accounts. Supported options: ``saml``. - - ``to_auth``: The authentication service to which to migrate user accounts. Supported options: ``saml``. + - ``users_file``: The path of a JSON file with the usernames and emails of all users to migrate to SAML. The username and email must be the same as in your SAML service provider. Moreover, the email must match the email address of the Mattermost user account. An example of the users file is below: - - ``users_file``: The path of a JSON file with the usernames and emails of all users to migrate to SAML. The username and email must be the same as in your SAML service provider. Moreover, the email must match the email address of the Mattermost user account. An example of the users file is below: +.. code-block:: json - .. code-block:: json + { + "user1@email.com": "username.one", + "user2@email.com": "username.two" + } - { - "user1@email.com": "username.one", - "user2@email.com": "username.two" - } +Users file generation + Generating the ``users_file`` depends on how the system is configured and which SAML service provider is used. Below are two sample scripts for OneLogin and Okta service providers. For ADFS, you can use the AD/LDAP protocol to directly extract the users information and export it to a JSON file. - Users file generation - Generating the ``users_file`` depends on how the system is configured and which SAML service provider is used. Below are two sample scripts for OneLogin and Okta service providers. For ADFS, you can use the AD/LDAP protocol to directly extract the users information and export it to a JSON file. + After generating the ``users_file``, you can manually update the file to obtain a list of Mattermost user accounts you want to migrate to SAML. Note that users listed in ``users_file`` that do not yet exist in Mattermost are ignored during the migration process. - After generating the ``users_file``, you can manually update the file to obtain a list of Mattermost user accounts you want to migrate to SAML. Note that users listed in ``users_file`` that do not yet exist in Mattermost are ignored during the migration process. +OneLogin: - OneLogin: + .. code-block:: python - .. code-block:: python + from onelogin.api.client import OneLoginClient + import json - from onelogin.api.client import OneLoginClient - import json + client_id = input("Client id: ") + client_secret = input("Secret: ") + region = input("Region (us, eu): ") - client_id = input("Client id: ") - client_secret = input("Secret: ") - region = input("Region (us, eu): ") + client = OneLoginClient(client_id, client_secret, region) - client = OneLoginClient(client_id, client_secret, region) + mapping = {} + for user in client.get_users(): + mapping[user.email] = user.username - mapping = {} - for user in client.get_users(): - mapping[user.email] = user.username + with file("saml_users.json", "w") as fd: + json.dump(mapping, fd) - with file("saml_users.json", "w") as fd: - json.dump(mapping, fd) +Okta: - Okta: + .. code-block:: python - .. code-block:: python + from okta import UsersClient + import json - from okta import UsersClient - import json + base_url = input("Base url (example: https://example.okta.com): ") + api_token = input("API Token: ") - base_url = input("Base url (example: https://example.okta.com): ") - api_token = input("API Token: ") + sersClient = UsersClient(base_url, api_token) - usersClient = UsersClient(base_url, api_token) + users = usersClient.get_paged_users(limit=25) - users = usersClient.get_paged_users(limit=25) + mapping = {} - mapping = {} + for user in users.result: + mapping[user.profile.email] = user.profile.login + while not users.is_last_page(): + users = usersClient.get_paged_users(url=users.next_url) for user in users.result: - mapping[user.profile.email] = user.profile.login - - while not users.is_last_page(): - users = usersClient.get_paged_users(url=users.next_url) - for user in users.result: - mapping[user.profile.email] = user.profile.login + mapping[user.profile.email] = user.profile.login - with file("saml_users.json", "w") as fd: - json.dump(mapping, fd) + with file("saml_users.json", "w") as fd: + json.dump(mapping, fd) - ADFS: +ADFS: - .. code-block:: python + .. code-block:: python - import ldap - import json - import getpass + import ldap + import json + import getpass - ldap_host = input('Ldap Host (example ldap://localhost:389): ') - base_dn = input('Base DN (example dc=mm,dc=test,dc=com): ') - bind_dn = input('Bind DN (example ORGANIZATION\username): ') - password = getpass.getpass('Password: ') - user_object_class = input('User object class (example organizationalPerson): ') - username_field = input('Username field (example sAMAccountName): ') - mail_field = input('Mail field (example mail): ') + ldap_host = input('Ldap Host (example ldap://localhost:389): ') + base_dn = input('Base DN (example dc=mm,dc=test,dc=com): ') + bind_dn = input('Bind DN (example ORGANIZATION\username): ') + password = getpass.getpass('Password: ') + user_object_class = input('User object class (example organizationalPerson): ') + username_field = input('Username field (example sAMAccountName): ') + mail_field = input('Mail field (example mail): ') - l = ldap.initialize(ldap_host) - l.simple_bind_s(bind_dn, password) - page_control = ldap.controls.libldap.SimplePagedResultsControl(True, size=1000, cookie='') - r = l.search_ext(base_dn, ldap.SCOPE_SUBTREE, '(objectClass='+user_object_class+')', [username_field, mail_field], serverctrls=[page_control]) + l = ldap.initialize(ldap_host) + l.simple_bind_s(bind_dn, password) + page_control = ldap.controls.libldap.SimplePagedResultsControl(True, size=1000, cookie='') + r = l.search_ext(base_dn, ldap.SCOPE_SUBTREE, '(objectClass='+user_object_class+')', [username_field, mail_field], serverctrls=[page_control]) - mapping = {} - while True: - rtype, rdata, rmsgid, serverctrls = l.result3(r) + mapping = {} + while True: + rtype, rdata, rmsgid, serverctrls = l.result3(r) - for dn, entry in rdata: - if mail_field in entry and len(entry[mail_field]) >= 1 and username_field in entry and len(entry[username_field]) >= 1: - mapping[entry[mail_field][0].decode('utf-8')] = entry[username_field][0].decode('utf-8') + for dn, entry in rdata: + if mail_field in entry and len(entry[mail_field]) >= 1 and username_field in entry and len(entry[username_field]) >= 1: + mapping[entry[mail_field][0].decode('utf-8')] = entry[username_field][0].decode('utf-8') - controls = [control for control in serverctrls if control.controlType == ldap.controls.libldap.SimplePagedResultsControl.controlType] + controls = [control for control in serverctrls if control.controlType == ldap.controls.libldap.SimplePagedResultsControl.controlType] if not controls: - print('The server ignores RFC 2696 control') - break + print('The server ignores RFC 2696 control') + break if not controls[0].cookie: - break - page_control.cookie = controls[0].cookie - r = l.search_ext(base_dn, ldap.SCOPE_SUBTREE, '(objectClass='+user_object_class+')', [username_field, mail_field], serverctrls=[page_control]) + break + page_control.cookie = controls[0].cookie + r = l.search_ext(base_dn, ldap.SCOPE_SUBTREE, '(objectClass='+user_object_class+')', [username_field, mail_field], serverctrls=[page_control]) with open("saml_users.json", "w") as fd: - json.dump(mapping, fd) + json.dump(mapping, fd) - Format - .. code-block:: none +Format + .. code-block:: none - mattermost user migrate_auth {from_auth} saml {users_file} + mattermost user migrate_auth {from_auth} saml {users_file} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost user migrate_auth email saml users.json + bin/mattermost user migrate_auth email saml users.json - Options - .. code-block:: none +Options + .. code-block:: none - --auto Automatically migrate all users without a {users_file}. Assumes the usernames and emails are identical between Mattermost and SAML services. - --dryRun Run a simulation of the migration process without changing the database. Useful to test if the migration results in any errors. You can use this option with or without a {users_file}. + --auto Automatically migrate all users without a {users_file}. Assumes the usernames and emails are identical between Mattermost and SAML services. + --dryRun Run a simulation of the migration process without changing the database. Useful to test if the migration results in any errors. You can use this option with or without a {users_file}. mattermost user password ~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user reset_password `__. + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user reset_password `__. Description - Set a user's password. + Set a user's password. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost user password {user} {password} + mattermost user password {user} {password} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost user password user@example.com Password1 + bin/mattermost user password user@example.com Password1 mattermost user resetmfa ~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user resetmfa `__. - + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user resetmfa `__. Description - Turns off multi-factor authentication for a user. If MFA enforcement is enabled, the user will be forced to re-enable MFA with a new device as soon as they log in. + Turns off multi-factor authentication for a user. If MFA enforcement is enabled, the user will be forced to re-enable MFA with a new device as soon as they log in. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost user resetmfa {users} + mattermost user resetmfa {users} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost user resetmfa user@example.com + bin/mattermost user resetmfa user@example.com mattermost user search ~~~~~~~~~~~~~~~~~~~~~~ .. note:: - In Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user search `__. - + From Mattermost v6.0, this command has been replaced with the mmctl command `mmctl user search `__. Description - Search for users based on username, email, or user ID. + Search for users based on username, email, or user ID. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost user search {users} + mattermost user search {users} - Example - .. code-block:: none +Example + .. code-block:: none - bin/mattermost user search user1@example.com user2@example.com + bin/mattermost user search user1@example.com user2@example.com mattermost user verify ~~~~~~~~~~~~~~~~~~~~~~ - Description - Verify the email address of a new user. +Description + Verify the email address of a new user. + +Format + .. code-block:: none - Format - .. code-block:: none + mattermost user verify {users} - mattermost user verify {users} +Example + .. code-block:: none - Example - .. code-block:: none + bin/mattermost user verify user1 - bin/mattermost user verify user1 +---- mattermost version ------------------ .. note:: - From Mattermost v6.5, this CLI command no longer interacts with the database. The ``mattermost db migrate `__ CLI command has been introduced to trigger schema migrations. + From Mattermost v6.5, this CLI command no longer interacts with the database. The `mattermost db migrate `__ CLI command has been introduced to trigger schema migrations. -Description +Desription Displays Mattermost version information. - Format - .. code-block:: none +Format + .. code-block:: none + + mattermost version - mattermost version +---- mattermost webhook ------------------ - Description - Commands to manage webhooks. - - Child Commands - - `mattermost webhook create-incoming`_ - Create an incoming webhook within specific channel. - - `mattermost webhook create-outgoing`_ - Create an outgoing webhook within specific channel. - - `mattermost webhook delete`_ - Delete incoming and outgoing webhooks. - - `mattermost webhook list`_ - List all webhooks. - - `mattermost webhook modify-incoming`_ - Modify an existing incoming webhook by changing its title, description, channel, or icon URL. - - `mattermost webhook modify-outgoing`_ - Modify an existing outgoing webhook by changing its title, description, channel, icon, URL, content-type, and triggers. - - `mattermost webhook move-outgoing`_ - Move an existing outgoing webhook with an ID. - - `mattermost webhook show`_ - Show information about a webhook by providing the webhook ID. +Description + Commands to manage webhooks. + +Child Commands + - `mattermost webhook create-incoming`_ - Create an incoming webhook within specific channel. + - `mattermost webhook create-outgoing`_ - Create an outgoing webhook within specific channel. + - `mattermost webhook delete`_ - Delete incoming and outgoing webhooks. + - `mattermost webhook list`_ - List all webhooks. + - `mattermost webhook modify-incoming`_ - Modify an existing incoming webhook by changing its title, description, channel, or icon URL. + - `mattermost webhook modify-outgoing`_ - Modify an existing outgoing webhook by changing its title, description, channel, icon, URL, content-type, and triggers. + - `mattermost webhook move-outgoing`_ - Move an existing outgoing webhook with an ID. + - `mattermost webhook show`_ - Show information about a webhook by providing the webhook ID. mattermost webhook create-incoming ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description +Description Create an incoming webhook within specific channel. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost webhook create-incoming + mattermost webhook create-incoming - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost webhook create-incoming --channel [channelID] --user [userID] --display-name [display-name] --description [webhookDescription] --lock-to-channel --icon [iconURL] + bin/mattermost webhook create-incoming --channel [channelID] --user [userID] --display-name [display-name] --description [webhookDescription] --lock-to-channel --icon [iconURL] - Options - .. code-block:: none +Options + .. code-block:: none - --channel string Channel ID - --user string User ID - --display-name string Incoming webhook display name - --description string Incoming webhook description - --lock-to-channel boolean (True/False) Lock incoming webhook to channel - --icon [iconURL] Icon URL + --channel string Channel ID + --user string User ID + --display-name string Incoming webhook display name + --description string Incoming webhook description + --lock-to-channel boolean (True/False) Lock incoming webhook to channel + --icon [iconURL] Icon URL mattermost webhook create-outgoing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Create an outgoing webhook which allows external posting of messages from a specific channel. +Description + Create an outgoing webhook which allows external posting of messages from a specific channel. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost webhook create-outgoing + mattermost webhook create-outgoing - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost webhook create-outgoing --team myteam --channel mychannel --user myusername --display-name mywebhook --description "My cool webhook" --trigger-when start --trigger-word "build" --icon http://localhost:8000/my-slash-handler-bot-icon.png --url http://localhost:8000/my-webhook-handler --content-type "application/json" + bin/mattermost webhook create-outgoing --team myteam --channel mychannel --user myusername --display-name mywebhook --description "My cool webhook" --trigger-when start --trigger-word "build" --icon http://localhost:8000/my-slash-handler-bot-icon.png --url http://localhost:8000/my-webhook-handler --content-type "application/json" - bin/mattermost webhook create-outgoing --team myotherteam --channel mychannel --user myusername --display-name myotherwebhook --description "My cool webhook" --trigger-when exact --trigger-word "build" --trigger-word "test" --trigger-word "third-trigger" --icon http://localhost:8000/my-slash-handler-bot-icon.png --url http://localhost:8000/my-webhook-handler --url http://example.com --content-type "application/json" + bin/mattermost webhook create-outgoing --team myotherteam --channel mychannel --user myusername --display-name myotherwebhook --description "My cool webhook" --trigger-when exact --trigger-word "build" --trigger-word "test" --trigger-word "third-trigger" --icon http://localhost:8000/my-slash-handler-bot-icon.png --url http://localhost:8000/my-webhook-handler --url http://example.com --content-type "application/json" - Options - .. code-block:: none +Options + .. code-block:: none - --team string [REQUIRED] Team name or ID - --channel string Channel name or ID - --user string [REQUIRED] User username, email, or ID - --display-name string [REQUIRED] Outgoing webhook display name - --description string Outgoing webhook description - --trigger-words stringArray [REQUIRED] Words to trigger webhook - --trigger-when string [REQUIRED] When to trigger webhook (exact: for first word matches a trigger word exactly, start: for first word starts with a trigger word) (default "exact") - --icon [iconURL] Icon URL - --url stringArray [REQUIRED] Callback URLs - --content-type string Content-type - --h, --help Help for create-outgoing + --team string [REQUIRED] Team name or ID + --channel string Channel name or ID + --user string [REQUIRED] User username, email, or ID + --display-name string [REQUIRED] Outgoing webhook display name + --description string Outgoing webhook description + --trigger-words stringArray [REQUIRED] Words to trigger webhook + --trigger-when string [REQUIRED] When to trigger webhook (exact: for first word matches a trigger word exactly, start: for first word starts with a trigger word) (default "exact") + --icon [iconURL] Icon URL + --url stringArray [REQUIRED] Callback URLs + --content-type string Content-type + --h, --help Help for create-outgoing mattermost webhook delete ~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Delete incoming and outgoing webhooks. If deleting multiple webhooks, use a space-separated list. +Description + Delete incoming and outgoing webhooks. If deleting multiple webhooks, use a space-separated list. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost webhook delete [webhookID] + mattermost webhook delete [webhookID] - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost webhook delete ggwpz8c1oj883euk98wfm9n1cr + bin/mattermost webhook delete ggwpz8c1oj883euk98wfm9n1cr mattermost webhook list ~~~~~~~~~~~~~~~~~~~~~~~ - Description - List all webhooks. +Description + List all webhooks. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost webhook list {team} + mattermost webhook list {team} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost webhook list team1 - bin/mattermost webhook list + bin/mattermost webhook list team1 + bin/mattermost webhook list - Options - .. code-block:: none +Options + .. code-block:: none - --team string Specific team results to return. If not specified, all teams will be included. + --team string Specific team results to return. If not specified, all teams will be included. mattermost webhook modify-incoming ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Modify an existing incoming webhook by changing its title, description, channel or icon url. +Description + Modify an existing incoming webhook by changing its title, description, channel or icon url. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost webhook modify-incoming {webhookId} + mattermost webhook modify-incoming {webhookId} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost webhook modify-incoming [webhookID] --channel [channelID] --display-name [displayName] --description [webhookDescription] --lock-to-channel --icon [iconURL] + bin/mattermost webhook modify-incoming [webhookID] --channel [channelID] --display-name [displayName] --description [webhookDescription] --lock-to-channel --icon [iconURL] - Options - .. code-block:: none +Options + .. code-block:: none - --channel string Channel ID - --display-name string Incoming webhook display name - --description string Incoming webhook description - --lock-to-channel boolean (True/False) Lock incoming webhook to channel - --icon [iconURL] Icon URL + --channel string Channel ID + --display-name string Incoming webhook display name + --description string Incoming webhook description + --lock-to-channel boolean (True/False) Lock incoming webhook to channel + --icon [iconURL] Icon URL mattermost webhook modify-outgoing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description - Modify an existing outgoing webhook by changing its title, description, channel, trigger words, icon url, callback url, or content type. +Description + Modify an existing outgoing webhook by changing its title, description, channel, trigger words, icon url, callback url, or content type. - Format - .. code-block:: none +Format + .. code-block:: none - mattermost webhook modify-outgoing {webhookId} + mattermost webhook modify-outgoing {webhookId} - Examples - .. code-block:: none +Examples + .. code-block:: none - bin/mattermost webhook modify-outgoing [webhookId] --channel [channelId] --display-name [displayName] --description "New webhook description" --icon http://localhost:8000/my-slash-handler-bot-icon.png --url http://localhost:8000/my-webhook-handler --content-type "application/json" --trigger-word test --trigger-when start` + bin/mattermost webhook modify-outgoing [webhookId] --channel [channelId] --display-name [displayName] --description "New webhook description" --icon http://localhost:8000/my-slash-handler-bot-icon.png --url http://localhost:8000/my-webhook-handler --content-type "application/json" --trigger-word test --trigger-when start` - Options - .. code-block:: none +Options + .. code-block:: none - --channel string Channel ID - --display-name string Incoming webhook display name - --description string Incoming webhook description - --trigger-word string array Word(s) to trigger webhook - --trigger-when string When to trigger webhook (exact: for first word matches a trigger word exactly, start: for first word starts with a trigger word)") - --icon [iconURL] Icon URL - --url [callbackURL] Callback URL - --content-type string Content type + --channel string Channel ID + --display-name string Incoming webhook display name + --description string Incoming webhook description + --trigger-word string array Word(s) to trigger webhook + --trigger-when string When to trigger webhook (exact: for first word matches a trigger word exactly, start: for first word starts with a trigger word)") + --icon [iconURL] Icon URL + --url [callbackURL] Callback URL + --content-type string Content type mattermost webhook move-outgoing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Description +Description Move an existing outgoing webhook to another team by specifying its id. If the outgoing webhook is triggered by a keyword then assigning a channel is optional. If the outgoing webhook is associated to a specific channel prior to moving, a channel must be specified within the new team. - Format - .. code-block:: none - - mattermost webhook move-outgoing {webhookId} +Format + .. code-block:: none - Examples - .. code-block:: none + mattermost webhook move-outgoing {webhookId} - bin/mattermost webhook move-outgoing newteam oldteam:[webhookId] --channel [channelId or channelName] +Examples + .. code-block:: none - Options - .. code-block:: none + bin/mattermost webhook move-outgoing newteam oldteam:[webhookId] --channel [channelId or channelName] - --channel string Channel ID or Channel Name +Options + .. code-block:: none + --channel string Channel ID or Channel Name mattermost webhook show ~~~~~~~~~~~~~~~~~~~~~~~ - Description +Description Show information about a webhook by providing the webhook ID. Returns display name, channel ID and team ID for both incoming and outgoing webhooks. Additionally returns callback URL, username, and icon URL for outgoing webhooks. - Format - .. code-block:: none - - mattermost webhook show {webhookId} - - Examples - .. code-block:: none - - bin/mattermost webhook show [webhookId] - -Mattermost 3.5 and earlier -^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Format + .. code-block:: none -Typing ``./platform -help`` brings up documentation for the CLI tool. To return the help documentation in GitLab omnibus, type + mattermost webhook show {webhookId} - .. code-block:: none +Examples + .. code-block:: none - sudo -u mattermost /opt/gitlab/embedded/bin/mattermost --config=/var/opt/gitlab/mattermost/config.json -help - -Notes: - -- Parameters in CLI commands are order-specific. -- If special characters (``!``, ``|``, ``(``, ``)``, ``\``, `````, and ``"``) are used, the entire argument needs to be surrounded by single quotes (e.g. ``-password 'mypassword!'``, or the individual characters need to be escaped out (e.g. ``-password mypassword\!``). -- Team name and channel name refer to the handles, not the display names. So in the url ``https://community.mattermost.com/core/channels/town-square`` team name would be ``core`` and channel name would be ``town-square`` - -.. tip :: - - If you automate user creation through the CLI tool with SMTP enabled, emails will be sent to all new users created. If you run such a load script, it is best to disable SMTP or to use test accounts so that new account creation emails aren't unintentionally sent to people at your organization who aren't expecting them. + bin/mattermost webhook show [webhookId] CLI Documentation: @@ -2775,10 +2807,10 @@ CLI Documentation: Troubleshooting -^^^^^^^^^^^^^^^^^ +---------------- Executing a command hangs and doesn't complete ------------------------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you have Bleve search indexing enabled, temporarily disable it in **System Console > Experimental > Bleve** and run the command again. You can also optionally use the new `mmctl Command Line Tool `_. diff --git a/source/manage/mmctl-command-line-tool.rst b/source/manage/mmctl-command-line-tool.rst index d570c6981d3..e482b84d421 100644 --- a/source/manage/mmctl-command-line-tool.rst +++ b/source/manage/mmctl-command-line-tool.rst @@ -2083,7 +2083,7 @@ Set the value of a config setting by its name in dot notation. Accepts multiple .. code-block:: sh - mmctl config set SqlSettings.DriverName mysql + mmctl config set SqlSettings.DriverName postgres mmctl config set SqlSettings.DataSourceReplicas "replica1" "replica2" **Options** diff --git a/source/manage/telemetry.rst b/source/manage/telemetry.rst index ce1ad3e339c..a3b95c3e260 100644 --- a/source/manage/telemetry.rst +++ b/source/manage/telemetry.rst @@ -89,7 +89,7 @@ Server Configuration Settings **Type values (enumerated integer and enumerated boolean)** - **ServiceSettings**: enum WebserverMode, bool EnableSecurityFixAlert, bool EnableInsecureOutgoingConnections, bool EnableIncomingWebhooks, bool EnableOutgoingWebhooks, bool EnableCommands, bool EnableDeveloper, bool EnableOnlyAdminIntegrations, bool EnablePostUsernameOverride, bool EnablePostIconOverride, bool EnableCustomEmoji, enum RestrictCustomEmojiCreation, bool EnableTesting, bool DeveloperFlags, bool EnableClientPerformanceDebugging, bool EnableMultifactorAuthentication, bool EnableOAuthServiceProvider, enum ConnectionSecurity, bool UseLetsEncrypt, bool Forward80To443, enum ConnectionSecurity, bool TLSStrictTransport, bool EnforceMultifactorAuthentication, enum RestrictPostDelete, bool AllowEditPost, bool EnableUserTypingMessages, bool EnablePostSearch, bool EnableUserStatuses, bool EnableChannelViewMessages, bool EnableEmojiPicker, bool EnableGifPicker, bool EnableAuthenticationTransfer, enum TeammateNameDisplay, bool EnableUserAccessTokens, enum MaximumLoginAttempts, bool ExtendSessionLengthWithActivity, enum SessionLengthWebInHours, enum SessionLengthMobileInHours, enum SessionLengthSSOInHours, int SessionCacheInMinutes, enum SessionIdleTimeoutInMinutes, enum PostEditTimeLimit, enum TimeBetweenUserTypingUpdatesMilliseconds, enum ClusterLogTimeoutMilliseconds, bool CloseUnusedDirectMessages, bool EnablePreviewFeatures, bool EnableTutorial, bool EnableOnboarding, bool ExperimentalEnableDefaultChannelLeaveJoinMessages, bool ExperimentalGroupUnreadChannels, bool AllowCookiesForSubdomains, bool EnableAPITeamDeletion, bool EnableAPITriggerAdminNotifications, bool EnableAPIUserDeletion, bool EnableAPIChannelDeletion, bool ExperimentalEnableHardenedMode, bool DisableLegacyMFA, bool ExperimentalStrictCSRFEnforcement, bool EnableEmailInvitations, bool ExperimentalChannelOrganization, bool ExperimentalChannelSidebarOrganization, bool EnableLegacySidebar, bool CorsAllowCredentials, bool CorsDebug, bool DisableBotsWhenOwnerIsDeactivated, bool EnableBotAccountCreation, bool RestrictLinkPreviews, bool EnablePermalinkPreviews, bool EnableSVGs, bool EnableLatex, bool EnableInlineLatex, bool EnableOpenTracing, bool Directory, bool RetentionDays, bool ExperimentalDataPrefetch, bool EnableLocalMode; **TeamSettings**: bool EnableUserCreation, bool EnableTeamCreation, bool RestrictTeamNames, enum RestrictTeamInvite, enum RestrictPublicChannelManagement, enum RestrictPrivateChannelManagement, enum RestrictPublicChannelCreation, enum RestrictPrivateChannelCreation, enum RestrictPublicChannelDeletion, enum RestrictPrivateChannelDeletion, enum RestrictPrivateChannelManageMembers, bool EnableOpenServer, bool EnableUserDeactivation, bool EnableCustomBrand, bool RestrictDirectMessage, enum MaxNotificationsPerChannel, bool EnableConfirmNotificationsToChannel; enum MaxUsersPerTeam, enum MaxChannelsPerTeam, bool EnableCustomUserStatuses, bool EnableLastActiveTime, bool ExperimentalTownSquareIsReadOnly, bool ExperimentalHideTownSquareinLHS, bool EnableXToLeaveChannelsFromLHS, bool ExperimentalEnableAutomaticReplies, bool ExperimentalViewArchivedChannels, bool LockTeammateNameDisplay; **ClientRequirementSettings**: enum AndroidLatestVersion, enum AndroidMinVersion, enum DesktopLatestVersion, enum DesktopMinVersion, enum IosLatestVersion, enum IosMinVersion; **DisplaySettings**: bool ExperimentalTimezone; **GuestAccountsSettings**: bool Enable, bool AllowEmailAccounts, bool EnforceMultifactorAuthentication; **SqlSettings**: enum DriverName, bool Trace, enum MaxIdleConns, enum ConnMaxIdleTimeMilliseconds, bool ConnMaxLifetimeMilliseconds; enum MaxOpenC onns, enum QueryTimeout, bool DisableDatabaseSearch; **LogSettings**: bool EnableConsole, enum ConsoleLevel, bool ConsoleJson, bool EnableFile, enum FileLevel, bool FileJson, bool EnableWebhookDebugging; **NotificationLogSettings**: bool EnableConsole, bool ConsoleLevel, bool ConsoleJson, bool EnableFile, bool FileLevel, bool FileJson **PasswordSettings**: bool Lowercase, bool Number, bool Uppercase, bool Symbol, enum MinimumLength; **FileSettings**: bool EnablePublicLink, enum DriverName, enum MaxFileSize, enum FileSettings.MaxImageResolution, enum MaxImageDecoderConcurrency, bool FileSettings.ExtractContent, bool FileSettings.ArchiveRecursion, bool AmazonS3SSL, bool AmazonS3SignV2, bool AmazonS3SSE, bool AmazonS3Trace, bool EnableFileAttachments, bool EnableMobileUpload, bool EnableMobileDownload; **EmailSettings**: bool EnableSignUpWithEmail, bool EnableSignInWithEmail, bool EnableSignInWithUsername, bool RequireEmailVerification, bool SendEmailNotifications, bool UseChannelInEmailNotifications, bool EmailNotificationContentsType, bool EnableSMTPAuth, enum ConnectionSecurity, bool SendPushNotifications, enum PushNotificationContents, bool EnableEmailBatching, bool SkipServerCertificateVerification, enum EmailBatchingBufferSize, enum EmailBatchingInterval, bool EnablePreviewModeBanner, enum SMTPServerTimeout; **MessageExportSettings**: bool DownloadExportResults; **RateLimitSettings**: bool EnableRateLimiter, bool VaryByRemoteAddr, bool VaryByUser, enum PerSec, enum MaxBurst, enum MemoryStoreSize; **PrivacySettings**: bool ShowEmailAddress, bool ShowFullName; **ThemeSettings**: bool EnableThemeSelection, bool AllowCustomThemes; **GitLabSettings**: bool Enable; **GoogleSettings**: bool Enable; **Office365Settings**: bool Enable; **SupportSettings**: bool CustomTermsOfServiceEnabled; enum CustomTermsOfServiceReAcceptancePeriod; **LdapSettings**: bool Enable, bool EnableSync, enum ConnectionSecurity, bool SkipCertificateVerification, enum SyncIntervalMinutes, enum QueryTimeout, enum MaxPageSize, bool EnableAdminFilter; **ComplianceSettings**: bool Enable, bool EnableDaily; **LocalizationSettings**: enum DefaultServerLocale, enum DefaultClientLocale, enum AvailableLocales; **SamlSettings**: bool Enable, bool EnableSyncWithLdap, bool IgnoreGuestsLdapSync, bool EnableSyncWithLdapIncludeAuth, bool Verify, bool Encrypt, bool SignRequest, bool EnableAdminFilter; **ClusterSettings**: bool Enable, bool UseIpAddress, bool UseExperimentalGossip, bool ReadOnlyConfig, bool EnableExperimentalGossipEncryption, bool EnableGossipCompression; **MetricsSettings**: bool Enable, enum BlockProfileRate; **WebrtcSettings** (only in v5.5 and earlier): bool Enable; **ExperimentalSettings** bool ClientSideCertEnable, bool EnablePostMetadata, bool LinkMetadataTimeoutMilliseconds, bool EnableClickToReply, bool RestrictSystemAdmin, bool UseNewSAMLLibrary, bool CloudBilling, bool RemoteClusters, bool EnableSharedChannels, bool EnableRemoteClusterService, bool PatchPluginsReactDOM, bool EnableAppBar, bool AllowSyncedDrafts; **AnnouncementSettings**: bool EnableBanner, bool AllowBannerDismissal, bool AdminNoticesEnabled, bool UserNoticesEnabled; **ElasticsearchSettings**: bool EnableIndexing, bool EnableSearching, bool Sniff, enum PostIndexReplicas, enum PostIndexShards, enum LiveIndexingBatchSize, enum BatchSize, enum RequestTimeoutSeconds, bool SkipTLSVerification, bool Trace; **PluginSettings**: bool Enable, bool EnableUploads, bool EnableHealthCheck, bool EnableMarketplace, bool EnableRemoteMarketplace, bool AutomaticPrepackagedPlugins, bool RequirePluginSignature; **DataRetentionSettings**: bool EnableMessageDeletion, bool MessageRetentionDays, bool AllowInsecureDownloadUrl, bool EnableFileDeletion, bool FileRetentionDays, enum DeletionJobStartTime; **MessageExportSettings**: bool EnableExport, enum ExportFormat, enum DailyRunTime, enum ExportFromTimestamp, enum BatchSize, enum GlobalRelaySettings.CustomerType; **ExperimentalAuditSettings**: bool SysLogEnabled, bool SysLogInsecure, enum SysLogMaxQueueSize, bool FileEnabled, enum FileMaxSizeMB, enum FileMaxAgeDays, bool FileMaxBackups, bool FileCompress, enum FileMaxQueueSize; **BleveSettings**: bool EnableIndexing, bool EnableSearching, bool EnableAutocomplete, enum BatchSize; bool FeatureFlags + **ServiceSettings**: enum WebserverMode, bool EnableSecurityFixAlert, bool EnableInsecureOutgoingConnections, bool EnableIncomingWebhooks, bool EnableOutgoingWebhooks, bool EnableCommands, bool EnableDeveloper, bool EnableOnlyAdminIntegrations, bool EnablePostUsernameOverride, bool EnablePostIconOverride, bool EnableCustomEmoji, enum RestrictCustomEmojiCreation, bool EnableTesting, bool DeveloperFlags, bool EnableClientPerformanceDebugging, bool EnableMultifactorAuthentication, bool EnableOAuthServiceProvider, enum ConnectionSecurity, bool UseLetsEncrypt, bool Forward80To443, enum ConnectionSecurity, bool TLSStrictTransport, bool EnforceMultifactorAuthentication, enum RestrictPostDelete, bool AllowEditPost, bool EnableUserTypingMessages, bool EnablePostSearch, bool EnableUserStatuses, bool EnableChannelViewMessages, bool EnableEmojiPicker, bool EnableGifPicker, bool EnableAuthenticationTransfer, enum TeammateNameDisplay, bool EnableUserAccessTokens, enum MaximumLoginAttempts, bool ExtendSessionLengthWithActivity, enum SessionLengthWebInHours, enum SessionLengthMobileInHours, enum SessionLengthSSOInHours, int SessionCacheInMinutes, enum SessionIdleTimeoutInMinutes, enum PostEditTimeLimit, enum TimeBetweenUserTypingUpdatesMilliseconds, enum ClusterLogTimeoutMilliseconds, bool CloseUnusedDirectMessages, bool EnablePreviewFeatures, bool EnableTutorial, bool EnableOnboarding, bool ExperimentalEnableDefaultChannelLeaveJoinMessages, bool ExperimentalGroupUnreadChannels, bool AllowCookiesForSubdomains, bool EnableAPITeamDeletion, bool EnableAPITriggerAdminNotifications, bool EnableAPIUserDeletion, bool EnableAPIChannelDeletion, bool ExperimentalEnableHardenedMode, bool DisableLegacyMFA, bool ExperimentalStrictCSRFEnforcement, bool EnableEmailInvitations, bool ExperimentalChannelOrganization, bool ExperimentalChannelSidebarOrganization, bool EnableLegacySidebar, bool CorsAllowCredentials, bool CorsDebug, bool DisableBotsWhenOwnerIsDeactivated, bool EnableBotAccountCreation, bool RestrictLinkPreviews, bool EnablePermalinkPreviews, bool EnableSVGs, bool EnableLatex, bool EnableInlineLatex, bool EnableOpenTracing, bool Directory, bool RetentionDays, bool ExperimentalDataPrefetch, bool EnableLocalMode; **TeamSettings**: bool EnableUserCreation, bool EnableTeamCreation, bool RestrictTeamNames, enum RestrictTeamInvite, enum RestrictPublicChannelManagement, enum RestrictPrivateChannelManagement, enum RestrictPublicChannelCreation, enum RestrictPrivateChannelCreation, enum RestrictPublicChannelDeletion, enum RestrictPrivateChannelDeletion, enum RestrictPrivateChannelManageMembers, bool EnableOpenServer, bool EnableUserDeactivation, bool EnableCustomBrand, bool RestrictDirectMessage, enum MaxNotificationsPerChannel, bool EnableConfirmNotificationsToChannel; enum MaxUsersPerTeam, enum MaxChannelsPerTeam, bool EnableCustomUserStatuses, bool EnableLastActiveTime, bool ExperimentalTownSquareIsReadOnly, bool ExperimentalHideTownSquareinLHS, bool EnableXToLeaveChannelsFromLHS, bool ExperimentalEnableAutomaticReplies, bool ExperimentalViewArchivedChannels, bool LockTeammateNameDisplay; **ClientRequirementSettings**: enum AndroidLatestVersion, enum AndroidMinVersion, enum DesktopLatestVersion, enum DesktopMinVersion, enum IosLatestVersion, enum IosMinVersion; **DisplaySettings**: bool ExperimentalTimezone; **GuestAccountsSettings**: bool Enable, bool AllowEmailAccounts, bool EnforceMultifactorAuthentication; **SqlSettings**: enum DriverName, bool Trace, enum MaxIdleConns, enum ConnMaxIdleTimeMilliseconds, bool ConnMaxLifetimeMilliseconds; enum MaxOpenC onns, enum QueryTimeout, bool DisableDatabaseSearch; **LogSettings**: bool EnableConsole, enum ConsoleLevel, bool ConsoleJson, bool EnableFile, enum FileLevel, bool FileJson, bool EnableWebhookDebugging; **NotificationLogSettings**: bool EnableConsole, bool ConsoleLevel, bool ConsoleJson, bool EnableFile, bool FileLevel, bool FileJson **PasswordSettings**: bool Lowercase, bool Number, bool Uppercase, bool Symbol, enum MinimumLength; **FileSettings**: bool EnablePublicLink, enum DriverName, enum MaxFileSize, enum FileSettings.MaxImageResolution, enum MaxImageDecoderConcurrency, bool FileSettings.ExtractContent, bool FileSettings.ArchiveRecursion, bool AmazonS3SSL, bool AmazonS3SignV2, bool AmazonS3SSE, bool AmazonS3Trace, bool EnableFileAttachments, bool EnableMobileUpload, bool EnableMobileDownload; **EmailSettings**: bool EnableSignUpWithEmail, bool EnableSignInWithEmail, bool EnableSignInWithUsername, bool RequireEmailVerification, bool SendEmailNotifications, bool UseChannelInEmailNotifications, bool EmailNotificationContentsType, bool EnableSMTPAuth, enum ConnectionSecurity, bool SendPushNotifications, enum PushNotificationContents, bool EnableEmailBatching, bool SkipServerCertificateVerification, enum EmailBatchingBufferSize, enum EmailBatchingInterval, bool EnablePreviewModeBanner, enum SMTPServerTimeout; **MessageExportSettings**: bool DownloadExportResults; **RateLimitSettings**: bool EnableRateLimiter, bool VaryByRemoteAddr, bool VaryByUser, enum PerSec, enum MaxBurst, enum MemoryStoreSize; **PrivacySettings**: bool ShowEmailAddress, bool ShowFullName; **ThemeSettings**: bool EnableThemeSelection, bool AllowCustomThemes; **GitLabSettings**: bool Enable; **GoogleSettings**: bool Enable; **Office365Settings**: bool Enable; **SupportSettings**: bool CustomTermsOfServiceEnabled; enum CustomTermsOfServiceReAcceptancePeriod; **LdapSettings**: bool Enable, bool EnableSync, enum ConnectionSecurity, bool SkipCertificateVerification, enum SyncIntervalMinutes, enum QueryTimeout, enum MaxPageSize, bool EnableAdminFilter; **ComplianceSettings**: bool Enable, bool EnableDaily; **LocalizationSettings**: enum DefaultServerLocale, enum DefaultClientLocale, enum AvailableLocales; **SamlSettings**: bool Enable, bool EnableSyncWithLdap, bool IgnoreGuestsLdapSync, bool EnableSyncWithLdapIncludeAuth, bool Verify, bool Encrypt, bool SignRequest, bool EnableAdminFilter; **ClusterSettings**: bool Enable, bool UseIpAddress, bool UseExperimentalGossip, bool ReadOnlyConfig, bool EnableExperimentalGossipEncryption, bool EnableGossipCompression; **MetricsSettings**: bool Enable, enum BlockProfileRate; **WebrtcSettings** (only in v5.5 and earlier): bool Enable; **ExperimentalSettings** bool ClientSideCertEnable, bool EnablePostMetadata, bool LinkMetadataTimeoutMilliseconds, bool EnableClickToReply, bool RestrictSystemAdmin, bool UseNewSAMLLibrary, bool CloudBilling, bool RemoteClusters, bool EnableSharedChannels, bool EnableRemoteClusterService, bool PatchPluginsReactDOM, bool Disableappbar, bool AllowSyncedDrafts; **AnnouncementSettings**: bool EnableBanner, bool AllowBannerDismissal, bool AdminNoticesEnabled, bool UserNoticesEnabled; **ElasticsearchSettings**: bool EnableIndexing, bool EnableSearching, bool Sniff, enum PostIndexReplicas, enum PostIndexShards, enum LiveIndexingBatchSize, enum BatchSize, enum RequestTimeoutSeconds, bool SkipTLSVerification, bool Trace; **PluginSettings**: bool Enable, bool EnableUploads, bool EnableHealthCheck, bool EnableMarketplace, bool EnableRemoteMarketplace, bool AutomaticPrepackagedPlugins, bool RequirePluginSignature; **DataRetentionSettings**: bool EnableMessageDeletion, bool MessageRetentionDays, bool AllowInsecureDownloadUrl, bool EnableFileDeletion, bool FileRetentionDays, enum DeletionJobStartTime; **MessageExportSettings**: bool EnableExport, enum ExportFormat, enum DailyRunTime, enum ExportFromTimestamp, enum BatchSize, enum GlobalRelaySettings.CustomerType; **ExperimentalAuditSettings**: bool SysLogEnabled, bool SysLogInsecure, enum SysLogMaxQueueSize, bool FileEnabled, enum FileMaxSizeMB, enum FileMaxAgeDays, bool FileMaxBackups, bool FileCompress, enum FileMaxQueueSize; **BleveSettings**: bool EnableIndexing, bool EnableSearching, bool EnableAutocomplete, enum BatchSize; bool FeatureFlags **Counts (integer)** @@ -97,7 +97,7 @@ Server Configuration Settings **True/false (boolean)** value whether setting remains default (true) or non-default (false). **NOTE: No input data is used**: - **ServiceSettings**: bool SiteURL, bool WebsocketURL, bool TLSCertFile, bool TLSKeyFile, bool ReadTimeout, bool WriteTimeout,bool IdleTimeout, bool GoogleDeveloperKey, bool AllowCorsFrom, bool CorsExposedHeaders, bool AllowedUntrustedInternalConnections, bool GfycatApiKey, bool GfycatApiSecret, bool ManagedResourcePaths, bool CollapsedThreads, bool PostPriority; **TeamSettings**: bool SiteName, bool CustomBrandText, bool CustomDescriptionText, bool UserStatusAwayTimeout, bool ExperimentalPrimaryTeam; **DisplaySettings**: bool CustomUrlSchemes; **GuestAccountSettings**: bool RestrictCreationToDomains; **LogSettings**: bool FileLocation; **NotificationLogSettings**: bool FileLocation; **EmailSettings**: bool FeedbackName, bool FeedbackEmail, bool FeedbackOrganization, bool LoginButtonColor, bool LoginButtonBorderColor, bool LoginButtonTextColor, bool ImageProxyType, bool ImageProxyURL, bool ImageProxyOptions; **RateLimitSettings**: bool VaryByHeader; **SupportSettings**: bool TermsOfServiceLink, bool PrivacyPolicyLink, bool AboutLink, bool HelpLink, bool ReportAProblemLink, bool AppCustomURLSchemes, bool SupportEmail; **ThemeSettings**: bool DefaultTheme; **TimeZoneSettings**: bool SupportedTimezonesPath; **LdapSettings**: bool FirstNameAttribute, bool LastNameAttribute, bool EmailAttribute, bool UserNameAttribute, bool NicknameAttribute, bool IdAttribute, bool PositionAttribute, bool LoginFieldName, bool LoginButtonColor, bool LoginButtonBorderColor, bool LoginButtonTextColor, bool GroupFilter, bool GroupDisplayNameAttribute, bool GroupIdAttribute, bool GuestFilter, bool AdminFilter; **SamlSettings**: bool SignatureAlgorithm, bool CanonicalAlgorithm, bool ScopingIDPProviderId, bool ScopingIDPName, bool IdAttribute, bool GuestAttribute, bool FirstNameAttribute, bool LastNameAttribute, bool EmailAttribute, bool UserNameAttribute, bool NicknameAttribute, bool LocaleAttribute, bool PositionAttribute, bool LoginIdAttribute, bool LoginButtonText, bool LoginButtonColor, bool LoginButtonBorderColor, bool LoginButtonTextColor, bool AdminFilter; **NativeAppSettings**: bool AppDownloadLink, bool AndroidAppDownloadLink, bool IosAppDownloadLink; **WebrtcSettings** (only in v5.5 and earlier): bool StunURI, bool TurnURI; **ClusterSettings**: bool NetworkInterface, bool BindAddress, bool AdvertiseAddress; **MetricsSettings**: bool BlockProfileRate; **AnalyticsSettings**: bool MaxUsersForStatistics; **ExperimentalSettings** bool ClientSideCertCheck; **AnnouncementSettings**: bool BannerColor, bool BannerTextColor; **ElasticsearchSettings**: bool ConnectionUrl, bool Username, bool Password, bool IndexPrefix; **PluginSettings**: bool MarketplaceUrl, bool SignaturePublicKeyFiles, bool ChimeraOAuthProxyUrl; **MessageExportSettings**: bool GlobalRelaySettings.SmtpUsername, bool GlobalRelaySettings.SmtpPassword, bool GlobalRelaySettings.EmailAddress + **ServiceSettings**: bool SiteURL, bool WebsocketURL, bool TLSCertFile, bool TLSKeyFile, bool ReadTimeout, bool WriteTimeout,bool IdleTimeout, bool GoogleDeveloperKey, bool AllowCorsFrom, bool CorsExposedHeaders, bool AllowedUntrustedInternalConnections, bool GfycatApiKey, bool GfycatApiSecret, bool ManagedResourcePaths, bool CollapsedThreads, bool PostPriority, bool AllowPersistentNotifications, bool PersistentNotificationMaxCount, bool PersistentNotificationIntervalMinutes, bool PersistentNotificationMaxRecipients; **TeamSettings**: bool SiteName, bool CustomBrandText, bool CustomDescriptionText, bool UserStatusAwayTimeout, bool ExperimentalPrimaryTeam; **DisplaySettings**: bool CustomUrlSchemes; **GuestAccountSettings**: bool RestrictCreationToDomains; **LogSettings**: bool FileLocation; **NotificationLogSettings**: bool FileLocation; **EmailSettings**: bool FeedbackName, bool FeedbackEmail, bool FeedbackOrganization, bool LoginButtonColor, bool LoginButtonBorderColor, bool LoginButtonTextColor, bool ImageProxyType, bool ImageProxyURL, bool ImageProxyOptions; **RateLimitSettings**: bool VaryByHeader; **SupportSettings**: bool TermsOfServiceLink, bool PrivacyPolicyLink, bool AboutLink, bool HelpLink, bool ReportAProblemLink, bool AppCustomURLSchemes, bool SupportEmail; **ThemeSettings**: bool DefaultTheme; **TimeZoneSettings**: bool SupportedTimezonesPath; **LdapSettings**: bool FirstNameAttribute, bool LastNameAttribute, bool EmailAttribute, bool UserNameAttribute, bool NicknameAttribute, bool IdAttribute, bool PositionAttribute, bool LoginFieldName, bool LoginButtonColor, bool LoginButtonBorderColor, bool LoginButtonTextColor, bool GroupFilter, bool GroupDisplayNameAttribute, bool GroupIdAttribute, bool GuestFilter, bool AdminFilter; **SamlSettings**: bool SignatureAlgorithm, bool CanonicalAlgorithm, bool ScopingIDPProviderId, bool ScopingIDPName, bool IdAttribute, bool GuestAttribute, bool FirstNameAttribute, bool LastNameAttribute, bool EmailAttribute, bool UserNameAttribute, bool NicknameAttribute, bool LocaleAttribute, bool PositionAttribute, bool LoginIdAttribute, bool LoginButtonText, bool LoginButtonColor, bool LoginButtonBorderColor, bool LoginButtonTextColor, bool AdminFilter; **NativeAppSettings**: bool AppDownloadLink, bool AndroidAppDownloadLink, bool IosAppDownloadLink; **WebrtcSettings** (only in v5.5 and earlier): bool StunURI, bool TurnURI; **ClusterSettings**: bool NetworkInterface, bool BindAddress, bool AdvertiseAddress; **MetricsSettings**: bool BlockProfileRate; **AnalyticsSettings**: bool MaxUsersForStatistics; **ExperimentalSettings** bool ClientSideCertCheck; **AnnouncementSettings**: bool BannerColor, bool BannerTextColor; **ElasticsearchSettings**: bool ConnectionUrl, bool Username, bool Password, bool IndexPrefix; **PluginSettings**: bool MarketplaceUrl, bool SignaturePublicKeyFiles, bool ChimeraOAuthProxyUrl; **MessageExportSettings**: bool GlobalRelaySettings.SmtpUsername, bool GlobalRelaySettings.SmtpPassword, bool GlobalRelaySettings.EmailAddress Commercial License Information (Enterprise Edition only) Information about commercial license key purchased or trial license key used for Enterprise Edition servers: Company ID, license ID, license issue date, license start date, license expiry date, number of licensed users, license name, list of unlocked subscription features. @@ -162,8 +162,8 @@ Non-personally Identifiable Diagnostic Information, distinguished by end users a - *In Product Notices Diagnostics:* Notices viewed, and the notices on which an action button was clicked. - *Collapsed Reply Threads:* Clicks to reply to a thread, reply using the footer element, filter threads by unread, mark as read, access to global threads section. -Playbooks telemetry -------------------- +Playbooks plugin telemetry +-------------------------- Playbooks metadata is collected and sent every 24 hours. Visit the `playbooks telemetry file `_ for details about the types of metadata collected. diff --git a/source/onboard/ad-ldap.rst b/source/onboard/ad-ldap.rst index a4ad101b62e..0b875d1f885 100644 --- a/source/onboard/ad-ldap.rst +++ b/source/onboard/ad-ldap.rst @@ -1,4 +1,4 @@ -SActive directory/LDAP setup +Active directory/LDAP setup =========================== .. include:: ../_static/badges/ent-pro-cloud-selfhosted.rst diff --git a/source/onboard/advanced-permissions-backend-infrastructure.rst b/source/onboard/advanced-permissions-backend-infrastructure.rst index ce24809a04b..d8cde6d2032 100644 --- a/source/onboard/advanced-permissions-backend-infrastructure.rst +++ b/source/onboard/advanced-permissions-backend-infrastructure.rst @@ -66,8 +66,6 @@ Permissions in Mattermost are a property of the server code base and are not cre +----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | add_user_to_team | team | Add existing server users to the current team. | +----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| use_slash_commands | channel | Use slash commands. | -+----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | manage_slash_commands | system | Create, edit, and delete your own slash commands. | +----------------------------------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | manage_others_slash_commands | system | Edit or delete other users' slash commands. | @@ -255,7 +253,6 @@ The following built-in roles and associated permissions are available: *channel_guest* -- use_slash_commands - read_channel - add_reaction - remove_reaction @@ -280,7 +277,6 @@ The following built-in roles and associated permissions are available: - get_public_link - remove_reaction - manage_public_channel_members -- use_slash_commands - upload_file - manage_private_channel_properties - create_post @@ -390,7 +386,6 @@ The following built-in roles and associated permissions are available: - delete_public_channel - read_public_channel - sysconsole_read_about -- use_slash_commands - read_bots - sysconsole_read_authentication - edit_other_users diff --git a/source/onboard/managing-team-channel-membership-using-ad-ldap-sync-groups.rst b/source/onboard/managing-team-channel-membership-using-ad-ldap-sync-groups.rst index 4db00fac929..2c0ce0e7513 100644 --- a/source/onboard/managing-team-channel-membership-using-ad-ldap-sync-groups.rst +++ b/source/onboard/managing-team-channel-membership-using-ad-ldap-sync-groups.rst @@ -41,7 +41,7 @@ To manage membership of a private team with synchronized groups: Alternatively you can use the CLI tool to set the team to be managed by groups: -1. Ensure there's at least one group already associated to the team. You can view and add default teams to a group via **System Console > User Management > Groups > Group Configuration**. Please see more information on adding default teams and channels `here `_. Additionally, you can use the CLI tool to view if there is already a group associated to the team by running the `group team list CLI command `_. +1. Ensure there's at least one group already associated to the team. You can view and add default teams to a group via **System Console > User Management > Groups > Group Configuration**. See the `CLI `__ documentation for more information on adding default teams and channels. Additionally, you can use the CLI tool to view if there is already a group associated to the team by running the `group team list CLI command `_. 2. Ensure **Team Settings > General > Allow any user with an account on this server to join this team** is set to ``No``. 3. Convert the team to have its membership managed by synchronized groups by running the `group team enable CLI command `_. @@ -56,7 +56,7 @@ To manage membership of a private channel with synchronized groups: Alternatively you can use the CLI tool to set a private channel to be managed by groups: -1. Ensure there's at least one group already associated to the channel. You can view and add default channels to a group via **System Console > User Management > Groups > Group Configuration**. Please see more information on adding default teams and channels `here `_. Additionally, you can use the CLI tool to view if there is already a group associated to the channel by running the `group channel list CLI command `_. +1. Ensure there's at least one group already associated to the channel. You can view and add default channels to a group via **System Console > User Management > Groups > Group Configuration**. See our `AD/LDAP `__ documentation for more information on adding default teams and channels. Additionally, you can use the CLI tool to view if there is already a group associated to the channel by running the `group channel list CLI command `_. 2. Convert the team to have its membership managed by synchronized groups by running the `group channel enable CLI command `_. Add or remove groups from teams diff --git a/source/onboard/migrating-from-hipchat-to-mattermost.rst b/source/onboard/migrating-from-hipchat-to-mattermost.rst index e0126876c70..72e05e35b80 100644 --- a/source/onboard/migrating-from-hipchat-to-mattermost.rst +++ b/source/onboard/migrating-from-hipchat-to-mattermost.rst @@ -62,7 +62,7 @@ Use the following message template to alert users of the migration:: **Announcing Mattermost onboarding using email using username/password:** -#. Get a list of email addresses of people in the new system by running a database query on Mattermost. Run ``SELECT Email FROM Users`` from either MySQL or PostgreSQL databases. +#. Get a list of email addresses of people in the new system by running a database query on Mattermost. Run ``SELECT Email FROM Users`` from either PostgreSQL or MySQL databases. #. Adapt the `migration announcement email template `__ to let users know how to reclaim their old accounts or start new ones. Onboard users using SSO in Mattermost diff --git a/source/onboard/migrating-to-mattermost.rst b/source/onboard/migrating-to-mattermost.rst index d2e1a4f33c7..8728e79b31e 100644 --- a/source/onboard/migrating-to-mattermost.rst +++ b/source/onboard/migrating-to-mattermost.rst @@ -4,7 +4,7 @@ Migration guide .. include:: ../_static/badges/allplans-selfhosted.rst :start-after: :nosearch: -Thousands of organizations are moving to Mattermost for powerful, flexible, and easy-to-manage workplace collaboration. Mattermost deploys as a single Linux binary with MySQL or PostgreSQL, and can scale from dozens to tens of thousands of users in a single channel. +Thousands of organizations are moving to Mattermost for powerful, flexible, and easy-to-manage workplace collaboration. Mattermost deploys as a single Linux binary with PostgreSQL, and can scale from dozens to tens of thousands of users in a single channel. This guide summarizes different approaches to migrating from one Mattermost deployment to another, and migrating from other tools (such as Slack, HipChat, Jabber, and bespoke solutions) to Mattermost. @@ -17,33 +17,25 @@ Migrate Mattermost server The following instructions migrate Mattermost from one server to another by backing up and restoring the Mattermost database and ``config.json`` file. For these instructions **SOURCE** refers to the Mattermost server *from which* your system will be migrated and **DESTINATION** refers to the Mattermost server *to which* your system will be migrated. -1. Back up your SOURCE Mattermost server. - 1. See `Backup and Disaster Recovery documentation `__. -2. Upgrade your SOURCE Mattermost server to the latest major build version. - 1. See `Upgrading Mattermost Server documentation `__. -3. Install the latest major build of Mattermost server as your DESTINATION. - 1. See `Install Mattermost documentation
`__ for details. Make sure your new instance is properly configured and tested. The database type (MySQL or PostgreSQL) and version of SOURCE and DESTINATION deployments need to match. - 2. Stop the DESTINATION server using ``sudo stop mattermost``, then back up the database and ``config.json`` file. -4. Migrate database from SOURCE to DESTINATION. - 1. Backup the database from the SOURCE Mattermost server and restore it in place of the database to which the DESTINATION server is connected. -5. Migrate ``config.json`` from SOURCE to DESTINATION. - 1. Copy of ``config.json`` file from SOURCE deployment to DESTINATION. +1. Back up your SOURCE Mattermost server. See `Backup and Disaster Recovery documentation `__. +2. Upgrade your SOURCE Mattermost server to the latest major build version. See `Upgrading Mattermost Server documentation `__. +3. Install the latest major build of Mattermost server as your DESTINATION. See `Install Mattermost documentation
`__ for details. + + - Make sure your new instance is properly configured and tested. The database type (MySQL or PostgreSQL) and version of SOURCE and DESTINATION deployments need to match. + - Stop the DESTINATION server using ``sudo stop mattermost``, then back up the database and ``config.json`` file. +4. Migrate database from SOURCE to DESTINATION. Backup the database from the SOURCE Mattermost server and restore it in place of the database to which the DESTINATION server is connected. +5. Migrate ``config.json`` from SOURCE to DESTINATION. Copy ``config.json`` file from SOURCE deployment to DESTINATION. 6. If you use local storage (``FileSettings.DriverName`` is set to ``local``), migrate ``./data`` from SOURCE to DESTINATION. - 1. Copy the ``./data`` directory from SOURCE deployment to DESTINATION. - 2. If you use a directory other than ``./data``, copy that directory instead. -7. Start the DESTINATION deployment. - 1. Run ``sudo start mattermost``. - 2. Go to the **System Console**, make a minor change, and save it to upgrade your ``config.json`` schema to the latest version using default values for any new settings added. -8. Test that the system is working by going to the URL of an existing team. - 1. You may need to refresh your Mattermost browser page in order to get the latest updates from the upgrade. -Once your migration is complete and verified, you can optionally `upgrade the Team Edition of Mattermost to Enterprise Edition using the upgrade guide `__. + - Copy the ``./data`` directory from SOURCE deployment to DESTINATION. + - If you use a directory other than ``./data``, copy that directory instead. +7. Start the DESTINATION deployment by running ``sudo start mattermost``. Then go to the **System Console**, make a minor change, and save it to upgrade your ``config.json`` schema to the latest version using default values for any new settings added. +8. Test that the system is working by going to the URL of an existing team. You may need to refresh your Mattermost browser page in order to get the latest updates from the upgrade. -Migrate to Mattermost from other messaging solutions ------------------------------------------------------ +Once your migration is complete and verified, you can optionally `upgrade the Team Edition of Mattermost to Enterprise Edition using the upgrade guide `__. -Migrate from bespoke messaging solutions to Mattermost -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Migrate to Mattermost from bespoke messaging solutions +------------------------------------------------------- Many enterprises run bespoke, unsupported, lightly documented messaging systems driven by the initial excitement of the product's promise. @@ -51,7 +43,8 @@ Often the solutions were championed by tech-savvy early adopters who loved a few Over time, management moves to an IT team, where an unsupported solution becomes problematic to maintain and secure. Mattermost is often selected to replace bespoke solutions by IT and DevOps teams as a stable, enterprise-grade, commercially-supported solution on an open source platform that meets and exceeds the flexibility and innovation of bespoke solutions. -**Why IT teams choose to leave bespoke solutions** +Why IT teams choose to leave bespoke solutions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Because messaging solutions in technical teams often contain confidential and highly exploitable data, messaging solutions become a security concern that could impact all of an organization's technical infrastructure. @@ -69,7 +62,8 @@ When early adopters of a bespoke solutions ask IT to "take over" and assume the Often at this point, IT teams accelerate their exploration of Mattermost as a long-term solution, given the `thousands of organizations (many in mission critical, high security industries) that have switched `__. -**Why IT teams choose Mattermost over bespoke solutions** +Why IT teams choose Mattermost over bespoke solutions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Mattermost is designed to replace bespoke messaging solutions through a platform that is unmatched in flexibility. From the `hundreds of open source projects extending and customizing Mattermost through APIs and drivers `__, to an innovative client and server plugin framework for adapting the Mattermost user experience to the specific workflows and needs, thousands of high performance teams rely on Mattermost daily. @@ -103,7 +97,7 @@ Sometimes systems running in parallel turn into a hard switch migration when a b When IT adopts management of Mattermost, often they will purchase the commercial version for additional compliance, access control, and scale features, in addition to high quality commercial support for upgrades and migrations. Teams can `purchase Mattermost Enterpise Edition with a credit card online `__ or `contact sales `__ to engage in an enterprise procurement process. Migrate from Slack -~~~~~~~~~~~~~~~~~~ +------------------ Slack offers two ways to `export your data from their product `_. @@ -117,9 +111,7 @@ Slack offers two ways to `export your data from their product `__. + The ability to migrate from Slack using the Mattermost web app has been deprecated and removed in favor of using the `Mattermost mmetl tool with bulk import <#use-the-mattermost-mmetl-tool-and-bulk-import>`_. 1. Generate a Slack export file from **Slack > Administration > Workspace Settings > Import/Export Data > Export > Start Export**. Alternatively, use the Slack Corporate Export file after receiving it from Slack. 2. In Mattermost go to **Main Menu > Team Settings > Import > Import from Slack**. Team admin or system admin permission is required to access this menu option. @@ -241,7 +229,7 @@ Use the imported team * Once logged in, Mattermost users will have access to previous Slack messages in the public channels imported from Slack. Migrate from Bitnami -~~~~~~~~~~~~~~~~~~~~ +-------------------- Bitnami uses MySQL, and renames the Mattermost database tables by converting the names to all lower case. For example, in non-Bitnami installations, the Users table is named "Users", but in Bitnami, the table is "users". As a result, when you migrate your data from Bitnami to a non-Bitnami installation, you must modify the MySQL startup script so that it starts MySQL in lowercase table mode. @@ -250,18 +238,18 @@ You can modify the script by adding the ``--lower-case-table-names=1`` switch to For more information about letter case in MySQL table names and the ``--lower-case-table-names`` switch, see the `Identifier Case Sensitivity `__ topic in the MySQL documentation. Migrate from HipChat Server and HipChat Data Center to Mattermost -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------------------------------------ Please see `HipChat Migration Guide `__. Migrate from Jabber to Mattermost -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +--------------------------------- BrightScout helped a major U.S. Federal Agency rapidly migrate from Jabber to Mattermost and open sourced their Extract, Transform and Load (ETL) tool at https://github.com/Brightscout/mattermost-etl. Read more about their `case study `__ online. Migrate from Pidgin to Mattermost -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +--------------------------------- In some cases people are using Pidgin clients with different backends to communicate. To continue using Pidgin with a Mattermost backend consider using `Mattermost ETL tool `__ created by BrightScout to migrate data from your existing backend into Mattermost, then use the `Pidgin-Mattermost plugin `__ (complete with an installer for end user machines) to continue to support legacy Pidgin users while offering a whole new Mattermost experience on web, mobile, and PC. diff --git a/source/onboard/multi-factor-authentication.rst b/source/onboard/multi-factor-authentication.rst index 54d03878517..cf01b945936 100644 --- a/source/onboard/multi-factor-authentication.rst +++ b/source/onboard/multi-factor-authentication.rst @@ -12,7 +12,7 @@ With MFA enabled, users need to provide a secure one-time code in addition to th Mattermost offers a smartphone-based MFA check in addition to email-password or Active Directory/LDAP authentication to log in to the Mattermost server. -Supported smartphones include iOS, Android, Blackberry, and Windows Phone devices that are able to install `Google Authenticator `__. Other than requiring internet access to download and install Google Authenticator, the phone used for Mattermost MFA does not require internet access. +Supported devices include iOS, Android, or other devices that are able to install Google Authenticator or a similar app. After the app is installed, the device does not require internet access. .. note:: diff --git a/source/onboard/sso-saml-keycloak.rst b/source/onboard/sso-saml-keycloak.rst index a525a1e3b39..3dd86b3050f 100644 --- a/source/onboard/sso-saml-keycloak.rst +++ b/source/onboard/sso-saml-keycloak.rst @@ -34,8 +34,8 @@ Set up a connection app for Mattermost SSO - **Valid Redirects**: ``https://<>/login/sso/saml`` - **Base URL**: ``https://<>/login/sso/saml`` -.. image:: ../../source/images/keycloak_1_client_settings.png - :alt: In Keycloak, create the Mattermost client, specify the Client ID and Client Protocol, then save your changes. + .. image:: ../../source/images/keycloak_1_client_settings.png + :alt: In Keycloak, create the Mattermost client, specify the Client ID and Client Protocol, then save your changes. 4. Save the client config. @@ -51,11 +51,11 @@ Set up a connection app for Mattermost SSO - **Store Password**: ``mattermost`` .. note:: + In the image below, we used `Mattermost` for the `Realm Certificate Alias`. You can use any value that you would like here, as it's designed to identify what this certificate is within your Keycloak realm. - -.. image:: ../../source/images/keycloak_2_saml_keys.png - :alt: In Keycloak, on the Keys tab, generate new keys, export using the values documented, then select Download. + .. image:: ../../source/images/keycloak_2_saml_keys.png + :alt: In Keycloak, on the Keys tab, generate new keys, export using the values documented, then select Download. 8. Add the default attributes: @@ -64,8 +64,8 @@ Set up a connection app for Mattermost SSO c. Select the **X500 email**, **X500 givenName**, and **X500 surname** attributes. d. Select **Add selected**. -.. image:: ../../source/images/keycloak_3_add_builtins.png - :alt: In Keycloak, on the Mappers tab, add default attributes + .. image:: ../../source/images/keycloak_3_add_builtins.png + :alt: In Keycloak, on the Mappers tab, add default attributes 9. Add the username and ID attribute. @@ -79,12 +79,12 @@ Set up a connection app for Mattermost SSO f. Select **Save**. g. Repeat this step and use the property of ``id`` to create the ID Attribute. -.. image:: ../../source/images/keycloak_4_create_username_attribute.png - :alt: In Keycloak, on the Mappers tab, create a protocol mapper, then save your changes. + .. image:: ../../source/images/keycloak_4_create_username_attribute.png + :alt: In Keycloak, on the Mappers tab, create a protocol mapper, then save your changes. Once done your Mappers should look like this: -.. image:: ../../source/images/keycloak_4_create_username_attribute_finished.png - :alt: Example of protocol mapper configuration. + .. image:: ../../source/images/keycloak_4_create_username_attribute_finished.png + :alt: Example of protocol mapper configuration. 10. Get the metadata URL from Keycloak: @@ -92,8 +92,8 @@ Set up a connection app for Mattermost SSO a. Within your Realm, select **Realm Settings**. b. At the bottom of the **General** tab you should see a **SAML 2.0 Identity Provider Metadata** endpoint. Right-click and copy this URL. Store for the next step. -.. image:: ../../source/images/keycloak_9_export_metadata.png - :alt: Within your Realm, select Realm Settings. At the bottom of the General tab, you should see a SAML 2.0 Identify Provider Metadata endpoint. Copy this URL for the next step. + .. image:: ../../source/images/keycloak_9_export_metadata.png + :alt: Within your Realm, select Realm Settings. At the bottom of the General tab, you should see a SAML 2.0 Identify Provider Metadata endpoint. Copy this URL for the next step. Configure SAML for Mattermost ----------------------------- @@ -104,8 +104,8 @@ Configure SAML for Mattermost If you have any issues with this import, you can check the ``mattermost.log`` file for more information. You will need to turn on debug logging and try again if you do not already have debug logging enabled. -.. image:: ../../source/images/keycloak_10_get_metadata.png - :alt: In Mattermost, configure SAML in the System Console by going to Authentication > SAML. Set the Identity Provider Metadata URL to the value you copied in the previous step. When you select Get SAML Metadata from IdP, fields related to your Keycloak configuration are populated. + .. image:: ../../source/images/keycloak_10_get_metadata.png + :alt: In Mattermost, configure SAML in the System Console by going to Authentication > SAML. Set the Identity Provider Metadata URL to the value you copied in the previous step. When you select Get SAML Metadata from IdP, fields related to your Keycloak configuration are populated. 3. Set the below fields: @@ -115,31 +115,31 @@ Configure SAML for Mattermost The Service Provider Identifier will match the **Client ID** that you configured in the second Keycloak step. -.. image:: ../../source/images/keycloak_5_mattermost_config.png - :alt: In the System Console, configure SAML as documented, where the Service Provider Identifier matches the Client ID you configured in Keycloak. + .. image:: ../../source/images/keycloak_5_mattermost_config.png + :alt: In the System Console, configure SAML as documented, where the Service Provider Identifier matches the Client ID you configured in Keycloak. 4. Configure the Encryption using the key you downloaded in step 8 of the Keycloak config. a. Generate the ``.crt`` file from the ``.p12`` file. - ``openssl pkcs12 -in keystore.p12 -out mattermost.crt -nodes`` + ``openssl pkcs12 -in keystore.p12 -out mattermost.crt -nodes`` b. Generate the ``.key`` file from the ``.p12`` file. - ``openssl pkcs12 -in keystore.p12 -out mattermost.key -nodes -nocerts`` + ``openssl pkcs12 -in keystore.p12 -out mattermost.key -nodes -nocerts`` c. Upload both of these files within the Mattermost System Console. Make sure to select **Upload**. - **Service Provider Private Key**: ``mattermost.key`` - **Service Provider Private Certificate**: ``mattermost.crt`` -.. image:: ../../source/images/keycloak_6_mattermost_encryption.png - :alt: In the System Console, upload both the Service Provider Private Key and the Service Provider Private Certificate. + .. image:: ../../source/images/keycloak_6_mattermost_encryption.png + :alt: In the System Console, upload both the Service Provider Private Key and the Service Provider Private Certificate. 5. (Optional) Set up request signing with the below parameters. -.. image:: ../../source/images/keycloak_7_mattermost_request_signing.png - :alt: In the System Console, you can optionally request signing with configured parameters. + .. image:: ../../source/images/keycloak_7_mattermost_request_signing.png + :alt: In the System Console, you can optionally request signing with configured parameters. 6. Set attributes for the SAML Assertions, which will update user information in Mattermost. @@ -149,8 +149,8 @@ Configure SAML for Mattermost - **Username Attribute**: ``username`` - **Id Attribute**: ``id`` -.. image:: ../../source/images/keycloak_8_mattermost_attributes.png - :alt: Set attributes for the SAML assertions which updates user information in Mattermost. + .. image:: ../../source/images/keycloak_8_mattermost_attributes.png + :alt: Set attributes for the SAML assertions which updates user information in Mattermost. 7. Select **Save**. diff --git a/source/overview/index.rst b/source/overview/index.rst index a294819624f..63029082bb9 100644 --- a/source/overview/index.rst +++ b/source/overview/index.rst @@ -27,7 +27,7 @@ Mattermost is an open source platform that provides secure collaboration for tec Mattermost contains three key tools: * :doc:`Channels
` - Stay connected with your team via 1:1 and group messages, voice calls, and screensharing. -* :doc:`Playbooks
` - Build and configure repeatable processes with workflow automation to achieve specific and predictable outcomes. +* :doc:`Playbooks plugin
` - Build and configure repeatable processes with workflow automation to achieve specific and predictable outcomes. * :doc:`Boards
` - Manage projects and tasks in a Kanban board structure to help your team hit key milestones. This section provides an overview of Mattermost products, features, security, integrations, licensing, subscriptions, authentication, and compliance support. diff --git a/source/playbooks/metrics-and-goals.rst b/source/playbooks/metrics-and-goals.rst index 817a5f39ad5..99943f7b874 100644 --- a/source/playbooks/metrics-and-goals.rst +++ b/source/playbooks/metrics-and-goals.rst @@ -56,4 +56,4 @@ The lower half of the page shows a list of finished runs with metrics values. Yo Channel export ^^^^^^^^^^^^^^ -Exporting the contents of a channel requires the channel export plugin. See the `Channel Export plugin documentation `_ for more information. +Exporting the contents of a channel requires the channel export plugin. See the `Channel Export plugin documentation `_ for more information. diff --git a/source/playbooks/overview.rst b/source/playbooks/overview.rst index 93c61c8662f..2ecf4080362 100644 --- a/source/playbooks/overview.rst +++ b/source/playbooks/overview.rst @@ -4,9 +4,9 @@ Overview .. include:: ../_static/badges/allplans-cloud-selfhosted.rst :start-after: :nosearch: -Mattermost Playbooks is a collaboration tool that defines a repeatable process to enable teams to achieve specific and predictable outcomes. With playbooks, development teams can orchestrate prescribed workflows and define, streamline, and document complex, recurring operations. +The Mattermost Playbooks plugin is a collaboration tool that defines a repeatable process to enable teams to achieve specific and predictable outcomes. With playbooks, development teams can orchestrate prescribed workflows and define, streamline, and document complex, recurring operations. -Mattermost Playbooks is included in Mattermost self-hosted and Mattermost Cloud workspace. You can access Playbooks via the product menu in the top-left corner of Mattermost. +The Mattermost Playbooks plugin is enabled by default for Mattermost self-hosted and Mattermost Cloud workspaces. You can access the Playbooks plugin via the product menu in the top-left corner of Mattermost. To find all playbook runs, open **Product menu > Playbooks**, and then select any playbook name. Next, select **Runs** from the navigation bar, then choose a run to view its overview. Select **Go to channel** to open the run’s channel. @@ -17,7 +17,7 @@ Playbooks are made up of: - **Checklists**: The list of tasks to be completed for the run. `Checklists `_ can be edited ad-hoc during a run. - **Templates**: `Templates `_ for frequently-used actions such as updates and reminders. You can create your own templates or use default ones. - **Actions**: `Automation options `_ for inviting members, creating webhooks, editing welcome messages, and more. -- **Permissions**: Manage :doc:`permissions ` at a channel and a playbook level. +- **Permissions**: Manage :doc:`permissions ` at a channel and a playbook level. Teams run a playbook every time they want to orchestrate people, tools, and data to achieve that outcome as quickly as possible while providing visibility to stakeholders. diff --git a/source/playbooks/share-and-collaborate.rst b/source/playbooks/share-and-collaborate.rst index 4dfba7d25eb..ac0d792c7a4 100644 --- a/source/playbooks/share-and-collaborate.rst +++ b/source/playbooks/share-and-collaborate.rst @@ -18,7 +18,7 @@ For more information about System and Team Override Schemes, refer to the `Advan Some permissions functionality is only available to Mattermost Enterprise customers. For more information, visit `https://mattermost.com/pricing `__. -In the context of Playbooks, members are assigned a role and based on the selected permissions, this determines how they interact with Playbooks. A member can be a member of one playbook, and an admin of another. This allows for granular permissions across teams and departments. For example, setting playbook visibility so only certain teams can view it, or setting permissions to allow an organization to view a playbook but only designated team members can make edits. +In the context of Playbooks, members are assigned a role and based on the selected permissions, this determines how they interact with playbooks. A member can be a member of one playbook, and an admin of another. This allows for granular permissions across teams and departments. For example, setting playbook visibility so only certain teams can view it, or setting permissions to allow an organization to view a playbook but only designated team members can make edits. Permissions are applied only to playbooks - there are no permissions that are specific to runs. @@ -102,7 +102,7 @@ To import a playbook, go to the Playbooks screen, and select **Import**. Choose Channel export ^^^^^^^^^^^^^^ -Exporting the contents of a channel requires the channel export plugin. See the `Channel Export plugin documentation `_ for more information. +Exporting the contents of a channel requires the channel export plugin. See the `Channel Export plugin documentation `_ for more information. .. note:: diff --git a/source/playbooks/work-with-playbooks.rst b/source/playbooks/work-with-playbooks.rst index 3b36f162888..7b1cac76934 100644 --- a/source/playbooks/work-with-playbooks.rst +++ b/source/playbooks/work-with-playbooks.rst @@ -57,7 +57,7 @@ You can change a playbook’s configuration at any time, but changes will only b Make checklists ---------------- -1. In channels, select **Toggle Playbook List** from the apps bar. +1. In channels, select **Toggle Playbook List** from the Apps Bar. 2. Select an exiStart a **Blank Playbook**, or use the built-in template. 3. Name your playbook and provide a description. 4. Select the **Checklists** tab. diff --git a/source/recipes/product-vulnerability-incident.rst b/source/recipes/product-vulnerability-incident.rst index d86e5ad33da..6db8ea0890d 100644 --- a/source/recipes/product-vulnerability-incident.rst +++ b/source/recipes/product-vulnerability-incident.rst @@ -13,7 +13,7 @@ After getting access to your Mattermost instance, you’d like to set up a workf Solution -------- -This guide walks through the set up of a product security incident room using the Mattermost `Playbooks
`__ and `Channels `__ with voice calling and screen sharing functionalities. +This guide walks through the set up of a product security incident room using the Mattermost `Playbooks plugin `__ and `Channels `__ with voice calling and screen sharing functionalities. 1. Workspace setup ~~~~~~~~~~~~~~~~~~ @@ -78,7 +78,7 @@ For Mattermost Team Edition, only 1:1 calls are supported. Open a direct message Discussion ---------- -Using Mattermost Playbooks you can ensure a streamlined approach to incident resolution. Our playbook template walks through a typical product vulnerability remediation aims to provide a structure resolution and also keeping the right stakeholder informed. +Using the Mattermost Playbooks plugin you can ensure a streamlined approach to incident resolution. Our playbook template walks through a typical product vulnerability remediation aims to provide a structure resolution and also keeping the right stakeholder informed. The playbook starts with a **Triage** stage that verifies the validity of the issue, continues with an **Investigation** of exploitation (if possible) and follows with an active **Remediation** of the issue. After the issue is mitigated, the incident can go into **Resolution** and be closed with an incident post-mortem. diff --git a/source/scale/elasticsearch.rst b/source/scale/elasticsearch.rst index 7483ac98e6f..00ddb873ad7 100644 --- a/source/scale/elasticsearch.rst +++ b/source/scale/elasticsearch.rst @@ -140,7 +140,7 @@ Do I need to use Elasticsearch? The Elasticsearch engine is designed for large Enterprise deployments to run highly efficient database searches in a cluster environment. The default Mattermost database search starts to show performance degradation at around 2.5 million posts, depending on the specifications for the database server. If you expect your Mattermost server to have more than 2.5 million posts, we recommend using Elasticsearch for optimum search performance. Should I install Elasticsearch on the same machine as Mattermost Server? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ No. We strongly recommend that you install Elasticsearch on a different machine than the Mattermost Server. diff --git a/source/scale/high-availability-cluster.rst b/source/scale/high-availability-cluster.rst index 9b38be34c28..887db0834b2 100644 --- a/source/scale/high-availability-cluster.rst +++ b/source/scale/high-availability-cluster.rst @@ -232,7 +232,7 @@ Deploy a multi-database configuration To configure a multi-database Mattermost server: -1. Update the ``DataSource`` setting in ``config.json`` with a connection string to your master database server. The connection string is based on the database type set in ``DriverName``, either ``postgres`` or ``mysql``. +1. Update the ``DataSource`` setting in ``config.json`` with a connection string to your master database server. 2. Update the ``DataSourceReplicas`` setting in ``config.json`` with a series of connection strings to your database read replica servers in the format ``["readreplica1", "readreplica2"]``. Each connection should also be compatible with the ``DriverName`` setting. Here's an example ``SqlSettings`` block for one master and two read replicas: @@ -280,7 +280,7 @@ While the connection settings are changing, there might be a brief moment when w Transparent failover ```````````````````` -The database can be configured for high availability and transparent failover use the existing database technologies. We recommend MySQL Clustering, Postgres Clustering, or Amazon Aurora. Database transparent failover is beyond the scope of this documentation. +The database can be configured for high availability and transparent failover use the existing database technologies. We recommend PostgreSQL Clustering or Amazon Aurora. Database transparent failover is beyond the scope of this documentation. Recommended configuration settings for PostgreSQL `````````````````````````````````````````````````` @@ -320,17 +320,6 @@ If you're using PostgreSQL as the choice of database, we recommend the following If you are using pgbouncer, or any similar connection pooling proxy, in front of your DB, then apply the keepalive settings to the proxy instead, and revert the keepalive settings for the DB back to defaults. -Recommended configuration settings for MySQL -```````````````````````````````````````````` - -For MySQL, we recommend the following configuration options for high performance: - -1. **innodb_buffer_pool_size**: Set to about 70% of your total RAM. -2. **innodb_log_file_size**: Set to 256MB. Increasing this helps in write intensive operations. Downside is that recovery times will be longer. -3. **innodb_flush_log_at_trx_commit**: 2. Note that this can potentially cause up to 1 second of loss of transaction data. -4. **max_heap_table_size**: 64MB. -5. **tmp_table_size**: 64MB. - Leader election ^^^^^^^^^^^^^^^^ diff --git a/source/templates/index.html b/source/templates/index.html index 9d638252916..681a10db8a9 100644 --- a/source/templates/index.html +++ b/source/templates/index.html @@ -389,7 +389,7 @@

Channels

-

Playbooks

+

Playbooks plugin

Build reliable and repeatable responses for workflow and process automation.

@@ -469,7 +469,7 @@

Get Help

diff --git a/source/upgrade/downgrading-mattermost-server.rst b/source/upgrade/downgrading-mattermost-server.rst index 26252ead2a8..da474bd9612 100644 --- a/source/upgrade/downgrading-mattermost-server.rst +++ b/source/upgrade/downgrading-mattermost-server.rst @@ -6,8 +6,8 @@ Downgrade Mattermost Server In most cases you can downgrade Mattermost Server using the same steps as :doc:`upgrading-mattermost-server`. The binaries can be found in the :doc:`version-archive`. We do not recommend downgrading more than one version back from your current installation. -Downgrade from v6.0 to v5.38 ------------------------------ +Downgrade Mattermost v6.0 to v5.38 +----------------------------------- Run the following set of queries, specific to your database, to downgrade the schema from v6.0 to v5.38. @@ -15,80 +15,38 @@ Run the following set of queries, specific to your database, to downgrade the sc The performance impact of a downgrade from v6.0 is similar to the v6.0 database migration. See the `Upgrading Mattermost Server `__ documentation for details. -.. tabs:: - - .. tab:: MySQL - - .. code-block:: sh - - INSERT INTO Systems (Name,Value) VALUES ('Version','5.38.0') ON DUPLICATE KEY UPDATE Value = '5.38.0'; - - CREATE INDEX idx_status_status ON Status (Status); - DROP INDEX idx_status_status_dndendtime ON Status; - CREATE INDEX idx_channelmembers_user_id ON ChannelMembers (UserId); - DROP INDEX idx_channelmembers_channel_id_scheme_guest_user_id ON ChannelMembers; - DROP INDEX idx_channelmembers_user_id_channel_id_last_viewed_at ON ChannelMembers; - CREATE INDEX idx_threads_channel_id ON Threads (ChannelId); - DROP INDEX idx_threads_channel_id_last_reply_at ON Threads; - CREATE INDEX idx_channels_team_id ON Channels (TeamId); - DROP INDEX idx_channels_team_id_type ON Channels; - DROP INDEX idx_channels_team_id_display_name ON Channels; - CREATE INDEX idx_posts_root_id ON Posts (RootId); - DROP INDEX idx_posts_root_id_delete_at ON Posts; - - ALTER TABLE CommandWebhooks ADD COLUMN ParentId varchar(26); - UPDATE CommandWebhooks SET ParentId = ''; - ALTER TABLE Posts ADD COLUMN ParentId varchar(26); - UPDATE Posts SET ParentId = ''; - - ALTER TABLE Users MODIFY Timezone text; - ALTER TABLE Users MODIFY NotifyProps text; - ALTER TABLE Users MODIFY Props text; - ALTER TABLE Threads MODIFY Participants longtext; - ALTER TABLE Sessions MODIFY Props text; - ALTER TABLE Posts MODIFY Props text; - ALTER TABLE Jobs MODIFY Data text; - ALTER TABLE LinkMetadata MODIFY Data text; - ALTER TABLE ChannelMembers MODIFY NotifyProps text; - - .. note:: - - The inverse of `the final v6.0 upgrade query `__ is intentionally omitted from these downgrade queries because its result is backwards compatible, and running the query would unnecessarily delay the downgrade process. - - .. tab:: PostgreSQL - - .. code-block:: sh - - INSERT INTO Systems (Name,Value) VALUES ('Version','5.38.0') ON CONFLICT (name) DO UPDATE SET Value = '5.38.0'; - - CREATE INDEX idx_status_status ON Status (Status); - DROP INDEX idx_status_status_dndendtime; - CREATE INDEX idx_channelmembers_user_id ON ChannelMembers (UserId); - DROP INDEX idx_channelmembers_user_id_channel_id_last_viewed_at; - DROP INDEX idx_channelmembers_channel_id_scheme_guest_user_id; - CREATE INDEX idx_threads_channel_id ON Threads (ChannelId); - DROP INDEX idx_threads_channel_id_last_reply_at; - CREATE INDEX idx_channels_team_id ON Channels (TeamId); - DROP INDEX idx_channels_team_id_type; - DROP INDEX idx_channels_team_id_display_name; - CREATE INDEX idx_posts_root_id ON Posts (RootId); - DROP INDEX idx_posts_root_id_delete_at; - - ALTER TABLE CommandWebhooks ADD COLUMN ParentId varchar(26); - UPDATE CommandWebhooks SET ParentId = ''; - ALTER TABLE Posts ADD COLUMN ParentId varchar(26); - UPDATE Posts SET ParentId = ''; - - ALTER TABLE users ALTER COLUMN timezone TYPE varchar(256); - ALTER TABLE users ALTER COLUMN notifyprops TYPE varchar(2000); - ALTER TABLE users ALTER COLUMN props TYPE varchar(4000); - ALTER TABLE threads ALTER COLUMN participants TYPE text; - ALTER TABLE sessions ALTER COLUMN props TYPE varchar(1000); - ALTER TABLE posts ALTER COLUMN props TYPE varchar(8000); - ALTER TABLE linkmetadata ALTER COLUMN data TYPE varchar(4096); - ALTER TABLE jobs ALTER COLUMN data TYPE varchar(1024); - ALTER TABLE channelmembers ALTER COLUMN notifyprops TYPE varchar(2000); - - .. note:: +.. code-block:: sh + + INSERT INTO Systems (Name,Value) VALUES ('Version','5.38.0') ON CONFLICT (name) DO UPDATE SET Value = '5.38.0'; + + CREATE INDEX idx_status_status ON Status (Status); + DROP INDEX idx_status_status_dndendtime; + CREATE INDEX idx_channelmembers_user_id ON ChannelMembers (UserId); + DROP INDEX idx_channelmembers_user_id_channel_id_last_viewed_at; + DROP INDEX idx_channelmembers_channel_id_scheme_guest_user_id; + CREATE INDEX idx_threads_channel_id ON Threads (ChannelId); + DROP INDEX idx_threads_channel_id_last_reply_at; + CREATE INDEX idx_channels_team_id ON Channels (TeamId); + DROP INDEX idx_channels_team_id_type; + DROP INDEX idx_channels_team_id_display_name; + CREATE INDEX idx_posts_root_id ON Posts (RootId); + DROP INDEX idx_posts_root_id_delete_at; + + ALTER TABLE CommandWebhooks ADD COLUMN ParentId varchar(26); + UPDATE CommandWebhooks SET ParentId = ''; + ALTER TABLE Posts ADD COLUMN ParentId varchar(26); + UPDATE Posts SET ParentId = ''; + + ALTER TABLE users ALTER COLUMN timezone TYPE varchar(256); + ALTER TABLE users ALTER COLUMN notifyprops TYPE varchar(2000); + ALTER TABLE users ALTER COLUMN props TYPE varchar(4000); + ALTER TABLE threads ALTER COLUMN participants TYPE text; + ALTER TABLE sessions ALTER COLUMN props TYPE varchar(1000); + ALTER TABLE posts ALTER COLUMN props TYPE varchar(8000); + ALTER TABLE linkmetadata ALTER COLUMN data TYPE varchar(4096); + ALTER TABLE jobs ALTER COLUMN data TYPE varchar(1024); + ALTER TABLE channelmembers ALTER COLUMN notifyprops TYPE varchar(2000); + +.. note:: - The inverse of `the final v6.0 upgrade query `__ is intentionally omitted from these downgrade queries because its result is backwards compatible, and running the query would unnecessarily delay the downgrade process. \ No newline at end of file + The inverse of `the final v6.0 upgrade query `__ is intentionally omitted from these downgrade queries because its result is backwards compatible, and running the query would unnecessarily delay the downgrade process. \ No newline at end of file diff --git a/source/upgrade/extended-support-release.rst b/source/upgrade/extended-support-release.rst index 964881271f9..85ff0bb28c1 100644 --- a/source/upgrade/extended-support-release.rst +++ b/source/upgrade/extended-support-release.rst @@ -21,7 +21,7 @@ When an ESR is at the end of its life cycle, there will be announcements ahead o To receive updates about Extended Support Releases, sign up for our mailing list `here `__. -.. image:: ../images/esr.png +.. image:: ../images/ESR_graphic.png :alt: Timeline-based chart showing the lifecycle of Mattermost Extended Support Releases and feature releases from last year and this year. What is included in an Extended Support Release dot release? @@ -109,10 +109,3 @@ Earlier 4.x versions of Mattermost Desktop App and earlier v1.x versions of the Please review the `Desktop App changelog `_ and the `Mobile App changelog `_ notes for any self-hosted version requirements for features and functionalities, as well as notes on security fixes. See more details in our `release lifecycle documentation `_. - -Mobile App v1.55.1 extended support release (ESR) --------------------------------------------------- - -The latest version of the mobile app released in September 2022 (v1.55.1) is our first mobile extended support release. We are very excited about the upcoming general availability of the v2.0 mobile app in December 2022. We recognize that some customers may have a custom build of Mattermost mobile and need more time to test or implement their custom changes on mobile v2.0. The mobile ESR will be supported until July 2023. - -The mobile v1.55.1 (ESR) will be smoke tested monthly with every new server release until the mobile ESR reaches end-of-life (July 2023). The ESR version will receive critical security fixes only and be released as needed via unsigned builds to our mobile Github repository. diff --git a/source/upgrade/important-upgrade-notes.rst b/source/upgrade/important-upgrade-notes.rst index c9ce1d4307c..2a9ccab08ad 100644 --- a/source/upgrade/important-upgrade-notes.rst +++ b/source/upgrade/important-upgrade-notes.rst @@ -5,17 +5,84 @@ Important Upgrade Notes :start-after: :nosearch: .. important:: - - Support for Mattermost Server v7.1 :doc:`Extended Support Release ` has come to the end of its life cycle in May 15, 2023. Upgrading to Mattermost Server v7.8 :doc:`Extended Support Release ` or later is recommended. + - Support for Mattermost Server v7.1 :doc:`Extended Support Release ` has come to the end of its life cycle in May 15, 2023. Upgrading to Mattermost Server v7.8 :doc:`Extended Support Release ` or later is required. - MySQL 8.0.22 contains an `issue with JSON column types `__ changing string values to integers which is preventing Mattermost from working properly. Users are advised to avoid this database version. - Upgrading the Microsoft Teams Calling plugin to v2.0.0 requires users to reconnect their accounts. - When upgrading to 7.x from a 5.x release please make sure to upgrade to 5.37.10 first for the upgrade to complete successfully. - Disable global drafts. Admins can set the feature flag ``MM_FEATUREFLAGS_GLOBALDRAFTS`` to ``false`` to disable server-wide. It can't be disabled on a per-user basis. The code is located `here `__. - - Disable insights. Admins can set the feature flag ``MM_FEATUREFLAGS_INSIGHTSENABLED`` to ``false`` to disable server-wide. It can't be disabled on a per-user basis. The code is located `here `__. - - Please see the `the list `_ of deprecations and breaking changes planned for the Mattermost v8.0 release, which is scheduled for the summer of 2023. This list is subject to change prior to the release. +----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | If you’re upgrading from a version earlier than... | Then... | +====================================================+==================================================================================================================================================================+ +| v8.0 | Insights has been deprecated for all new instances and for existing servers that upgrade to v8.0. See more details in this forum post | +| | https://forum.mattermost.com/t/proposal-to-revise-our-insights-feature-due-to-known-performance-issues/16212 on why Insights has been deprecated. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | The Focalboard plugin is now disabled by default for all new instances and can be enabled in the **System Console > Plugin settings**. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | The Channel Export and Apps plugins are now disabled by default. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | Apps Bar is now enabled by default for on-prem servers. ``ExperimentalSettings.EnableAppBar`` was also renamed to ``ExperimentalSettings.DisableAppBar``. | +| | See more details at https://docs.mattermost.com/configure/experimental-configuration-settings.html#disable-app-bar and at | +| | https://forum.mattermost.com/t/channel-header-plugin-changes/13551 | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | In the main `server package`, the Go module path has changed from ``github.com/mattermost/mattermost-server/server/v8`` to | +| | ``github.com/mattermost/mattermost/server/v8``. But with the introduction of the `public` submodule, it should no longer be necessary for third-party code to | +| | import this `server` package. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | Introduced the `public `_ submodule, housing the familiar `model` and `plugin` packages, | +| | but now discretely versioned from the server. It is no longer necessary to `go get` a particular commit hash, as Go programs and plugins can now opt-in to | +| | importing `github.com/mattermost/mattermost-server/server/public` and managing versions idiomatically. While this submodule has not yet shipped a v1 and will | +| | introduce breaking changes before stabilizing the API, it remains both forwards and backwards compatible with the Mattermost server itself. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | As part of the `public` submodule above, a ``context.Context`` is now passed to ``model.Client4`` methods. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | Removed support for PostgreSQL v10. The new minimum PostgreSQL version is now v11. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | The Mattermost public API for Go is now available as a distinctly versioned package. Instead of pinning a particular commit hash, use idiomatic Go to add this | +| | package as a dependency: go get `github.com/mattermost/mattermost-server/server/public`. This relocated Go API maintains backwards compatibility with Mattermost | +| | v7. Furthermore, the existing Go API previously at github.com/mattermost/mattermost-server/v6/model remains forward compatible with Mattermost v8, but may not | +| | contain newer features. Plugins do not need to be recompiled, but developers may opt in to using the new package to simplify their build process. The new public | +| | package is shipping alongside Mattermost v8 as version 0.5.0 to allow for some additional code refactoring before releasing as v1 later this year. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | Three configuration fields have been added, ``LogSettings.AdvancedLoggingJSON``, ``ExperimentalAuditSettings.AdvancedLoggingJSON``, and | +| | ``NotificationLogSettings.AdvancedLoggingJSON`` which support multi-line JSON, escaped JSON as a string, or a filename that points to a file containing JSON. | +| | The ``AdvancedLoggingConfig`` fields have been deprecated. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | The Go MySQL driver has changed the ``maxAllowedPacket`` size from 4MiB to 64MiB. This is to make it consistent with the change in the server side default value | +| | from MySQL 5.7 to MySQL 8.0. If your ``max_allowed_packet`` setting is not 64MiB, then please update the MySQL config DSN with an additional param of | +| | ``maxAllowedPacket`` to match with the server side value. Alternatively, a value of 0 can be set to to automatically fetch the server side value, on every new | +| | connection, which has a performance overhead. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | Removed ``ExperimentalSettings.PatchPluginsReactDOM``. If this setting was previously enabled, confirm that: | +| | | +| | 1. All Mattermost-supported plugins are updated to the latest versions. | +| | 2. Any other plugins have been updated to support React 17. See the section for v7.7 release for more information. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | Removed deprecated ``PermissionUseSlashCommands``. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | Removed deprecated ``model.CommandArgs.Session``. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | For servers wanting to allow websockets to connect from other origins, please set the ``ServiceSettings.AllowCorsFrom`` `configuration setting | +| | `_. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | In v8.0 release, the following repositories are merged into one: ``mattermost-server``, ``mattermost-webapp`` and ``mmctl``. | +| | Developers should read the updated `Developer Guide `_ for details. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | Fixed an issue caused by a migration in the previous release. Query takes around 11ms on a PostgreSQL 14 DB t3.medium RDS instance. Locks on the preferences | +| | table will only be acquired if there are rows to delete, but the time taken is negligible. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | Fixed an issue where a user would still see threads in the threads view of channels they have left. Migration execution time in PostgreSQL: Execution time: | +| | 58.11 sec, DELETE 2766690. Migration execution time in MySQL: Query OK, 2766769 rows affected (4 min 47.57 sec). | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | For servers wanting to allow websockets to connect from other origins, please set the ``ServiceSettings.AllowCorsFrom`` config setting. | +| +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | The file info stats query is now optimized by denormalizing the ``channelID`` column into the table itself. This will speed up the query to get the file count | +| | for a channel when selecting the right-hand pane. Migration times: | +| | | +| | On a PostgreSQL 12.14 DB with 1731 rows in FileInfo and 11M posts, it took around 0.27s | +| | | +| | On a MySQL 8.0.31 DB with 1405 rows in FileInfo and 11M posts, it took around 0.3s | ++----------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | v7.10 | In v7.10.1, fixed an issue caused by a migration in the previous release. Query takes around 11ms on a PostgreSQL 14 DB t3.medium RDS instance. Locks on the | | | preferences table will only be acquired if there are rows to delete, but the time taken is negligible. | | +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ diff --git a/source/upgrade/open-source-components.rst b/source/upgrade/open-source-components.rst index 9d79fc5e413..5fe98293056 100644 --- a/source/upgrade/open-source-components.rst +++ b/source/upgrade/open-source-components.rst @@ -27,6 +27,8 @@ Desktop Mobile ------- + - Mattermost Mobile v2.6.0 - `View Open Source Components `_. + - Mattermost Mobile v2.5.0 - `View Open Source Components `_. - Mattermost Mobile v2.4.0 - `View Open Source Components `_. - Mattermost Mobile v2.3.0 - `View Open Source Components `_. - Mattermost Mobile v2.2.0 - `View Open Source Components `_. @@ -92,6 +94,7 @@ Mobile Server ------------------------------ + - Mattermost Enterprise Edition v8.0.0 - `View Open Source Components `_. - Mattermost Enterprise Edition v7.10.0 - `View Open Source Components `_. - Mattermost Enterprise Edition v7.9.0 - `View Open Source Components `_. - Mattermost Enterprise Edition v7.8.0 - `View Open Source Components `_. diff --git a/source/upgrade/prepare-to-upgrade-mattermost.rst b/source/upgrade/prepare-to-upgrade-mattermost.rst index 871f40ac301..03432d35fdd 100644 --- a/source/upgrade/prepare-to-upgrade-mattermost.rst +++ b/source/upgrade/prepare-to-upgrade-mattermost.rst @@ -20,51 +20,33 @@ In the case of delayed upgrades, we recommend upgrading to the closest ESR versi Upgrade to Mattermost v7.1 -------------------------- -Mattermost v7.1 introduces schema changes in the form of a new column and its index. The following notes our test results for the schema changes: +Mattermost v7.1 introduces schema changes in the form of a new column and its index. Our test results for the schema changes include: -- MySQL 12M Posts, 2.5M Reactions - ~1min 34s (instance: PC with 8 cores, 16GB RAM) - PostgreSQL 12M Posts, 2.5M Reactions - ~1min 18s (instance: db.r5.2xlarge) You can run the following SQL queries before the upgrade that obtains a lock on ``Reactions`` table. Users' reactions posted during this time won't be reflected in the database until the migrations are complete. This is fully backwards-compatible. If your connection collation and table collations are different, this can result in the error `Illegal mix of collations`. To resolve this error, set the same collation for both the connection and the table. There are different collations at different levels - connection, database, table, column, and database administrators may choose to set different collation levels for different objects. -.. tabs:: +``ALTER TABLE reactions ADD COLUMN IF NOT EXISTS channelid varchar(26) NOT NULL DEFAULT '';`` - .. tab:: MySQL +``UPDATE reactions SET channelid = COALESCE((select channelid from posts where posts.id = reactions.postid), '') WHERE channelid='';`` - ``ALTER TABLE Reactions ADD COLUMN ChannelId varchar(26) NOT NULL DEFAULT "";`` - - ``UPDATE Reactions SET ChannelId = COALESCE((select ChannelId from Posts where Posts.Id = Reactions.PostId), '') WHERE ChannelId="";`` - - ``CREATE INDEX idx_reactions_channel_id ON Reactions(ChannelId) LOCK=NONE;`` - - .. tab:: PostgreSQL - - ``ALTER TABLE reactions ADD COLUMN IF NOT EXISTS channelid varchar(26) NOT NULL DEFAULT '';`` - - ``UPDATE reactions SET channelid = COALESCE((select channelid from posts where posts.id = reactions.postid), '') WHERE channelid='';`` - - ``CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_reactions_channel_id on reactions (channelid);`` - -Upgrade to Mattermost v7.0 --------------------------- - -Self-hosted Mattermost customers using MySQL databases may notice the migration to release v7.0 taking longer than usual when there are a large number of rows in the ``FileInfo`` table. See the `important upgrade notes `__ documentation for details. +``CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_reactions_channel_id on reactions (channelid);`` Upgrade to Mattermost v6.7 -------------------------- Mattermost v6.7 introduces schema changes in the form of a new index. The following notes our test results for the schema changes: -- MySQL 7M Posts - ~17s (instance: db.r5.xlarge) -- MySQL 9M Posts - 2min 12s (instance: db.r5.large) - Postgres 7M Posts - ~9s (instance: db.r5.xlarge) -If you want a zero downtime upgrade, you can apply this index prior to doing the upgrade. This is fully backwards-compatible and will not acquire any table lock or affect any existing operations on the table. +If you want a zero downtime upgrade, you can apply this index prior to doing the upgrade. + +``CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_posts_create_at_id on posts(createat, id);`` + +This is fully backwards-compatible and will not acquire any table lock or affect any existing operations on the table. -- For MySQL: ``CREATE INDEX idx_posts_create_at_id on Posts(CreateAt, Id) LOCK=NONE;`` -- For Postgres: ``CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_posts_create_at_id on posts(createat, id);`` Upgrade to Mattermost v6.0 -------------------------- @@ -86,46 +68,13 @@ We strongly recommend that you: v6.0 database schema migrations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Mattermost v6.0 introduces several database schema changes to improve both database and application performance. The upgrade will run significant database schema changes that can cause an extended startup time depending on the dataset size. We've conducted extensive tests on supported database drivers including MySQL and PostgreSQL, using realistic datasets of more than 10 million posts and more than 72 million posts. - -A migration to v6.0 of 10+ million posts will take approximately 1 hour and 22 minutes to complete for a MySQL database. See the `Mattermost v6.0 DB schema migrations analysis `__ documentation for test specifications, data sizes, and test results. - -A large migration from v5.39 to v6.0 of 72+ million posts will take approximately 3 hours and 40 minutes to complete for a MySQL database. See the `Migration results analysis `__ documentation for test specifications, data sizes, and test results. - -.. tabs:: - - .. tab:: MySQL - - The following queries, executed during the migration process on an environment with 10+ million posts, will have a significant impact on database CPU usage and write operation restrictions for the duration of the query: - - ``ALTER TABLE Posts MODIFY Props JSON;`` (~26 minutes) - - ``ALTER TABLE Posts DROP COLUMN ParentId;`` (~26 minutes) - - ``ALTER TABLE Posts MODIFY COLUMN FileIds text;`` (~26 minutes) - - For a complete breakdown of MySQL queries, as well as their impact and duration, see the `Mattermost v6.0 DB schema migrations analysis `__ documentation. - - **MySQL Mitigation Strategies** - - **Run combined queries prior to the upgrade.** - The previous queries can be combined when run prior to the upgrade as follows: - - ``ALTER TABLE Posts MODIFY COLUMN FileIds text, MODIFY COLUMN Props JSON;`` - - This limits the time taken to that of a single query of that type. - - **Online migration**: An online migration that avoids locking can be attempted on MySQL installations, especially for particularly heavy queries or very big datasets (tens of millions of posts or more). This can be done through an external tool like `pt-online-schema-change `__. However, the online migration process can cause a significant spike in CPU usage on the database instance it runs. - - See the `Mattermost v6.0 DB schema migrations analysis `__ documentation for a sample execution and additional caveats. - - .. tab:: PostgreSQL +Mattermost v6.0 introduces several database schema changes to improve both database and application performance. The upgrade will run significant database schema changes that can cause an extended startup time depending on the dataset size. We've conducted extensive tests on supported PostgreSQL database drivers, using realistic datasets of more than 10 million posts and more than 72 million posts. - The following query executed during the migration process will have a significant impact on database CPU usage and write operation restrictions for the duration of the query: +The following query executed during the migration process will have a significant impact on database CPU usage and write operation restrictions for the duration of the query: - ``ALTER TABLE posts ALTER COLUMN props TYPE jsonb USING props::jsonb;`` (~ 11 minutes) +``ALTER TABLE posts ALTER COLUMN props TYPE jsonb USING props::jsonb;`` (~ 11 minutes) - For a complete breakdown of PostgreSQL queries, as well as their impact and duration, see the `Mattermost v6.0 DB schema migrations analysis `__. +For a complete breakdown of PostgreSQL queries, as well as their impact and duration, see the `Mattermost v6.0 DB schema migrations analysis `__. Upgrade from releases older than v5.35 ---------------------------------------- @@ -179,4 +128,4 @@ Ensure you review the `high availability cluster upgrade guide `_. Access insights --------------- diff --git a/source/welcome/keyboard-shortcuts.rst b/source/welcome/keyboard-shortcuts.rst index 93b0697cd1f..97e45368fe9 100644 --- a/source/welcome/keyboard-shortcuts.rst +++ b/source/welcome/keyboard-shortcuts.rst @@ -20,7 +20,7 @@ The following navigation keyboard shortcuts are supported only in the Mattermost .. tab:: Desktop app v5.0 onwards - Mattermost desktop app v5.0 introduces additional ways to navigate your Mattermost interface, including server selections, as well as tabs for Channels, Playbooks, and Boards. + Mattermost desktop app v5.0 introduces additional ways to navigate your Mattermost interface, including server selections, as well as tabs for channels, playbooks, and boards. +--------------------------------------+-------------------------------+-------------------------------------------------------------------------------------------------+ | On Windows & Linux | On macOS | Description | diff --git a/source/welcome/log-out.rst b/source/welcome/log-out.rst index dbbc9c35229..4711cd92512 100644 --- a/source/welcome/log-out.rst +++ b/source/welcome/log-out.rst @@ -4,4 +4,17 @@ Log out of Mattermost .. include:: ../_static/badges/allplans-cloud-selfhosted.rst :start-after: :nosearch: -You can log out of Mattermost from your profile picture. Select **Log Out** to log out of all teams on the server. \ No newline at end of file +You can log out of Mattermost from your profile picture. Select **Log Out** to log out of all teams on the server. + +.. tabs:: + + .. tab:: Desktop + + .. image:: ../images/profile-log-out.png + :alt: Log out of Mattermost from your profile picture. + + .. tab:: Mobile + + .. image:: ../images/profile-log-out-mobile.png + :width: 300 + :alt: Log out of Mattermost from your profile picture. \ No newline at end of file diff --git a/source/welcome/manage-multiple-server-connections.rst b/source/welcome/manage-multiple-server-connections.rst index 9b2971a5d21..58eed1983e5 100644 --- a/source/welcome/manage-multiple-server-connections.rst +++ b/source/welcome/manage-multiple-server-connections.rst @@ -9,6 +9,10 @@ Manage multiple server connections Using the Mattermost desktop or mobile app, you can connect to multiple Mattermost instances from a single interface. +.. note:: + + The ability to create and manage multiple server connections isn't available when using Mattermost in a web browser. + .. tabs:: .. tab:: Desktop diff --git a/source/welcome/manage-your-profile.rst b/source/welcome/manage-your-profile.rst index 17cd1e8940e..878a8e259d0 100644 --- a/source/welcome/manage-your-profile.rst +++ b/source/welcome/manage-your-profile.rst @@ -95,11 +95,10 @@ See the following table to learn how to configure your password, view access his +----------------------+--------------------------------------------------------------------------------------------------------+ | Multi-factor | If your system admin has enabled `multi-factor authentication | | authentication (MFA) | `__ | -| | (MFA), you can choose to set up your Mattermost account to require a generated | -| | passcode in addition to your password when you log in to Mattermost. | +| | (MFA), you can require a passcode in addition to your password to log-in to your Mattermost account. | | | | -| | You'll need to download a passcode generation app, and then enable MFA | -| | for your Mattermost account. | +| | You'll need to download a MFA passcode generation app, such as Google Authenticator or a similar app, | +| | and then set-up MFA in your Mattermost account. | | | | | | **Download a passcode generation app** | | | | @@ -123,16 +122,9 @@ See the following table to learn how to configure your password, view access his | | .. image:: ../images/add-mfa-to-account.png | | | :alt: Add multi-factor authentication to your Mattermost user profile. | | | | -| | 5. On your device, use the Google Authenticator app to scan the QR code that displays in Mattermost. | -| | 6. Enter the **MFA Code** generated by Google Authenticator in Mattermost where prompted. | +| | 5. Scan the QR code or enter the **Secret** provided by Mattermost into the authenticator app. | +| | 6. In Mattermost, enter the **MFA Code** generated by the authenticator app. | | | 7. Select **Save**. | -| | | -| | Once you've set up multi-factor authentication for your Mattermost account, | -| | when you log in to Mattermost you'll be asked to enter a code generated by Google Authenticator | -| | as well as your password. | -| | | -| | **Tip**: If scanning the QR code using your device doesn't work, you can manually enter the **Secret** | -| | provided on the Mattermost screen into the Google Authenticator app as a **Manual Entry** instead. | +----------------------+--------------------------------------------------------------------------------------------------------+ | Sign-in method | This option allows you to switch your `login method `__ from | | | `email/username and password `__ | @@ -161,4 +153,4 @@ See the following table to learn how to configure your password, view access his | | - Select **Logout** during an active session if you want to revoke automatic login privileges | | | for a specific browser or device. | | | - Select **More Info** to view browser and system details. | -+----------------------+--------------------------------------------------------------------------------------------------------+ \ No newline at end of file ++----------------------+--------------------------------------------------------------------------------------------------------+ From f5ed3b5ff5584691602a881065e8fdaf9dc38242 Mon Sep 17 00:00:00 2001 From: Amy Blais <29708087+amyblais@users.noreply.github.com> Date: Fri, 14 Jul 2023 08:46:36 -0400 Subject: [PATCH 08/34] Update version-archive.rst (#6517) --- source/upgrade/version-archive.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/upgrade/version-archive.rst b/source/upgrade/version-archive.rst index 72b68560236..092896635fb 100644 --- a/source/upgrade/version-archive.rst +++ b/source/upgrade/version-archive.rst @@ -16,6 +16,10 @@ If you want to check that the version of Mattermost you are installing is the of Mattermost Enterprise Edition ------------------------------ +Mattermost Enterprise Edition v8.0.0 - `View Changelog `__ - `Download `__ + - ``https://releases.mattermost.com/8.0.0/mattermost-8.0.0-linux-amd64.tar.gz`` + - SHA-256 Checksum: ``e5ac1c852c595ed350d970fb7e2e674205944af8097e98829e96b38ab19a6618`` + - GPG Signature: https://releases.mattermost.com/8.0.0/mattermost-8.0.0-linux-amd64.tar.gz.sig Mattermost Enterprise Edition v7.10.4 - `View Changelog `__ - `Download `__ - ``https://releases.mattermost.com/7.10.4/mattermost-7.10.4-linux-amd64.tar.gz`` - SHA-256 Checksum: ``132d9c1fd0a7422f03e40bc4f095a4eaf4da470208af8d51d5e853581f2154c3`` @@ -329,6 +333,10 @@ The open source Mattermost Team Edition is functionally identical to the commerc We generally recommend installing Enterprise Edition, even if you don't currently need a license. This provides the flexibility to seamlessly unlock Enterprise features should you need them. However, if you only want to install software with a fully open source code base, then Team Edition is the best choice for you. +Mattermost Team Edition v8.0.0 - `View Changelog `__ - `Download `__ + - ``https://releases.mattermost.com/8.0.0/mattermost-team-8.0.0-linux-amd64.tar.gz`` + - SHA-256 Checksum: ``46b44a2a6b8d7a2bad4553e40a565f1eb3e0b86d60903d97ec4d2f37f68effb2`` + - GPG Signature: https://releases.mattermost.com/8.0.0/mattermost-team-8.0.0-linux-amd64.tar.gz.sig Mattermost Team Edition v7.10.4 - `View Changelog `__ - `Download `__ - ``https://releases.mattermost.com/7.10.4/mattermost-team-7.10.4-linux-amd64.tar.gz`` - SHA-256 Checksum: ``744fae31e3cc59b8d56accd064f2605a4d165e740fcf4e224cd1693a9ff4d2eb`` From 7bf9d4e4c993ae6f636a7db47921da71619a3e6c Mon Sep 17 00:00:00 2001 From: Amy Blais <29708087+amyblais@users.noreply.github.com> Date: Fri, 14 Jul 2023 08:53:43 -0400 Subject: [PATCH 09/34] Update deprecated-features.rst (#6521) * Update deprecated-features.rst * Update source/install/deprecated-features.rst --------- Co-authored-by: Carrie Warner (Mattermost) <74422101+cwarnermm@users.noreply.github.com> --- source/install/deprecated-features.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/install/deprecated-features.rst b/source/install/deprecated-features.rst index b2dab35ff8a..8f46a136192 100644 --- a/source/install/deprecated-features.rst +++ b/source/install/deprecated-features.rst @@ -7,7 +7,7 @@ Removed features in upcoming versions ------------------------------------- Removed features by Mattermost version -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +---------------------------------------- Mattermost Server v8.0.0 ~~~~~~~~~~~~~~~~~~~~~~~~ From 1c29c7c31881f1f3ef1c7bfe858f133d084841bd Mon Sep 17 00:00:00 2001 From: "Carrie Warner (Mattermost)" <74422101+cwarnermm@users.noreply.github.com> Date: Fri, 14 Jul 2023 08:54:21 -0400 Subject: [PATCH 10/34] Changelog update re: end user training (#6520) --- source/install/self-managed-changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/install/self-managed-changelog.md b/source/install/self-managed-changelog.md index e110a486e1b..e48cbe7a912 100644 --- a/source/install/self-managed-changelog.md +++ b/source/install/self-managed-changelog.md @@ -65,7 +65,7 @@ Latest Mattermost Releases: - To simplify management and scalability challenges, Mattermost 8.0 recommends deploying PostgreSQL over MySQL. #### New End User Training - - We’re introducing [10 new training modules](https://academy.mattermost.com/p/mattermost-end-user-onboarding) dedicated to educating users on the key components of the Mattermost platform and an additional [10 new use case modules](https://academy.mattermost.com/courses/category/use-case-training) tackling technical scenarios within DevOps, Security Ops, and Incident Management. + - We’re introducing [9 new training modules](https://academy.mattermost.com/p/mattermost-end-user-onboarding) dedicated to educating users on the key components of the Mattermost platform and an additional [10 new use case modules](https://academy.mattermost.com/courses/category/use-case-training) tackling technical scenarios within DevOps, Security Ops, and Incident Management. ### Improvements From a9de346b6ef9c365f557f0405aa1fdd175475d03 Mon Sep 17 00:00:00 2001 From: mvitale1989 Date: Fri, 14 Jul 2023 16:38:24 +0200 Subject: [PATCH 11/34] CLD-5793 - mmctl release changes (#6514) * Update mmctl docs, prepare for v8.0.0 release * Also update the mmctl build and testing docs * fix building and testing commands * Use v8.0.0 as an example version, for the docs --------- Co-authored-by: Carrie Warner (Mattermost) <74422101+cwarnermm@users.noreply.github.com> Co-authored-by: Amy Blais <29708087+amyblais@users.noreply.github.com> --- source/manage/mmctl-command-line-tool.rst | 62 ++++++++++++++--------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/source/manage/mmctl-command-line-tool.rst b/source/manage/mmctl-command-line-tool.rst index e482b84d421..cfaab42f641 100644 --- a/source/manage/mmctl-command-line-tool.rst +++ b/source/manage/mmctl-command-line-tool.rst @@ -13,8 +13,8 @@ This feature was developed to a large extent by community contributions and we'd mmctl usage notes ----------------- -- System Admins have two ways to run ``mmctl`` commands: by downloading ``mmctl`` from the repository, or by building it directly. See the `mmctl readme `__ for details. -- ``mmctl`` comes bundled with the Mattermost distribution, and is located in the ``bin`` folder of the installation, next to the ``CLI``. +- System Admins have two ways to run ``mmctl`` commands: by downloading ``mmctl`` from the release URLs, which you can find in the :ref:`installation instructions `, or by building it directly, for which you can check the :ref:`build instructions ` below. The source code lives in the `server/cmd/mmctl directory within the mattermost repository `__. +- ``mmctl`` also comes bundled with the Mattermost distribution, and is located in the ``bin`` folder of the installation, next to the ``CLI``. - We recommend you add the path to the Mattermost ``bin`` folder into your ``$PATH`` environment variable. This ensures that you can run mmctl commands locally regardless of your current directory location. - If the ``bin`` directory is not added to the ``$PATH`` environment variable, each time you use mmctl you must be in the ``bin`` directory to run mmctl commands, and the commands must be prefixed with ``./``. If you're working from a different directory, make sure you specify the full path to mmctl when running mmctl commands. @@ -79,39 +79,60 @@ Install mmctl The mmctl tool comes bundled with Mattermost package. For customers that want to setup it independently from the package, the following methods are available to install mmctl. +.. _install-mmctl-options: + .. tabs:: - .. tab:: Use brew (Linux, macOS) + .. tab:: Using release package (Linux, macOS, Windows) - Use this option on Linux and macOS if you have Homebrew installed. + Starting release ``v8.0.0`` of Mattermost, you can download the mmctl builds at their release URL: ``https://releases.mattermost.com/mmctl/${MATTERMOST_VERSION}/${PLATFORM}_${ARCHITECTURE}.tar`` + + E.g. to download version ``v8.0.0`` of the mmctl amd64 build for linux, you can run the following: .. code-block:: sh - brew install mmctl + curl -vfsSL -O https://releases.mattermost.com/mmctl/v8.0.0/linux_amd64.tar + + Supported platforms, and corresponding supported architectures, are: linux (amd64 and arm64), darwin (amd64 and arm64), windows (amd64 only). + + For versions older than ``v8.0.0``, you can instead visit the `mmctl releases page `__ and download the appropriate release for your OS, and install the binary. .. tab:: Using go install (Linux, macOS, Windows) Use this option on Linux, macOS, and Windows if you have a ``go`` environment configured. - To add the project in your `$GOPATH` run the following command: + To build and install the mmctl binary in your `$GOPATH`, run the following command: .. code-block:: sh + # For Mattermost versions >= v8.0.0 + go install github.com/mattermost/mattermost/server/v8/cmd/mmctl@master + + # For Mattermost versions < v8.0.0 go install github.com/mattermost/mmctl@latest - .. tab:: Using release package (Linux, macOS, Windows) + .. tab:: Use brew (Linux, macOS) + + **NB: this is not an officially supported method.** This installation channel is managed by the community, please refer to the `homebrew/homebrew-core repo `__ for reporting issues. - Vist the `mmctl releases page `__ and download the appropriate release for your OS, and install the binary. + Use this option on Linux and macOS if you have Homebrew installed. + + .. code-block:: sh + + brew install mmctl Build mmctl ------------ -The ``mmctl`` tool uses ``go`` modules to manage dependencies, so you need to have installed -``go`` 1.11 or greater and compile the binary using: +.. _build-mmctl: + +The ``mmctl`` tool uses ``go`` modules to manage dependencies, so you need to have installed ``go`` 1.19 or greater on your machine. + +After checking out the `mattermost repository `__ locally to your machine, from the root directory of the project, you can compile the mmctl binary by running: .. code-block:: sh - make build + make -C server mmctl-build Local mode ---------- @@ -145,24 +166,15 @@ Running mmctl tests mmctl has two types of tests: unit tests and end to end tests. -To run the unit tests, you need to execute: +To execute them, you can run the following commands from the mattermost project root directory: .. code-block:: sh - make test - -To run the end to end test suite, you need to have a Mattermost server instance running. Check the `Developer Setup guide `_ for instructions around how to configure a local test server instance. - -Once the development server is set up, cd into the ``mattermost-server directory``: - -- Start it with ``make run``. To confirm that the instance is running correctly, you can access the web interface at ``http://localhost:8065``. -- Run ``make test-data`` to preload your server instance with initial seed data. Generated data such as users are typically used for logging, etc. - -Change your directory to ``mmctl`` and run the end to end test suite with: - -.. code-block:: sh + # For the unit tests + make -C server test-mmctl-unit - make test-e2e + # For the end to end tests + make -C server test-mmctl-e2e mmctl auth ---------- From 79b639a3443e0817d18c651cd654d1affb97b947 Mon Sep 17 00:00:00 2001 From: "Carrie Warner (Mattermost)" <74422101+cwarnermm@users.noreply.github.com> Date: Fri, 14 Jul 2023 10:50:43 -0400 Subject: [PATCH 12/34] Mattermost for Microsoft Teams plugin docs (#6519) * Created docs framework for MS Teams plugin * Repositioned plugin via nav based on feedback * Navigation fixes * Update source/about/mattermost-for-microsoft-teams.rst Co-authored-by: Jason Blais <13119842+jasonblais@users.noreply.github.com> * Final updates & external links --------- Co-authored-by: Jason Blais <13119842+jasonblais@users.noreply.github.com> --- ...tall-mattermost-app-in-microsoft-teams.rst | 46 ++++ ...-mattermost-for-microsoft-teams-plugin.rst | 32 +++ .../about/mattermost-for-microsoft-teams.rst | 35 +++ source/about/secure-command-and-control.rst | 16 +- source/about/unified-collaboration.rst | 16 ++ source/about/use-cases.rst | 4 +- ...e-using-mattermost-for-microsoft-teams.rst | 9 + .../plugins-configuration-settings.rst | 245 ++++++++++++++++++ source/guides/administration.rst | 2 +- source/guides/channels.rst | 2 + 10 files changed, 397 insertions(+), 10 deletions(-) create mode 100644 source/about/install-mattermost-app-in-microsoft-teams.rst create mode 100644 source/about/install-mattermost-for-microsoft-teams-plugin.rst create mode 100644 source/about/mattermost-for-microsoft-teams.rst create mode 100644 source/about/unified-collaboration.rst create mode 100644 source/channels/collaborate-using-mattermost-for-microsoft-teams.rst diff --git a/source/about/install-mattermost-app-in-microsoft-teams.rst b/source/about/install-mattermost-app-in-microsoft-teams.rst new file mode 100644 index 00000000000..cbdfab6530f --- /dev/null +++ b/source/about/install-mattermost-app-in-microsoft-teams.rst @@ -0,0 +1,46 @@ +Install the Mattermost App in Microsoft Teams +============================================= + +.. include:: ../_static/badges/allplans-cloud-selfhosted.rst + :start-after: :nosearch: + +.. note:: + + You must `install the Microsoft Teams plugin in Mattermost `__ before you can install the Mattermost app in Microsoft Teams. + +To install the Mattermost app in Microsoft Teams: + +1. In Mattermost, as an administrator, go to System Console > Plugins > Mattermost for Microsoft Teams. At the bottom of the settings page, select **Download Manifest** to download a ZIP file containing the Microsoft Teams application manifest pre-configured for your Mattermost workspace. +2. In Microsoft Teams, as an administrator, go to the Microsoft Teams admin center under **Teams Apps > Manage Apps**, or use the following URL: ``https://admin.teams.microsoft.com/policies/manage-apps``. +3. Select **Upload new app**, then upload the app manifest you downloaded in the previous step. + +You’re all set! The Mattermost app is now available to everyone in your Microsoft Teams workspace. + +Pin the Mattermost app in Microsoft Teams +------------------------------------------ + +1. Add the Mattermost app by selecting **Apps** within the left-hand sidebar, select **Add** located next to the Mattermost for Microsoft Teams app, then select **Add** again. Once added, your Mattermost workspace is now embedded in your Microsoft Teams instance. +2. Pin the Mattermost app in your left-hand sidebar to access it easily in the future, by right-clicking the Mattermost tab and selecting **Pin**. +3. Sign in with your email/password credentials, and use the Mattermost app to collaborate with technical and operations teams. + +Limitations +------------ + +The Mattermost app currently only supports email/password log in to the Mattermost workspace. SSO authentication with SAML 2.0 providers (Okta, OneLogin, Microsoft ADFS) and with your Microsoft365 account are under consideration. + +Troubleshooting +---------------- + +If you face any issues while installing or using the app in Microsoft Teams, you can either: + +- Open a new issue in the `Mattermost for Microsoft Teams GitHub repository `__. +- Or, create a new topic in our `peer-to-peer troubleshooting forum `__. + +Demonstration +-------------- + +Check out this `YouTube demo `__, from Doug Lauder, Senior Software Design Engineer at Mattermost, to get started with Mattermost for Microsoft Teams: + +.. raw:: html + + \ No newline at end of file diff --git a/source/about/install-mattermost-for-microsoft-teams-plugin.rst b/source/about/install-mattermost-for-microsoft-teams-plugin.rst new file mode 100644 index 00000000000..06f17ca7569 --- /dev/null +++ b/source/about/install-mattermost-for-microsoft-teams-plugin.rst @@ -0,0 +1,32 @@ +Install the Mattermost for Microsoft Teams plugin +================================================= + +.. include:: ../_static/badges/allplans-cloud-selfhosted.rst + :start-after: :nosearch: + +To install the `Mattermost for Microsoft Teams `__ plugin in Mattermost: + +1. Log in to your Mattermost workspace as a system administrator. +2. Download the `latest plugin binary release `__, compatible with Mattermost v8.0.1 and later. + + .. tip:: + + If you are using an earlier version of Mattermost, `follow our documentation `__ to upgrade to Mattermost v8.0.1 or later. + +4. Go to **System Console > Plugins > Plugin Management > Upload Plugin**, and upload the plugin binary you downloaded in the previous step. +5. Go to **System Console > Plugins > Plugin Management > Installed Plugins**, search for ``MS Teams Sync``, and select **Enable Plugin**. + +Configure the plugin +-------------------- + +Additional configuration settings are available for this plugin. See the `MS Teams Sync plugin configuration settings `__ documentation for details. + +Demonstration +-------------- + +Check out this `YouTube demo `__, from Doug Lauder, Senior Software Design Engineer at Mattermost, to learn how to embed Mattermost in Microsoft Teams: + +.. raw:: html + + + diff --git a/source/about/mattermost-for-microsoft-teams.rst b/source/about/mattermost-for-microsoft-teams.rst new file mode 100644 index 00000000000..44e3ddb4c02 --- /dev/null +++ b/source/about/mattermost-for-microsoft-teams.rst @@ -0,0 +1,35 @@ +Mattermost for Microsoft Teams +============================== + +.. include:: ../_static/badges/allplans-cloud-selfhosted.rst + :start-after: :nosearch: + +Mattermost for Microsoft Teams enables you to collaborate with technical & operations teams seamlessly through the Mattermost app, without leaving Microsoft Teams. This Mattermost integration includes 2 components: + +- A Mattermost plugin that enables direct message, group message, and chat synchronization as well as the ability to link and synchronize channel-based collaboration. +- A Mattermost app for Microsoft Teams embedded within a Microsoft Teams workspace across desktop and web clients that enables Central IT organizations to provide an extended customization experience for technical and operational teams while staying firmly integrated into the Microsoft 365 all-employee platform. + +See the following product documentation to install and use Mattermost for Microsoft Teams: + +- `Install the Mattermost for Microsoft Teams plugin `__ +- `Install the Mattermost app in Microsoft Teams `__ +- `Collaborate using Mattermost for Microsoft Teams `__ + +Additional integration features include: + +- **Improved reaction time in the event of an incident** by accessing alerting features in Mattermost directly from within Teams. + + Mattermost is open-source and can be extensively customized to integrate with various system monitoring and alerting tools. If your tech team has set up unique alerting features in Mattermost, use the app to access these directly from within Teams, including system status updates, improving reaction time in the event of an incident. + +- **Simplified workflows through a single interface** for communication and DevOps management. + + If your technical team uses specific DevOps tools (such as Jenkins, Jira, GitHub, etc.) that are tightly integrated with Mattermost, embedding Mattermost in Teams can give direct access to these integrated services. This simplifies workflows by providing a single interface for DevOps use cases. + +- The ability to **quickly run scripts within Microsoft Teams**. + + Mattermost supports the use of a CLI, which can be a major advantage for tech teams. If you need to run scripts or execute commands via Mattermost, embedding it within Teams allows you to use this functionality from either platform. + +- The ability to **embed custom functionality to accelerate technical workflows**. + + If your tech team has created custom bots and plugins that function with Mattermost, embedding it within Teams will allow everyone to access these utilities. These may include custom bots for streamlining incident management, security operations and red/blue team workflows. + diff --git a/source/about/secure-command-and-control.rst b/source/about/secure-command-and-control.rst index d2944a61378..c3f38b1557e 100644 --- a/source/about/secure-command-and-control.rst +++ b/source/about/secure-command-and-control.rst @@ -7,14 +7,14 @@ The solution provides easy-to-use collaboration for technical teams, including t Features include: - * `Private mobile communications `__ to provide secure mobile apps via encryption keys and certifications with custom mobile applications. - * `Custom push notification service `__ to ensure notifications are not intercepted or leaked to unsecured channels by transmitting push notifications within your private network. - * `Remote user deactivation with data purge `__ to mitigate sensitive data from being stored on mobile devices after a user departs the organization. - * (Professional & Enterprise) `Hosted push notifications service (HPNS) `__ for production-level uptime SLAs and encrypted TLS connections between HPNS and Apple Push Notification Services, between HPNS and Google’s Firebase Cloud Messaging Service, and between HPNS and your Mattermost Server. - * (Professional & Enterprise) Mobile single-sign-on with `SAML `__, `AD/LDAP `__, `OpenID Connect `__, `Google `__, and `Office365 `__ for centralized identity management and automatic account provisioning for fast and secure access to mobile applications. - * (Enterprise) `ID-only push notifications `__ to remove the need to pass clear text notifications through Apple and Google’s mobile notification relays. - * (Enterprise) `Enterprise Mobility Management (EMM) `__ to manage secure mobile endpoints with a managed app configuration (`via AppConfig `__), such as AirWatch. +* `Private mobile communications `__ to provide secure mobile apps via encryption keys and certifications with custom mobile applications. +* `Custom push notification service `__ to ensure notifications are not intercepted or leaked to unsecured channels by transmitting push notifications within your private network. +* `Remote user deactivation with data purge `__ to mitigate sensitive data from being stored on mobile devices after a user departs the organization. +* (Professional & Enterprise) `Hosted push notifications service (HPNS) `__ for production-level uptime SLAs and encrypted TLS connections between HPNS and Apple Push Notification Services, between HPNS and Google’s Firebase Cloud Messaging Service, and between HPNS and your Mattermost Server. +* (Professional & Enterprise) Mobile single-sign-on with `SAML `__, `AD/LDAP `__, `OpenID Connect `__, `Google `__, and `Office365 `__ for centralized identity management and automatic account provisioning for fast and secure access to mobile applications. +* (Enterprise) `ID-only push notifications `__ to remove the need to pass clear text notifications through Apple and Google’s mobile notification relays. +* (Enterprise) `Enterprise Mobility Management (EMM) `__ to manage secure mobile endpoints with a managed app configuration (`via AppConfig `__), such as AirWatch. For an example case study, learn why `The U.S. Department of Defense relies on Mattermost for Secure Command and Control across devices `_, including flight crews who can now securely access documents from mobile devices anywhere in the world. -`Contact us `_ to learn more about this solution and to discuss whether it’s the right one for you. +`Contact us `_ to learn more about this solution and to discuss whether it’s the right one for you. \ No newline at end of file diff --git a/source/about/unified-collaboration.rst b/source/about/unified-collaboration.rst new file mode 100644 index 00000000000..d9ac42481fb --- /dev/null +++ b/source/about/unified-collaboration.rst @@ -0,0 +1,16 @@ +Unified communication +===================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + /about/mattermost-for-microsoft-teams.rst + /about/install-mattermost-for-microsoft-teams-plugin.rst + /about/install-mattermost-app-in-microsoft-teams.rst + +Mattermost's Unified Communication solution is designed to provide an extended extended customization experience for technical and operational teams. + +* :doc:`Mattermost for Microsoft Teams ` - Learn how organizations can easily connect operational workflows through the Mattermost app while staying connected to the all-employee platform, all in one place. + +`Contact us `_ to learn more about this solution and to discuss whether it’s the right one for you. \ No newline at end of file diff --git a/source/about/use-cases.rst b/source/about/use-cases.rst index 1ea3b7dcb1c..50b8e71259d 100644 --- a/source/about/use-cases.rst +++ b/source/about/use-cases.rst @@ -6,11 +6,13 @@ Use cases :hidden: /about/secure-command-and-control.rst + /about/unified-collaboration.rst /about/devops-collaboration.rst /about/incident-response-collaboration.rst Learn more about how to use Mattermost in agile software development, incident response, customer onboarding, and many other applications. * :doc:`Secure command and control ` - Learn about the Mattermost Secure Command and Control solution, designed to provide fast and secure mobile communications for technical teams. +* :doc:`Unified collaboration ` - Learn how Central IT organizations can provide an extended customization experience for technical and operational teams across both Mattermost and the Microsoft 365 all-employee platform. * :doc:`How to: Build your Agile software development practice ` - Learn how accelerate software development and deployment processes and reduce costs. -* :doc:`How to: Respond to incidents and outages quickly and effectively ` - Maximize your Mattermost deployment with incident response collaboration. \ No newline at end of file +* :doc:`How to: Respond to incidents and outages quickly and effectively ` - Maximize your Mattermost deployment with incident response collaboration. diff --git a/source/channels/collaborate-using-mattermost-for-microsoft-teams.rst b/source/channels/collaborate-using-mattermost-for-microsoft-teams.rst new file mode 100644 index 00000000000..161c492a9fc --- /dev/null +++ b/source/channels/collaborate-using-mattermost-for-microsoft-teams.rst @@ -0,0 +1,9 @@ +Collaborate using Mattermost for MS Teams +========================================= + +.. include:: ../_static/badges/allplans-cloud-selfhosted.rst + :start-after: :nosearch: + +Mattermost for Microsoft Teams enables you to collaborate with technical & operations teams seamlessly through the Mattermost app, without leaving Microsoft Teams. + +Join us on `Mattermost Academy `__ to enroll in the `Mattermost for Microsoft Teams `__ training course where you'll learn how to start collaborating with colleagues across both systems. \ No newline at end of file diff --git a/source/configure/plugins-configuration-settings.rst b/source/configure/plugins-configuration-settings.rst index 34a989ed19e..6e35ca334bf 100644 --- a/source/configure/plugins-configuration-settings.rst +++ b/source/configure/plugins-configuration-settings.rst @@ -17,6 +17,7 @@ Both self-hosted and Cloud admins can access the following configuration setting - `Demo Plugin <#demo-plugin>`__ - `GIF commands <#gif-commands>`__ - `Mattermost Boards <#mattermost-boards>`__ +- `MS Teams Sync <#ms-teams-sync>`__ - `Mattermost Playbooks plugin <#mattermost-playbooks>`__ - `User Satisfaction surveys <#user-satisfaction-surveys>`__ - `Zoom <#zoom>`__ @@ -1311,6 +1312,250 @@ Enable plugin ---- +MS Teams Sync +------------- + +.. include:: ../_static/badges/allplans-cloud-selfhosted.rst + :start-after: :nosearch: + +Mattermost for Microsoft Teams enables you to collaborate with technical & operations teams seamlessly through the Mattermost app, without leaving Microsoft Teams. + +Access the following configuration settings in the System Console by going to **Plugins > MS Teams Sync**. + +.. config:setting:: plugins-msteamssyncenable + :displayname: Enable plugin (Plugins - MS Teams Sync) + :systemconsole: Plugins > MS Teams Sync + :configjson: N/A + :environment: N/A + + - **true**: Enables the MS Teams Sync plugin on your Mattermost workspace. + - **false**: Disables the MS Teams Sync plugin on your Mattermost workspace. + +Enable plugin +~~~~~~~~~~~~~ + ++------------------------------------------------------------------------+----------------------------------------------------+ +| Enable the Mattermost for Microsoft Teams plugin for all Mattermost | - System Config path: **Plugins > MS Teams Sync** | +| teams. | - ``config.json`` setting: N/A | +| | - Environment variable: N/A | +| - **true**: Enables MS Teams Sync plugin on your Mattermost workspace. | | +| - **false**: **(Default)** Disables the MS Teams Sync plugin. | | ++------------------------------------------------------------------------+----------------------------------------------------+ +| **Note**: Use the `Enabled Teams <#enabled-teams>`__ configuration option to specify which Mattermost teams synchronize | +| direct and group messages with Microsoft Teams chats. | ++------------------------------------------------------------------------+----------------------------------------------------+ + +.. config:setting:: plugins-msteamssynctenantid + :displayname: Tenant ID (Plugins - MS Teams Sync) + :systemconsole: Plugins > MS Teams Sync + :configjson: N/A + :environment: N/A + :description: Specify the Microsoft Teams Tenant ID. + +Tenant ID +~~~~~~~~~~ + ++------------------------------------------------------------------------+---------------------------------------------------+ +| Specify the Microsoft Teams Tenant ID. | - System Config path: **Plugins > MS Teams Sync** | +| | - ``config.json`` setting: N/A | +| | - Environment variable: N/A | ++------------------------------------------------------------------------+---------------------------------------------------+ + +.. config:setting:: plugins-msteamssyncclientid + :displayname: Client ID (Plugins - MS Teams Sync) + :systemconsole: Plugins > MS Teams Sync + :configjson: N/A + :environment: N/A + :description: Specify the Microsoft Teams Client ID. + + +Client ID +~~~~~~~~~ + ++------------------------------------------------------------------------+---------------------------------------------------+ +| Specify the Microsoft Teams Client ID. | - System Config path: **Plugins > MS Teams Sync** | +| | - ``config.json`` setting: N/A | +| | - Environment variable: N/A | ++------------------------------------------------------------------------+---------------------------------------------------+ + +.. config:setting:: plugins-msteamssyncclientsecret + :displayname: Client secret (Plugins - MS Teams Sync) + :systemconsole: Plugins > MS Teams Sync + :configjson: N/A + :environment: N/A + :description: Specify the Microsoft Teams Client Secret. + +Client secret +~~~~~~~~~~~~~~ + ++------------------------------------------------------------------------+---------------------------------------------------+ +| Specify the Microsoft Teams Client Secret. | - System Config path: **Plugins > MS Teams Sync** | +| | - ``config.json`` setting: N/A | +| Alpha-numeric value. | - Environment variable: N/A | ++------------------------------------------------------------------------+---------------------------------------------------+ + +.. config:setting:: plugins-msteamssyncgenerateatrestencryptionkey + :displayname: At rest encryption key (Plugins - MS Teams Sync) + :systemconsole: Plugins > MS Teams Sync + :configjson: N/A + :environment: N/A + :description: Generate the AES encryption key used to encrypt sotred access tokens. + +At rest encryption key +~~~~~~~~~~~~~~~~~~~~~~~ + ++------------------------------------------------------------------------+---------------------------------------------------+ +| Generate the AES encryption key used to encrypt sotred access tokens. | - System Config path: **Plugins > MS Teams Sync** | +| | - ``config.json`` setting: N/A | +| Alpha-numeric value. | - Environment variable: N/A | ++------------------------------------------------------------------------+---------------------------------------------------+ +| **Note**: Select **Regenerate** to generate a new key. | ++------------------------------------------------------------------------+---------------------------------------------------+ + +.. config:setting:: plugins-msteamssyncgeneratewebhooksecret + :displayname: Webhook secret (Plugins - MS Teams Sync) + :systemconsole: Plugins > MS Teams Sync + :configjson: N/A + :environment: N/A + :description: Generate the webhook secret that Microsoft Teams will use to send messages to Mattermost. + +Webhook secret +~~~~~~~~~~~~~~~ ++------------------------------------------------------------------------+---------------------------------------------------+ +| Generate the webhook secret that Microsoft Teams will use to send | - System Config path: **Plugins > MS Teams Sync** | +| messages to Mattermost. | - ``config.json`` setting: N/A | +| | - Environment variable: N/A | ++------------------------------------------------------------------------+---------------------------------------------------+ +| **Note**: Select **Regenerate** to generate a new key. | ++------------------------------------------------------------------------+---------------------------------------------------+ + +.. config:setting:: plugins-msteamssyncuseevaluationapipaymodel + :displayname: Use the evaluation API pay model (Plugins - MS Teams Sync) + :systemconsole: Plugins > MS Teams Sync + :configjson: N/A + :environment: N/A + + - **true**: Enables the evaluation API pay model. + - **false**: Disables the evaluation API pay model. + +Use the evaluation API pay model +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++------------------------------------------------------------------------+---------------------------------------------------+ +| Enable the evaluation API pay model to receive a limited number of | - System Config path: **Plugins > MS Teams Sync** | +| change notifications. Ensure you keep the number of notifications low. | - ``config.json`` setting: N/A | +| | - Environment variable: N/A | +| - **true**: Enables the evaluation API pay model. | | +| - **false**: **(Default)** Disables the evaluation API pay model. | | ++------------------------------------------------------------------------+---------------------------------------------------+ + +.. config:setting:: plugins-msteamssyncenforceconnectedaccounts + :displayname: Enforce connected accounts (Plugins - MS Teams Sync) + :systemconsole: Plugins > MS Teams Sync + :configjson: N/A + :environment: N/A + + - **true**: Users are required to connect their Mattermost and Microsoft Teams accounts. + - **false**: Users aren't required to connect their Mattermost and Microsoft Teams accounts. + +Enforce connected accounts +~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++------------------------------------------------------------------------+---------------------------------------------------+ +| Requires all users to connect their Mattermost account to their | - System Config path: **Plugins > MS Teams Sync** | +| Microsoft Teams account, if the accounts aren't already connected. | - ``config.json`` setting: N/A | +| | - Environment variable: N/A | +| - **true**: Users are required to connect their Mattermost and | | +| Microsoft Teams accounts each time they refresh the Mattermost | | +| browser, refresh the desktop app, or log in to Mattermost. | | +| - **false**: **(Default)** Users aren't required to connect their | | +| Mattermost and Microsoft Teams accounts. | | ++------------------------------------------------------------------------+---------------------------------------------------+ + +.. config:setting:: plugins-msteamssyncallowtempskipconnectuser + :displayname: Allow to temporarily skip connect user (Plugins - MS Teams Sync) + :systemconsole: Plugins > MS Teams Sync + :configjson: N/A + :environment: N/A + + - **true**: Enables users to skip the current prompt to connect their Mattermost and Microsoft Teams user accounts. + - **false**: Prevents users from skipping the prompt to connect their Mattermost and Microsoft Teams user accounts. + +Allow to temporarily skip connect user +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++------------------------------------------------------------------------+---------------------------------------------------+ +| Allow users to temporarily dismiss the prompt to connect their | - System Config path: **Plugins > MS Teams Sync** | +| Mattermost account to their Microsoft Teams account. Users will | - ``config.json`` setting: N/A | +| continue to be prompted when they refresh the browser, refresh the | - Environment variable: N/A | +| desktop app, or log in to Mattermost. | | +| | | +| - **true**: Enables users to skip the current prompt to connect their | | +| Mattermost and Microsoft Teams user accounts. | | +| - **false**: **(Default)** Prevents users from skipping the prompt to | | +| connect their Mattermost and Microsoft Teams accounts. | | ++------------------------------------------------------------------------+---------------------------------------------------+ + +.. config:setting:: plugins-msteamssyncsyncusers + :displayname: Sync users (Plugins - MS Teams Sync) + :systemconsole: Plugins > MS Teams Sync + :configjson: N/A + :environment: N/A + :description: Specify how often, in minutes, to synchronize direct messages, group messages, and chats, between Mattermost and Microsoft Teams users. + +Sync users +~~~~~~~~~~ + ++------------------------------------------------------------------------+---------------------------------------------------+ +| Specify how often, in minutes, to synchronize direct messages, | - System Config path: **Plugins > MS Teams Sync** | +| group messages, and chats, between Mattermost and Microsoft Teams | - ``config.json`` setting: N/A | +| users. | - Environment variable: N/A | +| | | +| Leave this value blank to disble user synchronization. | | +| Numerical value. | | ++------------------------------------------------------------------------+---------------------------------------------------+ + +.. config:setting:: plugins-msteamssyncsyncmessages + :displayname: Sync direct and group messages (Plugins - MS Teams Sync) + :systemconsole: Plugins > MS Teams Sync + :configjson: N/A + :environment: N/A + + - **true**: Mattermost synchronizes direct messages, group messages, and chats between Mattermost and Microsoft Teams. + - **false**: Mattermost doesn't synchronize direct messages, group messages, and chats between Mattermost and Microsoft Teams. + +Sync direct and group messages +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++------------------------------------------------------------------------+----------------------------------------------------+ +| Synchronize direct messages, group messages, and chats between | - System Config path: **Plugins > MS Teams Sync** | +| Mattermost and Microsoft Teams users. | - ``config.json`` setting: N/A | +| | - Environment variable: N/A | +| - **true**: **(Default)** Mattermost synchronizes direct messages, | | +| group messages, and chats between Mattermost and Microsoft Teams. | | +| - **false**: Mattermost doesn't synchronize messages and chats. | | ++------------------------------------------------------------------------+----------------------------------------------------+ + +.. config:setting:: plugins-msteamssyncenabledteams + :displayname: Enabled teams (Plugins - MS Teams Sync) + :systemconsole: Plugins > MS Teams Sync + :configjson: N/A + :environment: N/A + :description: Specify which Mattermost teams synchronize direct messages, group messages, and chats with Microsoft Teams. + +Enabled teams +~~~~~~~~~~~~~ + ++------------------------------------------------------------------------+----------------------------------------------------+ +| Specify which Mattermost teams synchronize direct messages, group | - System Config path: **Plugins > MS Teams Sync** | +| messages, and chats with Microsoft Teams. | - ``config.json`` setting: N/A | +| | - Environment variable: N/A | +| Separate multiple team names with commas. Leave this value blank to | | +| synchronize all Mattermost teams. | | ++------------------------------------------------------------------------+----------------------------------------------------+ + +---- + Mattermost Playbooks plugin ---------------------------- diff --git a/source/guides/administration.rst b/source/guides/administration.rst index 8f6d83ee424..300af82c97a 100644 --- a/source/guides/administration.rst +++ b/source/guides/administration.rst @@ -188,4 +188,4 @@ If the information above doesn’t solve your problem, look at these other resou * :doc:`mmctl command line tool ` - Use mmctl to manage self-hosted Mattermost servers from the command line. * :doc:`Migration announcement email template ` - Use this email template to notify your users about migrating to Mattermost. * :doc:`Advanced permissions: backend infrastructure ` - Read our technical guide on modifying self-hosted Mattermost installations to create custom permissions schemes. -* :doc:`Command line tools ` - Learn how to use the command line to manage self-hosted Mattermost servers. +* :doc:`Command line tools ` - Learn how to use the command line to manage self-hosted Mattermost servers. \ No newline at end of file diff --git a/source/guides/channels.rst b/source/guides/channels.rst index 371b90b4d65..727b8809e23 100644 --- a/source/guides/channels.rst +++ b/source/guides/channels.rst @@ -120,5 +120,7 @@ Extend Channels functionality :hidden: Extend functionality with integrations + Collaborate using Mattermost for MS Teams * :doc:`Extend Channels with integrations ` - Find open source integrations to common tools in the Mattermost Marketplace. +* :doc:`Collaborate using Mattermost for MS Teams ` - Learn how to collaborate with colleagues across both Mattermost and Microsoft Teams at the same time. \ No newline at end of file From 1267ae377aac7a345320ee76e6d2fd1d3f4c0e4d Mon Sep 17 00:00:00 2001 From: emily dela cruz Date: Fri, 14 Jul 2023 12:05:17 -0400 Subject: [PATCH 13/34] 8.0 Nav Updates (#6523) * Update main nav for 8.0 release * Update footer nav for 8.0 release --- source/_static/myscript.js | 4 +- source/_static/mytheme.css | 1680 +++++++++++++++------------------- source/conf.py | 4 +- source/templates/header.html | 539 +++++------ source/templates/index.html | 5 +- 5 files changed, 942 insertions(+), 1290 deletions(-) diff --git a/source/_static/myscript.js b/source/_static/myscript.js index 015c966d33e..65a435d23f4 100644 --- a/source/_static/myscript.js +++ b/source/_static/myscript.js @@ -174,7 +174,7 @@ $(document).ready(function () { // Fallback for when a notification CTA expires - ie. webinar happens const dateInFuture = (value) => new Date().getTime() <= new Date(value).getTime(); - const expiryDate = '2023-04-27T15:00:00-0500'; + const expiryDate = '2023-07-24T15:00:00-0500'; // 2023-04-27 @ 3pm EST const fallback_url = 'https://mattermost.com/solutions/mattermost-for-microsoft-teams/'; const fallback_text = 'Learn more about Mattermost for Microsoft Teams »'; @@ -192,7 +192,7 @@ $(document).ready(function () { // So it will show up for new announcements // Keep "mm_notification_banner__" at the beginning of the key // Add system to clean out storage items that are no longer needed - const notification_banner_key = 'mm_notification_banner__webinar-prod'; + const notification_banner_key = 'mm_notification_banner__8-0-release'; if (localStorage.getItem(notification_banner_key) === null) { localStorage.setItem(notification_banner_key, true); diff --git a/source/_static/mytheme.css b/source/_static/mytheme.css index c70bbe6ec0e..a343c219f85 100644 --- a/source/_static/mytheme.css +++ b/source/_static/mytheme.css @@ -1183,21 +1183,27 @@ pre { } /* START NEW NAV */ +.nav-open .site-header { + bottom: 0; + overflow-x: hidden; +} + +.nav-open .site-header__col--menu { + height: calc(100vh - 75px); + overflow-y: scroll; + overflow-x: hidden; + padding-bottom: 100px; +} + .site-header { font-family: 'trade-gothic-next',sans-serif; background: #fff; - box-shadow: 0 4px 15px rgba(0,0,0,.1); + box-shadow: 0 4px 15px rgba(0, 0, 0, .1); position: -webkit-sticky; position: sticky; top: 0; width: 100%; - z-index: 1000 -} - -@media (max-width:991.98px) { - .site-header { - z-index: 3147483642 - } + z-index: 999; } .site-header__col--logo { @@ -1209,30 +1215,30 @@ pre { @media (max-width:991.98px) { .site-header__col--logo { padding-top: 15px; - padding-bottom: 15px + padding-bottom: 15px; } } .site-header__col--logo img { width: 190px; - max-width: none + max-width: none; } @media (min-width:992px) { .site-header__col--logo img { - width: 150px + width: 150px; } } @media (min-width:1200px) { .site-header__col--logo img { - width: 170px + width: 170px; } } @media (min-width:1600px) { .site-header__col--logo img { - width: 190px + width: 190px; } } @@ -1240,7 +1246,7 @@ pre { display: none; list-style-type: none; margin: 0; - padding-left: 0 + padding-left: 0; } @media (max-width:991.98px) { @@ -1252,219 +1258,233 @@ pre { top: 0; height: 2px; background-color: #ffbc1f; - width: calc(100% + 20px) + width: calc(100% + 20px); } } @media (min-width:992px) { .site-header__col--menu .site-nav { - display: flex + display: flex; } } @media (min-width:992px) { .site-header__col--menu .site-nav__hassubnav .sub-menu { opacity: 0; - position: absolute + position: absolute; } } @media (max-width:991.98px) { - .site-header__col--menu .site-nav__toplink { - border-bottom: 1px solid #babec9 + .site-header__col--menu .site-nav__toplink.is-active .toplink-wrapper { + border-bottom: none; } } .site-header__col--menu .site-nav__toplink>a { color: #1b1d22; display: block; - font-size: 18px; + font-size: 24px; line-height: 1; - padding: 40px 24px; + padding: 0 24px; text-decoration: none; - transition: color .3s ease-in-out + transition: color .3s ease-in-out; +} + +@media (max-width:991.98px) { + .site-header__col--menu .site-nav__toplink>a { + font-weight: 700; + color: #1e325c; + } + + .site-header__col--menu .site-nav__toplink>a .toplink-wrapper { + padding: 40px 0; + border-bottom: 1px solid #babec9; + } } @media (min-width:992px) { .site-header__col--menu .site-nav__toplink>a { line-height: 150%; padding: 26px 10px; - font-size: 14px + font-size: 14px; } } @media (min-width:1600px) { .site-header__col--menu .site-nav__toplink>a { - font-size: 15px + font-size: 15px; } } @media (max-width:991.98px) { .site-header__col--menu .site-nav__toplink>a span { - float: right + float: right; } .site-header__col--menu .site-nav__toplink>a span svg { height: 18px; transform: rotate(-90deg); - width: 26px + width: 26px; } .site-header__col--menu .site-nav__toplink>a span svg path { - stroke: #1c58d9 + stroke: #1c58d9; } } .site-header__col--menu .site-nav__toplink>a span svg path { - transition: stroke .3s ease-in-out + transition: stroke .3s ease-in-out; } .site-header__col--menu .site-nav__toplink>a:hover { - color: #1c58d9 + color: #1c58d9; } .site-header__col--menu .site-nav__toplink>a:hover span svg path { - stroke: #1c58d9 + stroke: #1c58d9; } .site-header__col--menu .site-nav__button { border-bottom: none; margin: 0 auto; max-width: 200px; - padding-top: 12px + padding-top: 12px; } .site-header__col--menu .site-nav__button a { font-size: 18px; padding: 20px 25px; border-width: 1px; - transition: background-color .3s ease,color 0s ease; - font-weight: 400 + transition: background-color .3s ease, color 0s ease; + font-weight: 400; } @media (min-width:992px) { .site-header__col--menu .site-nav__button a { font-size: 13px; padding: 5px 10px; - margin-top: 9px + margin-top: 9px; } } @media (min-width:1200px) { .site-header__col--menu .site-nav__button a { - font-size: 14px + font-size: 14px; } } @media (min-width:1600px) { .site-header__col--menu .site-nav__button a { font-size: 14px; - padding: 5px 20px + padding: 5px 20px; } } -.site-header__col--menu .site-nav__button a:focus,.site-header__col--menu .site-nav__button a:hover { - color: #fff +.site-header__col--menu .site-nav__button a:focus, +.site-header__col--menu .site-nav__button a:hover { + color: #fff; } @media (max-width:991.98px) { .site-header__col--menu .site-nav__button { - padding-bottom: 20px + padding-bottom: 20px; } } @media (min-width:992px) { .site-header__col--menu .site-nav__button { - padding-left: 15px + padding-left: 15px; } } @media (max-width:991.98px) { .site-header__col--menu .site-nav__button--secondary { padding: 0 0 40px; - max-width: 250px + max-width: 250px; } .site-header__col--menu .site-nav__button--secondary a { - padding: 20px 30px + padding: 20px 30px; } } @media (max-width:991.98px) { .site-header__col--menu .site-nav__login { border-bottom: none; - text-align: center + text-align: center; } .site-header__col--menu .site-nav__login a { padding-bottom: 20px; - padding-top: 5px + padding-top: 55px; } } @media (min-width:992px) { .site-header__col--menu { display: flex; - justify-content: flex-end + justify-content: flex-end; } } .site-header__mobile-menu { padding-top: 20px; - text-align: right + text-align: right; } @media (min-width:992px) { .site-header__mobile-menu { - display: none + display: none; } } -.site-header__mobile-menu .hamburger-close,.site-header__mobile-menu.is-active .hamburger-open { - display: none +.site-header__mobile-menu .hamburger-close, +.site-header__mobile-menu.is-active .hamburger-open { + display: none; } .site-header__mobile-menu.is-active .hamburger-close { - display: inline + display: inline; } .site-header .lower-nav { - border-top: 1px solid #c5d2ec + border-top: 1px solid #c5d2ec; } @media (max-width:991.98px) { .site-header .lower-nav .container { - padding-right: 5px + padding-right: 5px; } } .site-header .lower-nav ul { margin: 0; - padding: 0 + padding: 0; } @media (max-width:991.98px) { .site-header .lower-nav ul { width: 100%; overflow-x: scroll; - display: flex + display: flex; } } .site-header .lower-nav ul li { display: inline-block; - margin-right: 20px + margin-right: 20px; } @media (max-width:991.98px) { .site-header .lower-nav ul li { - flex: 0 0 auto + flex: 0 0 auto; } } @media (min-width:992px) { .site-header .lower-nav ul li { - margin-right:40px + margin-right: 40px; } } @@ -1474,1079 +1494,845 @@ pre { text-decoration: none; font-size: 15px; border-bottom: 3px solid transparent; - color: #5a6072 + color: #5a6072; } .site-header .lower-nav ul a:hover { - color: #1c58d9 + color: #1c58d9; } .site-header .lower-nav ul .current-menu-item a { - border-bottom: 3px solid #ffbc1f -} - -.nav { - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; - display: flex; - position: relative; - width: 100%; - justify-content: space-between + border-bottom: 3px solid #ffbc1f; } -@media (max-width:767.98px) { - .nav { - justify-content: center +@media (min-width:992px) { + .masthead-trial-form { + margin-top: 30px; } } -.nav .nav-link { - transition: all .2s; - transition-delay: 0s; - position: relative; - display: inline-block; - color: rgba(150,161,178,.7); - z-index: 5; - font-size: 20px; - font-weight: 500; - font-family: trade-gothic-next,sans-serif -} - /* NEW NAV DEFER */ - -@media (max-width:991.98px) { - .site-header__col--menu { - padding-left: 0; - padding-right: 0 - } -} .site-header__col--menu .site-nav.active { - display: block + display: block; } + @media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav:not(.is-active) .sub-menu { - display: none !important - } - .site-header__col--menu .site-nav__hassubnav.is-active > a svg { - transform: rotate(0) - } + .site-header__col--menu .site-nav__hassubnav:not(.is-active) .sub-menu { + display: none !important; + } + + .site-header__col--menu .site-nav__hassubnav.is-active > a svg { + transform: rotate(0); + } + + .site-header__col--menu .site-nav__hassubnav.is-active .sub-menu__developers .sub-menu__developers__main, + .site-header__col--menu .site-nav__hassubnav.is-active .sub-menu__login .sub-menu__links, + .site-header__col--menu .site-nav__hassubnav.is-active .sub-menu__solutions .sub-menu__solutions__main-wrapper { + border-bottom: 1px solid #babec9; + padding-bottom: 20px; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu { - background-color: #fff; - display: flex; - flex-direction: column; - pointer-events: none; - z-index: 2 + background-color: #fff; + display: flex; + flex-direction: column; + pointer-events: none; + z-index: 2; } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu { - border-top: 2px solid #ffbc1f; - box-shadow: 0 4px 15px rgba(0, 0, 0, .1); - flex-direction: row; - right: 0; - top: 73px; - transition: opacity .15s ease-in-out - } + .site-header__col--menu .site-nav__hassubnav .sub-menu { + border-top: 2px solid #ffbc1f; + box-shadow: 0 4px 15px rgba(0, 0, 0, .1); + flex-direction: row; + right: 0; + top: 73px; + transition: opacity .15s ease-in-out; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block { - margin-bottom: 10px + margin-bottom: 10px; } + @media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__block { - margin-right: 24px; - margin-left: 24px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block { + margin-right: 24px; + margin-left: 24px; + } } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__block { - margin-bottom: 0; - padding: 0 11px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block { + margin-bottom: 0; + padding: 11px; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block a { - align-items: center; - background-color: #ebebef; - display: flex; - flex-direction: row; - padding: 21px 28px; - text-decoration: none + align-items: center; + background-color: #ebebef; + display: flex; + flex-direction: row; + padding: 21px 28px; + text-decoration: none; } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__block a { - flex-direction: column; - justify-content: center; - padding: 10px; - transition: box-shadow .2s ease, background-color .2s ease - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__block a:focus, - .site-header__col--menu .site-nav__hassubnav .sub-menu__block a:hover { - background-color: #e8edf8 - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block a { + flex-direction: column; + justify-content: center; + padding: 10px; + transition: box-shadow .2s ease, background-color .2s ease; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__block a:focus, + .site-header__col--menu .site-nav__hassubnav .sub-menu__block a:hover { + background-color: #e8edf8; + } } + @media (min-width:768px) and (max-width:1199.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__block a { - width: 140px; - height: 140px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block a { + width: 14px; + height: 14px; + } } + @media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__block a { - min-width: 161px; - padding: 21px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block a { + min-width: 161px; + padding: 21px; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block--wrapper { - display: flex; - flex-direction: row + display: flex; + flex-direction: row; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block--icon { - align-items: center; - display: flex; - height: 64px + align-items: center; + display: flex; + height: 64px; } + @media (min-width:768px) and (max-width:1199.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__block--icon { - height: 45px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__block--icon img { - height: 40px !important; - width: auto !important - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block--icon { + height: 45px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__block--icon img { + height: 40px !important; + width: auto !important; + } } + @media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__block--icon { - height: 64px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block--icon { + height: 64px; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block--text { - display: flex; - flex-direction: column + display: flex; + flex-direction: column; } + @media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__block--text { - margin-left: 30px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block--text { + margin-left: 30px; + } } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__block--text { - text-align: center - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block--text { + text-align: center; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block--text_title { - color: #1b1d22; - font-weight: 700; - font-size: 18px; - line-height: 150% + color: #1b1d22; + font-weight: 700; + font-size: 18px; + line-height: 150%; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__block--text_learnmore { - color: #1c58d9; - font-size: 12px + color: #1c58d9; + font-size: 12px; } + @media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__links { - padding-top: 20px; - margin-right: 24px; - margin-left: 24px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__links { + margin-right: 24px; + margin-left: 24px; + } } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__links { - align-items: flex-start; - display: flex; - padding-left:40px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__links:first-child { - padding-left: 0 - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__links { + align-items: flex-start; + display: flex; + padding-left: 40px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__links:first-child { + padding-left: 0; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu__links ul { - padding: 0 + padding: 0; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__links--single { - list-style-type: none; - margin-bottom: 25px + list-style-type: none; + margin-bottom: 25px; } + @media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__links--single { - margin-bottom: 30px - } -} -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__links--single { - min-height: 30px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__links--single { + margin-bottom: 30px; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu__links--single a { - align-items: center; - color: #1b1d22; - display: flex; - font-size: 18px; - line-height: 150%; - text-decoration: none; - transition: color .3s ease-in-out + align-items: center; + color: #1b1d22; + display: flex; + font-size: 18px; + line-height: 150%; + text-decoration: none; + transition: color .3s ease-in-out; } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__links--single a { - font-size: 15px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__links--single a { + font-size: 15px; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu__links--single a:focus, .site-header__col--menu .site-nav__hassubnav .sub-menu__links--single a:hover { - color: #1c58d9 + color: #1c58d9; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__links--icon { - display: inline-block; - margin-right: 10px; - text-align: center; - width: 30px + display: inline-block; + margin-right: 10px; + text-align: center; + width: 30px; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo { - padding: 30px 24px; - background: #e2e8f5; - margin-bottom: 0 -} -@media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__promo { - margin-top: 20px - } + padding: 30px 24px; + background: #e2e8f5; + margin-bottom: 0; } + @media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__promo { - padding: 40px 35px 30px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo { + padding: 40px 35px 30px; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-heading, .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-subhead { - font-size: 15px; - line-height: 1.5; - margin: 0 + font-size: 15px; + line-height: 1.5; + margin: 0; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-heading { - text-transform: uppercase; - color: #2c4987; - font-weight: 700 + text-transform: uppercase; + color: #2c4987; + font-weight: 700; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-subhead { - color: #5a6072; - margin-bottom: 20px + color: #5a6072; + margin-bottom: 20px; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block { - text-decoration: none; - display: flex + text-decoration: none; + display: flex; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block:last-child { - margin-top: 15px + margin-top: 15px; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block:hover { - box-shadow: 0 0 15px #b7c6e5 + box-shadow: 0 0 15px #b7c6e5; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block:hover .promo-block__copy { - color: #1e325c + color: #1e325c; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block--large { - margin-top: 20px; - position: relative + margin-top: 20px; + position: relative; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block--large .promo-block__copy { - padding: 0 10px 0 15px; - display: flex; - flex-direction: column; - align-items: flex-start; - justify-content: center + padding: 0 10px 0 15px; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block--large .promo-block__copy { - min-width: 190px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block--large .promo-block__copy { + min-width: 190px; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block--large .promo-corner-icon { - position: absolute; - top: 10px; - right: 10px; - width: 14px; - height: auto + position: absolute; + top: 10px; + right: 10px; + width: 14px; + height: auto; } + @media (max-width:767.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block--large .promo-block__image img { - height: 100px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block--large .promo-block__image img { + height: 100px; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block__image img { - -o-object-fit: cover; - object-fit: cover; - width: 95px; - max-width: none + -o-object-fit: cover; + object-fit: cover; + width: 95px; + max-width: none; } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block__copy { - font-size: 13px; - color: #1c58d9; - line-height: 150%; - font-weight: 700; - background: #fff; - display: flex; - align-items: center; - padding: 0 10px 0 20px + font-size: 13px; + color: #1c58d9; + line-height: 150%; + font-weight: 700; + background: #fff; + display: flex; + align-items: center; + padding: 0 10px 0 20px; } + @media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block__copy { - width: 100% - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block__copy { + width: 100%; + } } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block__copy { - justify-content: center; - min-width: 175px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block__copy { + justify-content: center; + min-width: 160px; + } } + .site-header__col--menu .site-nav__hassubnav .sub-menu__promo .promo-block__eyebrow { - font-size: 12px; - color: #5a6072; - margin-bottom: 5px; - font-weight: 400 + font-size: 12px; + color: #5a6072; + margin-bottom: 5px; + font-weight: 400; } + .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu--sm-hidden { - display: none + display: none; } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu--sm-visible { - display: none - } - .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu--sm-hidden { - display: block - } - .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__header { - display: flex; - align-items: center; - border-bottom: 1px solid #c5d2ec; - padding-bottom: 10px; - margin-bottom: 30px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__header > span { - font-size: 24px; - color: #2c4987 - } - .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__header a { - text-decoration: none; - color: #1b1d22; - font-size: 14px; - display: flex; - align-items: center - } - .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__header a:hover { - color: #1c58d9 - } - .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__header img { - width: 20px; - margin-left: 20px; - margin-right: 10px - } -} -@media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products img { - width:40px; - height: auto - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__header { - margin-right: 24px; - margin-left: 24px; - margin-bottom:40px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__header a { - text-decoration: none; - display: flex; - align-items: center; - background-color: #ebebef; - padding: 21px 28px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__header-title { - font-size: 18px; - font-weight: 700; - color: #1b1d22 - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__header-subhead { - font-size: 12px; - color: #1c58d9 - } -} -@media (min-width:768px) and (max-width:1199.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links--single a { - font-size: 13px - } -} -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__block, - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links { - display: flex - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links { - margin-right: 20px; - padding-left: 20px; - margin-top: 20px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products__main { - padding-right: 30px; - padding-left: 30px; - display: flex; - flex-direction: column; - justify-content: center - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products__main > div { - display: flex - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .promo-block__copy { - min-width: 165px - } -} -@media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products__main { - padding-right:50px; - padding-left:50px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links { - margin-right: 0; - padding-right:40px; - padding-left: 30px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links li { - min-width: 0 - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links--single { - min-width: 130px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links--single a { - font-size: 15px - } -} -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products__main { - display: flex; - flex-direction: row; - align-items: center; - padding: 30px 50px 30px 40px - } -} -@media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products__main { - padding: 30px 50px 30px 60px - } -} -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products-overview { - display: block - } -} -.site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__header { - margin: 0 24px 20px -} -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__header { - border-bottom: none; - display: block; - margin: 0; - padding: 0 - } -} -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products-main-links { - min-width: 350px; - margin-left: 40px - } -} -@media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products-main-links { - min-width: 400px - } -} -.site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links { - margin: 0 40px 20px -} -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links { - margin: 0; - padding: 0 - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links ul { - display: grid; - grid-auto-flow: column; - grid-template-columns: repeat(2, 1fr); - grid-template-rows: repeat(3, 52px); - -moz-column-gap: 20px; - column-gap: 20px; - row-gap: 30px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links ul li a { - min-width: 150px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links ul .sub-menu__links--icon { - width: unset; - margin-right: 20px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links ul img { - width:50px; - height: auto; - max-width:50px; - max-height:50px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links ul .sub-menu__links--icon-security img { - width:40px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links ul .sub-menu__links--icon-integration img { - width: 45px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu--sm-visible { + display: none; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu--sm-hidden { + display: block; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__header { + display: flex; + align-items: center; + border-bottom: 1px solid #c5d2ec; + padding-bottom: 10px; + margin-bottom: 30px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__header>span { + font-size: 24px; + color: #2c4987; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__header a { + text-decoration: none; + color: #1b1d22; + font-size: 14px; + display: flex; + align-items: center; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__header a:hover { + color: #1c58d9; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__header img { + width: 20px; + margin-left: 20px; + margin-right: 10px; + } } -@media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links ul { - -moz-column-gap:50px; - column-gap:50px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links li a { - min-width: 175px - } + +.site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__link-col-header { + font-size: 21px; + color: #818698; + font-weight: 700; + text-transform: uppercase; } -.site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links-heading { - margin: 0 + +@media (min-width:768px) { + .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__link-col-header { + margin-bottom: 20px; + margin-top: 0; + font-size: 15px; + } } -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links-heading { - font-size: 18px; - color: #1b1d22; - font-weight: 700 - } + +.site-header__col--menu .site-nav__hassubnav .sub-menu__products ul { + padding: 0; } -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links--single a:hover .sub-menu__links-cta { - color: #1e325c - } + +.site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links--single { + margin-bottom: 0; } -@media (min-width:992px) and (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links--single .sub-menu__links-cta { - font-size: 12px; - color: #1c58d9 - } + +.site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links--single:not(:last-child) { + margin-bottom: 20px; } -.site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links-cta { - display: none + +.site-header__col--menu .site-nav__hassubnav .sub-menu__products .mobile-spacer { + display: none; } -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__links-cta { - display: inline-block - } + +@media (max-width:991.98px) { + .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products__main { + padding: 0 24px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products__main>:first-child p { + margin-top: 0; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products__main>* { + margin-bottom: 50px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__products .mobile-spacer { + display: block; + margin: 0 24px; + padding: 15px 0; + border-bottom: 1px solid #babec9; + } } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions__main { - padding: 0 !important; - display: flex; - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions__main .sub-menu__solution__main-links { - display: flex - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links img { - max-height: 28px; - height: unset - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions__main-wrapper { - padding: 40px 30px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--leftcol .sub-menu__links--single { - min-width: 140px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--rightcol ul { - grid-template-columns: none - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--rightcol ul li { - min-width: none - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--rightcol ul li:nth-child(2), - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--rightcol ul li:nth-child(3) { - min-width: 140px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__promo { - padding:50px 35px !important - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__promo a { - margin-top: 30px !important - } -} -@media (min-width:1600px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--leftcol .sub-menu__links--single, - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--rightcol ul li:nth-child(2), - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--rightcol ul li:nth-child(3) { - min-width: 195px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__products { + right: 0; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products__main { + padding: 70px 80px 60px; + display: grid; + grid-template-columns: repeat(3, 150px); + -moz-column-gap: 50px; + column-gap: 50px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__products .sub-menu__products-link-col-header { + font-size: 15px; + } } -@media (min-width:992px) and (max-width:1599.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links--single a { - font-size: 13px - } + +.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions ul { + padding: 0; } + @media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions { - display: block - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions.is-active { - display: flex - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions--title { - flex: 0 0 100%; - max-width: 100% - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links--icon { - border: 1.5px solid #ebebef; - border-radius: 5px; - display: inline-block; - flex: 0 0 30px; - max-width: 30px; - min-height: 30px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links--icon img { - width: 16px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links a { - font-size: 15px - } -} -@media (min-width:992px) and (max-width:1199.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions { - padding-left: 25px; - padding-right: 0 - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__link-col-header { + display: none; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions__main-wrapper { + margin: 0 24px; + } } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions { - padding: 0 - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__block { - display: none - } -} -@media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links { - padding-left: 25px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions { + right: unset; + margin-left: -50px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links--single { + margin-bottom: 0; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__links--single:not(:last-child) { + margin-bottom: 20px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions__main { + padding: 0 !important; + display: block !important; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions__main .sub-menu__solution__main-links { + display: flex; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions__main-wrapper { + padding: 40px 60px; + } } -.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__col { - display: block + +.site-header__col--menu .site-nav__hassubnav .sub-menu__developers ul { + padding: 0; } + @media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__col { - width: 100% - } -} -.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__col ul { - display: grid; - grid-column-gap: 0; - grid-row-gap: 25px; - grid-auto-flow: column + .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__developers__main { + margin: 0 24px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__link-col-header { + display: none; + } } -.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__col ul li { - margin: 0 + +@media (min-width:992px) { + .site-header__col--menu .site-nav__hassubnav .sub-menu__developers { + right: unset; + margin-left: -130px; + padding: 50px 60px 20px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__developers-grid-wrapper { + display: grid; + grid-template-columns: 75px 95px; + -moz-column-gap: 70px; + column-gap: 70px + } } -@media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__col ul li { - height:40px - } + +.site-header__col--menu .site-nav__hassubnav .sub-menu__login ul { + padding: 0; } + @media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions-mobile .sub-menu__header-title { - font-weight: 700; - color: #363a45 - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions-mobile .sub-menu__header-subhead { - font-size: 12px; - color: #1c58d9 - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__login .sub-menu__link-col-header { + display: none; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__login .sub-menu__links-wrapper { + margin: 0 24px; + } } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions__main-wrapper { - padding: 30px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__login { + right: unset; + margin-left: -40px; + padding: 50px 60px 20px; + } } -@media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions__main-wrapper { - padding: 30px 30px 30px 50px - } + +.site-header__col--menu .site-nav__hassubnav .sub-menu__col { + display: flex; + flex-wrap: wrap; } -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions-desktop { - margin-right:40px; - padding: 70px 0 - } + +.site-header__col--menu .site-nav__hassubnav .sub-menu__col .sub-menu__links:first-of-type { + padding-left: 0; } -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions__main-wrapper { - display: flex; - align-items: center - } + +.site-header__col--menu .site-nav__hassubnav .sub-menu__col--title { + color: #818698; + display: block; + font-size: 15px; + font-weight: 700; + line-height: 150%; + margin-top: 0; + flex: 0 0 100%; } + @media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__header img { - width:40px; - height: auto - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__header a { - text-decoration: none; - display: flex; - align-items: center; - background-color: #ebebef; - padding: 21px 28px + .site-header__col--menu { + padding: 0; } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__col--title { + margin-bottom: 0; + padding-left: 20px; + } } -.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__header { - margin: 0 24px 35px -} + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__header { - border-bottom: none; - display: block; - margin: 0; - padding: 0 - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__col--title { + margin-bottom: 20px; + } } + @media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--leftcol { - padding-bottom:50px !important - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__col { + padding-bottom: 70px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__col:last-child { + padding-bottom: 20px; + } } -@media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--leftcol { - margin-right:40px - } + +.site-header__col--menu .site-nav__hassubnav .sub-menu__bar { + display: none; } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--leftcol { - margin-right: 20px - } -} -.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--leftcol .sub-menu__links ul { - grid-template-rows: repeat(2, 1fr); - grid-template-columns: repeat(2, 50%); - row-gap: 30px + .site-header__col--menu .site-nav__hassubnav .sub-menu__bar { + bottom: 0; + display: block; + left: 0; + position: absolute; + width: 100%; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__bar a { + background-color: #1c58d9; + color: #fff; + display: block; + font-size: 15px; + font-weight: 700; + line-height: 150%; + padding: 7px 41px; + text-align: left; + text-decoration: none; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__bar a:hover { + background-color: #043cb5; + } } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--leftcol .sub-menu__links ul { - grid-template-columns: repeat(1, 1fr); - grid-template-rows: repeat(4, 1fr); - -moz-column-gap: 20px; - column-gap: 20px; - row-gap: 20px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__promo { + padding-top: 73px; + } } -.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--rightcol .sub-menu__links ul { - grid-template-rows: repeat(2, 1fr); - grid-template-columns: repeat(2, 50%); - row-gap: 30px + +.site-header__col--menu .site-nav__hassubnav:hover .sub-menu { + opacity: 1; + pointer-events: auto; } -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions .sub-menu__solutions--rightcol .sub-menu__links ul { - grid-template-columns: repeat(1, 1fr); - grid-template-rows: repeat(4, 1fr); - -moz-column-gap: 20px; - column-gap: 20px; - row-gap: 20px - } + +.site-header__col--menu .site-nav__hassubnav .sub-menu:focus-within { + opacity: 1; + pointer-events: auto; } -@media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers img { - width:40px; - height: auto - } + +.site-header__col--menu .site-nav__hassubnav .sub-menu__platform-mobile, +.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-mobile { + display: flex; } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers { - padding: 0 !important - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__links { - padding-left: 0; - margin-top: 90px; - align-self: start - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__links li:last-child { - margin-bottom: 0 - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__links--icon { - width: 24px - } - .sub-menu__developers .sub-menu__links--single span { - width: 34px !important; - } - .sub-menu__developers .sub-menu__links--single-community img { - width: 25px; - } - .sub-menu__developers .sub-menu__links--single-academy span { - width: 43px !important; - } - .sub-menu__developers .sub-menu__links--single-academy a { - align-items: flex-start; - } -} -@media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__links:last-child { - padding-left: 0 - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__links li { - min-width: 150px - } -} -@media (min-width:992px) and (max-width:1599.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__links--single { - min-width: 130px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__links--single a { - font-size: 13px - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-mobile, + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-mobile { + display: none !important; + } } -.site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__blocks-list { - padding: 0 24px 20px + +.site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop, +.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop { + display: none; } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__blocks-list { - padding: 60px 30px; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop, + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop { + padding: 60px 0; + border-right: 1px solid #c5d2ec; + display: block; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop .sub-menu__platform-desktop-wrapper, + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop .sub-menu__platform-desktop-wrapper { + min-width: 170px; + margin-right: 20px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop .sub-menu__solutions-desktop-wrapper, + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop .sub-menu__solutions-desktop-wrapper { + min-width: 230px; + margin-right: 20px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop .sub-menu__header-title, + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop .sub-menu__header-title { + font-size: 24px; + color: #1b1d22; + font-weight: 700; + margin: 0; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop .sub-menu__body-copy, + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop .sub-menu__body-copy { + font-size: 15px; + line-height: 150%; + color: #1b1d22; + margin-bottom: 10px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop a, + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop a { + color: #1c58d9 !important; + font-size: 12px !important; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop a:hover, + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop a:hover { + color: #1e325c; + } } + @media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__blocks-list { - padding: 60px 50px - } -} -.site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__block--mini { - background-color: #ebebef; - padding: 5px 20px; - margin-bottom: 10px; -} -.site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__block--mini:hover { - background-color: #e8edf8 -} -@media (min-width:992px) and (max-width:1599.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__block--mini { - min-width: 300px; - margin-bottom: 10px - } -} -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__block--mini .sub-menu__block--text { - display: flex; - flex-direction: row; - align-items: center; - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__block--mini .sub-menu__block--text_title { - margin-right: 20px - } -} -@media (min-width:1600px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__block--mini { - min-width: 340px; - margin-bottom: 10px; - } -} -.site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__block--mini:last-child { - margin-bottom: 0 -} -.site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__block--mini a { - display: flex; - align-items: center; - text-decoration: none -} -.site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__block--mini img { - width:40px -} -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__block--mini img { - margin-right: 30px - } -} -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__developers .sub-menu__promo { - margin-left: 30px - } -} -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__enterprise { - padding: 40px 50px; - right: unset; - margin-left: -3rem - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__enterprise .sub-menu__links ul { - display: grid; - grid-template-columns: 1fr; - row-gap: 20px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__enterprise .sub-menu__links--single { - margin-bottom: 0 - } + .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop .sub-menu__platform-desktop-wrapper, + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop .sub-menu__platform-desktop-wrapper { + margin-right: 110px; + } + + .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop .sub-menu__solutions-desktop-wrapper, + .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop .sub-menu__solutions-desktop-wrapper { + margin-right: 60px; + } } -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__login { - padding: 70px 40px - } + +@media (max-width:991.98px) { + .site-header .sub-menu__links+.sub-menu__links { + padding-top: 0; + } + + .site-header .site-nav__toplink:first-child .sub-menu__links .sub-menu__links--single:last-child { + margin-bottom: 0; + } + + .site-header .site-nav__button:not(.site-nav__button--secondary) { + padding-top: 40px; + } } -.site-header__col--menu .site-nav__hassubnav .sub-menu__login img { - width:40px; - height: auto + +footer.site-footer { + background: linear-gradient(180deg, rgba(19, 30, 57, .9), #1e325c 20%); + padding: 50px 0; } + @media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__login img { - height:50px; - width: auto; - margin-bottom: 10px - } + footer.site-footer { + padding: 100px 0; + } } -.site-header__col--menu .site-nav__hassubnav .sub-menu__col { - display: flex; - flex-wrap: wrap + +.site-footer .site-footer__links { + display: flex; + justify-content: space-between; + flex-wrap: wrap; } -.site-header__col--menu .site-nav__hassubnav .sub-menu__col .sub-menu__links:first-of-type { - padding-left: 0 + +.site-footer .site-footer__links .footer-link-list { + margin-bottom: 40px; } -.site-header__col--menu .site-nav__hassubnav .sub-menu__col--title { - color: #818698; - display: block; - font-size: 15px; - font-weight: 700; - line-height: 150%; - margin-top: 0; - flex: 0 0 100%; - text-transform: uppercase; + +@media (min-width:768px) { + .site-footer .site-footer__links .footer-link-list { + flex: 0 0 calc(33.33333% - 60px); + max-width: calc(33.33333% - 60px); + margin-bottom: 0; + } } -@media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__col--title { - margin-bottom: 0; - padding-left: 20px - } + +.site-footer .site-footer__links .footer-link-list:last-child { + margin-bottom: 0; } -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__col--title { - margin-bottom: 20px - } + +.site-footer .site-footer__links .footer-link-list .footer-link-list__header { + color: #fff; + font-size: 18px; + font-weight: 700; + margin-bottom: 20px; + text-transform: uppercase; } -@media (max-width:991.98px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__col { - padding-bottom: 70px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__col:last-child { - padding-bottom: 20px - } + +.site-footer .site-footer__links .footer-link-list .footer-link-list__item { + margin-bottom: 10px; } -.site-header__col--menu .site-nav__hassubnav .sub-menu__bar { - display: none + +.site-footer .site-footer__links .footer-link-list .footer-link-list__item:last-child { + margin-bottom: 0; } -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__bar { - bottom: 0; - display: block; - left: 0; - position: absolute; - width: 100% - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__bar a { - background-color: #1c58d9; - color: #fff; - display: block; - font-size: 15px; - font-weight: 700; - line-height: 150%; - padding: 7px 41px; - text-align: left; - text-decoration: none - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__bar a:hover { - background-color: #043cb5 - } + +.site-footer .site-footer__links .footer-link-list .footer-link-list__item a { + color: #e2e8f5; + font-size: 14px; + text-decoration: none; } -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu .sub-menu__promo { - padding-top:50px - } + +.site-footer .site-footer__links .footer-link-list .footer-link-list__item a:hover { + color: #fff; } -.site-header__col--menu .site-nav__hassubnav:hover .sub-menu { - opacity: 1; - pointer-events: auto + +.site-footer .site-footer__social { + display: flex; + align-items: center; } -.site-header__col--menu .site-nav__hassubnav .sub-menu:focus-within { - opacity: 1; - pointer-events: auto + +.site-footer .site-footer__social .social-link { + margin-right: 10px; } -.site-header__col--menu .site-nav__hassubnav .sub-menu__platform-mobile, -.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-mobile { - display: flex + +.site-footer .site-footer__social .social-link:last-child { + margin-right: 0; } -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-mobile, - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-mobile { - display: none !important - } + +.site-footer .site-footer__social .social-link a { + color: #e2e8f5; + font-size: 18px; + text-decoration: none; } -.site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop, -.site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop { - display: none + +.site-footer .site-footer__social .social-link a:hover { + color: #fff; } -@media (min-width:992px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop, - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop { - padding: 60px 0; - border-right: 1px solid #c5d2ec; - display: block - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop .sub-menu__platform-desktop-wrapper, - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop .sub-menu__platform-desktop-wrapper { - min-width: 170px; - margin-right: 20px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop .sub-menu__solutions-desktop-wrapper, - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop .sub-menu__solutions-desktop-wrapper { - min-width: 230px; - margin-right: 20px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop .sub-menu__header-title, - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop .sub-menu__header-title { - font-size: 24px; - color: #1b1d22; - font-weight: 700; - margin-bottom: 10px; - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop .sub-menu__body-copy, - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop .sub-menu__body-copy { - font-size: 15px; - line-height: 150%; - color: #1b1d22; - margin-bottom: 10px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop a, - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop a { - color: #1c58d9 !important; - font-size: 12px !important - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop a:hover, - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop a:hover { - color: #1e325c - } + +.site-footer .site-footer__legal { + color: #e2e8f5; + font-size: 14px; + margin-top: 40px; } -@media (min-width:1200px) { - .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop .sub-menu__platform-desktop-wrapper, - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop .sub-menu__platform-desktop-wrapper { - margin-right: 110px - } - .site-header__col--menu .site-nav__hassubnav .sub-menu__platform-desktop .sub-menu__solutions-desktop-wrapper, - .site-header__col--menu .site-nav__hassubnav .sub-menu__solutions-desktop .sub-menu__solutions-desktop-wrapper { - margin-right: 60px - } + +.site-footer .site-footer__legal a { + color: #e2e8f5; + text-decoration: underline; } -@media (max-width:991.98px) { - .site-header .sub-menu__links + .sub-menu__links { - padding-top: 0 - } - .site-header .site-nav__toplink:first-child .sub-menu__links .sub-menu__links--single:last-child { - margin-bottom: 0 - } - .site-header .site-nav__button:not(.site-nav__button--secondary) { - padding-top: 40px - } + +.site-footer .site-footer__legal a:hover { + color: #fff; } + + /* END NEW NAV */ diff --git a/source/conf.py b/source/conf.py index 36ee2af024f..95335b2f2cf 100644 --- a/source/conf.py +++ b/source/conf.py @@ -2508,12 +2508,12 @@ def setup(_: Sphinx): # A list of CSS files. The entry must be a filename string or a tuple containing the filename string and the attributes # dictionary. The filename must be relative to the html_static_path, or a full URI with scheme like # https://example.org/style.css. The attributes is used for attributes of tag. It defaults to an empty list. -html_css_files = ["mytheme.css?version=v38", "css/compass-icons.css"] +html_css_files = ["mytheme.css?version=v46", "css/compass-icons.css"] # A list of JavaScript filenames. The entry must be a filename string or a tuple containing the filename string and the # attributes dictionary. The filename must be relative to the html_static_path, or a full URI with scheme like # https://example.org/script.js. The attributes is used for attributes of