Memasang Mattermost di AWS

Rencana Desain

Bagi yang belum mengenal mattermost, bisa membaca postingan saya sebelumnya.

1 Mesin EC2 free tier (1Core1GB) AWS
OS Ubuntu 16.04
IP Publik Static (Elastic IP)

Stack:

  • Nginx (as proxy)
  • Mattermost-server
  • Postgresql
  • SSL letsencrypt

Security Group outbond:

  • 443, 80 (open)
  • Ping (open)
  • 8065 (port mattermost sementara)

Instalasi saya pecah menjadi beberapa bagian

Persiapan Mesin

  1. Buat mesin, sesuai spesifikasi diatas
  2. Login ssh dan mulai masang-masang

Install dan konfigurasi Postgresql

$ sudo apt-get install postgresql postgresql-contrib

Login, kemudian buat database dan usernya serta memberikan hak akses.

$ sudo --login --user postgres
$ psql
postgres=# CREATE DATABASE mattermost;
postgres=# CREATE USER mmuser WITH PASSWORD 'mmuser_password';
postgres=# GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;
postgres=# \q
exit

Atur agar postgresql bisa diakses via localhost di mesin yg sama.

$ sudo vim /etc/postgresql/9.5/main/postgresql.conf

Cari baris
#listen_addresses = 'localhost'

Ganti menjadi
listen_addresses = '*'

$ sudo vim /etc/postgresql/9.5/main/pg_hba.conf

Cari baris
local all all peer

Ganti menjadi
local all all trust

Restart

$ sudo systemctl restart postgresql

Periksa jika mmuser sudah besa mengakses db:

psql --dbname=mattermost --username=mmuser --password

Installasi Mattermost Server

1. SSH ke mesin dan unduh paket mattermost terbaru

wget https://releases.mattermost.com/4.9.1/mattermost-4.9.1-linux-amd64.tar.gz

2. Ekstrak file hasil unduhan dan pindahkan ke folder /opt

tar -xvzf mattermost*.gz
sudo mv mattermost /opt/.

3. Buat Mattermost user dan group, kemudian ubah hak akses folder mattermost

sudo useradd --system --user-group mattermost
sudo chown -R mattermost:mattermost /opt/mattermost
sudo chmod -R g+w /opt/mattermost

4. Konfigurasi config/config.json. Sebelum melakukan konfigurasi, silahkan salin file config/config.json ke lokasi lain yang dirasa aman.
Database

Set "DriverName" to "postgres"
Set "DataSource" to "postgres://mmuser:mmuser-password@localhost:5432/mattermost?sslmode=disable&connect_timeout=10".

5. Tes konfigurasi awal tadi;

cd /opt/mattermost
sudo -u mattermost ./bin/platform

Jika konfigurasi tidak ada yg salah, di log akan terdapat baris Server is listening on :8065. Tekan CTRL+C untuk keluar dari mode testing.

6. Buat konfiguasi daemon systemd

sudo vim /lib/systemd/system/mattermost.service

Isi dengan baris berikut:

[Unit]
Description=Mattermost
After=network.target
After=postgresql.service
Requires=postgresql.service

[Service]
Type=notify
ExecStart=/opt/mattermost/bin/platform
TimeoutStartSec=3600
Restart=always
RestartSec=10
WorkingDirectory=/opt/mattermost
User=mattermost
Group=mattermost
LimitNOFILE=49152

[Install]
WantedBy=postgresql.service

7. Cek konfigurasi systemd

sudo systemctl daemon-reload
sudo systemctl start mattermost.service
sudo systemctl status mattermost.service
curl http://localhost:8065
sudo systemctl enable mattermost.service

Sekarang server mattermost sudah jalan.

Konfigurasi Mattermost Server

Panduan komplitnya saya mengacu dari URL ini.

