bacula cliente y server en distintos servidores

Aloja! bueno este creo que es el tercer howto dedicado a bacula, y en este caso les voy a mostrar una configuración un poco más compleja de como hacer backups con bacula instalando el servidor (director y storage daemon) en un servidor distinto que el cliente (file daemon). Esto es útil muchas veces ya que si cae el servidor principal, seguramente querremos tener una copia de seguridad en otro lugar.


Algunas diferencias:

1) Lo más importante es evitar el error de nombres en el bacula, para lograrlo es importante que el nombre del director y del storage y file daemon coincidan, les dejó aquí una imagen que expresa la idea.

Conf-Diagram
2) otra cosa muy importante es que el file daemon es quien se conecta a storage daemon, así que para que funcione correctamente será necesario redireccionar el puerto donde queda escuchando el storage daemon.
3) Quizás el cambio más significativo entre un esquema y otro serán los comandos que se corren antes de comenzar a hacer el backup, ya que claro, el servidor no será el mismo así que los comandos se tienen que ejecutar vía ssh. Sobre todo porque el tiempo en copiar los archivos desde el cliente al servidor ya no será despreciable y es por esto que tenemos que utilizar una copia auxiliar para asegurarnos que el servicio no esté apagado mucho tiempo.

Acá van mis archivos de configuración, en el ejemplo hostclient es donde corre el file daemon, y hostserver donde corre el director y storage daemon.

—-bacula-sd.conf—-
Storage { # definition of myself
Name = u-pc-8-sd
SDPort = 9103 # Director’s port
WorkingDirectory = “/var/lib/bacula”
Pid Directory = “/var/run/bacula”
Maximum Concurrent Jobs = 20
SDAddress = 192.168.1.28
Heartbeat Interval = 15 sec
}

Director {
Name = u-pc-8-dir
Password = “m/k3mhFkxEXzQMbLDWXuGGlJgZX9P3j/kB70CoOQr740”
}

Director {
Name = u-pc-8-mon
Password = “eNY58lAD8f5HXdHQG9NnPPDlBDFFL1QkqjOdgxcRpRJ7”
Monitor = yes
}

Device {
Name = FileStorage
Media Type = File
Archive Device = /media/backup/bacula
LabelMedia = yes; # lets Bacula label unlabeled media
Random Access = Yes;
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
}
Messages {
Name = Standard
director = u-pc-8-dir = all
}

—-EOF—-
—bacula-dir.conf—
Director {
Name = u-pc-8-dir
DIRport = 9101 # where we listen for UA connections
QueryFile = “/etc/bacula/scripts/query.sql”
WorkingDirectory = “/var/lib/bacula”
PidDirectory = “/var/run/bacula”
Maximum Concurrent Jobs = 1
Password = “iA6pwbPuT2zUt/hbyE2hj4kwnkG5qmjw7x7a+6MB9bbO” # Console password
Messages = Daemon
DirAddress = 127.0.0.1
}

JobDefs { #no es mas que un template para jobs, viene a ser como una configuracion global que puede ser sobreescribida por jobs
Name = “DefaultJob”
Type = Backup
Level = Incremental
Client = hostclient-fd
Storage = File
Messages = Standard
Pool = Default
Priority = 10
}

Job {
Name = “ClearSpace”
Level = Incremental
FileSet = “ClearSpace”
JobDefs = “DefaultJob”
Schedule = “Daily”
Write Bootstrap = “/var/lib/bacula/ClearSpace.bsr”
RunBeforeJob = “/sbin/prejive”
}

# Archivos que serán backupeados
FileSet {
Name = “ClearSpace”
Include {
Options {
signature = MD5
}
File = /home/backupjive
}

Exclude {
File = /home/backupjive/var/data
File = /home/backupjive/var/logs
}
}

Job {
Name = “Zimbra”
Level = Incremental
FileSet = “Zimbra”
JobDefs = “DefaultJob”
Schedule = “Daily”
Write Bootstrap = “/var/lib/bacula/Zimbra.bsr”
# Apago el servicio
RunBeforeJob = “/sbin/prezimbra”
# Prendo el servicio

}

