Backup MX

From Frotmail Projects
Jump to navigation Jump to search

PostFix

PostFix als Backup MX

Dit heb ik gedaan om te zorgen dat mijn mailserver als backup/failback mailserver kan fungeren.

Maak een tabel in je postfix database:

 CREATE TABLE domainsbackup (
   id int(9) unsigned NOT NULL auto_increment,
   domain varchar(255) NOT NULL default ,
   active tinyint(1) unsigned default '1',
   PRIMARY KEY  (id),
   KEY id (id)
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

In deze tabel kan je het domein aangeven wat geaccepteerd mag worden door de mailserver en later bezorgt mag worden op de eerste mailserver. Ook kan je aangeven of die optie nu actief moet zijn of niet.

In het main.cf configbestand, voegen we de regels toe:

 # Backup MX
 relay_domains = mysql:/etc/postfix/mysql_backupmx.cf

in 'mysql_backupmx.cf' heb ik het volgende staan:

 hosts = localhost
 user = *db gebruiker*
 password = *db wachtwoord*
 dbname = *db naam*
 
 table = domainsbackup
 select_field = domain
 where_field = domain
 additional_conditions = and active = '1'

Nu herstarten we postfix, en gaan met die banaan

 postfix reload

Niet Spam & Virusscannen van backup domeinen

In de amavis home map een bestand aanmaken: backup_domains

Met de volgende inhoud:

 domeinnaam.nl  1
 domeinnaam2.nl 1

Amavis configuratie '/etc/amavisd.conf' openen. Volgende regels erin:

 @bypass_virus_checks_maps = ( \read_hash("$MYHOME/backup_domains") );
 @bypass_spam_checks_maps = ( \read_hash("$MYHOME/backup_domains") );

amavis reloaden, en gaan met die banaan.

Sync script

Script om db te dumpen naar een backup_domains file:

#!/usr/local/bin/php
<?php

##Config
 $amavisd = '/usr/local/sbin/amavisd';
 $amavisd_conf = '/etc/amavisd.conf';
 $amavisd_domains_noscan = '/etc/backup_domains';
 $debug = false;

## Create connection to database
 include ('../webroot/slave/config.php');
 connect('pfix');

## Debug?
 if( ($_SERVER['argc'] > 2) or (($_SERVER['argv'][1] != '-d') and ($_SERVER['argc'] == 2)) )
   die('Usage: '.$_SERVER['argv'][0]." [-d]\n       -d   Debugging on\n");

 if($_SERVER['argv'][1] == '-d')
   $debug = true;

## Generate new file
 if ($debug) echo "DEBUG: Generating new file\n*****************************\n";
 $query = "select * from backupmx where active=1";
 $result = mysql_query($query) or die('ERROR: Error in query: '.$query."\nERROR: ".mysql_error());
 $fp = fopen($amavisd_domains_noscan,"w");
 while ( $row = mysql_fetch_assoc($result))
 {
   fputs($fp,$row['domain']." 1\n");
   if ($debug) echo "DEBUG: ".$row['domain']." Added!\n";
 }
 fclose($fp);

## Reload amavisd
 if ($debug) echo "*****************************\nDEBUG: Amavisd reloading...\n";
 $reload = `$amavisd -c $amavisd_conf reload 2>&1 | grep Error`;
 if($reload != "")
   echo "ERROR: Amavisd NOT reloaded!\nERROR: $reload\n";
 else
   if ($debug) echo "DEBUG: Amavisd is succesfully reloaded\n";
?>

Cron friendly ;) bij een error blijft amavisd wel draaien en krijg je dus een mailtje met de foutmelding