Docker: Setup Self-hosted Mail Server

Docker: Setup Self-hosted Mail Server

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": "info@domain.tld",
          "password": "{PLAIN}tahiayam"
        },
        {
          "email": "admin@domain.tld",
          "password": "{PLAIN}tahiayam",
          "aliases": ["abuse@domain.tld", "webmaster@domain.tld", "postmaster@domain.tld"]
        },
        {
          "email": "support@domain.tld",
          "password": "{PLAIN}tahiayam"
        },
        {
          "email": "abuse@domain.tld",
          "password": "{PLAIN}tahiayam"
        },
        {
          "email": "webmaster@domain.tld",
          "password": "{PLAIN}tahiayam"
        },
        {
          "email": "postmaster@domain.tld",
          "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:

record Name Value
A hostname.domain.tld ip vps
MX domain.tld ip vps
TXT _dmarc v=DMARC1; p=quarantine; rua=mailto:postmaster@domain.tld; ruf=mailto:postmaster@domain.tld; sp=none; ri=86400
TXT default._domainkey hasil generate dkim (generate_key.sh)
TXT domain.tld v=spf1 a mx ip4:100.162.14.8 ~all

Keterangan tambahan:

  • SPF saya dapat dari mail-tester.com
  • DMARC saya dapat dari hasil mengikuti wizard di dmarc guide
  • DKIM saya dapat dari generate-key.sh

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:

  • ssl-cert-snakeoil.key
  • ssl-cert-snakeoil.pem

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": "info@domain.tld",
          "password": "{SHA512-CRYPT}random-string-hasil-enkripsi"
        },
        {
          "email": "admin@domain.tld",
          "password": "{SHA512-CRYPT}random-string-hasil-enkripsi",
          "aliases": ["abuse@domain.tld", "webmaster@domain.tld", "postmaster@domain.tld"]
        },
        {
          "email": "support@domain.tld",
          "password": "{SHA512-CRYPT}random-string-hasil-enkripsi"
        },
        {
          "email": "abuse@domain.tld",
          "password": "{SHA512-CRYPT}random-string-hasil-enkripsi"
        },
        {
          "email": "webmaster@domain.tld",
          "password": "{SHA512-CRYPT}random-string-hasil-enkripsi"
        },
        {
          "email": "postmaster@domain.tld",
          "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.