# Archivos que serán backupeados
FileSet {
Name = “Zimbra”
Include {
Options {
signature = MD5
}
File = /home/backupzimbra/zimbra/
}

Exclude {
File = /home/backupzimbra/zimbra/log
File = /home/backupzimbra/zimbra/zmstat
}
}

Job {
Name = “Apache”
Level = Incremental
FileSet = “Apache”
JobDefs = “DefaultJob”
Schedule = “Daily”
Write Bootstrap = “/var/lib/bacula/Apache.bsr”
}

# Archivos que serán backupeados
FileSet {
Name = “Apache”
Include {
Options {
signature = MD5
}
File = /var/www/
}
}

Job {
Name = “Mysql”
Level = Incremental
FileSet = “Mysql”
JobDefs = “DefaultJob”
Schedule = “Daily”
Write Bootstrap = “/var/lib/bacula/Mysql.bsr”
# backup en caliente
RunBeforeJob = “ssh hostclient ‘sudo -u root /sbin/mysqlprebackup'”
}

# Archivos que serán backupeados
FileSet {
Name = “Mysql”
Include {
Options {
signature = MD5
}
File = /home/mysql/
}
}

Schedule {
Name = “Daily”
Run = Full 1st sun at 20:05
Run = Differential 2nd-5th sun at 20:05
Run = Incremental mon-sat at 20:05
}

# Client (File Services) to backup
Client {
Name = hostclient-fd
Address = hostclient
FDPort = 9102
Catalog = MyCatalog
Password = “Nlw2vp555z4vep0viaBpeALX6nlP9An8NQx5J/lLK9LY” # password for FileDaemon
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
}

# Definition of file storage device
Storage {
Name = File
# Do not use “localhost” here
Address = hostserver # N.B. Use a fully qualified name here
SDPort = 9103
Password = “m/k3mhFkxEXzQMbLDWXuGGlJgZX9P3j/kB70CoOQr740”
Device = FileStorage
Media Type = File
}

# Generic catalog service
Catalog {
Name = MyCatalog
dbname = bacula; DB Address = “”; user = bacula; password = “g4br13la”
}

Messages {
Name = Standard
mailcommand = “/usr/lib/bacula/bsmtp -h localhost -f \”\(Bacula\) %r\” -s \”Bacula: %t %e of %c %l\” %r”
operatorcommand = “/usr/lib/bacula/bsmtp -h localhost -f \”\(Bacula\) %r\” -s \”Bacula: Intervention needed for %j\” %r”
mail = root@localhost = all, !skipped
operator = root@localhost = mount
console = all, !skipped, !saved
append = “/var/lib/bacula/log” = all, !skipped
}

#
# Message delivery for daemon messages (no job).
Messages {
Name = Daemon
mailcommand = “/usr/lib/bacula/bsmtp -h localhost -f \”\(Bacula\) %r\” -s \”Bacula daemon message\” %r”
mail = root@localhost = all, !skipped
console = all, !skipped, !saved
append = “/var/lib/bacula/log” = all, !skipped
}

# Default pool definition
Pool {
Name = Default
Pool Type = Backup
Recycle = yes # Bacula can automatically recycle Volumes
AutoPrune = yes # Prune expired volumes
Volume Retention = 365 days # one year
Accept Any Volume = yes # write on any volume in the pool
}

#
# Restricted console used by tray-monitor to get the status of the director
#
Console {
Name = u-pc-8-mon
Password = “GxVW6dfnO+EVBPpkIdd5VXF8RdzYXx3lEJ+g86Gs+qIP”
CommandACL = status, .status
}
—-EOF—
—@client:/etc/bacula/bacula-fd.conf—
Director {
Name = u-pc-8-dir
Password = “Nlw2vp555z4vep0viaBpeALX6nlP9An8NQx5J/lLK9LY”
}

#
# Restricted Director, used by tray-monitor to get the
# status of the file daemon
#
Director {
Name = u-pc-8-mon
Password = “eNY58lAD8f5HXdHQG9NnPPDlBDFFL1QkqjOdgxcRpRJ7”
Monitor = yes
}

#
# “Global” File daemon configuration specifications
#
FileDaemon { # this is me
Name = hostclient-fd
FDport = 9102 # where we listen for the director
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run/bacula
Maximum Concurrent Jobs = 20
FDAddress = XXX.XXX.XXX.XX
Heartbeat Interval = 15 sec
}

