(1) Ikatlah ilmu dengan menuliskannya...

Migrasi Postfix + Courier + MySQL Virtual User & Domain ke Zimbra Collaboration Suite

Beberapa bulan lalu saya melakukan pemindahan (migrasi) sistem pada salah satu email server yang saya kelola. Kebetulan existing server menggunakan Postfix + Courier + MySQL Virtual User & Domain untuk mengurusi email dengan user 500+ dan akan dipindahkan ke Zimbra Collaboration Suite versi OSE.

Baiklah tanpa panjang lebar, berikut cara migrasi nya :

1. Migrasi Akun

Karena metode otentifikasi email server lama menggunakan MySQL yang menyimpan data username dan password dalam sebuah tabel, maka kita buat script berikut yang akan membaca tabel user dan meng-export nya kedalam sebuah file.

Buat file : export.php

#!/usr/bin/php5
// Postfix.admin to Zimbra import
//
// Created by Jaroslaw Czarniak on 26-10-2008
// Modified By Gigih Forda Nama : 2011

/////////////////////////////////////////////////////////
$user="namaUser";
$pass="passWordnya";
$base="namaDatabase";
$tabl="namaTabelUser"; //table
$file="exported.sh";

/////////////////////////////////////////////////////////
echo "Usage: as \"zimbra\" user on destination server:\n";
echo "# sh ./exported.sh\n\n";
echo "";

$mydb = mysql_connect('localhost',$user, $pass) or die ('Error of connection with server');
mysql_select_db($base);
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET NAMES utf8");

$query = "SELECT email,password FROM ".$tabl;
$dane = mysql_query($query) or die ('Error during query for bazy1'.mysql_error());

$handle = fopen($file, "w");

while ($row = mysql_fetch_array($dane, MYSQL_NUM))
{
    $StringData = "zmprov ca ".$row[0]." dsfs123hsdyfgbsdgfbsd displayName '".$row[0]."'\n";
    fwrite($handle, $StringData);
    $StringData = "zmprov ma ".$row[0]." userPassword '{crypt}".$row[1]."'"."\n";
    fwrite($handle, $StringData);
}
?>

Jalankan file tersebut dengan command php :

[[email protected] ~]# php -f export.php

Setelah berjalan akan terdapat file exported.sh pada direktori yang sama. File ini yang akan kita jalankan di server zimbra collaboration suite yang telah disiapkan.

Copy file exported.sh tersebut ke server zimbra yang baru, ubah mode nya menjadi executable, lalu eksekusi dengan dot slash :

[[email protected] ~]# chmod +x exported.sh

[[email protected] ~]# ./exported.sh

Tunggu hingga proses pembuatan akun selesai, waktu yang dibutuhkan tergantung banyaknya user. Pengalaman saya dibutuhkan waktu + 4 Jam untuk generate 500+ user.

2. Migrasi Data

Migrasi data dapat dilakukan jika migrasi akun sudah selesai semua. Caranya copy direktori spool email Postfix + Courier + MySQL Virtual User & Domain ke server zimba yang baru. Biasanya spool directory postfix terdapat di : /home/vmail/

[[email protected] ~]# scp -r /home/vmail [email protected]:/usr/local/virtual/

Tunggu hingga semua spool directory tercopy di server zimbra yang baru. Waktu copying tergantung file size direktory nya. Setelah selesai, masuk ke zimbra server dan buat file berikut ini pada direktory yang sejajar dengan direktory nama domain nya.

Nama file : migrasi.sh

#!/bin/bash

# Postfix virtual transport -> Zimbra mailbox migration
# written by NERvOus (http://www.nervous.it) - 2009-12-25, Modified By Gigih Forda Nama 2011

# base folder where msgs will be imported
BFOLDER="Inbox"
ZMMBOX="/opt/zimbra/bin/zmmailbox"
BDIR=$(pwd)

echo You must run $0 from inside /var/mail/virtual directory
echo $0 expects to find the mailboxes in the current path!
echo The structure of maildirs must be as follows:
echo
echo "domain/username/{cur|new|tmp}"
echo "domain/username/subfolder1/{cur|new|tmp}"
echo "domain/username/subfolder2/{cur|new|tmp}"
echo ...
echo
echo All folders will be stored in a subfolder called $BFOLDER
echo The hierarchy of subfolders will be maintained under $BFOLDER.
echo
echo Press Enter to start, CTRL+C to abort.
read

# handle folders with a space inside, they are more common than you may
# think
IFS='
'
for p in $(find . -type d -name cur); do
        DOMAIN=`echo $p | cut -d'/' -f2`
        UNAME=`echo $p | cut -d'/' -f3`
        DIRNAME=`echo $p | cut -d'/' -f4`
        # this may fail, if folder already exists. Who cares. Ignore the
        # error.
        echo createFolder /$BFOLDER | $ZMMBOX -z -m [email protected]$DOMAIN
        if [ "$DIRNAME" == "cur" ]; then
                echo Importing INBOX folder for [email protected]$DOMAIN from $BDIR/$DOMAIN/$UNAME/ 1>&2
                # we are importing the top level folder
                echo addMessage /$BFOLDER $BDIR/$DOMAIN/$UNAME/cur | $ZMMBOX -z -m [email protected]$DOMAIN
                echo addMessage /$BFOLDER $BDIR/$DOMAIN/$UNAME/new | $ZMMBOX -z -m [email protected]$DOMAIN
        else
                DIRNAME=$(echo $DIRNAME | sed -e 's/\/cur$//')
                echo Importing folder $DIRNAME for [email protected]$DOMAIN from $BDIR/$DOMAIN/$UNAME/$DIRNAME 1>&2
                echo createFolder \'/$BFOLDER/$DIRNAME\' | $ZMMBOX -z -m [email protected]$DOMAIN
                echo addMessage \'/$BFOLDER/$DIRNAME\' \'$BDIR/$DOMAIN/$UNAME/$DIRNAME/cur\' | $ZMMBOX -z -m [email protected]$DOMAIN
                echo addMessage \'/$BFOLDER/$DIRNAME\' \'$BDIR/$DOMAIN/$UNAME/$DIRNAME/new\' | $ZMMBOX -z -m [email protected]$DOMAIN
        fi
done

 

Setelah disimpan, lalu ubah mode file nya menjadi executable dan jalankan (Perhatikan lokasi file migrasi.sh, pastikan sejajar dengan folder domain bukan user)

[[email protected] ~]# chmod +x migrasi.sh

[[email protected] ~]# ./migrasi.sh

Tinggal tunggu hingga proses selesai. Biasanya memakan waktu yang cukup lama. 

<< Go back to the previous page