bolt Valebyte VPS від $4/міс — NVMe, запуск за 60 секунд.

Отримати VPS arrow_forward
eco Початковий Туторіал

Self-hosted Mattermost на VPS:

calendar_month Jun 08, 2026 schedule 20 хв. читання visibility 168 переглядів
Self-hosted Mattermost на VPS: установка с Docker, Nginx, Push-уведомлениями и S3-бэкапами
info

Потрібен сервер для цього гайду? Ми пропонуємо виділені сервери та VPS у 50+ країнах з миттєвим налаштуванням.

Потрібен сервер для цього гайду?

Розгорніть VPS або виділений сервер за хвилини.

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-конфіг потрібен для цього завдання

Схема: Який 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 необхідно резервувати три основні групи даних:

  1. База даних PostgreSQL: Містить всю інформацію про користувачів, канали, повідомлення, налаштування тощо. Це найважливіша частина.
  2. Користувацькі файли: Усі файли, завантажені користувачами (зображення, документи тощо), зберігаються в директорії /opt/mattermost/data.
  3. Конфігураційні файли: Файл 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 "--- Запуск резервного копіювання Mattermost о ${DATE} ---" >> "$LOG_FILE"

# --- 1. Database Backup ---
echo "Дампування бази даних PostgreSQL..." >> "$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 "Дамп бази даних успішний: ${DB_BACKUP_FILE}" >> "$LOG_FILE"
else
    echo "Дамп бази даних НЕВДАЛИЙ!" >> "$LOG_FILE"
fi

# --- 2. Files Backup ---
echo "Архівування файлів даних Mattermost..." >> "$LOG_FILE"
tar -czf "${FILES_BACKUP_FILE}" -C /opt/mattermost data >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
    echo "Архівування файлів успішне: ${FILES_BACKUP_FILE}" >> "$LOG_FILE"
else
    echo "Архівування файлів НЕВДАЛЕ!" >> "$LOG_FILE"
fi

# --- 3. Configuration Files Backup ---
echo "Архівування конфігураційних файлів Mattermost..." >> "$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_BACKUP_FILE}" >> "$LOG_FILE"
else
    echo "Архівування конфігурації НЕВДАЛЕ!" >> "$LOG_FILE"
fi

# --- Upload to S3 ---
echo "Завантаження резервних копій до S3-бакета: ${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 успішне." >> "$LOG_FILE"
else
    echo "Завантаження до S3 НЕВДАЛЕ!" >> "$LOG_FILE"
fi

# --- Cleanup local backups (optional) ---
echo "Очищення локальних файлів резервних копій, старших за 7 днів..." >> "$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 "Очищення завершено." >> "$LOG_FILE"

echo "--- Резервне копіювання Mattermost завершено о $(date +%Y-%m-%d-%H%M%S) ---" >> "$LOG_FILE"
echo "" >> "$LOG_FILE" # Додати новий рядок для читабельності

Зробіть скрипт виконуваним:


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.

Поділитися цим записом:

self-hosted mattermost на vps: встановлення з docker, nginx, push-спо
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.