Tutorial Instalasi Carbonio Multi-Server di Ubuntu 24.04 dengan Ansible

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.

Leave a Reply

Your email address will not be published. Required fields are marked *