Self-hosted Mattermost на VPS: установка с Docker, Nginx, Push-уведомлениями и S3-бэкапами
TL;DR
В этом подробном руководстве мы настроим Mattermost — мощную платформу для командного общения, которая служит отличной альтернативой Slack, но полностью контролируется вами. Мы развернем его на виртуальном или выделенном сервере (VPS/Dedicated) с использованием Docker и Docker Compose для упрощения управления, настроим Nginx в качестве обратного прокси с SSL-сертификатами от Let's Encrypt, обеспечим работу мобильных push-уведомлений и реализуем надежную систему автоматического резервного копирования данных в S3-совместимое хранилище.
- Полностью управляемый вами Mattermost на Ubuntu Server 24.04 LTS.
- Использование Docker и Docker Compose для изоляции и простоты развертывания.
- Настройка Nginx для безопасного доступа через HTTPS с автоматическими SSL-сертификатами.
- Поддержка мобильных push-уведомлений для всех пользователей.
- Автоматические ежедневные бэкапы базы данных и файлов в S3-хранилище.
- Актуальные версии ПО, инструкции для 2026 года.
Что мы настраиваем и зачем
Mattermost — это современная платформа для командного обмена сообщениями, разработанная как открытая альтернатива коммерческим продуктам вроде Slack или Microsoft Teams. Она предоставляет все необходимые функции для эффективной коммуникации: публичные и приватные каналы, прямые сообщения, обмен файлами, интеграции с внешними сервисами, голосовые и видеозвонки (через плагины) и многое другое. Самостоятельное развертывание Mattermost (self-hosted) на собственном VPS или выделенном сервере дает полный контроль над данными, безопасностью и возможностью глубокой настройки под уникальные потребности вашей команды или компании.
В этом руководстве мы пройдем путь от пустого сервера до полностью функционального Mattermost-инстанса, доступного из любой точки мира через защищенное HTTPS-соединение. Мы сосредоточимся на использовании Docker и Docker Compose — эти инструменты позволяют легко развертывать, управлять и обновлять приложения в изолированных контейнерах, что значительно упрощает эксплуатацию. Nginx будет выступать в роли обратного прокси, обрабатывая входящие запросы и направляя их к Mattermost-контейнеру, а также обеспечивая шифрование трафика с помощью бесплатных SSL-сертификатов от Let's Encrypt. Отдельное внимание уделим настройке push-уведомлений для мобильных клиентов и реализации надежной системы автоматического резервного копирования данных в S3-совместимое хранилище, что критически важно для любой производственной системы.
В итоге вы получите отказоустойчивую и безопасную систему коммуникации, которая не зависит от сторонних облачных провайдеров и полностью находится под вашим контролем. Это идеальное решение для разработчиков, стартапов, криптоэнтузиастов и всех, кто ценит конфиденциальность и суверенитет над своими данными.
Альтернативы: Cloud-managed vs Self-hosted
При выборе платформы для командного общения обычно стоят два основных варианта:
- Cloud-managed решения (Slack, Microsoft Teams, Mattermost Cloud): Эти сервисы предлагают удобство "под ключ", не требуя от вас никаких технических знаний для установки и обслуживания. Вы просто регистрируетесь, платите ежемесячную абонентскую плату, и все работает. Однако, вы полностью доверяете свои данные стороннему провайдеру, теряете контроль над их местоположением и безопасностью, а также ограничены в кастомизации и интеграциях. Стоимость может быстро расти с увеличением числа пользователей.
- Self-hosted решения (Mattermost на VPS): Вы самостоятельно развертываете и управляете приложением на собственном сервере. Это требует определенных технических навыков, но дает неоспоримые преимущества:
- Полный контроль над данными: Ваши данные остаются на вашем сервере, под вашим управлением. Это критично для компаний с высокими требованиями к безопасности и конфиденциальности.
- Гибкость и кастомизация: Вы можете устанавливать любые плагины, модифицировать исходный код (если это open-source), интегрировать с внутренними системами без ограничений API.
- Экономия: Долгосрочно self-hosted решение часто оказывается дешевле, особенно для больших команд, так как вы платите только за сервер, а не за каждого пользователя.
- Независимость: Вы не зависите от политики ценообразования или возможных сбоев стороннего провайдера.
Мы выбираем self-hosted подход на VPS, чтобы получить максимум преимуществ при разумных затратах и с полным контролем.
Какой VPS-конфиг нужен под эту задачу
Требования к серверу для Mattermost зависят от количества пользователей и интенсивности использования. Приведенные ниже рекомендации актуальны для установки Mattermost Team Edition.
Минимальные требования (до 50 активных пользователей)
- CPU: 2 ядра (x86-64)
- RAM: 4 GB
- Диск: 80 GB SSD (для ОС, Docker-образов, БД и пользовательских файлов)
- Сеть: 100 Mbps, неограниченный трафик
Рекомендуемый конфиг (до 200 активных пользователей)
- CPU: 4 ядра (x86-64)
- RAM: 8 GB
- Диск: 160-200 GB NVMe SSD (для максимальной производительности дисковой подсистемы)
- Сеть: 1 Gbps, неограниченный трафик
Для нашей задачи по развертыванию Mattermost с Nginx, Docker и бэкапами, рекомендуем ориентироваться на конфигурацию: 4 vCPU, 8 GB RAM, 160 GB NVMe SSD, 1 Gbps сеть. Такой сервер обеспечит комфортную работу для команды до 200 человек и оставит запас для роста. VPS с указанными характеристиками будет оптимальным выбором для большинства команд.
Когда нужен dedicated, а не VPS
Выделенный сервер (dedicated server) становится предпочтительнее в следующих случаях:
- Очень большие команды: Если вы ожидаете 500+ активных пользователей или тысячи одновременных подключений.
- Высокие требования к производительности: Для критически важных систем, где задержки недопустимы, и требуется максимальная производительность диска и CPU без влияния "соседей" по VPS.
- Специфические требования к безопасности/комплаенсу: Когда необходима полная изоляция на физическом уровне, или требуется установка кастомного оборудования/ПО, которое невозможно на VPS.
- Интенсивное использование плагинов и интеграций: Некоторые ресурсоемкие плагины могут требовать больше ресурсов, чем может предоставить средний VPS.
Для большинства сценариев, описанных в этом гайде, мощного VPS будет более чем достаточно.
Локация: на что влияет
Выбор локации VPS имеет значение для:
- Задержки (latency): Чем ближе сервер к большинству ваших пользователей, тем ниже будет пинг и быстрее отклик. Для международной команды выбирайте центральную локацию или используйте CDN.
- Законодательство: Расположение сервера определяет юрисдикцию, под которую подпадают ваши данные. Это важно для соблюдения GDPR, HIPAA и других регуляций.
- Стоимость: Цены на VPS могут варьироваться в зависимости от локации.
Рекомендуется выбирать локацию, которая географически близка к основной массе пользователей Mattermost.
Подготовка сервера
Предполагается, что у вас есть свежеустановленный VPS с операционной системой Ubuntu Server 24.04 LTS. Все команды будут выполняться от имени пользователя с правами sudo.
1. Обновление системы и установка базовых утилит
Первым делом обновим систему и установим необходимые пакеты.
sudo apt update && sudo apt upgrade -y # Обновление списка пакетов и их обновление
sudo apt install -y curl wget git nano htop ufw fail2ban # Установка полезных утилит и инструментов безопасности
2. Создание нового пользователя с правами sudo (если еще не сделали)
Работа под root пользователем небезопасна. Создадим нового пользователя и дадим ему права sudo.
sudo adduser mattermostuser # Создаем нового пользователя
sudo usermod -aG sudo mattermostuser # Добавляем пользователя в группу sudo
Теперь выйдите из сессии root и войдите под новым пользователем mattermostuser.
exit
# Войдите снова: ssh mattermostuser@your_vps_ip
3. Настройка SSH-ключей (рекомендуется)
Использование SSH-ключей вместо паролей значительно повышает безопасность.
На вашей локальной машине:
ssh-keygen -t rsa -b 4096 # Генерируем новый SSH-ключ (если его нет)
ssh-copy-id mattermostuser@your_vps_ip # Копируем публичный ключ на сервер
Теперь можно отключить авторизацию по паролю в SSH на сервере. Отредактируйте файл /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
Найдите и измените следующие строки (или добавьте, если отсутствуют):
#...
PasswordAuthentication no
ChallengeResponseAuthentication no
PermitRootLogin no
#...
Перезапустите SSH-сервис:
sudo systemctl restart sshd
4. Настройка брандмауэра (UFW)
UFW (Uncomplicated Firewall) — простой в использовании брандмауэр для Linux.
sudo ufw allow OpenSSH # Разрешаем SSH-подключения
sudo ufw allow http # Разрешаем HTTP (порт 80)
sudo ufw allow https # Разрешаем HTTPS (порт 443)
sudo ufw enable # Включаем UFW
sudo ufw status # Проверяем статус брандмауэра
Убедитесь, что SSH разрешен, прежде чем включать UFW, иначе вы можете потерять доступ к серверу.
5. Настройка Fail2ban
Fail2ban защищает сервер от атак методом подбора паролей, блокируя IP-адреса, с которых происходят многократные неудачные попытки входа.
После установки он работает "из коробки" с SSH. Для настройки дополнительных правил можно создать файл /etc/fail2ban/jail.local:
sudo nano /etc/fail2ban/jail.local
Пример содержимого (для SSH):
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
Перезапустите Fail2ban:
sudo systemctl restart fail2ban
sudo fail2ban-client status # Проверяем статус
На этом базовая подготовка сервера завершена.
Установка ПО — пошагово
В этом разделе мы установим Docker, Docker Compose, Nginx и настроим их для работы с Mattermost. Все версии ПО актуальны на 2026 год, что подразумевает использование последних стабильных релизов.
1. Установка Docker Engine и Docker Compose
Docker — это платформа для разработки, доставки и запуска приложений в контейнерах. Docker Compose позволяет определять и запускать многоконтейнерные Docker-приложения.
# Добавляем репозиторий Docker
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Устанавливаем Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # Установка Docker и Docker Compose (v2)
# Добавляем текущего пользователя в группу docker для работы без sudo
sudo usermod -aG docker mattermostuser # Замените mattermostuser на ваше имя пользователя
newgrp docker # Применяем изменения для текущей сессии, либо перелогиньтесь
# Проверяем установку Docker
docker run hello-world # Запуск тестового контейнера
docker compose version # Проверка версии Docker Compose
На момент 2026 года, docker-compose-plugin является предпочтительным способом установки Docker Compose v2, который интегрирован в CLI Docker.
2. Установка Nginx
Nginx будет работать как обратный прокси для Mattermost, обрабатывая SSL-сертификаты и направляя трафик.
sudo apt update
sudo apt install -y nginx # Установка Nginx (версия ~1.26.x на 2026 год для Ubuntu 24.04 LTS)
sudo systemctl enable nginx # Включаем автозапуск Nginx
sudo systemctl start nginx # Запускаем Nginx
sudo systemctl status nginx # Проверяем статус Nginx
Проверьте доступность Nginx, открыв IP-адрес вашего сервера в браузере. Вы должны увидеть страницу "Welcome to Nginx!".
3. Установка Certbot (для Let's Encrypt SSL)
Certbot — это клиент для автоматического получения и обновления SSL-сертификатов от Let's Encrypt.
sudo apt install -y certbot python3-certbot-nginx # Установка Certbot и плагина для Nginx
Для работы Certbot вам потребуется доменное имя, указывающее на IP-адрес вашего VPS. Например, chat.yourdomain.com.
4. Создание директорий для Mattermost
Создадим структуру директорий для хранения конфигурации Mattermost, данных и базы данных PostgreSQL.
sudo mkdir -p /opt/mattermost/{app,data,db,logs,config,plugins,client/plugins} # Создание основной структуры
sudo chown -R mattermostuser:mattermostuser /opt/mattermost # Назначение прав текущему пользователю
sudo chmod -R 770 /opt/mattermost # Установка прав доступа
Убедитесь, что ваш пользователь mattermostuser имеет права на запись в эти директории.
Конфигурация
Этот раздел посвящен настройке всех компонентов: Docker Compose для Mattermost и PostgreSQL, Nginx для проксирования и SSL, а также Mattermost для push-уведомлений и S3-бэкапов.
1. Подготовка файла .env для секретов
Создадим файл .env для хранения переменных окружения и секретов, чтобы не хардкодить их в docker-compose.yml.
nano /opt/mattermost/.env
Пример содержимого /opt/mattermost/.env:
# Mattermost
MM_HOSTNAME=chat.yourdomain.com # Замените на ваш домен
MM_SITEURL=https://chat.yourdomain.com # Замените на ваш домен
MM_DB_USERNAME=mmuser
MM_DB_PASSWORD=your_strong_db_password # Сгенерируйте надежный пароль
MM_DB_NAME=mattermost
# PostgreSQL
POSTGRES_USER=mmuser
POSTGRES_PASSWORD=your_strong_db_password
POSTGRES_DB=mattermost
Важно: Сгенерируйте по-настоящему надежные пароли для базы данных. Используйте онлайн-генераторы или команду типа openssl rand -base64 32.
2. Создание файла docker-compose.yml
Создадим основной файл docker-compose.yml, который определит сервисы Mattermost, PostgreSQL и Nginx.
nano /opt/mattermost/docker-compose.yml
Пример содержимого /opt/mattermost/docker-compose.yml:
version: '3.8'
services:
app:
container_name: mattermost-app
image: mattermost/mattermost-team-edition:9.6 # Актуальная версия на 2026 год, или используйте latest
restart: unless-stopped
environment:
MM_SQLSETTINGS_DRIVERNAME: postgres
MM_SQLSETTINGS_DATASOURCE: postgres://${MM_DB_USERNAME}:${MM_DB_PASSWORD}@db:5432/${MM_DB_NAME}?sslmode=disable&connect_timeout=10
MM_SERVICESETTINGS_SITEURL: ${MM_SITEURL}
MM_LOGSETTINGS_FILELOCATION: /mattermost/logs/mattermost.log
MM_FILESETTINGS_DIRECTORY: /mattermost/data
MM_EMAILSETTINGS_SENDEMAILNOTIFICATIONS: "true" # Включите после настройки SMTP
MM_EMAILSETTINGS_FEEDBACKEMAIL: "[email protected]"
MM_EMAILSETTINGS_SMTPUSERNAME: "smtp_user" # Замените на ваши данные SMTP
MM_EMAILSETTINGS_SMTPPASSWORD: "smtp_password"
MM_EMAILSETTINGS_SMTPSERVER: "smtp.yourprovider.com"
MM_EMAILSETTINGS_SMTPPORT: "587"
MM_EMAILSETTINGS_CONNECTIONSECURITY: "STARTTLS"
MM_EMAILSETTINGS_ENABLESMTPAUTH: "true"
MM_MESSAGINGSETTINGS_ENABLEEMAILBATCHING: "true"
MM_MESSAGINGSETTINGS_EMAILBATCHINGBUFFERSIZE: "256"
MM_MESSAGINGSETTINGS_EMAILBATCHINGINTERVAL: "30" # Seconds
MM_PUSHNOTIFICATIONSSETTINGS_ENABLEEXTENSIBLESERVICE: "true"
MM_PUSHNOTIFICATIONSSETTINGS_GATEWAYURL: "https://push.mattermost.com" # Используем официальный шлюз
# MM_PUSHNOTIFICATIONSSETTINGS_ANDROIDPUSHPROXYURL: "http://localhost:8065" # Для собственного MPNS
# MM_PUSHNOTIFICATIONSSETTINGS_IOSPUSHPROXYURL: "http://localhost:8065" # Для собственного MPNS
volumes:
- /opt/mattermost/app:/mattermost:rw
- /opt/mattermost/data:/mattermost/data:rw
- /opt/mattermost/config:/mattermost/config:rw
- /opt/mattermost/logs:/mattermost/logs:rw
- /opt/mattermost/plugins:/mattermost/plugins:rw
- /opt/mattermost/client/plugins:/mattermost/client/plugins:rw
ports:
- "8065:8065" # Mattermost слушает на 8065, Nginx будет проксировать
depends_on:
- db
networks:
- mattermost-bridge
db:
container_name: mattermost-db
image: postgres:16-alpine # Актуальная версия PostgreSQL на 2026 год
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- /opt/mattermost/db:/var/lib/postgresql/data:rw
networks:
- mattermost-bridge
networks:
mattermost-bridge:
driver: bridge
Пояснения:
mattermost-team-edition:9.6: Это пример актуальной версии Mattermost на 2026 год. Всегда используйте последнюю стабильную версию.postgres:16-alpine: Последняя стабильная версия PostgreSQL.MM_SQLSETTINGS_DATASOURCE: Строка подключения к базе данных. Использует переменные из.env.MM_SERVICESETTINGS_SITEURL: Важный параметр, определяющий базовый URL вашего Mattermost-инстанса. Должен быть HTTPS.volumes: Монтирование локальных директорий сервера в контейнеры, чтобы данные (конфиги, файлы, БД) сохранялись после перезапуска контейнеров.networks: Создаем внутреннюю Docker-сеть для безопасного взаимодействия контейнеров между собой.- SMTP-настройки: Замените на данные вашего SMTP-провайдера для отправки уведомлений по почте.
- Push-уведомления: По умолчанию мы используем официальный шлюз Mattermost (
https://push.mattermost.com), что является самым простым способом. Для настройки собственного MPNS (Mattermost Push Notification Service) потребуется значительно больше усилий и отдельный сервер или контейнер.
3. Настройка Nginx
Создадим конфигурационный файл Nginx для Mattermost. Сначала удалим дефолтный конфиг:
sudo rm /etc/nginx/sites-enabled/default
Затем создадим новый файл конфигурации для вашего домена:
sudo nano /etc/nginx/sites-available/mattermost.conf
Пример содержимого /etc/nginx/sites-available/mattermost.conf:
server {
listen 80;
server_name chat.yourdomain.com; # Замените на ваш домен
location / {
return 301 https://$host$request_uri; # Перенаправляем весь HTTP-трафик на HTTPS
}
}
server {
listen 443 ssl http2;
server_name chat.yourdomain.com; # Замените на ваш домен
ssl_certificate /etc/letsencrypt/live/chat.yourdomain.com/fullchain.pem; # Путь к вашему SSL-сертификату
ssl_certificate_key /etc/letsencrypt/live/chat.yourdomain.com/privkey.pem; # Путь к приватному ключу
ssl_trusted_certificate /etc/letsencrypt/live/chat.yourdomain.com/chain.pem;
# SSL-настройки для безопасности
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
ssl_dhparam /etc/ssl/certs/dhparam.pem; # Сгенерируем его позже
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Добавляем заголовки безопасности
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "no-referrer-when-downgrade";
add_header Content-Security-Policy "frame-ancestors 'self'";
client_max_body_size 50M; # Увеличиваем лимит на размер загружаемых файлов
client_body_buffer_size 128k;
location ~ /api/v[0-9]+/(users/)?websocket$ {
proxy_pass http://localhost:8065; # Mattermost слушает на 8065
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffering off; # Отключаем буферизацию для WebSocket
}
location / {
proxy_pass http://localhost:8065; # Mattermost слушает на 8065
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k; # Увеличиваем буферы прокси
proxy_buffer_size 16k;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}
Создайте символическую ссылку на этот файл в sites-enabled:
sudo ln -s /etc/nginx/sites-available/mattermost.conf /etc/nginx/sites-enabled/mattermost.conf
Сгенерируйте файл dhparam.pem для усиления SSL-безопасности. Это может занять несколько минут:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 # Или 4096 для большей безопасности
Проверьте синтаксис Nginx и перезапустите его:
sudo nginx -t # Проверка синтаксиса
sudo systemctl restart nginx # Перезапуск Nginx
4. Получение SSL-сертификатов с Certbot
Теперь, когда Nginx настроен и слушает порт 80, можно получить сертификаты Let's Encrypt.
sudo certbot --nginx -d chat.yourdomain.com # Замените на ваш домен
Certbot задаст несколько вопросов (email, согласие с условиями, перенаправление HTTP на HTTPS). Выберите автоматическое перенаправление (опция 2, если предложат). Certbot автоматически обновит ваш Nginx-конфиг и установит сертификаты.
Проверьте, что автоматическое обновление работает:
sudo systemctl status certbot.timer # Проверка таймера systemd для Certbot
sudo certbot renew --dry-run # Тестовое обновление
5. Запуск Mattermost с Docker Compose
Перейдите в директорию с docker-compose.yml и запустите сервисы.
cd /opt/mattermost
docker compose up -d # Запуск контейнеров в фоновом режиме
Проверьте статус контейнеров:
docker compose ps
Вы должны увидеть, что контейнеры mattermost-app и mattermost-db находятся в статусе running.
6. Проверка работоспособности
Откройте в браузере ваш домен (например, https://chat.yourdomain.com). Вы должны увидеть страницу приветствия Mattermost и возможность создать учетную запись администратора.
Также можно проверить доступность с помощью curl на сервере:
curl -I https://chat.yourdomain.com # Проверка HTTPS-доступа
curl http://localhost:8065/api/v4/system/ping # Проверка прямого доступа к Mattermost API изнутри сервера
Если все настроено правильно, первый запрос покажет HTTP/200 OK, а второй — {"status":"OK"} или подобный ответ.
Бэкапы и обслуживание
Надежное резервное копирование — критически важный аспект любой производственной системы. Мы настроим автоматические бэкапы базы данных и файлов Mattermost в S3-совместимое хранилище.
1. Что бэкапить
Для Mattermost необходимо резервировать три основные группы данных:
- База данных PostgreSQL: Содержит всю информацию о пользователях, каналах, сообщениях, настройках и т.п. Это самая важная часть.
- Пользовательские файлы: Все файлы, загруженные пользователями (изображения, документы и т.д.), хранятся в директории
/opt/mattermost/data. - Конфигурационные файлы: Файл
config.json(в/opt/mattermost/config) иdocker-compose.yml,.env.
2. Установка AWS CLI и настройка S3
Мы будем использовать AWS CLI для взаимодействия с S3-совместимым хранилищем. Это может быть как Amazon S3, так и любой другой провайдер, поддерживающий S3 API (например, MinIO, DigitalOcean Spaces, Vultr Object Storage).
sudo apt install -y python3-pip # Устанавливаем pip, если его нет
pip install awscli # Устанавливаем AWS CLI
Настройте AWS CLI, указав учетные данные S3. Вам потребуются Access Key ID, Secret Access Key и region.
aws configure # Запустите и введите свои данные
# AWS Access Key ID [None]: YOUR_ACCESS_KEY_ID
# AWS Secret Access Key [None]: YOUR_SECRET_ACCESS_KEY
# Default region name [None]: YOUR_S3_REGION (например, us-east-1 или ru-central1)
# Default output format [None]: json
3. Скрипт автоматического бэкапа
Создадим скрипт, который будет выполнять дамп базы данных, архивировать файлы и загружать все это в S3.
nano /opt/mattermost/backup_mattermost.sh
Пример содержимого /opt/mattermost/backup_mattermost.sh:
#!/bin/bash
# Load environment variables
source /opt/mattermost/.env
# --- Configuration ---
BACKUP_DIR="/opt/mattermost/backups"
S3_BUCKET="s3://your-mattermost-backup-bucket" # Замените на имя вашего S3-бакета
DATE=$(date +%Y-%m-%d-%H%M%S)
DB_BACKUP_FILE="${BACKUP_DIR}/mattermost_db_${DATE}.sql"
FILES_BACKUP_FILE="${BACKUP_DIR}/mattermost_files_${DATE}.tar.gz"
CONFIG_BACKUP_FILE="${BACKUP_DIR}/mattermost_config_${DATE}.tar.gz"
LOG_FILE="/var/log/mattermost_backup.log"
# --- Create backup directory ---
mkdir -p "$BACKUP_DIR" >> "$LOG_FILE" 2>&1
echo "--- Starting Mattermost backup at ${DATE} ---" >> "$LOG_FILE"
# --- 1. Database Backup ---
echo "Dumping PostgreSQL database..." >> "$LOG_FILE"
docker compose exec -T db pg_dump -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" > "${DB_BACKUP_FILE}" >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
echo "Database dump successful: ${DB_BACKUP_FILE}" >> "$LOG_FILE"
else
echo "Database dump FAILED!" >> "$LOG_FILE"
fi
# --- 2. Files Backup ---
echo "Archiving Mattermost data files..." >> "$LOG_FILE"
tar -czf "${FILES_BACKUP_FILE}" -C /opt/mattermost data >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
echo "Files archive successful: ${FILES_BACKUP_FILE}" >> "$LOG_FILE"
else
echo "Files archive FAILED!" >> "$LOG_FILE"
fi
# --- 3. Configuration Files Backup ---
echo "Archiving Mattermost configuration files..." >> "$LOG_FILE"
tar -czf "${CONFIG_BACKUP_FILE}" -C /opt/mattermost config docker-compose.yml .env >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
echo "Config archive successful: ${CONFIG_BACKUP_FILE}" >> "$LOG_FILE"
else
echo "Config archive FAILED!" >> "$LOG_FILE"
fi
# --- Upload to S3 ---
echo "Uploading backups to S3 bucket: ${S3_BUCKET}..." >> "$LOG_FILE"
aws s3 cp "${DB_BACKUP_FILE}" "${S3_BUCKET}/db/" --region YOUR_S3_REGION >> "$LOG_FILE" 2>&1
aws s3 cp "${FILES_BACKUP_FILE}" "${S3_BUCKET}/files/" --region YOUR_S3_REGION >> "$LOG_FILE" 2>&1
aws s3 cp "${CONFIG_BACKUP_FILE}" "${S3_BUCKET}/config/" --region YOUR_S3_REGION >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
echo "S3 upload successful." >> "$LOG_FILE"
else
echo "S3 upload FAILED!" >> "$LOG_FILE"
fi
# --- Cleanup local backups (optional) ---
echo "Cleaning up local backup files older than 7 days..." >> "$LOG_FILE"
find "${BACKUP_DIR}" -type f -name "mattermost_.sql" -mtime +7 -delete >> "$LOG_FILE" 2>&1
find "${BACKUP_DIR}" -type f -name "mattermost_.tar.gz" -mtime +7 -delete >> "$LOG_FILE" 2>&1
echo "Cleanup complete." >> "$LOG_FILE"
echo "--- Mattermost backup finished at $(date +%Y-%m-%d-%H%M%S) ---" >> "$LOG_FILE"
echo "" >> "$LOG_FILE" # Add a newline for readability
Сделайте скрипт исполняемым:
chmod +x /opt/mattermost/backup_mattermost.sh
Протестируйте скрипт вручную:
/opt/mattermost/backup_mattermost.sh
Проверьте содержимое /var/log/mattermost_backup.log и ваш S3-бакет.
4. Настройка Cron для автоматического запуска
Добавим скрипт в планировщик Cron для ежедневного выполнения, например, в 3 часа ночи.
crontab -e
Добавьте следующую строку в конец файла:
0 3 * /opt/mattermost/backup_mattermost.sh >> /var/log/cron.log 2>&1
Эта строка означает: "Каждый день в 3:00 утра выполнить скрипт backup_mattermost.sh".
5. Обслуживание и обновления
- Обновление ОС: Регулярно запускайте
sudo apt update && sudo apt upgrade -yдля поддержания актуальности вашей операционной системы. - Обновление Docker и Docker Compose: Они обновляются вместе с ОС, если установлены из репозиториев.
- Обновление Mattermost: Для обновления контейнера Mattermost измените тег образа в
docker-compose.ymlна новую версию (например, с9.6на9.7), затем выполните:cd /opt/mattermost docker compose pull app # Загрузить новый образ docker compose up -d # Пересоздать контейнер с новым образомВсегда читайте официальную документацию Mattermost перед обновлением, так как могут быть изменения в базе данных, требующие миграции.
- Обновление Nginx: Обновляется вместе с ОС.
- Мониторинг: Следите за использованием ресурсов сервера (CPU, RAM, диск) с помощью
htopили более продвинутых систем мониторинга. - Журналы: Регулярно просматривайте логи Mattermost (
/opt/mattermost/logs/mattermost.log) и Docker-контейнеров (docker compose logs app) на предмет ошибок.
Troubleshooting + FAQ
Здесь собраны ответы на часто задаваемые вопросы и решения типичных проблем, которые могут возникнуть при установке и эксплуатации Mattermost.
Mattermost не запускается, ошибка подключения к базе данных. Что делать?
Что проверить: Убедитесь, что контейнер mattermost-db запущен и доступен. Проверьте логи контейнера базы данных на предмет ошибок. Также проверьте файл .env на корректность имени пользователя, пароля и имени базы данных. Убедитесь, что порты не заняты другими процессами. Возможно, Mattermost-контейнер запустился раньше, чем PostgreSQL полностью инициализировался.
Как фиксить:
cd /opt/mattermost
docker compose logs db # Просмотр логов БД
docker compose restart db app # Перезапустить сначала БД, потом приложение
Убедитесь, что MM_SQLSETTINGS_DATASOURCE в docker-compose.yml правильно ссылается на сервис db (postgres://user:pass@db:5432/dbname).
Какой VPS-конфиг минимально подойдёт?
Для небольшой команды до 50 активных пользователей минимально подойдет VPS с 2 vCPU, 4 GB RAM и 80 GB SSD. Это позволит запустить Docker, Mattermost и PostgreSQL, а также Nginx и обеспечить базовую производительность. Однако, для комфортной работы и запаса на рост, особенно при использовании плагинов, рекомендуется 4 vCPU, 8 GB RAM и 160 GB NVMe SSD.
Nginx выдает ошибку 502 Bad Gateway.
Что проверить: Ошибка 502 обычно означает, что Nginx не смог связаться с бэкенд-сервисом (в нашем случае, с контейнером Mattermost на порту 8065). Проверьте, запущен ли контейнер mattermost-app: docker compose ps. Убедитесь, что Mattermost слушает на порту 8065 внутри контейнера и что в docker-compose.yml правильно проброшен порт (8065:8065).
Как фиксить:
docker compose logs app # Просмотр логов Mattermost
sudo systemctl restart nginx # Перезапустить Nginx
Убедитесь, что в файле /etc/nginx/sites-available/mattermost.conf строка proxy_pass http://localhost:8065; указана верно.
Что выбрать — VPS или dedicated для этой задачи?
Для большинства команд до 500 пользователей и средних нагрузок VPS будет оптимальным и экономически выгодным решением. Выделенный сервер стоит выбирать, если у вас очень большая команда (более 500 активных пользователей), критически высокие требования к производительности без каких-либо задержек, специфические требования к аппаратной изоляции или если вы планируете запускать множество других ресурсоемких приложений на том же сервере.
Не приходят мобильные push-уведомления.
Что проверить: Убедитесь, что в config.json Mattermost (который можно отредактировать через веб-интерфейс в разделе "System Console" -> "Notifications" -> "Push Notifications") включен параметр "Enable Push Notifications" и "Push Notification Server" установлен на https://push.mattermost.com (или на адрес вашего собственного MPNS). Проверьте, что ваш сервер имеет исходящий доступ к этому URL. Также убедитесь, что в docker-compose.yml установлены переменные окружения для push-уведомлений, как указано в разделе "Конфигурация".
Как фиксить: Проверьте логи Mattermost на предмет ошибок, связанных с push-уведомлениями. Если используете собственный MPNS, убедитесь, что он правильно настроен и доступен. Удостоверьтесь, что на вашем сервере открыт исходящий трафик на 443 порт для push.mattermost.com. Если вы только что настроили, попробуйте перелогиниться в мобильном приложении.
SSL-сертификат не работает или истек.
Что проверить: Убедитесь, что Certbot правильно настроил автоматическое обновление. Проверьте статус таймера Certbot: sudo systemctl status certbot.timer. Убедитесь, что доменное имя chat.yourdomain.com (или ваше) верно указано в Nginx-конфиге и в команде Certbot. Проверьте логи Certbot на предмет ошибок при обновлении.
Как фиксить: Попробуйте вручную обновить сертификаты: sudo certbot renew --force-renewal. Если это не помогает, проверьте, что DNS-записи для вашего домена корректно указывают на IP вашего сервера. Убедитесь, что порт 80 открыт для Certbot во время процесса обновления.
Выводы и следующие шаги
Поздравляем! Вы успешно развернули полностью функциональный Mattermost-сервер на вашем VPS. Теперь у вас есть мощная, безопасная и полностью контролируемая платформа для командного общения, работающая на Docker, защищенная Nginx с SSL и поддерживающая мобильные push-уведомления, а также автоматическое резервное копирование в S3-совместимое хранилище. Это дает вам полный суверенитет над вашими данными и гибкость в настройке.
Дальнейшие шаги для оптимизации и расширения функционала:
- SMTP-настройки: Обязательно настройте отправку электронной почты (SMTP) в System Console Mattermost для регистрации пользователей, сброса паролей и уведомлений.
- Интеграции и плагины: Изучите богатую экосистему плагинов и интеграций Mattermost. Вы можете добавить поддержку голосовых/видеозвонков (Jitsi, Zoom), интеграции с системами контроля версий (GitHub, GitLab), системами CI/CD и многими другими сервисами.
- Мониторинг и логирование: Для производственных систем рекомендуется настроить более продвинутый мониторинг (Prometheus, Grafana) и централизованное логирование (ELK Stack или Graylog) для отслеживания производительности и быстрого реагирования на проблемы.
- Масштабирование: Если ваша команда значительно вырастет, рассмотрите возможность масштабирования Mattermost, разделив базу данных и файловое хранилище на отдельные серверы или используя кластерные решения для Mattermost.