Category: Zimbra

  • Memahami Zimlet pada Zimbra

    Memahami Zimlet pada Zimbra

    Zimbra bukan hanya sekadar mail server yang menyediakan layanan email, kalender, kontak, dan task. Salah satu fitur yang membuat Zimbra fleksibel adalah Zimlet, sebuah mekanisme yang memungkinkan system admin maupun developer mengintegrasikan Zimbra dengan aplikasi, layanan, atau sistem lain tanpa harus mengubah kode inti Zimbra. Zimlet telah menjadi salah satu fitur unggulan sejak awal pengembangan Zimbra dan terus berkembang hingga versi modern.

    Pada artikel ini kita akan membahas apa itu Zimlet, bagaimana cara kerjanya, jenis-jenis Zimlet, contoh implementasinya, hingga cara admin mengelolanya di server Zimbra.


    Apa Itu Zimlet?

    Zimlet adalah ekstensi (plugin) yang dirancang untuk menambahkan kemampuan baru pada Zimbra Collaboration. Dengan Zimlet, informasi di dalam email dapat menjadi interaktif (actionable content) sehingga pengguna dapat berinteraksi langsung dengan aplikasi atau layanan lain tanpa meninggalkan antarmuka Zimbra.

    Sederhananya, Zimlet dapat:

    • Menambahkan menu baru pada antarmuka Zimbra.
    • Menghubungkan email dengan aplikasi pihak ketiga.
    • Menampilkan informasi tambahan ketika pengguna mengarahkan kursor ke suatu objek.
    • Menambahkan fitur drag-and-drop.
    • Menambahkan tab atau panel baru pada Zimbra Web Client.

    Mengapa Zimlet Dibuat?

    Pada umumnya, ketika menerima email yang berisi alamat, nomor resi, atau nomor penerbangan, pengguna harus membuka browser lalu mencari informasi tersebut secara manual.

    Dengan Zimlet, proses tersebut menjadi jauh lebih sederhana.

    Contohnya:

    • Alamat pada email langsung dapat dibuka di Google Maps.
    • Nomor penerbangan dapat menampilkan status penerbangan secara real-time.
    • Nomor tiket helpdesk langsung membuka halaman tiket.
    • Nomor telepon dapat langsung dihubungkan ke aplikasi VoIP.
    • Link meeting dapat langsung membuka Zoom atau Microsoft Teams.

    Semua proses tersebut berlangsung tanpa harus keluar dari Zimbra.

    Contoh Zimlet Bawaan Zimbra

    Beberapa Zimlet sudah tersedia secara default pada instalasi Zimbra.

    Contohnya:

    ZimletFungsi
    URLPreview website
    EmailMenampilkan informasi kontak
    CalendarMembuka jadwal pada tanggal tertentu
    PhoneIntegrasi VoIP
    MapsMembuka lokasi pada peta
    Skype / Zoom (tergantung versi)Membuka aplikasi meeting

    Admin dapat mengaktifkan atau menonaktifkan Zimlet sesuai kebutuhan.


    Jenis-Jenis Zimlet

    Secara umum terdapat beberapa jenis Zimlet.

    1. Content Zimlet

    Jenis ini bekerja dengan mendeteksi pola tertentu pada isi email.

    Misalnya:

    • alamat email
    • URL
    • tanggal
    • nomor telepon
    • alamat fisik

    Kemudian objek tersebut dibuat menjadi interaktif.


    2. Panel Zimlet

    Panel Zimlet muncul pada panel sebelah kiri Zimbra.

    Biasanya digunakan sebagai launcher aplikasi.

    Contohnya:

    • CRM
    • Helpdesk
    • ERP
    • Dashboard internal

    Pengguna dapat melakukan drag-and-drop email ke Panel Zimlet untuk menjalankan aksi tertentu.


    3. Tab Zimlet

    Jenis ini membuat tab baru pada menu utama Zimbra.

    Contohnya:

    Mail
    Calendar
    Contacts
    Tasks
    CRM
    Helpdesk
    Inventory

    Dengan begitu aplikasi perusahaan dapat diakses langsung dari dalam Zimbra.


    4. Integrated Zimlet

    Jenis ini merupakan Zimlet yang terintegrasi lebih dalam dengan antarmuka Zimbra.

    Contohnya:

    • menambahkan tombol baru
    • menambahkan menu klik kanan
    • membuat dialog baru
    • mengubah perilaku UI tertentu

    Jenis ini biasanya digunakan pada implementasi enterprise.


    Struktur Dasar Zimlet

    Sebuah paket Zimlet biasanya didistribusikan dalam bentuk file ZIP yang berisi beberapa komponen.

    Contohnya:

    com_example_demo.zip
    
    ├── com_example_demo.xml
    ├── com_example_demo.js
    ├── com_example_demo.properties
    ├── config_template.xml
    ├── images/
    ├── css/
    └── jsp/

    Penjelasan singkat:

    FileFungsi
    XMLMendefinisikan Zimlet
    JSLogika JavaScript
    JSPKomunikasi server (opsional)
    PropertiesMulti bahasa
    CSSTampilan
    ImagesIkon

    File yang paling penting adalah file XML, karena di sinilah perilaku dasar Zimlet didefinisikan.

    Mengelola Zimlet di Zimbra

    System admin dapat mengelola Zimlet menggunakan utilitas zmzimletctl.

    Melihat daftar Zimlet

    su - zimbra
    
    zmzimletctl listZimlets

    Deploy Zimlet

    zmzimletctl deploy nama-zimlet.zip

    Menonaktifkan Zimlet

    zmzimletctl disable nama_zimlet

    Mengaktifkan kembali

    zmzimletctl enable nama_zimlet

    Menghapus Zimlet

    zmzimletctl undeploy nama_zimlet

    Perintah-perintah tersebut memungkinkan admin mengelola siklus hidup Zimlet langsung dari command line.

    Kesimpulan

    Zimlet merupakan salah satu fitur yang menjadikan Zimbra lebih dari sekadar mail server. Dengan kemampuannya mengintegrasikan email dengan aplikasi dan layanan lain, Zimlet mampu meningkatkan produktivitas pengguna sekaligus menyederhanakan alur kerja di lingkungan perusahaan.

    Bagi system admin, Zimlet dapat dikelola dengan mudah melalui zmzimletctl, sedangkan bagi developer, Zimlet menyediakan kerangka kerja yang fleksibel untuk membangun integrasi dengan berbagai sistem internal maupun layanan pihak ketiga. Memahami konsep dan cara kerja Zimlet menjadi langkah awal yang penting sebelum mulai mengembangkan atau menerapkan integrasi pada lingkungan Zimbra.


    Referensi

    1. Zimbra Wiki – Zimlets
      https://wiki.zimbra.com/wiki/Zimlets
    2. GitHub – Zimbra Zimlet Guide
      Zimbra zm-zimlet-guide Repository
    3. Zimbra Developers Guide (Modern UI Zimlet Development)
      https://wiki.zimbra.com/wiki/DevelopersGuide#Zimlet_Development_Guide
  • Cara Mengatasi zmamavisdctl Gagal Start Setelah Upgrade Zimbra NE 10.1.20

    Cara Mengatasi zmamavisdctl Gagal Start Setelah Upgrade Zimbra NE 10.1.20

    Saya memiliki server Zimbra Collaboration Network Edition 10.1.16 yang sudah cukup lama tidak diperbarui. Setelah melakukan upgrade (patching) ke Zimbra 10.1.20, seluruh proses upgrade berjalan dengan baik, namun terdapat satu masalah, yaitu service Amavis (zmamavisdctl) gagal dijalankan.

    Akibatnya:

    • Service amavis berstatus Stopped.
    • Service antivirus dan mta juga ikut berhenti.
    • Email tidak dapat diproses karena Postfix gagal terhubung ke Amavis.

    Gejala

    Cek status service:

    zmcontrol status

    Hasil:

    zimbra@mail:~$ zmcontrol status
    Host mail.zimbra.lab
            amavis                  Stopped
                    amavisd is not running.
            antispam                Stopped
                    zmamavisdctl is not running
            antivirus               Stopped
                    zmamavisdctl is not running
            convertd                Running
            ldap                    Running
            license-daemon          Running
            logger                  Running
            mailbox                 Running
            memcached               Running
            mta                     Stopped
                    zmamavisdctl is not running
            onlyoffice              Running
            opendkim                Running
            proxy                   Running
            service webapp          Running
            snmp                    Running
            spell                   Running
            stats                   Running
            zimbra webapp           Running
            zimbraAdmin webapp      Running
            zimlet webapp           Running
            zmconfigd               Running

    Log Postfix menunjukkan:

    connect to 127.0.0.1:10026: Connection refused

    Artinya Amavis tidak berhasil membuka port filtering SMTP.


    Proses Troubleshooting

    1. Pastikan penyebab

    Jalankan:

    su - zimbra
    
    /opt/zimbra/common/sbin/amavisd \
    -X no_conf_file_writable_check \
    -c /opt/zimbra/conf/amavisd.conf \
    test-config

    Jika tidak ada output, berarti konfigurasi Amavis valid.


    2. Jalankan Amavis secara foreground

    /opt/zimbra/common/sbin/amavisd \
    -X no_conf_file_writable_check \
    -c /opt/zimbra/conf/amavisd.conf \
    foreground

    Didapatkan error:

    zimbra@mail:~$ /opt/zimbra/common/sbin/amavisd \
    -X no_conf_file_writable_check \
    -c /opt/zimbra/conf/amavisd.conf \
    foreground
    
    Suicide () TROUBLE in pre_loop_hook: config: no rules were found!  Do you need to run 'sa-update'?
    Compilation failed in require at /opt/zimbra/common/sbin/amavisd line 101.
    BEGIN failed--compilation aborted at /opt/zimbra/common/sbin/amavisd line 101.

    3. Periksa SpamAssassin

    Lakukan pengecekan:

    /opt/zimbra/common/bin/spamassassin --lint -D

    Hasil akhirnya menunjukkan:

    zimbra@mail:~$ /opt/zimbra/common/bin/spamassassin --lint -D
    .
    .
    .
    config: no rules were found!  Do you need to run 'sa-update'?

    Padahal direktori rules masih lengkap.


    4. Jalankan sa-update

    /opt/zimbra/common/bin/sa-update -D

    Didapatkan error:

    zimbra@mail:~$ /opt/zimbra/common/bin/sa-update -D
    .
    .
    Aug  3 12:05:57.745 [47987] dbg: gpg: [GNUPG:] NO_PUBKEY 6C55397824F434CE
    Aug  3 12:05:57.745 [47987] dbg: gpg: gpg: Can't check signature: No public key
    .
    .
    NO_PUBKEY
    error: GPG validation failed!

    Dari sini diketahui bahwa GPG key SpamAssassin hilang, sehingga proses update rules gagal diverifikasi.


    Solusi

    1. Buat direktori key

    mkdir -p /opt/zimbra/data/spamassassin/localrules/sa-update-keys
    chown -R zimbra:zimbra /opt/zimbra/data/spamassassin/localrules

    2. Download GPG Key resmi

    cd /tmp
    wget https://spamassassin.apache.org/updates/GPG.KEY

    3. Import GPG Key

    Jalankan sebagai user zimbra.

    su - zimbra
    /opt/zimbra/common/bin/sa-update --import /tmp/GPG.KEY

    4. Update SpamAssassin Rules

    /opt/zimbra/common/bin/sa-update

    Pastikan proses selesai tanpa error GPG.

    5. Restart Service

    zmamavisdctl restart

    atau

    zmcontrol restart

    Verifikasi

    Pastikan service kembali berjalan:

    zmcontrol status

    Hasil yang diharapkan:

    zimbra@mail:~$ zmcontrol status
    Host mail.zimbra.lab
            amavis                  Running
            antispam                Running
            antivirus               Running
            convertd                Running
            ldap                    Running
            license-daemon          Running
            logger                  Running
            mailbox                 Running
            memcached               Running
            mta                     Running
            onlyoffice              Running
            opendkim                Running
            proxy                   Running
            service webapp          Running
            snmp                    Running
            spell                   Running
            stats                   Running
            zimbra webapp           Running
            zimbraAdmin webapp      Running
            zimlet webapp           Running
            zmconfigd               Running

    Lalu pastikan dapat mengirim email secara normal kembali.


    Kesimpulan

    Kasus ini terjadi setelah melakukan upgrade dari Zimbra 10.1.16 ke 10.1.20 pada server yang sudah lama tidak diperbarui. Penyebab utamanya bukan pada konfigurasi Amavis, melainkan GPG key SpamAssassin yang hilang, sehingga proses sa-update gagal memverifikasi update rules. Akibatnya, SpamAssassin tidak dapat memuat rules dan Amavis gagal dijalankan.

    Dengan mengembalikan GPG key, menjalankan kembali sa-update, dan me-restart service Zimbra, service amavis, antivirus, dan mta dapat kembali berjalan normal.

    Referensi

  • Mengganti Logo & White Label Zimbra Modern UI

    Mengganti Logo & White Label Zimbra Modern UI

    Salah satu kebutuhan yang sering muncul ketika implementasi mail server Zimbra Collaboration adalah menyesuaikan tampilan webmail dengan identitas perusahaan. Mengganti logo perusahaan pada halaman webmail dapat meningkatkan branding sekaligus memberikan pengalaman yang lebih profesional bagi pengguna.

    Sejak hadirnya Modern UI, mekanisme penggantian logo di Zimbra berubah dibandingkan dengan Classic Web Client. Oleh karena itu, para admin perlu menggunakan metode yang sesuai dengan antarmuka yang digunakan.

    Pada artikel ini kita akan membahas cara mengganti logo pada Zimbra Modern UI berdasarkan panduan resmi Zimbra.


    Rebranding vs White Label

    Sebelum memulai, penting untuk memahami dua istilah yang sering digunakan.

    Rebranding adalah proses menambahkan identitas perusahaan, seperti logo, tanpa menghilangkan identitas Zimbra yang diwajibkan oleh lisensi tertentu.

    Sedangkan White Label berarti mengganti identitas Zimbra sepenuhnya dengan identitas perusahaan, termasuk logo maupun elemen antarmuka lainnya.

    Bagi pengguna Zimbra Open Source Edition, proses rebranding tetap harus mengikuti ketentuan lisensi CPAL. Sementara itu, kemampuan white label melalui konfigurasi bawaan tersedia pada Zimbra Network Edition. Informasi ini dijelaskan pada panduan resmi Zimbra mengenai rebranding Classic Web Client.

    Catatan

    Apabila masih menggunakan Classic Web Client (Zimbra 8.x), Zimbra telah menyediakan panduan resmi tersendiri mengenai penggantian Login Banner dan Application Banner menggunakan atribut zmprov. Karena artikel ini difokuskan pada Modern UI, panduan tersebut tidak dibahas kembali di sini.


    Persiapan

    Sebelum mengganti logo, siapkan terlebih dahulu file logo dengan format:

    • SVG (logo.svg)

    Modern UI menggunakan file logo.svg sebagai logo aplikasi.


    Menentukan Jenis Virtual Host

    Langkah pertama adalah mengetahui apakah deployment menggunakan default virtual hostname atau custom virtual hostname.

    Caranya:

    1. Login ke Modern UI menggunakan browser Firefox.
    2. Klik kanan pada logo Zimbra.
    3. Pilih Open Image in New Tab.
    4. Perhatikan URL gambar yang muncul.

    Hasilnya akan menunjukkan salah satu dari dua kondisi berikut:

    • Menggunakan default virtual hostname.
    • Menggunakan custom virtual hostname.

    Metode penggantian logo akan mengikuti kondisi tersebut.


    Prosedur A — Default Virtual Host

    Apabila logo berasal dari default virtual hostname, lakukan langkah berikut.

    1. Masuk ke direktori aset Modern UI

    cd /opt/zimbra/jetty/webapps/zimbra/modern/clients/default/assets

    2. Backup logo bawaan

    Sebelum mengganti logo, simpan salinan file asli.

    cp logo.svg logo.svg.old

    3. Upload logo

    Upload file logo perusahaan dengan nama:

    logo.svg

    ke direktori:

    /opt/zimbra/jetty/webapps/zimbra/modern/clients/default/assets

    Apabila file diunggah menggunakan user root, ubah ownership menjadi user zimbra.

    chown zimbra:zimbra \
    /opt/zimbra/jetty/webapps/zimbra/modern/clients/default/assets/logo.svg


    4. Perbarui config.json

    Edit file berikut.

    /opt/zimbra/jetty/webapps/zimbra/modern/clients/default/config.json

    Kemudian ubah nilai version menjadi nilai baru yang belum pernah digunakan sebelumnya.

    Tujuan perubahan versi ini adalah agar browser mengambil aset terbaru setelah logo diganti.


    5. Restart layanan Mailbox

    Masuk sebagai user zimbra.

    su - zimbra

    Kemudian restart layanan.

    zmmailboxdctl restart

    Prosedur B — Custom Virtual Host

    Apabila hasil pengecekan menunjukkan penggunaan custom virtual hostname, ikuti langkah berikut.

    1. Login sebagai user zimbra

    su - zimbra

    Masuk ke direktori Modern UI.

    cd /opt/zimbra/jetty/webapps/zimbra/modern/clients/

    2. Salin direktori default

    Salin direktori default menjadi nama virtual hostname yang digunakan.

    cp -r default <virtual-hostname>

    Sebagai contoh, apabila virtual hostname adalah mail.example.com, maka direktori baru akan dibuat menggunakan nama tersebut.


    3. Masuk ke direktori assets

    cd /opt/zimbra/jetty/webapps/zimbra/modern/clients/<virtual-hostname>/assets

    4. Backup logo bawaan

    cp logo.svg logo.svg.old

    5. Upload logo baru

    Upload logo perusahaan menggunakan nama:

    logo.svg

    ke direktori assets tersebut.


    6. Edit config.json

    Edit file:

    /opt/zimbra/jetty/webapps/zimbra/modern/clients/<virtual-hostname>/config.json

    Kemudian ubah nilai version menggunakan nilai baru yang belum pernah digunakan sebelumnya.


    7. Restart layanan

    Setelah konfigurasi, restart layanan Mailbox sebagai zimbra.

    zmmailboxdctl restart

    Verifikasi

    Setelah layanan berhasil dijalankan kembali:

    1. Buka kembali halaman Modern UI.
    2. Refresh browser.
    3. Apabila logo lama masih muncul, bersihkan cache browser lalu muat ulang halaman.

    Perubahan versi pada config.json membantu browser memuat aset terbaru, namun cache browser tetap dapat memengaruhi hasil yang ditampilkan.


    Hal yang Perlu Diperhatikan

    Beberapa hal penting sebelum melakukan kustomisasi logo:

    • Selalu lakukan backup terhadap file logo.svg bawaan.
    • Gunakan nilai version baru setiap kali mengganti logo.
    • Pastikan ownership file tetap dimiliki oleh user zimbra apabila proses upload dilakukan menggunakan user root.
    • Restart zmmailboxdctl setelah seluruh perubahan selesai dilakukan.

    Penutup

    Pada Modern UI, proses penggantian logo tidak lagi menggunakan atribut zmprov seperti pada Classic Web Client. Sebagai gantinya, administrator perlu mengganti file logo.svg, memperbarui nilai version pada config.json, kemudian me-restart layanan zmmailboxdctl.

    Bagi administrator yang masih menggunakan Classic Web Client, Zimbra tetap menyediakan panduan resmi mengenai rebranding Login Banner dan Application Banner. Namun, untuk implementasi Zimbra Modern UI, metode yang dijelaskan dalam artikel ini merupakan pendekatan yang direkomendasikan oleh Zimbra.

    Referensi

    1. Zimbra. (2023). Did you know? How to change the Zimbra logo in Modern UI. https://blog.zimbra.com/2023/08/did-you-know-how-to-change-the-zimbra-logo-in-modern-ui/
    2. Zimbra. (2021). How to change modern user interface logo. https://wiki.zimbra.com/wiki/How_to_change_modern_user_interface_logo
    3. Zimbra. (2015). How to add your Logo in the Login and App window in Open Source or Network Edition. https://blog.zimbra.com/2015/09/change-login-app-logo-open-source-network-edition/
  • Merancang Instalasi Otomatis Zimbra dengan Ansible

    Merancang Instalasi Otomatis Zimbra dengan Ansible

    Hari ini saya memulai untuk membangun project saya, yaitu project instalasi zimbra secara otomatis, dan disini saya menggunakan Ansible sebagai mesin otomasi nya. Instalasi Zimbra secara manual itu melelahkan. Kalian harus SSH ke server, menyiapkan hostname dan DNS, menjalankan install.sh, lalu menjawab puluhan pertanyaan interaktif di zmsetup.pl satu per satu. Ulangi proses ini untuk setiap server, dan satu salah ketik bisa membuat Anda mengulang dari awal.

    Di artikel ini saya akan menceritakan rancangan saya, bagaimana saya membangun sebuah dashboard yang menginstalasi Zimbra secara otomatis ke server target, cukup dengan mengisi parameter wajib lewat form. Mesin di belakangnya adalah Ansible. Dashboard mendukung dua edisi: Zimbra OSE (Open Source Edition) dan Zimbra NE (Network Edition).

    Kenapa Ansible?

    Ansible cocok untuk kasus ini karena beberapa alasan:

    • Agentless. Tidak perlu memasang apa pun di server target; cukup akses SSH dan Python (sudah ada di hampir semua distro Linux).
    • Idempotent. Menjalankan ulang playbook tidak merusak yang sudah benar — sangat penting untuk instalasi yang panjang.
    • Deklaratif. Anda mendeskripsikan kondisi akhir yang diinginkan, bukan urutan perintah manual.
    • Mudah dipasangkan dengan dashboard. Dashboard cukup men-generate file variabel dan inventory, lalu memanggil ansible-playbook.

    Arsitektur Solusi

    Alur kerjanya sederhana:

    [ Dashboard (form) ]
            │  generate
            ▼
    group_vars/all.yml  +  inventory/hosts.ini
            │  trigger
            ▼
    ansible-playbook site.yml
            │  SSH
            ▼
    [ Server target: Zimbra terpasang ]

    Dashboard hanya bertugas mengumpulkan parameter dari user, menuliskannya ke dua file, lalu menjalankan playbook. Seluruh logika instalasi hidup di dalam Ansible.

    Metode Instalasi Unattended

    Kunci otomasi Zimbra adalah membuat installer yang biasanya interaktif menjadi unattended. Saya mengikuti pendekatan resmi dari repo Zimbra (zinstaller), yang terbagi dua fase:

    Fase 1 — Install software saja. Jalankan installer dengan flag software-only dan suplai jawaban lewat answer file:

    ./install.sh -s < keystroke_answers

    Fase 2 — Konfigurasi unattended. Setelah paket terpasang, jalankan setup dengan file konfigurasi, bukan wizard interaktif:

    /opt/zimbra/libexec/zmsetup.pl -c /tmp/zim-install-config

    File zim-install-config berisi key konfigurasi resmi Zimbra (hostname, domain, password admin, komponen yang diaktifkan, dan seterusnya). Template inilah yang diisi dari parameter dashboard.

    Perbedaan OSE vs NE

    Bedanya terutama pada lisensi:

    • OSE — tidak butuh lisensi sama sekali.
    • NE 10.1.x — aktivasi memakai license KEY via zmlicense -a <key>.
    • NE ≤ 10.0 — memakai file lisensi (license.xml) yang ditunjuk lewat variabel LICENSEFILE.

    Dashboard cukup menampilkan field lisensi secara kondisional ketika user memilih edisi NE.

    Struktur Project Ansible

    instaru/
    ├── site.yml
    ├── inventory/
    │   └── hosts.ini
    ├── group_vars/
    │   └── all.yml          # semua parameter wajib di sini
    ├── roles/
    │   ├── preflight/       # cek hostname, DNS, resource, swap
    │   ├── zimbra_install/  # download, install.sh -s
    │   └── zimbra_config/   # render config, zmsetup.pl -c
    └── templates/
        └── zim-install-config.j2

    Parameter wajib (group_vars/all.yml)

    Inilah variabel yang dikumpulkan dashboard dari user:

    # Identitas
    zimbra_edition: "ose"          # ose | ne
    zimbra_version: "10.1.0"
    zimbra_hostname: "mail.example.com"
    zimbra_domain: "example.com"
    
    # Kredensial
    admin_password: "{{ vault_admin_password }}"
    ldap_password: "{{ vault_ldap_password }}"
    
    # Lisensi (hanya untuk NE)
    zimbra_license_key: ""         # NE 10.1.x
    zimbra_license_file: ""        # NE <=10.0
    
    # Komponen
    enable_proxy: true
    enable_spell: true
    timezone: "Asia/Jakarta"
    

    Simpan semua password di Ansible Vault, jangan plaintext. Dashboard bisa mengenkripsi nilai sensitif sebelum menulisnya ke file.

    Inventory & topologi

    Topologi dipilih lewat grup inventory. Untuk single-server semua peran di satu host; untuk multi-server, peran dipecah dan LDAP harus diinstall pertama.

    # Single server

    [zimbra_single]
    mail.example.com 

    atau

    # Multi-server

    [zimbra_ldap]
    ldap.example.com
    
    [zimbra_store] (mailbox/mbox)
    store.example.com
    
    [zimbra_mta]
    mta.example.com
    
    [zimbra_proxy]
    proxy.example.com

    Playbook Utama

    # site.yml
    - name: Validasi & persiapan server
      hosts: all
      become: true
      roles:
        - preflight
    
    - name: Install & konfigurasi Zimbra
      hosts: all
      become: true
      roles:
        - zimbra_install
        - zimbra_config
    

    Role preflight penting: ia memvalidasi bahwa hostname FQDN sudah benar, DNS A dan MX sudah resolve, RAM mencukupi, dan swap tersedia — kesalahan paling umum pada instalasi Zimbra ada di tahap ini, jadi lebih baik gagal cepat sebelum installer berjalan.

    Catatan dependensi: playbook ini membutuhkan koleksi community.general dan ansible.posix. Pasang dengan:

    ansible-galaxy collection install community.general ansible.posix

    Menjalankannya

    Dari dashboard, eksekusi akhirnya sesederhana ini:

    ansible-playbook -i inventory/hosts.ini site.yml --ask-vault-pass

    Dashboard menjalankan perintah ini sebagai background job, lalu menampilkan progres dengan men-stream output Ansible kembali ke UI. User cukup menunggu sampai status berubah menjadi selesai.

    Penutup

    Jika ini berhasil, maka saya tinggal membuat dashboard terintegrasi yang dapat melakukan instalasi zimbra hanya dengan beberapa input saja (ip, hostname, dll) dan akses ssh ke server target.

    Langkah pengembangan berikutnya yang saya rencanakan: validasi parameter real-time di sisi dashboard, dukungan rollback otomatis bila instalasi gagal di tengah jalan, dan template multi-server siap pakai.

  • Konfigurasi Fitur Zimbra: Forwarding, Reply-To, dan Mail Filter

    Konfigurasi Fitur Zimbra: Forwarding, Reply-To, dan Mail Filter

    Zimbra menyediakan berbagai fitur pengaturan email yang bisa dilakukan melalui GUI maupun command line (CLI). Tiga fitur yang paling sering digunakan dalam administrasi email adalah forwarding, reply-to, dan mail filter. Ketiganya berperan penting dalam mengatur alur distribusi email, pengelolaan respons, serta otomatisasi pemrosesan pesan.


    1. Konsep Dasar Email Management di Zimbra

    Sebelum masuk ke perintah, penting memahami bahwa Zimbra menyimpan semua konfigurasi user di LDAP. Setiap perubahan yang dilakukan melalui CLI seperti zmprov atau zmmailbox akan langsung tersinkronisasi dengan mailbox server.

    Secara umum:

    • Forwarding → meneruskan email ke alamat lain
    • Reply-To → menentukan alamat balasan
    • Filter → aturan otomatis untuk memproses email masuk

    2. Email Forwarding (Penerusan Email)

    Forwarding digunakan ketika email yang masuk ke satu user ingin diteruskan ke alamat lain secara otomatis.

    Perintah CLI

    zmprov ma user1@domain.com zimbraPrefMailForwardingAddress target@gmail.com

    Jika ingin mengaktifkan tanpa menyimpan copy lokal:

    zmprov ma user1@domain.com zimbraPrefMailLocalDeliveryDisabled TRUE

    Fungsi utama

    • Backup email ke external
    • Migrasi email sementara
    • Monitoring mailbox

    3. Reply-To Address

    Reply-To digunakan untuk mengarahkan balasan email ke alamat yang berbeda dari pengirim asli.

    Perintah CLI

    zmprov ma user1@domain.com \
    zimbraPrefReplyToEnabled TRUE \
    zimbraPrefReplyToAddress helpdesk@domain.com

    Fungsi utama

    • Masking alamat asli user
    • Centralized response handling

    4. Mail Filter (Rule Otomatis Email)

    Filter digunakan untuk mengatur bagaimana email diproses secara otomatis berdasarkan kondisi tertentu.

    Contoh via CLI

    zmprov ma "user${i}@zimbra.server" zimbraMailSieveScript '# gmail-filter
    if anyof (header :contains "from" "gmail.com") {
        fileinto "Test";
        stop;
    }'

    Fungsi utama

    • Auto sorting email
    • Anti spam sederhana
    • Workflow automation
    • Routing email ke folder tertentu

    5. Folder Target Filter

    Sebelum filter digunakan, folder harus dibuat:

    zmmailbox -z -m user1@domain.com createFolder /Inbox/Test

    Best Practice

    Dalam environment production, ada beberapa best practice:

    • Gunakan CLI untuk mass configuration
    • Hindari editing manual database LDAP
    • Pastikan folder filter sudah ada sebelum rule dibuat
    • Audit forwarding secara rutin
    • Batasi external forwarding untuk keamanan

    Penutup

    Forwarding, Reply-To, dan Filter adalah tiga komponen penting dalam manajemen email Zimbra:

    • Forwarding → mengalihkan email
    • Reply-To → mengatur arah balasan
    • Filter → otomatisasi pemrosesan email

    Dengan memahami ketiganya, administrator dapat mengelola sistem email dengan lebih efisien, aman, dan terstruktur.

  • Struktur File Ansible untuk Instalasi Zimbra Single Server

    Struktur File Ansible untuk Instalasi Zimbra Single Server

    Beberapa waktu terakhir saya iseng oprek oprek menyusun ulang project Ansible saya untuk instalasi Zimbra single server. Alasannya sederhana, dulu saya buat struktur seadanya, satu playbook panjang, variabel campur aduk, dan ujungnya susah dipakai ulang. Jadi di postingan ini saya bagikan bagaimana saya menata file dan folder Ansible untuk instalasi Zimbra single server, lengkap dengan alasan kenapa tiap bagian saya pisah seperti itu.

    Postingan ini fokus pada strukturnya saja, bukan isi task detail per file. Kalau ada bagian yang mau saya dalami di tulisan terpisah, silakan kasih tahu saya di komentar.

    Gambaran umum

    Begini struktur akhir yang saya pakai sekarang.

    tree zimbra-ansible

    Output tree zimbra-ansible/ di terminal saya jadikan screenshot pertama, biar pembaca punya gambaran utuh sebelum saya bahas tiap bagian.

    ansible.cfg

    File ansible.cfg di root project saya pakai untuk override default Ansible khusus project ini, jadi tidak perlu menyentuh konfigurasi global di /etc/ansible/ansible.cfg. Isinya kira-kira soal lokasi inventory, path role, retry files yang saya matikan, dan beberapa setting koneksi SSH seperti host_key_checking = False saat lab.

    Manfaat utama menempatkan ansible.cfg di project, ketika ada anggota tim lain yang clone repository, mereka langsung dapat konfigurasi yang sama tanpa perlu setup global. Praktik komunitas memang menyarankan project-level config untuk repository yang akan dibagi.

    Inventory dan group_vars

    Folder inventory/ di project saya isinya hanya hosts.ini. File ini berisi daftar host beserta pengelompokannya. Untuk Zimbra single server isinya simpel, hanya satu host di bawah grup zimbra_servers. Walaupun cuma satu mesin, saya tetap pakai grup karena memudahkan kalau suatu hari struktur berkembang ke multi-server.

    Folder group_vars/ saya letakkan di root project, bukan di dalam inventory/. Ansible mendukung dua pola ini, dan saya pilih yang di root karena lebih mudah dilihat dan diedit. File all.yml di dalamnya menyimpan variabel yang berlaku untuk semua host, misalnya zimbra_version, zimbra_domain, zimbra_admin_email, timezone, dan URL download installer.

    Untuk skala single server, satu file all.yml sudah cukup. Kalau nanti host bertambah dan tiap grup butuh variabel berbeda, tinggal saya tambah file seperti group_vars/zimbra_servers.yml. Begitu pula host_vars/ belum saya buat karena belum perlu, tapi sudah siap saya tambahkan ketika ada host yang butuh override individual.

    site.yml

    File site.yml di root saya pakai sebagai entry point utama playbook. Isinya menarget grup zimbra_servers dan memanggil role zimbra_single. Di sini saya juga set become: true dan gather_facts: true, ditambah beberapa pre_tasks ringan seperti update cache paket atau memastikan Python tersedia di target.

    Untuk project sekecil ini saya belum pecah site.yml ke beberapa playbook di folder playbooks/. Kalau besok saya tambah role lain misalnya monitoring atau backup, baru saya pisah jadi playbooks/zimbra.yml, playbooks/monitoring.yml, lalu site.yml saya jadikan orchestrator yang berisi import_playbook saja.

    Role zimbra_single

    Bagian paling besar adalah role itu sendiri. Saya namai zimbra_single karena memang khusus untuk topologi single server. Nantinya kalau saya bikin multi-server, saya buat role terpisah seperti zimbra_mta atau zimbra_proxy agar tanggung jawab masing-masing role jelas, ketimbang memaksa satu role besar mengakomodasi semuanya dengan logika percabangan yang ribet.

    defaults dan vars

    Saya isi defaults/main.yml dengan variabel yang user role boleh ubah, misalnya path download installer, nama user dan grup Zimbra, dan daftar komponen yang diinstall. Sifatnya nilai default, prioritas paling rendah, jadi mudah di-override dari group_vars atau host_vars.

    Folder vars/ saya sengaja biarkan kosong untuk sekarang. Bedanya dengan defaults, isi vars/main.yml itu prioritasnya tinggi dan susah di-override tanpa sengaja. Saya rencanakan untuk konstanta internal role yang tidak boleh diutak-atik user, misalnya nama service Zimbra atau path binary zmcontrol. Karena belum ada kebutuhan konkret, saya biarkan dulu agar tidak menambah noise.

    tasks

    Folder tasks/ adalah jantung role. File main.yml saya buat tipis, isinya hanya include_tasks ke file-file lain berdasarkan urutan eksekusi. Pemecahan ini disengaja agar tiap file punya tanggung jawab tunggal dan mudah dibaca.

    File preflight.yml melakukan pengecekan awal sebelum instalasi dimulai. Cek RAM minimum, free disk space, versi OS yang didukung, dan resolusi DNS hostname. Kalau salah satu gagal, playbook stop di sini sebelum sempat merusak apa-apa. Ini investasi waktu yang worth it karena Zimbra cukup picky soal prasyarat.

    File os_debian.yml dan os_redhat.yml saya pecah berdasarkan OS family. Isinya menangani persiapan OS yang spesifik per distro, mulai dari instalasi paket dependensi, disable service yang bentrok seperti postfix atau sendmail bawaan, sampai konfigurasi firewall (UFW untuk Debian, firewalld untuk RHEL). Saya pilih pendekatan pecah file per OS ketimbang satu file panjang dengan when: ansible_os_family == "...", karena lebih bersih saat dibaca dan lebih mudah dirawat kalau salah satu distro butuh logika kompleks. Pemanggilannya tetap pakai when di main.yml, jadi hanya satu file yang dijalankan tergantung OS target.

    File download.yml mengunduh tarball installer Zimbra dari URL yang didefinisikan di variabel, lalu mengekstraknya ke direktori kerja. Saya tambahkan verifikasi checksum SHA256 di sini untuk memastikan file tidak korup atau diganti di tengah jalan.

    File install.yml menjalankan installer dalam mode unattended menggunakan config file. Ini bagian paling tricky karena installer Zimbra interaktif by default. Saya pakai template zinstall.cfg.j2 untuk menghasilkan config file yang dibaca oleh install.sh -s -c. Nilai yang ditemplate antara lain admin password, domain, time zone, hostname, dan komponen yang dipilih.

    File config.yml berisi konfigurasi setelah instalasi selesai. Set admin password lewat zmprov, atur quota default, konfigurasi domain dan COS, restart service kalau perlu, dan hal-hal lain yang sifatnya tuning post-install. Saya konsolidasikan ke satu file karena task-nya saling terkait dan dijalankan beruntun. Kalau ke depan jumlahnya membengkak, baru saya pecah lagi misalnya jadi ssl.yml, quota.yml, dan seterusnya.

    handlers

    Folder handlers/main.yml menyimpan handler yang dipanggil pakai notify. Untuk Zimbra saya punya handler restart zimbra yang menjalankan zmcontrol restart sebagai user zimbra, dan reload firewall. Pemakaian handler ini menjaga idempotensi, restart hanya terjadi kalau memang ada perubahan, bukan setiap kali playbook dijalankan.

    templates

    File-file di templates/ berekstensi .j2 karena diproses Jinja2. Saya punya dua, hosts.j2 untuk men-generate /etc/hosts yang Zimbra-friendly (urutan baris dan FQDN harus benar, kalau tidak installer langsung gagal), dan zinstall.cfg.j2 untuk config file installer Zimbra yang dipakai mode unattended.

    Praktik yang saya ikuti, semua nilai yang berubah-ubah saya parameterkan lewat variabel, bukan hardcode di template. Misalnya {{ zimbra_admin_password }}, {{ zimbra_domain }}, {{ ansible_fqdn }}. Dengan begini template bisa dipakai ulang untuk berbagai environment tanpa harus diedit ulang.

    requirements.yml

    Di root project saya punya requirements.yml yang mendaftarkan collection eksternal yang dipakai role, misalnya community.general dan ansible.posix. Anggota tim lain yang clone repo cukup jalankan ansible-galaxy collection install -r requirements.yml dan dependency mereka beres.

    Praktik ini termasuk yang sering dilupakan tapi sangat penting. Tanpa requirements.yml, playbook bisa error karena modul tidak ketemu, dan debugging-nya menyebalkan, apalagi kalau yang menjalankan bukan kalian sendiri.

    Hal yang belum saya tambahkan

    Ada beberapa hal yang belum ada di struktur sekarang tapi sebenarnya layak dipertimbangkan ke depan.

    Pertama, Ansible Vault untuk menyimpan secret seperti password admin Zimbra dan password LDAP. Pola yang biasa dipakai, buat file group_vars/vault.yml yang dienkripsi pakai ansible-vault encrypt, lalu variabel di dalamnya diberi prefix vault_. Di file plaintext tinggal dibuat alias seperti zimbra_admin_password: "{{ vault_zimbra_admin_password }}". Untuk lab saya masih pakai variabel plaintext, tapi sebelum dipakai di environment yang lebih serius, vault wajib ditambahkan.

    Kedua, folder meta/ di dalam role yang berisi metadata seperti author, license, dan platform yang didukung. Kalau suatu hari role ini saya publish ke Ansible Galaxy atau saya share ke tim lain, file ini yang dibaca pertama kali. Tidak urgent untuk lab, tapi bagus dimiliki.

    Ketiga, README di dalam role itu sendiri. README di root sudah ada, tapi role yang reusable idealnya punya README sendiri yang mendokumentasikan variabel yang tersedia dan contoh pemakaian.

    Penutup

    Struktur di atas bukan satu-satunya cara, tapi cukup mewakili praktik yang umum dipakai komunitas Ansible. Inti yang saya pegang ada empat, pisahkan inventory dari role agar reusable, taruh variabel sesuai hierarki, pecah tasks per tanggung jawab, dan jangan pernah commit secret tanpa enkripsi.

    Kalau kalian baru mulai dengan Ansible, saran saya jangan langsung niru struktur lengkap. Mulai dari yang sederhana, satu playbook, satu inventory, satu role. Begitu kompleksitas naik, baru pelan-pelan pecah sesuai kebutuhan. Struktur yang baik itu yang menjawab masalah nyata, bukan struktur yang rapi tapi over-engineered untuk skala kecil.

    Kalau ada bagian yang ingin saya bahas lebih detail, misalnya isi zinstall.cfg.j2 lengkap atau task instalasi Zimbra step by step, kasih tahu saya di komentar.

  • Troubleshoot Zimbra: Email Tidak Terkirim Antar User Beda Mailbox

    Troubleshoot Zimbra: Email Tidak Terkirim Antar User Beda Mailbox

    Halo kembali lagi bersama Rafi. Tulisan kali ini saya buat sebagai catatan setelah saya selesai instalasi Zimbra dengan skema multi server di lab. Selesai instalasi, semua service kelihatannya aman, tidak ada error mencolok, login webmail juga lancar. Tapi begitu saya coba kirim email dari satu user ke user lain, email tidak pernah sampai ke inbox. Awalnya saya pikir mailbox yang bermasalah, ternyata jawabannya jauh lebih sepele, yaitu di resolv.conf. Berikut alur troubleshoot yang saya lakukan, semoga membantu kalian yang mengalami gejala serupa.

    Skema Lab Multi Server

    Sebelum masuk ke troubleshoot, saya cantumkan dulu skema lab yang saya pakai supaya kalian punya gambaran. Saya pisah role-nya per node:

    • ldap1.zimbra.server sebagai LDAP master dan DNS server
    • mbox1.zimbra.server sebagai mailbox node pertama
    • mbox2.zimbra.server sebagai mailbox node kedua
    • mta1.zimbra.server sebagai MTA+proxy node pertama
    • mta2.zimbra.server sebagai MTA+proxy node kedua

    User saya untuk uji coba ada dua, user1@zimbra.server yang mailbox-nya ada di mbox2, dan user2@zimbra.server yang mailbox-nya ada di mbox1.

    Periksa Log di MTA

    Saya login ke webmail sebagai user2@zimbra.server, lalu kirim email ke user1@zimbra.server. Di webmail terlihat email berhasil terkirim, tidak ada notifikasi error apapun di sisi pengirim. Tapi setelah saya cek inbox user1, email tidak ada.

    tail zimbra.log di mta2:

    su - zimbra
    tail -f /var/log/zimbra.log

    muncul

    Sampai sini saya pikir email lulus filter dan semua aman, namun akhirnyaaa…..

    Ketemu Error-nya

    Ternyata status email bounced:

    postfix/lmtp: 8EC8263EB4: to=<user1@zimbra.server>, relay=none,
      status=bounced (Host or domain name not found.
      Name service error for name=mbox2.zimbra.server type=A: Host not found)

    grep pesan bounced

    Ini menjelaskan kenapa email “terkirim” dari sisi user tapi tidak pernah sampai. MTA tahu mailbox tujuan ada di mbox2.zimbra.server, tapi MTA tidak bisa resolve A record dari hostname itu. Bahkan untuk balik mengirim notifikasi bounce ke user2, MTA juga gagal resolve mbox1.zimbra.server. Status code 5.4.4 di sini artinya “Unable to route”, yaitu murni masalah routing/DNS, bukan masalah autentikasi atau filter.

    Untuk memastikan, saya coba resolve manual dari mta2:

    [root@server ~]# getent hosts mbox2.zimbra.server
    [root@server ~]# dig +short mbox2.zimbra.server A

    dig Hasilnya kosong. Kemudian saya cek resolver-nya:

    [root@mta2 ~]# cat /etc/resolv.conf
    nameserver 127.0.0.1
    # Generated by NetworkManager
    search zimbra.server
    nameserver 192.168.14.80
    nameserver 8.8.8.8

    Dan inilah dia:

    nameserver 127.0.0.1

    Resolver di mta2 mengarah ke 127.0.0.1, padahal di node ini saya tidak menjalankan DNS server lokal. Setiap kali Postfix butuh resolve hostname mailbox, dia bertanya ke localhost, tidak ada yang jawab, jadi langsung gagal.

    Perbaikan resolv.conf

    Solusinya sederhana, saya arahkan resolver ke DNS server internal yang memang punya zona untuk zimbra.server. Saya edit /etc/resolv.conf:

    nameserver 192.168.14.80 #IP_ldap
    search zimbra.server

    Setelah itu saya tes ulang resolusi nama:

    [root@server ~]# getent hosts mbox1.zimbra.server
    192.168.14.81   mbox1.zimbra.server mbox1
    
    [root@server ~]# getent hosts mbox2.zimbra.server
    192.168.14.82   mbox2.zimbra.server mbox2

    Penutup

    Kasus ini sebenarnya simpel sekali, tapi gejalanya bisa bikin bingung karena di sisi user email kelihatan terkirim normal, dan log MTA juga menampilkan banyak baris “CLEAN” dan “Ok” sebelum akhirnya bounce. Pelajaran yang saya ambil, untuk deployment Zimbra multi server, DNS internal itu wajib hukumnya, dan resolv.conf di tiap node harus dicek satu per satu jangan sampai mengarah ke 127.0.0.1 kalau memang tidak ada DNS server lokal. Sebagai pengaman tambahan, isi juga /etc/hosts di semua node. Sekian dari saya, semoga catatan ini berguna kalau kalian mengalami hal yang sama.

  • Mengenal License Daemon Service (LDS) di Zimbra 10.1

    Mengenal License Daemon Service (LDS) di Zimbra 10.1

    Salah satu hal yang membuat saya cukup lama “linglung” waktu pertama kali memegang Zimbra 10.1 di lab adalah urusan lisensi. Hampir semua tutorial yang berserakan di internet menyebut soal file ZCSLicense.xml di /opt/zimbra/conf/, perintah zmlicense -i untuk install, dan konsep license daemon yang menempel di mailstore. Setelah saya cek langsung di server lab, semua referensi itu ternyata tidak lagi 100% benar. Zimbra 10.1 sudah memperkenalkan mekanisme lisensi yang baru, dan saya rasa ini topik yang perlu saya tulis supaya teman-teman tidak mengulangi kebingungan yang sama.

    Apa yang Berubah di Zimbra 10.1

    Zimbra 10.1 yang rilis pertengahan 2024 memperkenalkan service baru bernama License Daemon Service atau singkatnya LDS. Service ini adalah komponen wajib di Zimbra Network Edition, dan bertugas menjadi jembatan antara mailbox server kalian dengan server lisensi resmi Zimbra (license.zimbra.com).

    Yang lebih signifikan, format lisensinya juga berubah. Kalau dulu kalian terbiasa dengan file XML, sekarang lisensi online menggunakan kunci alfanumerik 18 sampai 26 karakter yang kalian aktivasi via perintah. File XML hanya masih digunakan untuk skenario offline activation, dengan flow yang berbeda dari sebelumnya.

    Konsep “license daemon menempel di mailstore” yang banyak ditemui di dokumentasi versi 8 dan 9 sudah tidak berlaku. LDS sekarang adalah service yang berdiri sendiri, dengan package terpisah bernama zimbra-license-daemon.

    Dimana LDS Sebaiknya Ditempatkan

    Inilah pertanyaan yang menurut saya paling sering bikin bingung waktu instalasi multi-server. Berdasarkan rekomendasi resmi Zimbra, ada tiga opsi penempatan, dengan urutan preferensi sebagai berikut.

    • Pilihan pertama dan paling direkomendasikan adalah node dedicated khusus untuk LDS. Ini cocok untuk environment produksi dengan banyak mailbox server. LDS adalah service yang ringan, tidak butuh resource besar, tapi memisahkannya membuat pengelolaan lebih bersih.
    • Pilihan kedua, kalau tidak memungkinkan punya node terpisah, LDS bisa ditempatkan di node Proxy atau MTA. Alasannya, dua node ini biasanya memang sudah punya jalur keluar ke internet karena posisinya di edge. Jadi tidak perlu membuka rute baru hanya untuk LDS.

    Yang penting untuk kalian ingat, LDS tidak direkomendasikan ditempatkan di mailstore. Ini perubahan mendasar dari konsep lama Zimbra. Mailstore biasanya berada di zona internal yang lebih tertutup, dan menambahkan kebutuhan internet di sana hanya untuk lisensi mencampur tanggung jawab yang sebenarnya bisa dipisah.

    Urutan Instalasi yang Benar di Multi-Server

    Karena LDS adalah prasyarat untuk mailbox server, urutan instalasi multi-server di Zimbra 10.1 menjadi:

    1. Install dan konfigurasi LDAP server
    2. Install LDS di node dedicated atau di Proxy/MTA
    3. Baru install mailbox server
    4. Lanjut ke MTA, Proxy, dan komponen lain

    Kalau kalian mencoba install mailbox dulu sebelum LDS, installer akan menolak dengan pesan yang cukup jelas: zimbra-license-daemon should be installed prior to zimbra-store. Saya pernah lupa urutannya dan akhirnya harus mengulang dari awal.

    Perintah Dasar yang Perlu Dikenal

    Ada dua keluarga perintah yang akan sering kalian pakai. Yang pertama untuk mengelola lisensinya sendiri, yang kedua untuk mengelola service LDS-nya.

    Untuk lisensi, gunakan zmlicense sebagai user zimbra:

    zmlicense -a <LICENSE-KEY>     # Aktivasi lisensi online (kunci alfanumerik)
    zmlicense -A /path/to/license.xml  # Aktivasi lisensi offline (file XML)
    zmlicense -p                    # Lihat detail lisensi
    zmlicense -c                    # Cek status lisensi
    zmlicense -rc                   # Refresh cache lisensi di mailbox

    Perhatikan perbedaan antara -a huruf kecil dan -A huruf besar. Yang kecil untuk online, yang besar untuk offline. Saya pernah salah ketik dan menghabiskan waktu cukup lama untuk sadar.

    Untuk service LDS-nya, gunakan zmlicensectl:

    zmlicensectl --service status       # Cek status service
    zmlicensectl --service start        # Start service
    zmlicensectl --service stop         # Stop service
    zmlicensectl --service setLogLevel=DEBUG  # Set level log untuk troubleshoot
    zmlicensectl --clearLicenseWorkDir  # Bersihkan working directory lisensi

    Memahami Grace Period

    Salah satu hal yang menurut saya cukup elegan di desain baru ini adalah konsep grace period. Mulai dari versi 10.1.10, kalau mailbox server kehilangan koneksi ke LDS selama kurang lebih 12 jam, sistem masuk ke mode grace period. Selama periode ini, mail flow tetap berjalan, tapi ada peringatan di admin console. Ini memberi kalian waktu untuk memperbaiki masalah konektivitas sebelum service benar-benar terganggu.

    Buat saya, ini menunjukkan bahwa Zimbra serius dengan reliability. Daripada langsung memutus service ketika ada masalah kecil di sisi lisensi, mereka memberi waktu untuk troubleshoot.

    Lokasi File Lisensi di 10.1

    Hal terakhir yang ingin saya luruskan. Di Zimbra 10.1, lisensi tidak lagi disimpan sebagai file XML statis di /opt/zimbra/conf/. Sekarang lokasinya di /opt/zimbra/license/store/, dan isinya bukan satu file XML melainkan beberapa file yang dikelola otomatis oleh LDS, seperti APV_secured.txt dan file pendamping lainnya.

    Jangan coba edit atau pindahkan file di direktori ini secara manual. Semua manipulasi harus lewat zmlicense dan zmlicensectl, supaya state internal LDS tetap konsisten.

    Refleksi Pribadi

    Yang saya pelajari dari mencoba memahami arsitektur ini adalah bahwa Zimbra 10.1 sebenarnya membawa Zimbra ke arah yang lebih modern dari sisi licensing. Mekanisme lama dengan file XML yang harus disalin manual antar server, validasi yang serba statis, dan license-daemon yang menempel di mailstore, semua itu adalah peninggalan era yang berbeda. Pendekatan baru dengan LDS sebagai service terpisah, dengan API, dengan grace period, dan dengan key alfanumerik untuk online, jauh lebih sejalan dengan praktik software modern.

    Tapi konsekuensinya, kalian harus berhati-hati membaca dokumentasi yang beredar di internet. Banyak artikel dan forum post yang relevan untuk Zimbra 8 atau 9, dan kalau diterapkan begitu saja ke 10.1, hasilnya akan keliru. Sumber paling aman adalah admin guide resmi Zimbra Daffodil v10 di zimbra.github.io/documentation/zimbra-10/. Saya akan menulis catatan lanjutan soal instalasi LDS di node terpisah dan troubleshoot LDS yang tidak running di postingan berikutnya, karena dua topik itu menurut saya cukup berdiri sendiri dan layak dibahas terpisah.

    Buat teman-teman yang sedang dalam perjalanan migrasi ke Zimbra 10.1, semoga catatan ini membantu meluruskan beberapa hal dasar sebelum kalian mulai menyentuh installer-nya. Lebih baik paham konsepnya dulu daripada kebingungan di tengah proses instalasi yang sudah berjalan setengah jalan.