sumarsono.com
Take it with a grain of salt


Docker: Setup Self-hosted Mail Server

Posted on

Mail server ini ribet, konfigurasinya banyak, cakupannya luas, mulai dari MTA, MDA, etc, etc. Ribet pokoknya. Untuk meringkas semua itu, saya memutuskan untuk memakai docker karena beruntung sudah ada yang membuat docker imagenya.

Persiapan direktori dan konfigurasi

Siapkan direkori untuk mail server

mkdir -p /opt/dockermail/settings
mkdir -p /opt/dockermail/mail

Buatlah config.json untuk mail server

nano /opt/dockermail/settings/config.json

Contoh dari config.json, silakan sesuikan domain.tld dengan yg dimiliki.

{
  "settings": {
    "myhostname": "hostname.domain.tld"
  },
  "domains": {
    "domain.tld" :
      [
        {
          "email": "[email protected]",
          "password": "{PLAIN}tahiayam"
        },
        {
          "email": "[email protected]",
          "password": "{PLAIN}tahiayam",
          "aliases": ["[email protected]", "[email protected]", "[email protected]"]
        },
        {
          "email": "[email protected]",
          "password": "{PLAIN}tahiayam"
        },
        {
          "email": "[email protected]",
          "password": "{PLAIN}tahiayam"
        },
        {
          "email": "[email protected]",
          "password": "{PLAIN}tahiayam"
        },
        {
          "email": "[email protected]",
          "password": "{PLAIN}tahiayam"
        }
      ]
  }
}

Buatlah docker-compose.yml

nano /opt/dockermail/settings/docker-compose.yml

Berikut ini isi dari docker-compose.yml

core:
  image: adaline/dockermail-core
  ports:
    - "25:25"
    - "143:143"
    - "587:587"
  volumes:
    - /opt/dockermail/settings:/mail_settings
    - /opt/dockermail/mail:/vmail
  links:
   - opendkim
   - amavis
opendkim:
  image: adaline/dockermail-opendkim
  volumes:
    - /opt/dockermail/settings:/mail_settings
amavis:
  image: adaline/dockermail-amavis
  volumes:
    - /opt/dockermail/settings:/mail_settings

Persiapan DNS

Kita generate dkim dulu,

cd /opt/dockermail/settings
wget https://raw.githubusercontent.com/adaline/dockermail/master/opendkim/generate_key.sh
bash generate_key.sh domain.tld

Catat outputnya!, akan kita pakai ketika setting dns.

Kemudia login ke manajemen domain dan buat record berikut ini:

recordNameValue
Ahostname.domain.tldip vps
MXdomain.tldip vps
TXT_dmarcv=DMARC1; p=quarantine; rua=mailto:[email protected]; ruf=mailto:[email protected]; sp=none; ri=86400
TXTdefault._domainkeyhasil generate dkim (generate_key.sh)
TXTdomain.tldv=spf1 a mx ip4:100.162.14.8 ~all
{:.table-striped}

Keterangan tambahan:

Start instance docker

docker-compose -f /opt/dockermail/settings/docker-compose.yml up -d

didalam folder /opt/dockermail/settings/ akan muncul ssl cert dan key:

silakan direplace pakai sertifikat lets encrypt, saya buat dengan cara certbot --nginx kemudian memilih domain domain.tld

Untuk enkripsi password: docker ps, cari nama container email kita, selanjutnya:

docker exec -it nama-kontainer doveadm pw -s SHA512-CRYPT
Enter new password: password yg mau dipakai
Retype new password: konfirmasi password yg mau dipakai
{SHA512-CRYPT}random-string-hasil-enkripsi

Setelah password yang diperlukan dibuat, silakan update password masing-masing akun yang ada di config.json

nano /opt/dockermail/settings/config.json

Contohnya begini:

{
  "settings": {
    "myhostname": "vps.domain.tld"
  },
  "domains": {
    "domain.tld" :
      [
        {
          "email": "[email protected]",
          "password": "{SHA512-CRYPT}random-string-hasil-enkripsi"
        },
        {
          "email": "[email protected]",
          "password": "{SHA512-CRYPT}random-string-hasil-enkripsi",
          "aliases": ["[email protected]", "[email protected]", "[email protected]"]
        },
        {
          "email": "[email protected]",
          "password": "{SHA512-CRYPT}random-string-hasil-enkripsi"
        },
        {
          "email": "[email protected]",
          "password": "{SHA512-CRYPT}random-string-hasil-enkripsi"
        },
        {
          "email": "[email protected]",
          "password": "{SHA512-CRYPT}random-string-hasil-enkripsi"
        },
        {
          "email": "[email protected]",
          "password": "{SHA512-CRYPT}random-string-hasil-enkripsi"
        }
      ]
  }
}

Kemudian restart docker instance

docker-compose -f /opt/dockermail/settings/docker-compose.yml restart

Kemudian kita tes email server kita, saya memanfaatkan mail-tester nampak seperti gambar pembuka artikel ini. Dari sana apa yang kurang bisa kita sesuaikan.