Forum Neocloud

Full Version: Membuat Server Email Domain Sendiri Pada VPS Ubuntu
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Cara Mudah & Cepat Membuat server email dengan domain sendiri di VPS (ubuntu/debian/linux) Tutorial ini menggunakan Ubuntu VPS.

Pertama Set hostname VPS. 
Code:
sudo hostnamectl set-hostname mail.domainmu.xyz
echo "127.0.0.1 mail.domainmu.xyz localhost" | sudo tee -a /etc/hosts
sudo apt update && sudo apt upgrade -y

Jangan lupa juga pointing domain via cloudflare/dns andalanmu

mail.domainmu.xyz ke ip vps mu.

Lalu install App yand dibutuhkan
Code:
sudo apt install -y postfix dovecot-core dovecot-imapd dovecot-pop3d \
dovecot-lmtpd dovecot-sqlite sqlite3 certbot python3-certbot-apache \
opendkim opendkim-tools mailutils

Ketika Muncul Pop Up pengaturan Postfix, Pilih
  • Internet Site
  • mail.domainmu.xyz

=====================
Lanjut Tahap Selanjutnya
====================

Berhubung Spec VPS hanya ram 512Mb, disini saya gunakan sqlite. Untuk rekomendasi, harusnya menggunakan MySql atau MariaDB

kita membuat virtual user, domain, email alias dan database sqlite
Code:
sudo mkdir -p /etc/mail/sqlite
sudo sqlite3 /etc/mail/sqlite/mailserver.db <<EOF
CREATE TABLE virtual_domains (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL UNIQUE
);

CREATE TABLE virtual_users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  domain_id INTEGER NOT NULL,
  email TEXT NOT NULL UNIQUE,
  password TEXT NOT NULL,
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id)
);

CREATE TABLE virtual_aliases (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  domain_id INTEGER NOT NULL,
  source TEXT NOT NULL,
  destination TEXT NOT NULL,
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id)
);

INSERT INTO virtual_domains (name) VALUES ('domainmu.xyz');

-- Create a user (change password after generating hash)
INSERT INTO virtual_users (domain_id, email, password)
VALUES (1, 'admin@domainmu.xyz', 'passwordkeren123789!_');

INSERT INTO virtual_aliases (domain_id, source, destination)
VALUES (1, 'postmaster@domainmu.xyz', 'admin@domainmu.xyz');

.exit
EOF

sudo chmod 640 /etc/mail/sqlite/mailserver.db
sudo chown root:postfix /etc/mail/sqlite/mailserver.db


Buat Password Hash untuk user email

Code:
# membuat password untuk user email
sudo doveadm pw -s SHA512-CRYPT
# Masukan Password email mu (e.g., sayaganteng123)
# Copy hasilnya (diawali {SHA512-CRYPT}...)

# Update ke db sqlite dengan hasil tadi
sudo sqlite3 /etc/mail/sqlite/mailserver.db <<EOF
UPDATE virtual_users SET password = '{SHA512-CRYPT}HASH_PASSWORD_TADI'
WHERE email = 'admin@domainmu.xyz';
.exit
EOF


Lanjut Setting POSTFIX
Backup dulu Config Aslinya buat jaga - jaga

Code:
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.backup

Setting postfix

Code:
sudo postconf -e "myhostname = mail.domainmu.xyz"
sudo postconf -e "mydomain = domainmu.xyz"
sudo postconf -e "myorigin = \$mydomain"
sudo postconf -e "inet_interfaces = all"
sudo postconf -e "inet_protocols = ipv4"
sudo postconf -e "mydestination = localhost"
sudo postconf -e "local_recipient_maps ="
sudo postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"
sudo postconf -e "virtual_mailbox_domains = sqlite:/etc/postfix/sqlite_virtual_domains.cf"
sudo postconf -e "virtual_mailbox_maps = sqlite:/etc/postfix/sqlite_virtual_mailboxes.cf"
sudo postconf -e "virtual_alias_maps = sqlite:/etc/postfix/sqlite_virtual_aliases.cf"


Setting sqlite Postfix

Code:
sudo tee /etc/postfix/sqlite_virtual_domains.cf <<EOF
dbpath = /etc/mail/sqlite/mailserver.db
query = SELECT name FROM virtual_domains WHERE name='%s'
EOF

sudo tee /etc/postfix/sqlite_virtual_mailboxes.cf <<EOF
dbpath = /etc/mail/sqlite/mailserver.db
query = SELECT email FROM virtual_users WHERE email='%s'
EOF

sudo tee /etc/postfix/sqlite_virtual_aliases.cf <<EOF
dbpath = /etc/mail/sqlite/mailserver.db
query = SELECT destination FROM virtual_aliases WHERE source='%s'
EOF

