Lo que vamos a hacer es una copia completa de todo el sistema operativo y de los datos de un servidor VPS. Obtendremos un fichero comprimido con el backup y lo guardaremos en el almacenamiento MEGA. Si el servidor sufriera algún problema grave que viera comprometidos no solo nuestras webs, bases de datos y correo electrónico, sinó también el propio sistema operativo y todos los programas y configuraciones instalados a lo largo del tiempo, podremos restaurarlo sin problemas y dejarlo como estaba en el momento de hacer el backup. Si somos cuidadosos y hacemos una copia completa de forma regular o al menos después de hacer cambios significativos en el servidor, seguramente nos ahorraremos muchos problemas y tiempo.

Un backup completo no es necesario hacerlo cada día, será suficiente con una vez a la semana o cada dos semanas, o mensual, dependera de que tan a menudo hagamos cambios en el sistema. Lo que si debemos tener es una política de copias de seguridad diarias de nuestras webs, las bases de datos, correo electrónico, etc. Pero esto es otra historia.

IMPORTANTE. Vamos a necesitar espacio suficiente en nuestro servidor para crear temporalmente el archivo de backup, que aunque comprimido pueden ser varios gigas. Si ejecutamos el comando du -bsh en nuestro servidor sabremos el volumen total sin comprimir, el archivo de backup comprimido podría ser la mitad o quizás algo menos. Como espacio libre necesitaríamos el doble.

Por ejemplo: Si el sistema y datos ocupan unos 4,7GB, un tar comprimido puede quedar en torno a los 1,8GB, por lo que necesitaríamos unos 4GB libres para trabajar con holgura.

1. Crear una cuenta en MEGA

Comenzamos y evidentemente lo primero que tenemos que tener es una cuenta de MEGA. ¿Porqué MEGA?, pues porque es una de las pocas o la única que nos permite acceder y gestionar nuestros ficheros y carpetas desde la consola de cualquier equipo Linux.

Para crear una cuenta solo hay que entrar en la web de MEGA e introducir los datos que nos pidan. El usuario y contraseña lo necesitaremos más adelante.

2. Instalar los programas necesarios

Vamos a instalar en nuestro servidor VPS todo lo necesario para hacer el backup. Vamos a crear un fichero tar comprimido con gzip, una vez creado lo vamos a cifrar usando openssl enc y finalmente lo vamos a transferir a nuestro almacenamiento Mega. Los programas tar y gzip ya estarán instalados y es de suponer que openssl y enc también (en caso contrario los instalamos). Nos faltaría instalar el programa que nos va a permitir conectar con el servidor Mega.

El programa es megacmd. Tenemos que descargar los fuentes desde la web del autor y compilarlo.

# cd /tmp
# wget https://github.com/t3rm1n4l/megacmd/archive/master.zip

Nos descarga un archivo llamado megacmd-master.zip. Ahora lo descomprimimos, lo compilamos y copiamos el ejecutable megacmd a /usr/local/bin.

# unzip megacmd-master.zip
# cd megacmd-master
# make
# cp megacmd /usr/local/bin

NOTA: En Debian 7 existe un problema con la versión de las herramientas golang-go necesarias para compilar, ya que se requiere una versión superior. Una posible solución podría ser instalar/actualizar golang-go desde los repositorios de Debian 8, pero en este caso, para mi lo más sencillo es compilar el programa en nuestro propio PC local y después copiar unicamente el fichero ejecutable megacmd a nuestro servidor. El único requisito es que nuestro PC y el servidor VPS sean de la misma architectura 64 bits o 32 bits.

Una vez que tengamos megacmd copiado en /usr/local/bin, tenemos que crear el archivo de configuración .megacmd.json. Como estamos en un VPS y trabajos como root lo crearemos en la carpeta /root.

# nano /root/.megacmd.json

Y escribimos el siguiente contenido:

{
"User" : "USUARIO_MEGA",
"Password" : "CONTRASEÑA_USUARIO_MEGA",
"DownloadWorkers" : 4,
"UploadWorkers" : 4,
"SkipSameSize" : true,
"Verbose" : 1
}

Ahora vamos a comprobar si podemos conectar con nuestro almacenamiento Mega.

# megacmd list mega:/

Deberiamos obtener la lista de carpetas y ficheros que hay en la raiz de Mega. Ahora, si no la hemos creado antes, vamos a crear una carpeta donde guardar los backups.

# megacmd mkdir mega:/backup_vps

Ya tenemos todo listo para poder hacer la copia de seguridad y subir el archivo de backup a Mega.

3. Hacer copia de seguridad

Vamos a hacer una copia de seguridad de todo el sistema, incluyendo las carpetas de usuario, correo electrónico, sitios web, etc. En la copia vamos a excluir el contenido de las carpetas /dev, /proc, /sys y /tmp también excluiremos los sockets que abren Apache y Postfix. Como sabemos el contenido de estas carpetas lo crea el sistema operativo cuando arranca y los sockets se vuelven a crear cuando arranquen de nuevo los programas que los usan. Así evitaremos algunas advertencias a la hora de crear el tar.gzip. Lo que haya en la carpeta /tmp no nos hace falta para nada.

