Upgrade managed · scripts custom traducidos · queue preservado · 3-6 semanas

Del Postfix legacy con scripts caseros al MTA enterprise, sin perder un mensaje.

Operación B2B que creció durante años sobre Postfix con master.cf modificado, transport maps custom, header_checks elaborados, milters en C o Python, scripts de bounce processing que alimentan sistemas downstream. Funciona, pero el scale-up acumula complejidad inmanejable: el equipo que escribió el scripting ya no está, runbooks operacionales no existen, observabilidad es grep en logs. El upgrade a PowerMTA o KumoMTA recupera la paridad funcional con observabilidad nativa, runbooks, multi-IP rotation gestionada y queue persistente robusto. Sin lock-in entre PowerMTA y KumoMTA: la decisión se basa en variables reales del cliente, no comerciales para EMP.

0mensajes perdidos en queue
3-6semanas según complejidad
14-30días rollback disponible
11migraciones operadas
Cuándo migrar tiene sentido · honestidad técnica

Cuatro signals reales que justifican el upgrade.

Postfix funciona excelentemente para muchas operaciones. Migrar tiene sentido cuando aparecen estos cuatro signals combinados, no por moda de stack moderno. Si tu Postfix actual cubre la operación y el equipo lo opera bien, mantenerlo es la respuesta correcta.

Signal 01 · Scale

Volumen sobre 500K/mes sostenido

Postfix maneja volumen alto técnicamente, pero el throttling por destination, retry backoff exponencial, multi-IP rotation requieren scripts custom que se vuelven frágiles. PowerMTA y KumoMTA tienen estas capacidades nativas con configuración declarativa.

Signal 02 · Observability

Observabilidad limitada a logs y grep

Postfix entrega logs detallados pero sin métricas exportables nativas. Cuando el head of MailOps quiere dashboards Prometheus/Grafana de queue depth, throughput por destination, bounce rate por categoría, las opciones son scripts de parseo logs frágiles. KumoMTA exporta métricas nativas; PowerMTA tiene VMTA stats.

Signal 03 · Bus factor

El SRE que escribió los scripts ya no está

El master.cf con 40 modificaciones, los transport maps con regex complejos, los milters custom en Python sin documentación: cuando el SRE original se va, el conocimiento operacional se pierde. La migración a MTA enterprise traduce el scripting a configuración declarativa documentada que sobrevive cambios de equipo.

Signal 04 · Runbooks

Incidentes sin runbooks operacionales

Queue stuck en 3am, bounce flood masivo, IP en blocklist súbita, complaint rate disparado: los incidentes operacionales requieren runbooks documentados. Postfix tiene documentación general, pero la documentación específica del setup custom del cliente no existe. PowerMTA y KumoMTA tienen runbooks community + custom específicos del cliente entregados con el setup.

Cuándo NO migrar

Postfix sigue siendo la respuesta correcta a veces.

Cuatro escenarios donde mantener Postfix es lo correcto y EMP lo dice honestamente: volumen bajo 500K/mes sin proyección de crecimiento donde el overhead de KumoMTA o el costo de licencia PowerMTA no se justifica; operación email corporativo (no marketing/transactional masivo) donde Postfix es el estándar de la industria; equipo SRE con expertise profundo en Postfix y configuración bien documentada que opera la stack sin fricción; requirement regulatorio específico que exige stack abierto auditable donde Postfix tiene historial validado vs MTAs enterprise. EMP no fuerza migraciones que no aportan valor real. Si después del discovery la conclusión es que Postfix sigue siendo correcto, cobramos solo el discovery ($2,200) sin proyecto de migración.

Qué se traduce y a qué equivalente

Mapping de elementos Postfix.

Tabla de los 9 elementos típicos de un Postfix legacy y su equivalente funcional en PowerMTA y KumoMTA. Esta tabla es el output del discovery: identifica qué requiere traducción simple, qué requiere trabajo manual, qué requiere reverse-engineering. KumoMTA tiende a ser más simple porque la mayoría de elementos se traducen a Lua scripts unificados; PowerMTA requiere más archivos de configuración separados.