# Send all messages except skipped files back to Director
Messages {
Name = Standard
director = hostclient-dir = all, !skipped, !restored
}
—-EOF—-
—/sbin/prezimbra—-
ssh zimbra@hostclient ‘zmcontrol stop’
ssh root@hostclient rsync -az –delete /opt/zimbra/ /home/backupzimbra/zimbra
ssh zimbra@hostclient ‘zmcontrol start’
—-EOF—-
—/sbin/prejive—
ssh jive@cari1.perseiconsulting.eu ‘/home/jive/bin/appstop’
ssh root@cari1.perseiconsulting.eu rsync -az –delete /usr/local/jive/ /home/backupjive/
ssh jive@cari1.perseiconsulting.eu ‘/home/jive/bin/appstart’
—EOF—

Claro que para que todo funcione hay que generar la public key de ssh
su bacula
ssh-keygen -b 2048 -C “SSH Tunnel for bacula” -t rsa -f bacula_tunnel -N “”

y agregarla a cada usuario, en mi caso zimbra, jive y root.

NOTA1: si están recibiendo el error “Fatal error: No Job status returned from FD.” agreguen “Heartbeat Interval = 15 sec” al fileDaemon y al StorageDaemon.
NOTA2: si reciben en el error_log del apache algo cómo:
[Fri Dec 04 18:33:04 2009] [error] [client 200.43.26.253] E: bconsole (, referer: http://hostserver:8081/cgi-bin/bweb/bweb.pl?
[Fri Dec 04 18:33:04 2009] [error] [client 200.43.26.253] /usr/bin/bconsole, referer: http://hostserver:8081/cgi-bin/bweb/bweb.pl?
[Fri Dec 04 18:33:04 2009] [error] [client 200.43.26.253] ) Invalid argument -1, referer: http://hostserver:8081/cgi-bin/bweb/bweb.pl?

Es por su versión de bconsole, la de debian por ejemplo es vieja, lo que hay que hacer es bajar el source de bacula y compilar solo la consola, copiar y especificar el uso de esa consola en la configuración del bweb.

Si te sirvió deja un comentario para alentarme a seguir con el proyecto.

Saludos.

Tags: , , ,

12 Responses to “bacula cliente y server en distintos servidores”

  1. FlaPer87 says:

    Excelente, siempre es bueno encontrar ejemplos de configuraciones….

  2. Diego says:

    Hola,

    Tengo un problema de conexion desde un cliente windows hacia el servidor donde esta el director, es decir, el fd – no se puede conectar al dir, sale el siguiente error: Failed to connect to Client siigo-fd

    • Diego says:

      Ya lo solucione, para los que tengan este problema, es muy importante tener en cuenta, que la contraseña en el segmento Client {…} del archivo director, debe ser igual a la que se coloca en el *.fd del cliente. Como en el esquema ubicado arriba. Eso pasa por no leer.

  3. Diego says:

    Espero me puedan ayudar con este error: Device “FileStorage” (/root/Backup) is not open. No se puede abrir el destino. Que hago?

  4. Maocv says:

    Excelente howto.. En toda la configuración siempre me ha quedado una duda respecto a la función de los job retention y file retention….

    Thanks

  5. diego says:

    execelente tu tutorial, un fabor podrias hacer uno sombre migracion de copias de bacula

  6. david says:

    Hola compañero:

    Cojonudo el tutorial, tras tener todo perfectamente configurado y funcionando tengo un cliente con windows 7 64 que con el bat del servidor me devuelve:

    Failed to connect to Client Client3-FD la configuracion del windows esta bien y funcionaba los puertos estan abiertos, al hacer un nmap a la direccion del win me dice que esta abierto el 9102 pero no va ni pa dios, le he downgradeado la version a la 5.0.1 ya que el servidor corre u 5.0.0 sobre centos, ya no se que hacer porfavor mira si me puedes ayudar.

    Muchas gracias

    • david says:

      Resulta que he hecho un telnet a la maquina con los diferentes puertos y solo me responde el 9102

      • david says:

        Ya esta lo solucione soy idiota solo abri los puertos de windows para local (que capullo….)

        Muchas gracias.

        Tu tuto es cojonudo

        agur.