Una buena practica si es posible, es detener los servicios que modifican ficheros, para evitar que cambien durante el proceso de backup. Lo ideal sería detenerlos y hacer esto en un horario que no afecte al funcionamiento del servidor, como por ejemplo de madrugada, por lo que incluso se podría crear una regla de cron para hacerlo automáticamente.

Algunos de los servicios que deberían detenerse podrían ser: apache2, bind9, postgresql, mysql, rsyslog, webmin, usermin, postfix, dovecot, proftpd, etc (en mi caso serían estos). Si la actividad del servidor no es demasiado frenética, tampoco debería pasar nada aunque no se detengan.

Vamos a comenzar creando un archivo con la lista de los sockets abiertos por Apache y Postfix para poder excluirlos más adelante.

# find /var /run -type s -print > /tmp/lista-sockets

Esto busca en las carpetas /var y /run todos los sockets abiertos y los escribe en el fichero /tmp/lista-sockets

Ahora creamos una carpeta de trabajo para crear el archivo tar.gz del backup, más tarde se borrará.

# mkdir /backup
# cd backup

Ya podemos crear nuestro archivo .tar.gz con la copia completa y exluyendo lo comentado antes

# tar -czvpf backuptotal-fecha-hora.tar.gz --exclude=/backup/* --exclude=/dev/* --exclude=/proc/* --exclude=/sys/* --exclude=/tmp/* -X /tmp/lista-sockets / 2>error.log

Donde:

-czvpf  Crea un tar comprimido con gzip, preservando permisos, mostrando detalles de lo que hace.
–exlude=/carpeta/*  Excluye unicamente el contenido de la carpeta pero mantiene la propia carpeta. Tambien excluimos la propia carpeta /backup, logicamente para que no se meta en un bucle infinito muy poco recomendable.
-X nombrefichero  Excluye los ficheros y carpetas indicados dentro de nombrefichero.
2>error.log  Dirigimos la salida de los mensajes de error a un fichero para consultarlo si es necesario

4. Cifrar el archivo de copia de seguridad

Después de crear el archvo de backup tar.gz, vamos a cifrarlo para evitar que nadie pueda ver su contenido. Tengamos en cuenta que lo almacenaremos en la nube, nunca está de más tomar precauciones. Ahora bien, si nuestra idea es descargarlo a nuestro PC local, podemos omitar este paso si no nos interesa.

El cifrado con openssl consiste en utilizar una contraseña o frase para cifrar con aes256. La contraseña puede ser todo lo larga que se quiera, es recomendable no utilizar palabras del diccionario tal cual, ya que podrían ser facilmente descurbiertas  por fuerza bruta. La mejor idea es utilizar combinaciones de letras mayúsculas y minúsculas, números y cualquier tipo de caracteres especiales. Lógicamente hay que guardarla bien, ya que sino después no podríamos descifrar el archivo. La contraseña se puede pasar manualmente desde la línea de comandos o desde un fichero.

Para cifrar introduciendo la contraseña manualmente.

# openssl enc -e -aes256 -in backuptotal-fecha-hora.tar.gz -out backuptotal-fecha-hora.bc

La extensión del archivo cifrado puede ser cualquiera, yo he usado .bc (Backup Cifrado)
Nos pedirá la contraseña, que hemos de introducir dos veces.

Para cifrar leyendo la contraseña desde un fichero. Primero creamos un fichero, preferiblemente oculto (por ejemplo, .keyfile) y escribimos la contraseña. Después ciframos.

# openssl enc -kfile /root/.keyfile -e -aes256 -in backuptotal-fecha-hora.tar.gz -out backuptotal-fecha-hora.bc

Importante: La opción -kfile toma la contraseña de la primera fila del fichero .keyfile

Una vez obtenido el archivo de copia de seguridad cifrado, ya podemos borrar el archivo .tar.gz y también el fichero error.log

# rm *.tar.gz *.log

5. Sincronizar la carpeta /backup del VPS con la carpeta backup_vps de MEGA

Como último paso, tan solo nos queda poner a buen resguardo nuestra copia de seguridad cifrada, copiandola a nuestro almacenamiento en Mega. Para ello las sincronizaremos con el comando:

# megacmd sync /backup mega:/backup_vps

En la consola veremos el progreso de la transferencia, que dependiendo del tamaño y el ancho de banda, tardará más o menos en completarse.

Cuando termine la transferencia y hayamos verificado que el archivo se ha copiado en Mega correctamente, ya no tiene sentido ocupar espacio en el VPS, por lo que podemos borrar el archivo de la carpeta /backup.

Finalmente y como mencionaba al principio, nada nos impide descargar esta copia de seguridad a nuestro PC local en lugar de usar el almacenamiento de Mega. Yo he optado por Mega, ya que mi conexión a internet es una ADSL de 3Mb, y aunque no me preocupa esperar las muchas horas necesarias para descargarlo, el gran problema sería cuando tocase subirlo de nuevo al servidor, eso sería como poco, Misión Imposible.