Elemento Postfix Función original PowerMTA equivalente KumoMTA equivalente
main.cf Configuración global del MTA config.txt sección global init.lua kumo.set_config()
master.cf Definición de services y daemons config.txt sección spool/listener init.lua kumo.start_smtp_listener()
transport maps Routing por destination domain domain {} blocks en config.txt queue.lua get_queue_config()
header_checks Regex filtering/rewriting de headers filter scripts en archivos .acl smtp_server.lua msg_received callback
body_checks Regex sobre body del mensaje filter scripts (limitado, no recomendado) smtp_server.lua msg_received con kumo.message API
milters externos Procesos externos via libmilter protocol Soporta libmilter via filter Callbacks Lua nativos o subprocess
aliases Local user aliasing aliases {} block No aplica (KumoMTA es outbound puro)
scripts bounce processing Parseo de DSN para downstream bounce_after y feedback_loop options bounce.lua disposition callback
queue lifetime / retry maximal_queue_lifetime, retry_template retry-after, max-retries en config queue.lua retry_interval array

Lo que el discovery siempre encuentra: scripts custom del cliente que no encajan en ninguna fila estándar de la tabla. Ejemplos típicos vistos: re-stamping de Subject según patrón de destination (banking con compliance), inserción de headers custom para tracking interno, queue routing dinámico basado en lookup contra base de datos externa, bounce processing que invoca webhooks downstream. Estos requieren scripting custom en la plataforma destino. KumoMTA con Lua es típicamente más fácil para estos casos porque permite scripting unificado en un solo lenguaje; PowerMTA requiere combinar config.txt declarativo con filters externos en C o Python.

Ejemplo real · traducción de retry policy

Cómo se traduce un fragmento típico.

Fragmento real anonimizado: cliente B2B Panamá con retry policy customizado en Postfix master.cf que define backoff exponencial diferente para Gmail vs Microsoft vs Yahoo. La traducción a KumoMTA aplica Lua nativo; a PowerMTA requeriría config.txt domain blocks separados (no mostrado).

Postfix · master.cf + transport retry policy custom · 40 líneas
# --- main.cf snippet ---
smtp_destination_concurrency_limit = 10
smtp_destination_rate_delay = 0s
smtp_destination_recipient_limit = 20

# --- master.cf: services por destination ---
gmail-out unix - - n - 5 smtp
  -o smtp_destination_concurrency_limit=8
  -o smtp_destination_rate_delay=100ms
  -o smtp_helo_name=mta.dominio.com

ms-out unix - - n - 5 smtp
  -o smtp_destination_concurrency_limit=5
  -o smtp_destination_rate_delay=200ms

yahoo-out unix - - n - 3 smtp
  -o smtp_destination_concurrency_limit=3
  -o smtp_destination_rate_delay=500ms

# --- transport map: routing por dest ---
gmail.com    gmail-out:
googlemail.com    gmail-out:
outlook.com    ms-out:
hotmail.com    ms-out:
yahoo.com    yahoo-out:
aol.com    yahoo-out:
KumoMTA · queue.lua equivalente Lua scripting · 24 líneas
-- queue.lua: routing + throttle unified
local kumo = require('kumo')

local dest_profiles = {
  ['gmail.com'] = 'gmail-out',
  ['googlemail.com'] = 'gmail-out',
  ['outlook.com'] = 'ms-out',
  ['hotmail.com'] = 'ms-out',
  ['yahoo.com'] = 'yahoo-out',
  ['aol.com'] = 'yahoo-out',
}

local profile_config = {
  ['gmail-out'] = { max_connections=8, ratelimit='10/s' },
  ['ms-out']    = { max_connections=5, ratelimit='5/s' },
  ['yahoo-out'] = { max_connections=3, ratelimit='2/s' },
}

kumo.on('get_queue_config', function(domain, tenant)
  local profile = dest_profiles[domain] or 'default'
  return kumo.make_queue_config(profile_config[profile])
end)

Diferencia clave en mantenimiento: el Postfix requiere coordinación entre master.cf y transport map (dos archivos), reload con postfix reload que no es hot. El KumoMTA tiene todo en un solo Lua, reload hot vía kumo.reload(). Para incidentes nocturnos (queue stuck, throttle ajustment urgente) la diferencia es relevante: hot reload en KumoMTA permite cambio sin afectar mensajes en flight. El objetivo de la traducción no es código más corto sino mantenibilidad por equipos futuros.