# Set permissions
sudo chmod 640 /etc/postfix/sqlite_*.cf
sudo chown root:postfix /etc/postfix/sqlite_*.cf

Buat Struktur Folder

Code:
sudo mkdir -p /var/mail/vhosts/domainmu.xyz
sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /var/mail -m
sudo chown -R vmail:vmail /var/mail

Lalu Atur Dovecot Main dengan sqlite
Code:
sudo tee /etc/dovecot/dovecot-sqlite.conf.ext <<EOF
driver = sqlite
connect = /etc/mail/sqlite/mailserver.db
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u'
user_query = SELECT '/var/mail/vhosts/%d/%n' as home, 'vmail' as uid, 'vmail' as gid

setting Dovecot
Code:
sudo sed -i 's/#disable_plaintext_auth = yes/disable_plaintext_auth = yes/' /etc/dovecot/conf.d/10-auth.conf
sudo sed -i 's/auth_mechanisms = plain/auth_mechanisms = plain login/' /etc/dovecot/conf.d/10-auth.conf
sudo sed -i 's/!include auth-system.conf.ext/#!include auth-system.conf.ext/' /etc/dovecot/conf.d/10-auth.conf
sudo sed -i 's/#!include auth-sql.conf.ext/!include auth-sql.conf.ext/' /etc/dovecot/conf.d/10-auth.conf

Setting auth Dovecot
Code:
sudo tee /etc/dovecot/conf.d/auth-sql.conf.ext <<EOF
passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sqlite.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}

Setting Lokasi Folder (?) Email
Code:
sudo sed -i 's|^mail_location = .*|mail_location = maildir:/var/mail/vhosts/%d/%n|' /etc/dovecot/conf.d/10-mail.conf
sudo sed -i 's/^mail_privileged_group =.*/mail_privileged_group = mail/' /etc/dovecot/conf.d/10-mail.conf

juga Namespaces
Code:
sudo sed -i 's/#mail_plugins = $mail_plugins/mail_plugins = $mail_plugins/' /etc/dovecot/conf.d/10-mail.conf

setting protocol (IMAP & POP3)
Code:
sudo sed -i 's/^protocols = .*/protocols = imap pop3 lmtp/' /etc/dovecot/dovecot.conf

Juga LMTP
Code:
sudo tee /etc/dovecot/conf.d/15-lmtp.conf <<EOF
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}
protocol lmtp {
  postmaster_address = postmaster@domainmu.xyz
}

Setting SSL sementara, Nanti Diganti Ke Letsencrypt SSL Gratis
Code:
sudo mkdir -p /etc/dovecot/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/dovecot/ssl/dovecot.key \
  -out /etc/dovecot/ssl/dovecot.crt \
  -subj "/CN=mail.domainmu.xyz"

sudo tee -a /etc/dovecot/conf.d/10-ssl.conf <<EOF
ssl = required
ssl_cert = </etc/dovecot/ssl/dovecot.crt
ssl_key = </etc/dovecot/ssl/dovecot.key


lalu tambah user vmail ke Group mail
Code:
sudo usermod -aG mail vmail


==========================
Lanjut SSL Lets Encrypt
==========================


Hentikan Dulu apache & nginx Buat ngebebasin port 80
Code:
sudo systemctl stop nginx apache2 2>/dev/null || true


Jalankan Certbot buat dapetin Cert Lets Encrypt
Code:
sudo certbot certonly --standalone -d mail.neomovie.qzz.io --non-interactive \
  --agree-tos --email admin@domainmu.xyz

Biar Auto Update Ketika Expired
Code:
sudo mkdir -p /etc/letsencrypt/renewal-hooks/post
sudo tee /etc/letsencrypt/renewal-hooks/post/dovecot-postfix.sh

atau pake nano buat bikin file tersebut, lalu isi ini
Code:
#!/bin/bash
systemctl restart dovecot postfix
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/post/dovecot-postfix.sh


Setting dovecot biar pake Cert Letsencrypt Tadi
Code:
sudo sed -i 's|ssl_cert = .*|ssl_cert = </etc/letsencrypt/live/mail.domainmu.xyz/fullchain.pem|' /etc/dovecot/conf.d/10-ssl.conf
sudo sed -i 's|ssl_key = .*|ssl_key = </etc/letsencrypt/live/mail.domainmu.xyz/privkey.pem|' /etc/dovecot/conf.d/10-ssl.conf

Juga Posttfixnya
Code:
sudo postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/mail.domainmu.xyz/fullchain.pem"
sudo postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/mail.domainmu.xyz/privkey.pem"
sudo postconf -e "smtpd_use_tls = yes"
sudo postconf -e "smtpd_tls_security_level = may"
sudo postconf -e "smtpd_tls_auth_only = yes"


