Problema

Los entornos de correo empresarial que utilizan Proxmox Mail Gateway (PMG) suelen requerir actualizaciones periódicas para beneficiarse de mejoras de seguridad y de componentes subyacentes (kernel, SpamAssassin, ClamAV, etc.). En la práctica, una actualización mayor —por ejemplo, de la serie 8.x/9.0 a 9.1— puede romper la cadena de backups, dejar sin acceso a la cuarentena o provocar incompatibilidades de base de datos. El síntoma típico es que, tras ejecutar apt upgrade, el servicio PMG no arranca, los backups aparecen corruptos o la nueva interfaz de cuarentena no reconoce usuarios existentes. La raíz del problema suele estar en cambios de paquetes base (Debian 13 → 13.5, kernel 6.x → 7.0) y en la introducción de cifrado cliente‑lado para los destinos de Proxmox Backup Server (PBS).

Causa

  1. Saltos de versión del sistema operativo – PMG se basa en Debian; al cambiar de una versión menor a una mayor, el gestor de paquetes actualiza bibliotecas críticas (libc, systemd) que pueden requerir reinicios de servicios o ajustes de configuraciones heredadas.
  2. Migración de esquema de PostgreSQL – Cada versión importante de PMG incluye una actualización de la base de datos. Si la migración falla, la UI muestra errores y los filtros dejan de aplicarse.
  3. Cambios en ZFS – La versión 9.1 incorpora ZFS 2.4. Pools creados con versiones anteriores pueden requerir una actualización de la tabla de propiedades o presentar incompatibilidades con snapshots usados por PBS.
  4. Activación del cifrado de backup – La opción “encrypted backup” introduce una capa de cifrado antes de enviar los datos a PBS. Si la clave no está disponible o el cliente no está configurado, los trabajos de backup fallan silenciosamente.
  5. Configuraciones personalizadas – Scripts de post‑instalación, reglas de SpamAssassin modificadas o ajustes de la cuarentena que dependen de rutas estáticas pueden quedar obsoletos cuando los paquetes se reemplazan.

Solución

1. Preparación del entorno

  • Snapshot del pool ZFS: crea un snapshot de la raíz del sistema y del pool que contiene los datos de PMG.
  • Backup completo con PBS: ejecuta un backup sin cifrado primero para validar que la cadena funciona.
  • Exportar la base de datos: pg_dumpall -U postgres > /root/pmg-db-backup.sql.
  • Revisar configuraciones personalizadas: copia /etc/pmg/* y cualquier script bajo /usr/local/bin a un directorio temporal.

2. Habilitar cifrado en PBS (opcional pero recomendado)

  1. En el servidor PBS, crea un vault con una clave maestra:
    proxmox-backup-manager vault create myvault --type passphrase
    
  2. En el nodo PMG, registra el vault y habilita el cifrado para el repositorio:
    proxmox-backup-client config set backup:myrepo encryption-key myvault
    

3. Actualizar el nodo PMG

  1. Cambia los repositorios a la rama de Debian 13.5:
    sed -i 's/bullseye/trixie/g' /etc/apt/sources.list
    apt update
    
  2. Instala los paquetes de la nueva versión sin remover configuraciones:
    apt full-upgrade -y
    
  3. Ejecuta los scripts de migración de PostgreSQL que PMG coloca en /usr/share/pmg/migration/:
    /usr/share/pmg/migration/upgrade-postgresql.sh
    
  4. Reinicia los servicios críticos:
    systemctl restart pmgproxy pmgdaemon
    

4. Verificar la integración de la cuarentena

  • Accede a la UI y comprueba que los usuarios pueden marcar correos como “seen” y que la columna de puntuación de spam muestra componentes positivos y negativos.
  • Si la vista de imágenes externas está deshabilitada, habilita la opción “on‑demand” desde Configuration → Quarantine → Image loading.

5. Re‑activar backups cifrados

  • Modifica el trabajo de backup en /etc/pmg/backup/jobs.d/ para incluir la bandera --encrypt.
  • Ejecuta un backup de prueba:
    proxmox-backup-client backup pmg@myrepo:/var/lib/pmg --encrypt
    

6. Restaurar configuraciones personalizadas

  • Copia de nuevo los archivos bajo /etc/pmg/ y los scripts.
  • Revisa que los archivos de reglas de SpamAssassin (/etc/spamassassin/local.cf) no tengan parámetros obsoletos.

Cuándo aplicar esta solución

  • Actualizaciones mayores de PMG (p.ej., 8.x → 9.x, 9.0 → 9.1) donde el salto incluye cambios de kernel o de componentes críticos.
  • Implementación de cifrado de backup en entornos que manejan datos sensibles (configuración, estadísticas, reglas).
  • Problemas de disponibilidad de la cuarentena después de una actualización que introdujo la nueva UI.

No es necesario seguir este proceso si solo se aplican parches menores (p.ej., 9.1‑1 a 9.1‑2) y no se ha activado el cifrado de backup.

Código

# 1. Snapshot ZFS
zfs snapshot -r rpool@pre-pmg-upgrade

# 2. Exportar DB
pg_dumpall -U postgres > /root/pmg-db-backup.sql

# 3. Cambiar repositorios a Debian trixie
sed -i 's/bullseye/trixie/g' /etc/apt/sources.list
apt update && apt full-upgrade -y

# 4. Migrar PostgreSQL
/usr/share/pmg/migration/upgrade-postgresql.sh

# 5. Reiniciar servicios
systemctl restart pmgproxy pmgdaemon

# 6. Configurar backup cifrado
proxmox-backup-client config set backup:myrepo encryption-key myvault
proxmox-backup-client backup pmg@myrepo:/var/lib/pmg --encrypt

Verificación

  1. Estado de los servicios: systemctl status pmgproxy pmgdaemon debe mostrar “active (running)”.
  2. Flujo de correo: envía un mensaje de prueba desde una cuenta interna y verifica que llega al destinatario y que el registro aparece en /var/log/pmg/maillog.
  3. Backup cifrado: inspecciona el repositorio PBS; los archivos deben aparecer con la extensión .enc y prox... backup-client verify debe devolver “OK”.
  4. Cuarentena: abre la UI, marca un mensaje como “seen” y confirma que el icono de check aparece para todos los usuarios de la bandeja compartida.
  5. Base de datos: ejecuta psql -U postgres -c "\l" y comprueba que la versión de la base de datos corresponde a PostgreSQL 17.

Notas adicionales

  • Mantén una copia del snapshot ZFS durante al menos 48 h; si la actualización falla, puedes volver a la instantánea con zfs rollback -r rpool@pre-pmg-upgrade.
  • Cuando habilites el cifrado, guarda la frase de paso del vault en un gestor de secretos externo; la pérdida de esa clave imposibilita la restauración de backups.
  • Si utilizas contenedores LXC para PMG, revisa que la plantilla base esté alineada con Debian trixie antes de iniciar la actualización.
  • Los logs de pmgdaemon y pmgproxy son la primera fuente de diagnóstico cuando la cuarentena no muestra los cambios esperados.
  • En entornos con alta carga, programa la actualización fuera de las horas pico y habilita el modo “maintenance” en la UI para evitar que los usuarios envíen correos mientras los servicios se reinician.