Plan de cutover · drainage del queue Postfix

Lo crítico es preservar el queue activo.

El timeline de cutover muestra cómo se ejecuta la migración sin perder mensajes en flight. Las cinco etapas operan en paralelo y secuencial según corresponde. El drainage del Postfix toma 2-4 horas durante las cuales el queue se vacía naturalmente antes de la migración de los mensajes que quedan.

Plan cutover · 32 horas total

Single Server · ventana de mantenimiento ampliada con coexistencia paralela

Setup paraleloMTA nuevo sin tráfico
T+0h a T+6h
Staging testingValidación paridad
T+5h a T+16h
Drainage PostfixStop admission · drain natural
T+16h a T+20h
CutoverSwitch traffic + queue migration
T+20h a T+24h
Standby PostfixRollback disponible 14-30d
T+24h a T+32h+ (continuado 14-30d)

El drainage de 4 horas (T+16h a T+20h) es la fase más crítica. Durante ese período el Postfix no acepta mensajes nuevos pero sigue entregando los que tiene en queue. Los mensajes nuevos van directo al MTA nuevo. Después de las 4 horas, los mensajes que siguen en queue del Postfix son los que tuvieron deferred (receiver temporariamente no aceptó) o están en retry pendiente. Esos se migran al queue del MTA nuevo con un exporter custom que respeta el retry_counter y next_retry_time, manteniendo el comportamiento de retry sin reseteo. Después del cutover formal el Postfix queda en standby 14-30 días con plan de rollback ejecutable en 2-4 horas si necesario. La inversión en el plan de rollback es la diferencia entre migración managed y migración ad-hoc.

Proceso completo · 5 fases · 3-6 semanas

Cómo ejecutamos la migración end-to-end.

Fase 01
Semana 1

Discovery + inventario

Análisis main.cf, master.cf, transport maps, milters. Inventario de scripts custom. Decisión PowerMTA vs KumoMTA basada en variables del cliente.

Fase 02
Semana 1-3

Traducción + setup

Setup MTA nuevo en paralelo. Traducción de configuración. Adaptación de scripts custom a Lua o filters. Integración con monitoreo.

Fase 03
Semana 3-4

Validación paridad

Testing exhaustivo con muestras representativas. Comparación byte-by-byte de output. Cliente firma off el documento de paridad antes del cutover.

Fase 04
Semana 4-5

Cutover coordinado

Ejecución del cutover según plan gantt. Drainage del Postfix, migración del queue residual, switch de tráfico, validación post-cutover.

Fase 05
Semana 5-6+

Stabilization + handover

14-30 días post-cutover con Postfix en standby para rollback. Monitoreo de KPIs. Runbooks entregados. Capacitación equipo cliente. Decommission Postfix.

Pricing transparente

Cuatro opciones según scope y discovery.

El discovery es contratable por separado. Si después del discovery la conclusión es "tu Postfix sigue siendo correcto", cobramos solo el discovery sin proyecto. Si avanza el proyecto, el costo del discovery se descuenta del primer servicio dentro de 90 días.

Discovery + Plan

Standalone · 5-7 días · descontable.

$2,200 USD
  • Análisis técnico inicial
  • Inventario scripts custom
  • Evaluación paridad funcional
  • Plan de migración + presupuesto
  • Decisión PowerMTA vs KumoMTA
  • Sin compromiso continuar
Solicitar Discovery

Multi-Server

Hasta 4 servidores · HA · 4-6 semanas.

$9,800 USD
  • Hasta 4 servidores
  • Configuración HA + failover
  • Scripts complejos (milters)
  • Cutover gradual coordinado
  • 60 días soporte
  • Plan de DR documentado
Solicitar Multi

Enterprise

Multi-domain · scripting complejo.

$22,000+ USD
  • Multi-domain
  • Scripting custom complejo
  • Integración backend cliente
  • Plan de DR completo
  • 90 días soporte
  • Runbooks operacionales
Hablar Enterprise
Lo que pregunta el head of MailOps senior

Las dudas reales en la primera llamada.

"Mi Postfix funciona desde hace años. ¿Por qué migrar realmente?"

