Pernah nggak sih kalian kepikiran buat punya platform chat internal yang nggak bergantung sama layanan cloud publik kayak Slack, Microsoft Teams dan lain lain? Apalagi kalau kita butuh kontrol penuh atas data dan pengin bebas ngoprek fitur-fitur sesuai kebutuhan tim.
Mattermost ini ibaratnya Slack versi open-source yang bisa kamu install di server sendiri. Fiturnya lengkap, bisa diintegrasiin sama banyak tools developer (kayak Jira, GitHub, Jenkins), dan yang paling penting, komunitasnya aktif!
Nah, di artikel ini kita bakal ngobrolin gimana cara self hosting Mattermost—platform chat team open-source favorit banyak engineer.
Table of Contents
Prerequisites
Sebelum kita mulai, ada beberapa hal yang perlu disiapin dulu nih:
- Akun Alibaba Cloud yang aktif
- VPS (ECS) minimal 2 vCPU, RAM 4 GB, OS Ubuntu 22.04 dengan storage minimal 50 GB
- Akses SSH ke server
- Docker & Docker Compose udah terinstall
- Domain/subdomain untuk Mattermost (contoh: chat.dika.dev)
- SSL “Let’s encrypt” Sertifikat agar mattermost dapat diakses menggunakan protokol HTTPS
Apa Itu Self-Hosting Platform Komunikasi dan Kenapa Mattermost?
Sebelum kita loncat ke teknis Deploy Mattermost dengan Docker, penting banget nih buat kita sepaham dulu soal konsep dasarnya. Kenapa sih self-hosting itu menarik, dan kenapa dari sekian banyak pilihan, Mattermost yang jadi pilihan?
Apa Sih Platform Komunikasi Self-Host Itu?
Gampangnya gini, self-hosting communication platform itu artinya kamu punya dan ngelola sendiri aplikasi buat ngobrol dan kolaborasi tim (kayak chat, file sharing, video call mungkin) di server punya kamu sendiri, bukan numpang di server penyedia layanan. Jadi, ibaratnya kamu bangun rumah sendiri, bukan sewa apartemen.
Keuntungannya apa aja?
- Kontrol Penuh atas Data (Data Sovereignty): Ini yang paling utama. Semua percakapan, file, informasi sensitif perusahaan, semuanya ada di tanganmu. Kamu yang nentuin kebijakan keamanannya, kamu yang ngatur siapa aja yang boleh akses. Gak ada lagi cerita data “disandera” atau tiba-tiba syarat dan ketentuan layanan berubah seenaknya.
- Kustomisasi Tanpa Batas: Karena servernya punya sendiri, aplikasinya juga bisa kamu utak-atik sesuai kebutuhan. Mau nambah fitur? Ubah tampilan? Integrasi sama sistem internal lain?.
- Potensi Hemat Biaya Jangka Panjang: Awalnya mungkin kerasa ada investasi buat server dan waktu buat setup. Tapi buat tim yang besar atau penggunaan jangka panjang, self-hosting bisa jadi lebih murah daripada bayar langganan bulanan per pengguna ke penyedia SaaS.
- Fleksibilitas Integrasi: Platform self-host biasanya lebih gampang diintegrasikan dengan tools atau sistem lain yang udah ada di perusahaanmu. Bayangin integrasi Mattermost dengan tools developer kayak Jira atau GitLab dll.
- Tidak Tergantung Pihak Ketiga: Bisnis kamu gak akan terganggu kalau tiba-tiba penyedia layanan SaaS favoritmu bangkrut, diakuisisi, atau ganti model bisnis. Kamu yang pegang kendali penuh.
Tentu ada tantangannya juga, kayak butuh pengetahuan teknis buat setup dan maintenance, serta tanggung jawab penuh soal keamanan dan uptime. Tapi, buat kita para DevOps, atau SysAdmin, tantangan kayak gini justru lebih seru!
Kenapa Mattermost Jadi Pilihan? Slack Kan Udah Oke?
Nah, ini pertanyaan bagus: “Mattermost vs Slack, mana yang lebih oke?” Slack emang populer banget, UI-nya cakep, fiturnya banyak. Tapi, Slack itu proprietary dan modelnya SaaS. Buat yang pengen self-host, Slack jelas bukan pilihan. Di sinilah Mattermost jadi pilihan.
Alasan Kenapa Mattermost Layak Dipertimbangkan:
- Open Source: Lisensi MIT-nya Mattermost ngasih kamu kebebasan buat pake, modifikasi, dan distribusi. Ini artinya gak ada biaya lisensi tersembunyi dan kamu bisa “ngintip” kode sumbernya kalau penasaran.
- Dirancang untuk Self-Hosting: Mattermost dari awal emang didesain buat di-install di server sendiri. Jadi, dokumentasi dan dukungannya buat skenario self-host itu cukup lengkap.
- Fokus pada Keamanan dan Privasi: Karena kamu yang pegang data, Mattermost nyediain banyak fitur keamanan, mulai dari enkripsi at-rest dan in-transit, otentikasi multi-faktor (MFA), sampai integrasi dengan direktori perusahaan (LDAP/AD).
- Skalabilitas: Mattermost bisa di-deploy dalam berbagai konfigurasi, mulai dari server tunggal buat tim kecil, sampai arsitektur high-availability buat ribuan pengguna. Cocok buat kolaborasi tim internal perusahaan skala apapun.
- Kaya Fitur dan Integrasi: Jangan salah, meskipun open-source, fitur Mattermost gak kalah sama kompetitor. Ada channels publik dan privat, direct messages, threads, file sharing, pencarian canggih, notifikasi, emojis, dan yang paling penting, integrasi Mattermost dengan tools developer seperti GitHub, GitLab, Jenkins, Jira, dan masih banyak lagi lewat webhooks dan API. Ada juga plugin marketplace yang terus berkembang.
- Migrasi Mudah dari Slack: Kalau tim kamu udah terlanjur pakai Slack dan mau pindah ke Mattermost, ada tools buat impor data dari Slack. Jadi, transisinya bisa lebih mulus.
- White-Labeling: Kamu bisa kustomisasi tampilan Mattermost biar sesuai sama brand perusahaanmu. Ganti logo, warna, bahkan teks tertentu. Ini penting buat branding internal.
Jadi, kalau kamu cari platform komunikasi tim yang aman, fleksibel, bisa di-custom, dan yang paling penting, bisa kamu kontrol sepenuhnya dengan self-hosting, Mattermost adalah jawaban yang sangat tepat.
Deploy Mattermost menggunakan Docker
Nah, ini dia bagian yang paling ditunggu-tunggu! Kita bakal praktek langsung deploy Mattermost pakai Docker di server. Tinggal ikutin langkah-langkahnya aja, simple, cepat dan bisa buat skala production.
1. Bikin ECS Instance di Alibaba Cloud
Langkah pertama adalah nyiapin server buat Mattermost kita, yaitu sebuah server virtual atau Elastic Compute Service (ECS) Instance di Alibaba Cloud.
- Login ke Konsol Alibaba Cloud: Buka browser, akses konsol Alibaba Cloud, dan login pake akun kamu.
- Pilih Region Data Center: Penting nih! Pilih region yang paling deket sama mayoritas pengguna kamu. Kalau targetnya Indonesia, pilih region Indonesia (Jakarta). Ini biar latency-nya kecil.
- Buat ECS Instance Baru:
- Dari dashboard, cari layanan “Elastic Compute Service” (ECS), lalu klik “Instances”.
- Klik tombol “Create Instance”.
- Billing Method: Pilih antara “Subscription” (bayar di depan buat periode tertentu, biasanya lebih murah buat jangka panjang) atau “Pay-As-You-Go” (bayar sesuai pemakaian, dan fleksibel).
- Region and Zone: Pastikan region-nya udah bener (misal, Indonesia (Jakarta)). Zone bisa dipilih salah satu yang tersedia, biasanya gak terlalu signifikan bedanya buat satu server.
- Instance Type: Ini krusial! Pilih tipe instans yang sesuai. Mattermost merekomendasikan minimal:
- Untuk 1-1000 pengguna: 2 vCPU, 4 GB RAM.
- Untuk 1000-2000 pengguna: 4 vCPU, 8 GB RAM.
- Image (Sistem Operasi): Pilih “Public Image”. Untuk OS-nya, kita rekomendasikan Ubuntu Server versi LTS terbaru (misalnya Ubuntu 22.04 LTS).
- Storage:
- System Disk: Biasanya SSD (ESSD) udah cukup bagus. Ukuran default (misal 50GB) biasanya cukup buat OS dan Docker.
- Data Disk (Opsional tapi Direkomendasikan): Untuk data Mattermost (database, file uploads), sangat disarankan pakai Data Disk terpisah. Ini memudahkan kalau mau resize, snapshot, atau ganti server. Pilih ukuran sesuai perkiraan kebutuhan (misal 50GB atau 100GB ESSD).
- Duration & Quantity: Kalau pilih Subscription, tentuin durasinya. Quantity pastinya 1.
- Networking:
- Network: Pilih VPC (Virtual Private Cloud) yang udah ada, atau buat baru kalau belum punya. VPC ini kayak jaringan pribadi virtualmu di cloud.
- VSwitch: Pilih VSwitch yang ada di dalam VPC tersebut.
- Security Group: Ini penting banget buat firewall! Buat Security Group baru atau pilih yang sudah ada. Pastikan kamu membuka port-port berikut:
- SSH (Port 22): Buat ngakses server via terminal. Wajib!
- HTTP (Port 80): Buat akses Mattermost via web (sebelum pakai SSL).
- HTTPS (Port 443): Buat akses Mattermost via web dengan aman (setelah SSL di-setting).
- Mattermost juga secara default berjalan di port
8065
. Kita bisa ekspos ini langsung atau, lebih baik, pakai reverse proxy (Nginx) di port 80/443. Untuk awal, buka 22, 80, 443. Nanti port8065
hanya perlu diakses dari dalam server (localhost) atau dari reverse proxy.
- Public IP Address: Centang “Assign public IPv4 address” biar server bisa diakses dari internet.
- Logon Credentials:
- Authentication Method: Pilih “Password” atau “Key Pair”. “Key Pair” (SSH Key) jauh lebih aman daripada password. Kalau belum punya, buat Key Pair baru, download private key (.pem file)-nya, dan simpen baik-baik. Kalau pilih password, bikin password yang kuat.
- Advanced (Opsional): Kamu bisa kasih nama buat instance-nya (Instance Name, Host Name) biar gampang diinget.
- Review dan Create: Cek lagi semua konfigurasi. Kalau udah yakin, klik “Create Instance”. Tunggu beberapa menit sampai servernya selesai dibuat dan statusnya “Running”.
Setelah server ECS kamu jadi dan berjalan, catat Public IP Address-nya. Ini yang bakal kita pakai buat SSH ke server. Jika kamu memilih Key Pair, pastikan file .pem
kamu aman dan memiliki permission yang benar (chmod 400 namafile.pem
).
2. Setting Domain dan DNS
Untuk kemudahan akses, kita perlu menyiapkan domain/subdomain untuk Mattermost. Berikut langkah-langkahnya:
- Beli Domain di Namecheap atau penyedia domain lainnya, jika sudah ada domain, kamu bisa menggunakan subdomain untuk mattermost.
- Arahkan A record dari domain/subdomain (misal chat.dika.dev) ke IP publik instance ECS yang sudah dibuat sebelumnya.
Contoh konfigurasi DNS yang diperlukan:
Type: A
Host: chat
Value: [IP Publik ECS] misalnya 192.168.100.202
TTL: 600
Setelah mengkonfigurasi DNS, tunggu beberapa saat hingga perubahan DNS terpropagasi secara global (biasanya 5-15 menit).
3. Instal Docker dan Docker Compose
Sebelumnya saya sudah pernah membahas panduan instalasi docker di berbagai distribusi linux, tutorial tersebut dapat kamu baca di link Install Docker di Berbagai distro Linux, pastikan kamu install terlebih dahulu docker dan docker compose sebelum mengikuti panduan selanjutnya.
4. Konfigurasi Mattermost dengan docker compose
Langkah berikutnya adalah menyiapkan file docker-compose dan juga credentials untuk mattermost.
4.1 Clone Repositori Mattermost
Clone repository mattermost dengan tools git, lalu masuk ke folder mattermost dengan perintah berikut:
git clone https://github.com/mattermost/docker
cd docker
4.2 Konfigurasi .env file
Edit file .env
sesuai kebutuhan. Misal password database, path volume, dan sebagainya.
mv env.example .env
Sesuaikan konfigurasi .env seperti konten dibawah ini, dan untuk lainya dapat di abaikan mengikuti default:
DOMAIN=chat.dika.dev
TZ=Asia/Jakarta
POSTGRES_USER=mattermost_user
POSTGRES_PASSWORD=M4tt3rm0sT_S3Cu12EP@ssW0rD
POSTGRES_DB=mattermost
RESTART_POLICY=always
- DOMAIN = isi dengan domain/subdomain anda misalnya: chat.dika.dev
- TZ = Zona waktu jakarta indonesia, dan isi dengan Asia/Jakarta
- POSTGRES_USER = username database postgresql
- POSTGRES_PASSWORD = kata sandi database postgresql
- POSTGRES_DB = nama database postgresql
- RESTART_POLICY = pengaturan policy restart service
Simpan konfigurasi yang sudah anda buat sebelumnya.
4.3 Buat direktori mattermost dan permission folder
Buat Direktori untuk Volumes mattermost secara manual dan pastikan permission-nya benar, terutama untuk data yang akan ditulis oleh proses di dalam kontainer (yang mungkin berjalan dengan user non-root).
mkdir -p ./volumes/app/mattermost/{config,data,logs,plugins,client/plugins,bleve-indexes}
Untuk beberapa direktori yang akan ditulis oleh Mattermost (yang berjalan sebagai user mattermost
UID/GID 2000
di dalam kontainer), kita perlu atur kepemilikannya di host agar bisa ditulis.
sudo chown -R 2000:2000 ./volumes/app/mattermost
Jika direktori ./volumes/db/data
untuk PostgreSQL membutuhkan permission khusus, biasanya Docker menanganinya saat inisialisasi. Namun, jika ada masalah permission, kamu mungkin perlu menyesuaikannya juga.
4.4 Menjalankan mattermost docker
Pastikan kamu masih berada di dalam direktori ~/mattermost
(tempat file docker-compose.yml
berada).
Langkah selanjutnya adalah menjalankan mattermost dengan tools docker compose tanpa nginx bawaan mattermost, karena konfigurasi nginx akan dilakukan terpisah. Lalu, jalankan perintah:
docker compose -f docker-compose.yml -f docker-compose.without-nginx.yml up -d
cek Status Kontainer: Setelah perintah di atas selesai, kamu bisa cek apakah kontainer-kontainernya berjalan dengan baik:
sudo docker ps
Kamu seharusnya melihat dua kontainer (misalnya docker-mattermost-1
dan docker-postgres-1
) dengan status Up
atau healthy
.
Lihat Log (Jika Ada Masalah): Kalau ada masalah atau mau lihat proses startup, kamu bisa lihat log dari masing-masing kontainer:
sudo docker compose logs -f
Ini akan menampilkan log gabungan dari semua layanan. Untuk log spesifik:
sudo docker logs -f docker-mattermost-1 # Log Mattermost
sudo docker logs -f docker-postgres-1 # Log PostgreSQL
Tekan Ctrl+C
untuk berhenti melihat log.
5. Setup Nginx Reverse Proxy + SSL Let’s Encrypt
Kita akan pakai Nginx sebagai reverse proxy. Nginx bakal nerima koneksi dari luar di port 80 (HTTP) dan 443 (HTTPS), terus nerusin ke Mattermost yang jalan di port 8065.
5.1 Instal Nginx dan Certbot
Jalankan perintah berikut untuk instalasi nginx, certbot dan plugin certbot nginx:
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
5.2 Aktifkan nginx dan Jalankan pada saat boot
Aktfikan service nginx dan jalankan pada saat boot server.
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
5.3 Konfigurasi domain Nginx Mattermost
Buat konfigurasi file dengan nama mattermost.conf pada folder yang berlokasi /etc/nginx/conf.d/mattermost.conf, lalu isi konten seperti dibawah ini, dan jangan lupa ganti server_name menjadi domain kamu.
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mattermost_cache:10m max_size=3g inactive=120m use_temp_path=off;
upstream backend {
server localhost:8065;
keepalive 64;
}
server {
server_name chat.dika.dev;
listen 80;
listen [::]:80;
access_log /var/log/nginx/mattermost.access.log;
error_log /var/log/nginx/mattermost.error.log warn;
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
application/atom+xml
application/javascript
application/json
application/ld+json
application/manifest+json
application/rss+xml
application/vnd.geo+json
application/vnd.ms-fontobject
application/x-font-ttf
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/opentype
image/bmp
image/svg+xml
image/x-icon
text/cache-manifest
text/css
text/plain
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy;
# Static file caching
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc|css|js)$ {
proxy_pass http://localhost:8065;
proxy_cache_valid 200 7d;
proxy_cache_valid 404 5m;
expires 7d;
add_header Cache-Control "public";
}
server_tokens off;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy no-referrer;
add_header Strict-Transport-Security "max-age=63072000" always;
add_header Permissions-Policy "interest-cohort=()";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self' wss://$host;";
add_header X-Robots-Tag "noindex";
location ~ /api/v[0-9]+/(users/)?websocket$ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 50M;
proxy_set_header Host $http_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_set_header Early-Data $ssl_early_data;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
client_body_timeout 60;
send_timeout 300;
lingering_timeout 5;
proxy_connect_timeout 90;
proxy_send_timeout 300;
proxy_read_timeout 90s;
proxy_http_version 1.1;
proxy_pass http://backend;
}
location / {
client_max_body_size 100M;
proxy_set_header Connection "";
proxy_set_header Host $http_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_set_header Early-Data $ssl_early_data;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
proxy_read_timeout 600s;
proxy_cache mattermost_cache;
proxy_cache_revalidate on;
proxy_cache_min_uses 2;
proxy_cache_use_stale timeout;
proxy_cache_lock on;
proxy_http_version 1.1;
proxy_pass http://backend;
}
}
Lalu hapus bawaan default file yang tidak digunakan pada folder /etc/nginx/sites-enabled dan juga /etc/nginx/sites-available dengan cara berikut:
sudo rm -r /etc/nginx/sites-enabled/*
sudo rm -r /etc/nginx/sites-available/*
Test nginx dengan menjalankan perintah berikut, untuk memastikan konfigurasi tidak ada yang error:
sudo nginx -t
Output result:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Restart konfigurasi nginx sebelum melakukan generate SSL Lets’Encrypt
sudo nginx -s reload
5.4 Firewall Config (UFW) Optional
Jika default kamu menggunakan firewall ufw maka kamu perlu enable http dan https protokol dengan perintah berikut:
sudo ufw allow http
sudo ufw allow https
atau jika ingin menonaktifkan firewall ufw, kamu bisa menjalankan perintah dibawah:
sudo systemctl stop ufw
sudo systemctl disable ufs
5.5 Generate SSL Let’e Encrypt
Jalankan perintah berikut untuk generate SSL certificate, agar platform mattermost diakses menggunakan protokol HTTPS:
sudo certbot --nginx --non-interactive --agree-tos -m [email protected] -d chat.dika.dev
Ganti email menggunakan email kamu
misalnya: [email protected]
serta domain/subdomain kamu.misalnya: chat.dika.dev
Output result:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for chat.dika.dev
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/chat.dika.dev/fullchain.pem
Key is saved at: /etc/letsencrypt/live/chat.dika.dev/privkey.pem
This certificate expires on 2025-08-11.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for chat.dika.dev to /etc/nginx/conf.d/chat.dika.dev.conf
Congratulations! You have successfully enabled HTTPS on https://chat.dika.dev
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5.5 Tes Akses via Domain dengan HTTPS:
Buka browser dan akses misalnya: https://chat.dika.dev
(ganti dengan domain/subdomain mu).
Setelah berhasil dibuka, klik View in Browser, kemudian ikuti dan isi form sebagai akun administrator:
Jika sudah diisi klik tombol Create Account, dan halaman akan berpindah ke chat dashboard mattermost seperti tampilan berikut:
6. Optimasi Mattermost untuk Production
Kustomisasi Mattermost:
- Undang temanmu ke mattermost
- Buat workspace untuk memisahkan tim
- Ganti Logo mattermost dengan logo perusahaanmu dan juga
- Site tittle dengan nama perusahaanmu
Integrasi Third party:
- Integrasi dengan SMTP Email
- Integrasi dengan Alibaba Cloud Object Storage (OSS)
- Disable registration user
- Integrasi dengan DevOps Tools seperti gitlab/github dan lainya.
- Plugin mattermost dapat kamu temukan di link berikut: https://mattermost.com/marketplace/
Keamanan & Autentikasi
- Aktifin 2FA
- Kalo enterprise, integrasi ke LDAP atau SAML
- Bikin batasan akses pakai IP atau firewall
Backup dan Restore
Penting banget buat nyiapin backup harian. Bisa pake cron, bash script, atau tool lain. Yang penting, jangan sampe data chat hilang gara-gara lupa backup.
Monitoring & Logging
Biar gampang debug atau mantau performa, integrasiin ke Grafana, Prometheus, atau ELK Stack.
Kesimpulan
Self-hosting platform komunikasi tim seperti Mattermost memberimu kendali penuh atas data komunikasi perusahaan sambil tetap menikmati keunggulan cloud infrastructure. Dengan menggunakan Docker, deployment menjadi lebih mudah, portable, dan skalabel.
Langkah Selanjutnya?
- Kontribusi Balik (Kalau Bisa): Mattermost itu open source. Kalau kamu nemu bug atau punya ide fitur, jangan ragu buat kontribusi ke komunitas.
- Ajak Tim Kamu Pakai: Sosialisasikan ke tim, kasih panduan singkat, dan dorong penggunaannya.
- Terus Belajar dan Eksplorasi: Mattermost itu fiturnya banyak. Komunitasnya juga aktif. Jangan berhenti belajar. Mungkin kamu nemu plugin keren atau trik optimasi baru.
Referensi: