Mattermost 5.1 will include support for serving Mattermost from subpaths. This allows Mattermost to be exposed at something like https://example.com/company/mattermost, with your proxy server exposing different services at other subpaths. Subpath support is configured via the Site URL.
In production, after configuration and restart, the application server expects all HTTP requests to be anchored to the configured subpath. This includes static assets, API calls, and WebSockets. For convenience, the application server redirects any unexpected requests back into this subpath, e.g. forwarding http://example.com/login to http://example.com/company/mattermost/login.
The pre-built static assets shipped with Mattermost assume being hosted at
/static/. In production, when the
SiteURL is configured with a subpath such as https://example.com/company/mattermost, the application server rewrites any affected assets on startup to point at
/company/mattermost/static instead. This rewriting can be done manually with the
mattermost config subpath command:
mattermost config subpath --path /company/mattermost
Rewriting the static assets manually may be necessary when deploying to a CDN.
In development, with webpack running, the static assets are rewritten whenever a source file changes. While the server is still configured via the
SiteURL, webpack requires this to be set via an environment variable:
cd mattermost-webapp/ make stop export MM_SERVICESETTINGS_SITEURL='http://localhost:8065/company/mattermost' make run
To resume testing at the root, either define a
SiteURL with no subpath or unset the environment variable:
unset MM_SERVICESETTINGS_SITEURL make restart
This environment variable is also honoured by the server as an override to config.json as described in documentation. Therefore, you can include this export in your shell’s initialization script to apply to both the server and the webapp simultaneously.
Under the covers, in development, our webpack.config.js parses the
MM_SERVICESETTINGS_SITEURL environment variable to extract the subpath. This is first used by HtmlWebpackPlugin to anchor the assets loaded by root.html. It is then exported into the node environment as
process.env.PUBLIC_PATH and used by entry.js to define `__webpack_public_path__`, affecting all modules loaded dynamically after the web application starts.
In production, with a non-root subpath, the application server rewrites root.html to export
window.publicPath. This is checked by entry.js to similarly define
HtmlWebpackPlugin is only run during development, the server also rewrites parts of
root.html and various CSS files to reflect the correct subpath. To make the rewriting robust against multiple subpath changes, the application server uses any existing definition of
window.publicPath to match the appropriate strings.