Postfix funciona excelentemente para email corporativo, transactional de volumen moderado y casos donde la configuración estándar cubre la operación. Las razones reales para migrar a MTA enterprise aparecen cuando la operación crece a volumen sobre 500K mensajes mensuales con multi-IP rotation, requiere throttling sofisticado por mailbox provider (Gmail/Microsoft con backoff exponencial diferente), necesita observabilidad nativa con métricas Prometheus exportables, exige runbooks operacionales para incidentes específicos del scale-up. Postfix puede emular muchas de esas capacidades con scripts custom, milters, transport maps elaborados, pero el mantenimiento del scripting casero acumula complejidad inmanejable cuando el equipo original que lo escribió ya no está. Si tu Postfix funciona y el equipo lo opera bien, no necesariamente hay que migrar. EMP cobra solo el discovery si esa es la conclusión.

"¿El queue activo se preserva sin pérdida durante la migración?"

Sí, esa es una de las razones por las cuales la migración requiere planificación. Procedimiento técnico estándar: Setup del MTA nuevo en paralelo al Postfix existente, sin tráfico productivo. Validación de paridad funcional con muestras representativas. Pausa de admission de nuevos mensajes al queue Postfix (los nuevos van al MTA nuevo). Espera de drainage del queue Postfix por 2-4 horas para que los mensajes en flight se entreguen normalmente. Para mensajes que quedan en queue después del drainage (deferred por receivers temporariamente, retries pendientes), se migran al queue del MTA nuevo usando exportador custom que respeta el retry counter y next_retry_time de cada mensaje. Validación de que el queue nuevo procesó los mensajes migrados correctamente. Decommission del Postfix después de 24-48h estables con el MTA nuevo en producción.

"¿PowerMTA o KumoMTA? ¿Cuál conviene en mi caso?"

Decisión basada en tres factores reales del cliente. Si el cliente ya tiene licencia PowerMTA activa pre-2021 o relaciones legacy con Bird, mantener PowerMTA evita coste adicional de licencia. Si el cliente no tiene licencia previa, KumoMTA (Apache 2.0, sin licencia comercial) es típicamente la respuesta correcta: el equipo original de PowerMTA está detrás del proyecto, paridad funcional confirmada en producción, observabilidad nativa Prometheus, configuración como código en Git. Si la operación tiene requirement regulatorio específico de software comercial documentado (alguna auditoría compliance específica), PowerMTA puede seguir siendo argumento válido. EMP no tiene relación contractual ni co-marketing con Bird desde 2021, por lo cual la recomendación es funcional y no comercial. Recomendación típica 2026 para operaciones nuevas o migraciones: KumoMTA en 75-80% de los casos.

"¿Qué pasa con los milters externos que tengo configurados?"

Los milters (Mail Filters) son procesos externos que Postfix consulta vía protocolo libmilter. Operación común incluye OpenDKIM, OpenDMARC, SpamAssassin, ClamAV, custom milters en C o Python. La migración aborda cada milter individualmente. OpenDKIM y OpenDMARC: típicamente se reemplazan por la firma DKIM y verificación DMARC nativas del MTA destino. SpamAssassin y ClamAV: se mantienen como milters externos en PowerMTA, o se traducen a Lua callbacks en KumoMTA con integración directa. Custom milters en C: requieren reverse-engineering de la lógica y traducción a la plataforma destino. Custom milters en Python: típicamente migrables más fácil a Lua si el destino es KumoMTA. Cualquier custom milter sin documentación es costo adicional de scoping que se identifica en el discovery.

"¿Es reversible si algo sale mal en el cutover?"

Sí, el procedure incluye plan de rollback documentado antes del cutover. Durante el período de coexistencia (Postfix y MTA nuevo corriendo en paralelo), el rollback es trivial: redirigir el tráfico de vuelta al Postfix existente, drenar el queue del MTA nuevo, decommission del MTA nuevo. Después del cutover formal y decommission del Postfix, el rollback es más costoso: requiere reactivar el Postfix con su configuración congelada en backup, re-instalar dependencias si fueron retiradas. Por eso el procedure mantiene el Postfix en standby por 14-30 días post-cutover con plan de rollback ejecutable en 2-4 horas si necesario. Después de 30 días estables se decommission formal del Postfix. La inversión en el plan de rollback es la diferencia entre migración managed y migración ad-hoc.

