Di tutorial ini saya akan memandu kalian memasang Carbonio Multi-Server untuk kebutuhan basic email menggunakan Ubuntu Server 24.04 LTS dan Ansible Collection resmi dari Zextras. Saya sarankan gunakan Ubuntu Server 24.04 LTS untuk seluruh node agar versi operating system pada semua server konsisten.
1. Contoh Arsitektur
Untuk deployment basic email multi-server, contoh pembagian role bisa memakai empat node berikut:
| Role | Hostname | Fungsi |
|---|---|---|
| LDAP + PostgreSQL + Service Discovery | ldap1.example.com | Directory, PostgreSQL, Service Discovery |
| MTA | mta1.example.com | SMTP, Anti-Spam, Anti-Virus |
| Proxy | proxy1.example.com | Reverse Proxy dan akses Webmail |
| Mailstore | mbox1.example.com | Mailbox dan Application Server |
Untuk menghemat jumlah VM, role MTA dan Proxy bisa ditempatkan pada server yang sama apabila resource dan desain infrastruktur memungkinkan. Contoh:
ldap1.example.com -> LDAP + PostgreSQL + Service Discovery
mail1.example.com -> MTA + Proxy
mbox1.example.com -> Mailstore
2. Persiapan Server Ubuntu
Siapkan seluruh server menggunakan Ubuntu Server 24.04 LTS. Sebaiknya gunakan fresh atau minimal installation. Pastikan setiap server memiliki:
- IP address static.
- Hostname atau FQDN yang sudah direncanakan.
- DNS yang sesuai.
- Akses internet.
- Akses SSH sebagai root.
- Network antar node dapat saling berkomunikasi.
- Seluruh node menggunakan versi operating system yang sama.
Contoh informasi server:
LDAP : 192.168.10.51 -> ldap1.example.com
MTA : 192.168.10.52 -> mta1.example.com
Proxy : 192.168.10.53 -> proxy1.example.com
Mailstore : 192.168.10.54 -> mbox1.example.com
Catatan, IP di atas hanya contoh. Sesuaikan dengan network environment yang kalian gunakan.
3. Persiapkan Ansible Controller
Initial setup multi-server dijalankan dari satu komputer atau server sebagai Controller. Controller bisa berupa server Ubuntu terpisah, jump host, salah satu server Carbonio, atau Linux workstation lainnya. Yang penting Controller dapat SSH ke seluruh node Carbonio.
Pastikan minimal tersedia ssh, base64, dan git. Jika Controller memakai Ubuntu, bisa dipastikan dengan:
apt update
apt install openssh-client git coreutils -y
4. Konfigurasi SSH Passwordless
Sebelum menjalankan script initial setup, pastikan Controller bisa SSH menggunakan user root ke seluruh server tanpa meminta password. Jika SSH key belum tersedia:
ssh-keygen
Copy SSH key ke setiap server:
ssh-copy-id root@192.168.10.51
ssh-copy-id root@192.168.10.52
ssh-copy-id root@192.168.10.53
ssh-copy-id root@192.168.10.54
Kemudian lakukan test:
ssh root@192.168.10.51
ssh root@192.168.10.52
ssh root@192.168.10.53
ssh root@192.168.10.54
Seluruh koneksi harus berhasil tanpa meminta password. Gunakan SSH user root ketika menjalankan script setup-carbonio-ubuntu22-24-multi.sh. Pastikan juga komunikasi SSH antar node tidak mengalami kendala.
5. Clone Initial Setup Carbonio
Clone repository berikut pada Controller:
git clone https://github.com/afatyoo/Initial-Setup-Carbonio.git
Masuk ke direktori:
cd Initial-Setup-Carbonio
Berikan hak akses execute:
chmod +x setup-carbonio-ubuntu22-24-multi.sh
Kemudian jalankan:
./setup-carbonio-ubuntu22-24-multi.sh
6. Mengisi Informasi Initial Setup
Script akan meminta beberapa informasi mengenai deployment Carbonio, contohnya domain, SSH user, lalu detail LDAP, MTA, Proxy, dan Mailstore Server (jumlah node, IP address, hostname).
Perhatikan bahwa script akan menggabungkan hostname + domain. Jadi apabila target FQDN adalah ldap1.example.com, mta1.example.com, proxy1.example.com, dan mbox1.example.com, maka masukkan:
Domain:
example.com
LDAP Hostname : ldap1
MTA Hostname : mta1
Proxy Hostname : proxy1
Mailstore Hostname : mbox1
Script kemudian akan menghasilkan ldap1.example.com, mta1.example.com, proxy1.example.com, dan mbox1.example.com. Penting, jangan memasukkan ldap1.example.com pada kolom hostname apabila Domain sudah diisi example.com, karena script akan menambahkan domain secara otomatis.
7. Proses yang Dilakukan Script
Initial setup script melakukan konfigurasi dasar secara otomatis pada seluruh node:
System update & upgrade
|
|-- Configure en_US.UTF-8
|-- Install basic packages
|-- Configure hostname
|-- Configure /etc/hosts
|-- Configure Chrony
|-- Set timezone Asia/Jakarta
|-- Disable systemd-timesyncd
|-- Disable UFW
|-- Configure Zextras Repository
Basic package yang dipasang antara lain chrony, net-tools, curl, vim, perl, python3, wget, gnupg, dan lsb-release.
Khusus LDAP Server
Pada node LDAP, script juga akan install dan configure dnsmasq, menjadikan LDAP sebagai internal DNS resolver, membuat DNS record seluruh node Carbonio, membuat MX record menuju node MTA, menginstall PostgreSQL 16 dan mengaktifkannya, serta menambahkan repository PostgreSQL dan Zextras.
ldap1.example.com
|-- LDAP
|-- Service Discovery
|-- dnsmasq
|-- PostgreSQL 16
PostgreSQL hanya di install pada LDAP Server untuk skenario ini. Tidak perlu instalasi PostgreSQL manual pada MTA, Proxy, atau Mailstore.
Node MTA, Proxy dan Mailstore
Node selain LDAP akan memakai LDAP server sebagai DNS resolver utama, contoh:
nameserver 192.168.10.51
nameserver 8.8.8.8
nameserver 1.1.1.1
Dengan begitu seluruh hostname internal Carbonio bisa saling dikenali.
8. DNS Public Tetap Harus Disiapkan
dnsmasq yang dibuat oleh script hanya untuk resolusi internal antar server dan tidak menggantikan public DNS. Untuk environment production, tetap pastikan record DNS publik tersedia, contoh:
mail.example.com -> Public IP Proxy
example.com MX 10 mta1.example.com
Pastikan juga hostname pada webmailHostname=mail.example.com dapat di resolve dengan benar. Untuk email production, konfigurasi DNS lain seperti PTR/rDNS, SPF, DKIM, dan DMARC bisa disiapkan sesuai kebutuhan setelah instalasi.
9. Verifikasi Initial Setup
Setelah script selesai, jangan langsung menjalankan Ansible. Lakukan beberapa pengecekan dulu.
Cek Hostname/FQDN pada setiap server:
hostname
hostname -f
Hasil yang benar contohnya ldap1.example.com, mta1.example.com, proxy1.example.com, dan mbox1.example.com. FQDN dari hostname -f harus sama persis dengan hostname yang nantinya dipakai pada Ansible Inventory.
Cek Resolusi Antar Server, contoh dari LDAP:
getent hosts mta1.example.com
getent hosts proxy1.example.com
getent hosts mbox1.example.com
Cek PostgreSQL pada LDAP:
systemctl status postgresql
pg_isready
Cek dnsmasq pada LDAP, pastikan active (running):
systemctl status dnsmasq
Cek Chrony pada seluruh server, pastikan waktu antar server sinkron:
chronyc tracking
timedatectl
Cek Repository Zextras pada seluruh server:
cat /etc/apt/sources.list.d/zextras.list
apt update
10. Pastikan Controller Bisa Resolve Semua FQDN
Karena Ansible Inventory memakai FQDN dan Controller bisa saja berada di luar node Carbonio, pastikan Controller dapat melakukan:
getent hosts ldap1.example.com
getent hosts mta1.example.com
getent hosts proxy1.example.com
getent hosts mbox1.example.com
Kemudian:
ssh root@ldap1.example.com
ssh root@mta1.example.com
ssh root@proxy1.example.com
ssh root@mbox1.example.com
Seluruh koneksi harus berhasil. Jika Controller belum bisa resolusi internal, sesuaikan DNS Controller atau gunakan mekanisme resolusi hostname yang sesuai environment.
11. Install Ansible
Install Ansible pada Controller. Penting, gunakan package ansible lengkap, bukan hanya ansible-core. Pada Ubuntu:
apt update
apt install ansible -y
Verifikasi:
ansible --version
12. Install Carbonio Ansible Collection
Install Ansible Collection resmi Carbonio dari Zextras:
ansible-galaxy collection install zxbot.carbonio_install -U
Verifikasi:
ansible-galaxy collection list | grep carbonio
13. Membuat Carbonio Inventory
Buat file inventory:
nano inventory
Untuk deployment basic email multi-server, gunakan contoh berikut:
# ============================================================
# Carbonio Multi-Server - Basic Mail
# ============================================================
# PostgreSQL ditempatkan pada LDAP Server
[postgresServers]
ldap1.example.com
# Master Directory / LDAP
[masterDirectoryServers]
ldap1.example.com
# Custom Default Mail Domain - Optional
[masterDirectoryServers:vars]
# default_domain=example.com
# Service Discovery
[serviceDiscoverServers]
ldap1.example.com
# MTA
[mtaServers]
mta1.example.com
# Proxy
[proxyServers]
proxy1.example.com
# Public Webmail Hostname
[proxyServers:vars]
webmailHostname=mail.example.com
# Mailstore / Application Server
[applicationServers]
mbox1.example.com
# Optional Components (tidak dipakai untuk Basic Mail)
[filesServers]
[docsServers]
[taskServers]
[previewServers]
[videoServers]
[workStreamServers]
[prometheusServers]
[syslogServer]
[replicaDirectoryServers]
[dbsConnectorServers]
14. Default Domain
Bagian berikut bersifat optional:
[masterDirectoryServers:vars]
#default_domain=example.com
Jika ingin menentukan domain email utama secara eksplisit:
[masterDirectoryServers:vars]
default_domain=example.com
Dengan begitu domain email pertama yang dibuat adalah example.com, contoh account user@example.com. Domain pada default_domain tidak harus sama dengan domain namespace hostname server. Misalnya FQDN server ldap1.infra.example.com dan seterusnya, namun default email domain tetap bisa example.com.
15. Verifikasi Inventory dan FQDN
Sebelum menjalankan installation playbook, cek sekali lagi pada masing-masing server:
hostname -f
Hasilnya harus sama persis dengan inventory (ldap1.example.com, mta1.example.com, proxy1.example.com, mbox1.example.com). Carbonio melakukan validasi FQDN sebelum instalasi dilanjutkan. Jika berbeda, perbaiki hostname atau inventory terlebih dahulu.
16. Test Koneksi Ansible
Sebelum instalasi, jalankan:
ansible all -u root -i inventory -m ping
Output yang benar kurang lebih:
ldap1.example.com | SUCCESS => {
"changed": false,
"ping": "pong"
}
mta1.example.com | SUCCESS => { ... "ping": "pong" }
proxy1.example.com | SUCCESS => { ... "ping": "pong" }
mbox1.example.com | SUCCESS => { ... "ping": "pong" }
Pastikan seluruh node menghasilkan SUCCESS. Jangan melanjutkan instalasi jika masih ada UNREACHABLE atau FAILED.
17. Jalankan Instalasi Menggunakan Screen atau TMUX
Proses instalasi bisa berjalan cukup lama, jadi sangat disarankan memakai screen atau tmux agar proses tidak terputus ketika koneksi SSH dari workstation terputus.
Menggunakan Screen:
apt install screen -y
screen -S carbonio-install
ansible-playbook zxbot.carbonio_install.carbonio_install -u root -i inventory
Untuk detach dari screen tekan Ctrl+A kemudian D. Untuk kembali:
screen -r carbonio-install
Menggunakan TMUX:
apt install tmux -y
tmux new -s carbonio-install
ansible-playbook zxbot.carbonio_install.carbonio_install -u root -i inventory
Untuk detach tekan Ctrl+B kemudian D. Untuk kembali:
tmux attach -t carbonio-install
18. Monitoring Installation
Tunggu hingga seluruh proses Ansible selesai. Pada akhir instalasi akan muncul PLAY RECAP, contoh:
PLAY RECAP
ldap1.example.com : ok=xx changed=xx unreachable=0 failed=0 skipped=xx
mta1.example.com : ok=xx changed=xx unreachable=0 failed=0 skipped=xx
proxy1.example.com : ok=xx changed=xx unreachable=0 failed=0 skipped=xx
mbox1.example.com : ok=xx changed=xx unreachable=0 failed=0 skipped=xx
Hal utama yang perlu diperhatikan adalah unreachable=0 dan failed=0. Jika ada failed=1 atau lebih, periksa task yang gagal. Setelah penyebab error diperbaiki, playbook bisa dijalankan kembali:
ansible-playbook zxbot.carbonio_install.carbonio_install -u root -i inventory
19. Simpan File Password Hasil Instalasi
Setelah instalasi menggunakan Ansible, beberapa credential atau password Carbonio akan dibuat dan disimpan pada direktori tempat inventory dijalankan. Jangan menghapus file file tersebut. Simpan bersama file inventory dan credential yang dihasilkan. Direktori tersebut sebaiknya hanya dapat diakses administrator, dibackup, tidak dipublish ke GitHub atau public repository, dan tidak dikirim melalui channel komunikasi publik. File tersebut bisa dibutuhkan kembali ketika melakukan maintenance atau upgrade Carbonio.
20. Ringkasan Alur Instalasi
Prepare Ubuntu 24.04 Servers
|
v
Prepare Controller
|
v
Configure Root SSH Passwordless
|
v
Clone Initial-Setup-Carbonio
|
v
Run Multi-Server Initial Setup
|-- System Update
|-- Locale
|-- Hostname & /etc/hosts
|-- Internal DNS
|-- PostgreSQL 16 on LDAP
|-- Chrony
|-- Disable UFW
|-- Zextras Repository
|
v
Verify Hostname / FQDN
|
v
Verify DNS & Connectivity
|
v
Install Ansible
|
v
Install Carbonio Ansible Collection
|
v
Create Inventory
|
v
Test Ansible Connectivity
|
v
Run Carbonio Installation
|
v
Monitor PLAY RECAP
|
v
Secure Generated Credentials
|
v
Carbonio Multi-Server Ready
Command Summary
# Initial Setup
git clone https://github.com/afatyoo/Initial-Setup-Carbonio.git
cd Initial-Setup-Carbonio
chmod +x setup-carbonio-ubuntu22-24-multi.sh
./setup-carbonio-ubuntu22-24-multi.sh
# Install Ansible
apt update
apt install ansible -y
# Install Carbonio Collection
ansible-galaxy collection install zxbot.carbonio_install -U
# Verify FQDN
hostname -f
# Test Ansible
ansible all -u root -i inventory -m ping
# Run Installation
ansible-playbook zxbot.carbonio_install.carbonio_install -u root -i inventory
Catatan penting, initial setup script hanya menyiapkan environment operating system dan prerequisite. Instalasi Carbonio tetap dilakukan setelah initial setup menggunakan Ansible Collection resmi Zextras. Selalu jalankan instalasi memakai screen atau tmux, dan sebelum menjalankan playbook pastikan hostname -f, FQDN pada inventory, DNS resolution, serta SSH passwordless seluruh node sudah benar.