结论:优先用 docker 部署,省去数据库、用户、服务等手动配置;裸机安装须严格使用官方二进制包+systemd+mysql/postgresql组合,否则易因 config.json 数据库连接或启动失败而卡住。

直接说结论:别用源码包硬装,优先选 Docker 方式部署,省去数据库、用户、服务管理一堆手动配置;如果必须裸机安装(比如内网无 Docker 环境),就严格按官方二进制包 + systemd + MySQL/PostgreSQL 组合来,否则大概率卡在 config.json 数据库连接或启动失败。
为什么 Docker 部署是 Linux 上最稳的路径
官方维护的 docker 仓库已内置 MySQL、Redis、Nginx(可选)、Mattermost Server 四件套,网络、卷挂载、端口映射全写死在 docker-compose.yml 里。你只需要改三处:DOMAIN(填服务器 IP 或域名)、DB_HOST(默认 db,不用动)、MM_SERVICESETTINGS_SITEURL(必须和访问地址一致,否则 WebSocket 断连)。
常见错误现象:
- 浏览器打开
http://IP:8065显示空白页或 502 —— 多半是MM_SERVICESETTINGS_SITEURL没配成http://IP:8065,或用了 HTTPS 但没配 TLS 终止 - 初始化页面卡住不动 ——
./volumes/app/mattermost目录权限不对,chown -R 2000:2000必须执行,Mattermost 容器内以 UID 2000 运行 -
docker compose up -d后docker ps看不到容器 —— 检查docker-compose.without-nginx.yml是否被误删,或者系统没装docker-composev2(Ubuntu 22.04+ 默认是docker compose,少个横杠)
裸机安装时 config.json 的关键字段不能乱改
从 mattermost-linux-amd64.tar.gz 解压后,config.json 是唯一核心配置文件。它不认环境变量,所有值都得手敲。最容易出问题的是这几块:
-
ServiceSettings.SiteURL:必须和最终用户访问地址完全一致(含协议、端口),比如用 Nginx 反代到https://chat.example.com,这里就得写死这个 URL,不能写http://localhost:8065 -
SqlSettings.DriverName:只接受mysql或postgres,拼错(如MySQL)会导致启动时 panic 报错unknown driver "MySQL" -
SqlSettings.DataSource:MySQL 示例为"mmuser:mostest@tcp(dbhost:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s",注意&是 JSON 里合法的 & 符号转义,漏掉会解析失败 -
LogSettings.EnableConsole设为true,启动失败时直接看./bin/mattermost控制台输出,比翻日志快得多
systemd 服务文件必须限制工作目录和用户
裸机部署后,不能靠 nohup ./bin/mattermost & 启动,否则进程归属 root、日志乱飞、重启失效。正确做法是写 /etc/systemd/system/mattermost.service:
[Unit] Description=Mattermost After=network.target After=mysqld.service [Service] Type=simple User=mattermost Group=mattermost WorkingDirectory=/opt/mattermost ExecStart=/opt/mattermost/bin/mattermost Restart=always RestartSec=10 LimitNOFILE=49152 [Install] WantedBy=multi-user.target
注意点:
-
User和Group必须是创建的专用系统用户(useradd --system --home=/opt/mattermost mattermost),不能用root或普通登录用户 -
WorkingDirectory必须设为/opt/mattermost,否则插件加载、日志写入路径全错 - 如果启用了邮件通知,
Postfix或其他 MTA 必须已配置好,且systemd不会自动拉起它们,要确保After=里列对依赖服务名(如postfix.service)
外网访问前必须过掉反向代理和证书这两关
本地能访问 :8065 不代表外网能用。真实生产环境几乎不会直接暴露 8065 端口,而是走 Nginx 或 Caddy 反代 + Let's Encrypt 自动续期。这里最容易忽略的是 WebSocket 升级头:
- Nginx 配置里必须包含:
proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection "upgrade";,否则客户端登录后无法收消息 -
SiteURL必须是 HTTPS 地址,否则浏览器会拦截混合内容(HTTP API + HTTPS 页面) - Let's Encrypt 申请时,域名 A 记录必须已解析到服务器 IP,且防火墙放行 80/443,否则
certbot --nginx会卡在验证环节 - 如果用内网穿透(如路由侠),
SiteURL要填穿透后的公网地址(如https://xxx.luyouxia.com),且穿透服务必须支持 WebSocket 流量透传(不是所有工具都支持)
复杂点在于:Mattermost 的文件上传、WebRTC、插件静态资源全部依赖 SiteURL 构造绝对路径,一旦配错,表现是部分功能看似正常,但上传失败、通知不响、插件白屏——这些都不是报错,而是静默失败。