"¿Pueden migrar si nuestro Postfix está integrado con sistemas backend custom?"

Sí, eso es exactamente el caso típico de Enterprise tier. Integraciones backend comunes que migramos: scripts de bounce processing que invocan webhooks downstream (CRM, soporte, billing), lookup queries contra base de datos para routing dinámico (clientes premium vs estándar), inserción de headers tracking interno consumidos por sistemas de analytics propios, integración con Slack/Teams para alertas operacionales, sincronización con sistemas de suppression list externos. Cada integración se documenta en el discovery, se traduce a la plataforma destino manteniendo la interfaz con el backend del cliente (mismos endpoints, mismo formato de payload). Si la integración usa libraries específicas de Postfix (libmilter, postmap APIs), se reemplaza por la API nativa del MTA destino. La paridad funcional se valida con testing exhaustivo antes del cutover, incluyendo testing end-to-end de los sistemas backend impactados.

Preguntas técnicas frecuentes

Lo que sale en la sesión técnica.

¿Qué se traduce exactamente del Postfix actual?

Inventario típico que mapeamos en el discovery:

  • main.cf con configuración global (banner, hostname, mynetworks, smtp_helo_name, queue lifetime, deferred_transport, etc)
  • master.cf con modificaciones custom (services adicionales, overrides de límites, parámetros de retry específicos)
  • Transport maps con routing custom por destination domain
  • Header checks y body checks con regex que filtran o reescriben mensajes en flight
  • Milters externos en C o Python con lógica de filtering o re-stamping
  • Scripts de bounce processing que parsean DSN y alimentan sistemas downstream del cliente
  • Aliases y virtual maps si aplica

Para cada elemento generamos equivalente funcional en la plataforma destino: PowerMTA config.txt si vamos a PowerMTA, Lua scripts si vamos a KumoMTA. La paridad funcional se valida con testing exhaustivo antes del cutover.

¿Cuánto tarda end-to-end la migración?

Tiempo varía por complejidad del scripting custom y por scope:

  • Single Server con scripting estándar: 3-4 semanas. Días 1-5 discovery, días 6-15 setup MTA paralelo y traducción, días 15-21 validación de paridad funcional, días 21-28 plan de cutover y go-live
  • Multi-Server con failover HA: 4-6 semanas adicionando coordinación entre nodos y testing de failover
  • Enterprise con scripting complejo (milters custom, integraciones backend cliente): 6-10 semanas

Variables que extienden plazo: scripts custom no documentados que requieren reverse-engineering, vendor cliente externo que requiere coordinación, ventanas de change management corporativo limitadas (CAB semanal en banca), descubrimiento de dependencias upstream del cliente no comunicadas en discovery.

¿Cómo se valida la paridad funcional antes del cutover?

Testing exhaustivo en staging con muestras representativas de los flujos productivos del cliente. Para cada flujo principal (transactional, marketing, lifecycle, notificaciones) se ejecuta una baseline con el Postfix actual capturando:

  • Routing de cada destination
  • Headers añadidos al mensaje
  • Timing de retries
  • Comportamiento ante bounces específicos
  • Output de scripts de bounce processing

La misma baseline se ejecuta contra el MTA nuevo. Las diferencias se documentan y se resuelven antes de avanzar. Específicamente validamos: paridad de routing en transport maps, headers añadidos idénticos byte-por-byte, retry timing dentro de variación aceptable (5-15% de delta es OK, 30%+ requiere ajuste), bounce categorization idéntica, output downstream idéntico. El cliente firma off del documento de paridad antes del cutover en producción.

¿Funciona si el Postfix tiene scripts custom sin documentación?

Sí, pero con costo adicional de scoping para el reverse-engineering. Tres escenarios típicos:

  • Scripts documentados o auto-explicativos: traducción directa. Incluido en el scope estándar
  • Scripts sin documentación pero código legible: reverse-engineering toma 4-12 horas adicionales por script complejo. Costo se identifica en discovery
  • Scripts obfuscados o con dependencias externas oscuras: reverse-engineering profundo con testing. Costo identificable solo durante el proceso. Discovery entrega estimación con caveats