Buat System Admin User dan atur konfigurasi umum Mattermost

  1. Buka browser dan navigasi ke alamat ip Mattermost. Conttoh IP Mattermost server adalah 10.10.10.2. Maka ketik alamat http://10.10.10.2:8065.
  2. Buat tim pertama kali dan user. User pertama yang dibuat memiliki aksese system_admin yang memiliki hak untuk mengakses System Console.
  3. Buka System Console. Untuk membuka System Console, klik username pada bagian atas navigasi, dan pada menu yang terbuka, pilih System Console
  4. Atus Site URL:
    Pada Bagian GENERAL, pilih Configuration. Isian yang saya atur adalah:
    Site URL: https://mattermost.domain.id | saya langsung mengatur url FQDN dan HTTPS disini, namun untuk SSL, saya atur manual dari nginx.
    Listen Address: :8065
    Pengaturan SSL: false
  5. Atur surel notifkasi. Saya menggunakan Google Apps.
    a. Pada bagian NOTIFICATIONS, Klik Email dan lakukan pengaturan:
    Set Enable Email Notifications: true
    Set Notification Display Name: Mattermost Notification
    Set Notification From Address: estu@domain.id
    Set SMTP Server Username: estu@domain.id
    Set SMTP Server Password: {SMTP-password}
    Set SMTP Server: smtp.gmail.com
    Set SMTP Server: 587
    Set Connection Security: STARTTLS
    b. Lakukan percobaaan koneksi. Setelah koneksi berjalan lancar, klik Save.
  6. Pengaturan lokasi penyimpanan file dan gambar.
    a. Langkah pertama adalah membuat IAM dari AWS Console khusus untuk mattermost dengan policy “AmazonS3FullAccess” dan tanpa login. Simpan Access key ID dan Secret key ID.
    b. Kemudian pada bagian FILES, klik Storage. Atur isian berikut!
    File Storage System: Amazon S3
    Amazon S3 Access Key ID: Axxxxxxxxxxxxxx
    Amazon S3 Secret Access Key: 7xxxxxxxxxxxxxxx
    Amazon S3 Bucket: prod-domain-mattermost
    Amazon S3 Region: ap-southeast-1
    c. Setelah selesai, klik Save.
  7. Pengaturan Domain di Domain Register. Set subdomain mattermost.domain.id ke A: IP Publik mesin AWS tadi.
  8. Pengaturan NGINX sebagai proxy dan generate SSL
    a. Install nginx, certbot dan genetare SSL

    sudo apt install nginx
    sudo systemctl stop nginx
    sudo apt-get install software-properties-common
    sudo add-apt-repository ppa:certbot/certbot
    sudo apt update
    sudo apt install certbot
    sudo certbot certonly --standalone -d mattermost.domain.id
    sudo mkdir /etc/nginx/ssl/
    sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
    

    b. Atur NGINX sebagai berikut:

    upstream backend {
       server localhost:8065;
    }
    
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mattermost_cache:10m max_size=3g inactive=120m use_temp_path=off;
    
    server {
      listen 80;
      server_name mattermost.domain.id;
      return 301 https://$host$request_uri;
    }
    
    server {
       listen 443;
       server_name mattermost.domain.id;
       ssl on;
     
       ssl_certificate /etc/letsencrypt/live/mattermost.domain.id/fullchain.pem;
       ssl_certificate_key /etc/letsencrypt/live/mattermost.domain.id/privkey.pem;
            
       ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
       ssl_ciphers         "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
       ssl_prefer_server_ciphers on;
       ssl_session_cache   shared:SSL:20m;
       ssl_session_timeout 60m;
     
       ssl_dhparam /etc/nginx/ssl/dhparam.pem;
     
       ssl_stapling on;
       ssl_stapling_verify on;
       ssl_trusted_certificate /etc/letsencrypt/live/mattermost.domain.id/chain.pem;
       resolver 8.8.8.8;
     
       add_header Strict-Transport-Security "max-age=31536000; includeSubdomains" always;
    
       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_buffers 256 16k;
           proxy_buffer_size 16k;
           proxy_read_timeout 600s;
           proxy_pass http://backend;
       }
    
       location / {
           client_max_body_size 50M;
           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_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_pass http://backend;
       }
    }
    

    c. Tes konfigurasi dan Restart NGINX

    sudo ln -s /etc/nginx/sites-available/mattermost.domain.id /etc/nginx/sites-enabled/mattermost.domain.id
    sudo nginx -t
    sudo systemctl restart nginx
    
  9. Restart Mattermost
    sudo systemctl restart mattermost
  10. Tutup port 8065 dari security grup EC2 di AWS
  11. Pengaturan-Pengaturan lain yang dibutuhkan

Mengundang Member Ke Mattermost

Buka domain mattermost tadi, klik username pada bagian atas navigasi, dan pada menu yang terbuka, pilih Get Team Invitation Link. Akan keluar jendela baru. Salin URL yg keluar dan bagikan ke team.

Dah gitu aja.

Selamat Mencoba, semoga panduannya runut.

Advertisements

2 thoughts on “Memasang Mattermost di AWS

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.