Tambahkan SASL Auth Postfix
Code:
sudo postconf -e "smtpd_sasl_type = dovecot"
sudo postconf -e "smtpd_sasl_path = private/auth"
sudo postconf -e "smtpd_sasl_auth_enable = yes"
sudo postconf -e "smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination"

Juga Dovecot SASL Auth nya
Code:
sudo tee /etc/dovecot/conf.d/10-master.conf <<EOF
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}



Yooooooooo Sudah 90% Perjalanan!!!!
langsung mulai!!
Code:
sudo systemctl restart postfix dovecot
sudo systemctl enable postfix dovecot
sudo systemctl status postfix dovecot

Kalo pake Firewall, open portnya
Code:
sudo ufw allow 25/tcp   # SMTP
sudo ufw allow 143/tcp  # IMAP
sudo ufw allow 993/tcp  # IMAPS (secure)
sudo ufw allow 110/tcp  # POP3
sudo ufw allow 995/tcp  # POP3S (secure)
sudo ufw allow 587/tcp  # SMTP submission
sudo ufw reload


Finnally, langsung coba login dong  Cool  

Di settingan mail client mu Seperti Thunderbird / k9-mail atau Mail client lain yang Support SMTP
Code:
Konfigurasikan mail client:

IMAP Server: mail.domainmu.xyz (Port 993, SSL/TLS)

SMTP Server: mail.domainmu.xyz (Port 587, STARTTLS)

Username: admin@domainmu.xyz

Password: PasswordmuPasHASHisiapa?

Authentication: Password

Kalo mau nambah user email,
Konek dulu ke sqlite database nya

sudo sqlite3 /etc/mail/sqlite/mailserver.db
lalu
Code:
INSERT INTO virtual_users (domain_id, email, password)
VALUES (1, 'newuser@domainmu.xy', '{SHA512-CRYPT}YOUR_HASH_buatlagihashnya');

dapetin/bikin lagi Hash Password kyk kode diatas sebelume.

Lalu bikinin Lokasi Folder Buat inbox & attachment
Code:
sudo mkdir -p /var/mail/vhosts/domainmu.xyz/newuser
sudo chown -R vmail:vmail /var/mail/vhosts/domainmu.xyz/newuser

Lalu coba Login


SELESAI. . . . Selamat Mengirim Email  Big Grin
Itu Harusnya Sudah Bisa Login , Kirim & Terima Email.

namun kalo ada error, Biasanya settingan kirim Email ( Outbounds) perlu tambahan.

Tambahan Postfix Config, jika sudah ada biarkan, jika belum tambahin / ilangin Komen tanda # nya didepan
Code:
postconf -e "smtpd_tls_security_level = may"
postconf -e "smtpd_tls_auth_only = yes"
postconf -e "smtpd_sasl_auth_enable = yes"
postconf -e "smtpd_sasl_type = dovecot"
postconf -e "smtpd_sasl_path = private/auth"
postconf -e "smtpd_sasl_security_options = noanonymous"
postconf -e "smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination"
postconf -e "smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination"


lalu verifikasi
Code:
postconf -n | grep -E "smtpd_(sasl|tls|relay)"

jika Gagal, Cara Manual:

Copy/Backup dulu file config master postfix

Code:
cp /etc/postfix/master.cf /etc/postfix/master.cf.backup


lalu edit, Jika tidak ada tambahin, jika ada biarin, jika ada komen/tanda "#" didepan, ilangin.

nano /etc/postfix/master.cf

Code:
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject


udah restart dulu
Code:
systemctl restart dovecot postfix


Udah Harusnya Gitu Doang sih

===============Selesai================
jika masih ada error, cek log

/var/log/mail.log

bakal ada penjelasan kesalahan,

harusnya udah 99% berhasil.
Fix Jika Masih Error ( biasnya postfix sqllite masih blm jalan )


Cek Postfix Sqlite
Code:
# cek postfix sqlite
postconf -m | grep sqlite

# If nothing shows, check installed packages
dpkg -l | grep postfix


Tancapkan
Code:
# Cek postfix Sqlite Sudah ada belum
apt-cache search postfix-sqlite

# langsung gass install
apt-get update
apt-get install -y postfix-sqlite

# postfix-sqlite jika tidak ada, install smua wkwkwk
apt-get install -y postfix postfix-sqlite postfix-mysql postfix-pcre

# Verifikasi
ls -la /usr/lib/postfix/*sqlite*


Verifikasi2
Code:
# Cek Lagi postfix config sqlite
postconf -m | grep -E "sqlite|pcre"

# Harus Tampilkan: sqlite

# Testing query database
postmap -q neomovie.qzz.io sqlite:/etc/postfix/sqlite_virtual_domains.cf

Jika Sqlite Postfix Sudah Terdeteksi, ulangi setting Postfix Diatas