Copias de seguridad cifradas de mailcow en Google Drive: retención, verificación y restauración

Convierte el script manual de mailcow en un servicio programado y cifrado con GnuPG, con copias locales y en Google Drive, verificación sin restaurar y restauración por componente.

mailcow incluye un buen script de copias de seguridad, pero es un comando que ejecutas a mano. Nada lo programa, nada lo cifra, nada lo saca del servidor, y restaurar implica responder a sus preguntas en la shell. Eso funciona hasta el día en que de verdad lo necesitas, normalmente en el peor momento posible.

Este tutorial explica cómo convertir ese script en un servicio que configuras una sola vez en Sistema → Backup: ejecuciones programadas con el propio backup_and_restore.sh de mailcow, cifrado con GnuPG (AES-256, con protección de integridad) antes de que nada llegue al disco, una copia local más una copia opcional en Google Drive, verificación sin restaurar y restauración por componente desde la página. El producto es Backup para mailcow; la referencia completa está en la guía de usuario.

Antes de empezar

  • mailcow-dockerized en Linux con docker compose y systemd.
  • El mailcow Toolkit 0.7.0 o superior de MediaLab Works: este módulo es uno de sus productos, con su propia licencia.
  • Acceso root en el host para ejecutar el instalador del Toolkit y salida HTTPS hacia medialab.works para la comprobación de licencia.
  • GnuPG en el host. Si falta: apt install gnupg.
  • Espacio libre en la carpeta local para unas dos copias de seguridad: una se construye mientras se conservan las anteriores.
  • Opcional, para Google Drive: una cuenta de Google y un cliente OAuth propio en Google Cloud.

Paso 1 — Instalar el módulo

En el host de mailcow, como root, ejecuta el instalador del Toolkit como de costumbre:

sudo ./install.sh --mailcow-dir /opt/mailcow-dockerized --name <instance>

Si el Toolkit ya está instalado, actualízalo desde Sistema → Actualizaciones (Toolkit). El instalador copia data/web/mlw-backup/, instala el script del host /usr/local/sbin/mlw-mailcow-backup-<instance>, crea la tabla de historial e instala el temporizador mlw-mailcow-backup-<instance>.timer, que cada 5 minutos comprueba si toca hacer una copia. Después abre Sistema → Backup en el menú de administración de mailcow.

Paso 2 — Activar la licencia

Abre Sistema → Actualizaciones (Toolkit) y busca la tarjeta Backup para mailcow: pega la clave y actívala, o empieza la prueba de 30 días. Desde la shell puedes hacer lo mismo con php /web/mlw-toolkit/cli.php activate mailcow-backup <KEY> dentro de php-fpm-mailcow.

Conviene saberlo: sin una licencia válida se detienen las copias programadas y las subidas a Google Drive, pero la verificación, la restauración y el borrado siguen funcionando. Tus datos nunca quedan retenidos.

Paso 3 — Elegir la carpeta local

En Ajustes → Carpeta local, introduce una ruta absoluta en el host, preferiblemente en otro disco distinto de mailcow, por ejemplo /srv/backup/mailcow o un disco montado. La carpeta se crea legible solo por root. Deja espacio para unas dos copias de seguridad.

Paso 4 — Establecer la frase de contraseña de cifrado

En Cifrado, pulsa Establecer con generada (recomendado). La frase de contraseña se muestra una sola vez: guárdala fuera del servidor, en un gestor de contraseñas o en papel. O elige la mía y escribe una de al menos 12 caracteres dos veces.

Cada copia de seguridad se convierte en un archivo .tar.gpg más un manifiesto JSON (componentes, tamaños, SHA-256, id de la frase de contraseña, versiones de mailcow y del Toolkit). También se descifra con gpg a secas, sin mailcow: gpg -d mailcow-…tar.gpg > backup.tar pide la frase de contraseña y devuelve la carpeta de copia de seguridad habitual de mailcow.

Paso 5 — Programación, componentes y retención

Sigue en Ajustes:

  • Copias programadas activadas o desactivadas, con Horas en la hora del servidor (se permiten varias, por ejemplo 03:15, 15:15) y Días. Una copia que se pierda mientras el servidor está apagado se ejecuta una vez al volver, y las ejecuciones programadas usan una prioridad baja de CPU y disco.
  • Qué se copia: correo (vmail), claves de cifrado (crypt — necesarias para leer el correo cifrado), redis, rspamd, postfix y la base de datos (SQL). Todos están activados por defecto; elige lo que necesites.
  • Copias locales guardadas y Copias guardadas en Drive: se quedan las N más recientes y las más antiguas se borran después de cada copia.
  • Hilos de compresión para el script de mailcow.
  • Correo electrónico: solo en caso de fallo (por defecto), después de cada copia o nunca. Una dirección vacía significa la dirección de notificaciones del Toolkit.

Pulsa Copiar ahora en la tarjeta de Estado para hacer la primera copia; el progreso y el registro se muestran en directo.