Para clientes con scripting muy custom, recomendamos contratar primero el Discovery ($2,200) para entender el alcance real antes de comprometer presupuesto del proyecto completo.

¿La migración mantiene compatibilidad con sistemas existentes?

Sí, esa es premisa del scope. El MTA nuevo se configura para presentar la misma interfaz externa que el Postfix:

  • Same SMTP listener en puerto y IP (cliente envía email al MTA nuevo igual que al Postfix)
  • Same authentication (SASL, IP whitelist, certificados según configuración actual)
  • Same headers añadidos al mensaje (X-headers custom del cliente, Return-Path, Message-ID generation)
  • Same bounce DSN format entregado a clients que parsean DSN
  • Same webhook payloads entregados a sistemas downstream que reciben notificaciones

Si hay incompatibilidad detectada durante el testing (frecuente: headers en orden diferente, timestamp en formato distinto), se ajusta la configuración del MTA destino para alinear con el comportamiento Postfix observado. El cliente no debería notar cambio funcional en sistemas downstream.

¿Qué pasa con el monitoreo durante la migración?

Durante la fase de coexistencia (Postfix y MTA nuevo en paralelo) hay monitoreo dual:

  • Postfix monitoring existente sigue activo capturando queue depth, throughput, bounces
  • MTA nuevo monitoring se agrega en paralelo con métricas Prometheus exportables (KumoMTA) o VMTA stats (PowerMTA)
  • Comparación lado a lado en dashboard Grafana para validar paridad de throughput y bounce rate
  • Alertas duales durante coexistencia: tanto Postfix como MTA nuevo alertan si hay anomalía

Después del cutover y los 14-30 días de standby, el monitoreo Postfix se decommission junto con el Postfix. El MTA nuevo queda con monitoreo nativo activado.

¿Cómo manejan operaciones reguladas con compliance audit?

Para clientes regulados (banca, government, healthcare) el scope incluye consideraciones adicionales:

  • Coordinación con compliance officer del cliente desde el discovery
  • Documentación apta para auditoría del cambio de stack
  • Cumplimiento de change management process del cliente (CAB review, approval flow)
  • Maintaining audit logs durante la migración para trazabilidad
  • BAA específico si aplica HIPAA
  • Coordinación con auditor externo del cliente si la migración cae en período de auditoría
  • Documentación de roles y responsabilidades bajo régimen del Decreto Ejecutivo 285 art. 24

Para banca SBP específicamente, el plan de migración cumple con Acuerdo SBP No. 11-2018 sobre Gestión de Riesgo Tecnológico. EMP coordina con el área de riesgo tecnológico del cliente durante la migración.

¿Cuándo es mejor mantener Postfix?

Cuatro escenarios donde EMP recomienda no migrar:

  • Volumen bajo 500K mensajes/mes sin proyección de crecimiento donde el overhead de KumoMTA o el costo de licencia PowerMTA no se justifica
  • Operación email corporativo (no marketing/transactional masivo) donde Postfix es el estándar de la industria
  • Equipo SRE con expertise profundo en Postfix y configuración bien documentada que opera la stack sin fricción
  • Requirement regulatorio específico que exige stack abierto auditable donde Postfix tiene historial validado vs MTAs enterprise

EMP no fuerza migraciones que no aportan valor real. Si después del discovery la conclusión es que Postfix sigue siendo correcto, cobramos solo el discovery ($2,200) sin proyecto de migración. Para clientes con scripting Postfix complejo que solo necesitan documentación + runbooks (no migrar), ofrecemos servicio separado de Postfix audit + documentation.

Discovery + Plan. 5 a 7 días.

Validamos en discovery el alcance real del scripting custom de tu Postfix, identificamos qué requiere reverse-engineering, decidimos PowerMTA vs KumoMTA basado en variables reales del cliente, entregamos plan de migración con presupuesto cerrado. Si después del discovery concluimos que tu Postfix sigue siendo la respuesta correcta, lo decimos honestamente y cobramos solo el discovery. Si el proyecto avanza, el costo del discovery se descuenta del primer servicio dentro de 90 días.

Sin compromiso · NDA disponible · L-V 9-18 GMT-5