Paso 6 — Añadir Google Drive (opcional)

El módulo usa tu propio cliente OAuth de Google, así que el acceso a tu Drive se queda en tu servidor:

  1. En la Google Cloud Console, crea o elige un proyecto y activa la Google Drive API.
  2. Pantalla de consentimiento de OAuth: tipo Externo, tu correo como contacto de asistencia y de desarrollador, y luego Publicar aplicación ("En producción"). En modo de prueba Google caduca el acceso a los 7 días.
  3. Credenciales → Crear credenciales → ID de cliente de OAuth, tipo Aplicación web, con la URI de redirección que se muestra en la página: https://<your mailcow UI host>/mlw-backup/oauth.php.
  4. Pega el Client ID y el client secret en Google Drive en la página, Guardar, y luego Conectar Google Drive y permite el acceso. Google puede avisar de que la aplicación no está verificada: es tu propia aplicación, continúa.
  5. En Ajustes, activa Subir cada copia a Google Drive y elige el nombre de la carpeta.

El ámbito es drive.file: el módulo solo ve los archivos que ha creado, nunca el resto de tu Drive. Las subidas van en partes de 32 MiB y continúan tras un error de red. Probar lista la carpeta; Desconectar revoca el acceso y las copias siguen en Drive.

Paso 7 — Verificar sin restaurar

En Copias, cada copia muestra dónde está (local, Drive o ambas). Verificar descifra y lee todo el archivo —descargándolo de Drive si no está en local— sin restaurar nada. Ejecútalo tras la primera copia y luego de forma periódica: es la forma más barata de descubrir que una frase de contraseña o una subida ha fallado.

Paso 8 — Restaurar por componente

Restaurar… te permite marcar los componentes que necesitas, escribir RESTORE y confirmar. Se comprueba el SHA-256 del archivo contra su manifiesto, se descifra y se comprueban sus rutas, y luego cada componente se restaura con los pasos de la propia restauración de mailcow: los contenedores afectados se detienen y se vuelven a iniciar. La base de datos detiene todo mailcow durante unos minutos y toma las credenciales SQL del mailcow.conf de la copia. Lo que haya cambiado en esos componentes después de la fecha de la copia se pierde. No se ejecuta una resincronización forzada del correo; si un buzón parece incorrecto después:

docker exec $(docker ps -qf name=dovecot-mailcow) doveadm force-resync -A '*'

Mudarse a un servidor nuevo

  1. Instala mailcow y el Toolkit, y luego activa la licencia (o restaura sin ella).
  2. Cifrado → la mía: escribe la frase de contraseña antigua. En un servidor que ya tiene una, marca solo para copias anteriores: una frase nueva se aplica a las próximas copias y las anteriores siguen siendo restaurables.
  3. Google Drive: usa el mismo cliente OAuth y conéctalo; las copias antiguas aparecen, porque el módulo ve los archivos que ha creado su cliente.
  4. Restaurar… la copia más reciente, todos los componentes.

Consejos y solución de problemas

  • Mantén la frase de contraseña fuera del servidor. Sin ella, una copia no se puede restaurar en otro servidor. Los secretos propios del módulo (frase de contraseña, acceso a Google) sobreviven a restaurar redis, pero un servidor perdido se los lleva consigo.
  • Privacidad: las copias contienen todo tu correo. Solo salen del servidor cifradas, y solo hacia la cuenta de Google Drive que conectes; no se envía nada a medialab.works salvo la comprobación de licencia.
  • Google caduca las aplicaciones en modo de prueba a los 7 días: publica la aplicación como se describe arriba.
  • Consulta el historial y los registros: el historial completo de copias, subidas, verificaciones y restauraciones está en la página y en la tabla mlw_bk_run; el progreso en directo está en data/hooks/phpfpm/.mlw-toolkit/backup/run.json y run.log.
  • A mano, como root: MLW_TK_CONF=/etc/mlw-mailcow-toolkit/<instance>.conf mlw-mailcow-backup-<instance> backup|verify NAME|list.
  • Desinstalar con uninstall.sh conserva las copias locales y las de Drive.

Para terminar

Configura una vez la carpeta y la frase de contraseña, elige horas y retención, conecta Drive si quieres una copia fuera del sitio y deja que el temporizador haga el resto. Verifica de vez en cuando y, cuando necesites una restauración, marcarás componentes en una página en lugar de responder a preguntas en una shell. Más en la guía de usuario y el registro de cambios; las preguntas son bienvenidas a través de contacto o la base de conocimiento.

Esta publicación se redactó con ayuda de IA a partir de la documentación de nuestros productos o de las fuentes indicadas y se revisó automáticamente antes de publicarse.

Sigue leyendo

¿Usas Emby, Jellyfin o Nextcloud?

Nuestros plugins y apps añaden TV en directo, subtítulos, registro de usuarios y seguridad a tu propio servidor, con prueba gratuita.