[{"data":1,"prerenderedAt":1159},["ShallowReactive",2],{"blog-es-\u002Fes\u002Fblog\u002Fpostgres-en-produccion-gestionado-vs-auto-hospedado":3,"blog-es-surround-\u002Fes\u002Fblog\u002Fpostgres-en-produccion-gestionado-vs-auto-hospedado":1145},{"id":4,"title":5,"author":6,"body":7,"category":1125,"cover":1126,"date":1127,"description":1128,"draft":1129,"extension":1130,"lastReviewed":1126,"meta":1131,"navigation":1132,"path":1133,"readingTime":1134,"seo":1135,"sitemap":1136,"stem":1137,"tags":1138,"__hash__":1144},"blog_es\u002Fes\u002Fblog\u002Fpostgres-en-produccion-gestionado-vs-auto-hospedado.md","Postgres en producción: gestionado vs auto-hospedado, la cuenta honesta","Equipo HeroCtl",{"type":8,"value":9,"toc":1106},"minimark",[10,14,17,22,25,32,38,44,50,56,62,68,71,75,78,84,90,96,102,108,114,118,126,131,219,222,226,319,326,330,446,453,457,460,474,480,486,489,493,496,502,512,529,535,545,551,555,558,564,586,596,606,612,616,619,633,639,645,651,660,666,669,673,940,943,947,953,959,965,971,975,984,993,1008,1017,1023,1033,1039,1043,1046,1049,1052,1085,1099,1102],[11,12,13],"p",{},"La decisión \"RDS o corro Postgres en mi cluster\" es la que más posterga el SaaS. Aparece en un documento de arquitectura el mes uno, se vuelve un TODO el mes tres, se vuelve una pelea interna el mes seis cuando la factura de AWS llega en tres cifras altas. Y mientras tanto, nadie quiere elegir — porque cada blog post sobre el tema está escrito por alguien con sesgo. Quien trabaja en proveedor gestionado dice que self-hosted te rompe. Quien mantiene Postgres desde hace quince años dice que RDS es robo. Los dos lados omiten cosas.",[11,15,16],{},"Este post abre la planilla de verdad. Sin adornos, sin vender un lado. Cuándo RDS tiene sentido, cuándo no, cuánto cuesta cada escenario, cuánto cuesta en hora de ingeniero, y cuáles son los cinco errores que hacen que self-hosted se vuelva accidente.",[18,19,21],"h2",{"id":20},"lo-que-los-servicios-gestionados-hacen-por-ti-sin-ironia","Lo que los servicios gestionados hacen por ti (sin ironía)",[11,23,24],{},"Antes de cualquier comparación, es honesto reconocer lo que RDS, Cloud SQL, Aurora y los Postgres-as-a-Service modernos (Supabase, Neon, Crunchy) entregan de hecho. La propaganda infló — pero el producto es real.",[11,26,27,31],{},[28,29,30],"strong",{},"Backup automático con retención configurable."," Le dices \"guarda siete días\" y está hecho. Snapshot incremental, sin ventana de mantenimiento visible, sin cron, sin niñera. Para muchos equipos, ese ítem solo justifica el cheque.",[11,33,34,37],{},[28,35,36],{},"Recuperación point-in-time (PITR)."," Descubres a las once de la mañana que un deploy a las nueve borró un campo importante. En RDS, restauras a 08:55. Sin leer manual de WAL archiving, sin rezar para que un log de transacciones esté íntegro en un bucket. Solo consola y botón.",[11,39,40,43],{},[28,41,42],{},"Patches de seguridad automáticos."," Postgres minor releases salen cada tres meses, y cada uno tiene CVE razonable. En gestionado, eso aplica en una ventana que tú defines. En self-hosted, descubres que estás retrasado cuando un check de compliance pega.",[11,45,46,49],{},[28,47,48],{},"Réplica de lectura en un clic."," ¿Quieres escalar lectura? Enciendes la réplica, esperas replicar, apuntas tu aplicación. En self-hosted, configuras streaming replication manualmente, gestionas slot de replicación, monitoreas retraso, defines qué pasa si la conexión cae.",[11,51,52,55],{},[28,53,54],{},"Failover Multi-AZ automático."," En RDS Multi-AZ, la instancia secundaria asume en 60–120 segundos cuando la primaria muere, y el endpoint DNS rutea solo. Es la feature más cara y la más útil del producto.",[11,57,58,61],{},[28,59,60],{},"Métricas integradas, logs centralizados."," CloudWatch ya tiene todo allí. Slow queries, cache hit ratio, conexiones activas, IO. Abres la consola y ves.",[11,63,64,67],{},[28,65,66],{},"Horas de operación que no pasas."," Ese es el ítem invisible. Cada una de las features de arriba es una tarde que no gastaste. Veinte tardes a lo largo del año se convierten en un ingeniero entero de dedicación parcial.",[11,69,70],{},"Reconocer esto es el punto de partida honesto. RDS es un producto serio. No es viento.",[18,72,74],{"id":73},"lo-que-los-servicios-gestionados-no-hacen-y-nadie-cuenta","Lo que los servicios gestionados NO hacen (y nadie cuenta)",[11,76,77],{},"Aquí vive el asterisco. Las limitaciones de abajo no están en la primera página de la documentación.",[11,79,80,83],{},[28,81,82],{},"Migrar a otra plataforma se vuelve un proyecto."," Cuando estás en Aurora, salir de Aurora es un proyecto de dos a doce semanas dependiendo del tamaño. El dialecto no es Postgres puro — Aurora tiene extensiones y comportamientos propios. Salir de Cloud SQL a otra nube exige dump-restore, downtime planificado, reescritura de scripts, ajuste de IAM, rehacer monitoreo. El coste de salida es lo que financia el descuento de la entrada.",[11,85,86,89],{},[28,87,88],{},"Algunas extensiones populares simplemente no existen."," TimescaleDB no corre en RDS (AWS ofrece un equivalente propio que no es compatible). pg_partman tiene versión antigua. pgvector llegó tarde. Si tu arquitectura depende de una extensión específica, puedes descubrir tres meses después que no está disponible en tu región, en tu versión, o en general.",[11,91,92,95],{},[28,93,94],{},"Tráfico de salida entre regiones cuesta."," Decides poner una réplica en otra región para disaster recovery. Cada gigabyte saliendo de la región principal a la secundaria paga peaje. En workloads pequeños es despreciable. En workloads de 200 GB de write por día, se vuelve una factura paralela.",[11,97,98,101],{},[28,99,100],{},"Latencia entre app y base si están en VPCs distintas."," Ese es el error silencioso. Subes la app en una red y la base en otra, con peering. La latencia mínima va de 0,3 ms (misma red) a 2–4 ms (peering). No parece mucho hasta que tu aplicación hace ciento veinte queries por request — ahí se vuelven 350 ms de latencia fantasma.",[11,103,104,107],{},[28,105,106],{},"Auditoría detallada cuesta extra."," ¿Quién hizo DROP TABLE? En RDS eso pide Performance Insights en el rango avanzado (US$7 por vCPU al mes) más un logging plugin. No viene activado.",[11,109,110,113],{},[28,111,112],{},"No controlas la ventana de mantenimiento de verdad."," \"Configuras\" una ventana, pero en incidentes graves AWS aplica patches fuera de ella. Ya pasó, pasará.",[18,115,117],{"id":116},"la-cuenta-financiera-honesta","La cuenta financiera honesta",[11,119,120,121,125],{},"Cambio de referencia: R$5 por dólar. Precios de RDS en región São Paulo (",[122,123,124],"code",{},"sa-east-1","), abril\u002F2026, on-demand. Self-hosted asume VPS DigitalOcean \u002F Vultr \u002F Hetzner en São Paulo o Miami.",[127,128,130],"h3",{"id":129},"escenario-pequeno-base-por-debajo-de-10-gb-hasta-100-conexionesseg","Escenario pequeño: base por debajo de 10 GB, hasta 100 conexiones\u002Fseg",[132,133,134,150],"table",{},[135,136,137],"thead",{},[138,139,140,144,147],"tr",{},[141,142,143],"th",{},"Ítem",[141,145,146],{},"RDS",[141,148,149],{},"Self-hosted",[151,152,153,165,182,193,204],"tbody",{},[138,154,155,159,162],{},[156,157,158],"td",{},"Instancia",[156,160,161],{},"db.t4g.micro (2 vCPU burst, 1 GB RAM)",[156,163,164],{},"VPS 2 vCPU 4 GB ya existente de la app",[138,166,167,170,176],{},[156,168,169],{},"Coste mensual",[156,171,172,173],{},"US$15 = ",[28,174,175],{},"R$75",[156,177,178,181],{},[28,179,180],{},"R$0"," (cabe junto con la app)",[138,183,184,187,190],{},[156,185,186],{},"Storage 10 GB gp3",[156,188,189],{},"US$1,15",[156,191,192],{},"incluido",[138,194,195,198,201],{},[156,196,197],{},"Backup 10 GB",[156,199,200],{},"US$0,95",[156,202,203],{},"R$0,50 (S3-compatible)",[138,205,206,209,214],{},[156,207,208],{},"Total",[156,210,211],{},[28,212,213],{},"R$85\u002Fmes",[156,215,216],{},[28,217,218],{},"R$0,50\u002Fmes",[11,220,221],{},"Diferencia: R$84\u002Fmes. En un año, R$1 mil. No le cambia la vida a nadie. Para un MVP, RDS es defendible solo por el backup automático.",[127,223,225],{"id":224},"escenario-medio-50-gb-1-mil-conexionesseg-1-replica-de-lectura","Escenario medio: 50 GB, 1 mil conexiones\u002Fseg, 1 réplica de lectura",[132,227,228,238],{},[135,229,230],{},[138,231,232,234,236],{},[141,233,143],{},[141,235,146],{},[141,237,149],{},[151,239,240,251,262,272,282,293,303],{},[138,241,242,245,248],{},[156,243,244],{},"Primaria",[156,246,247],{},"db.r6g.large (2 vCPU, 16 GB)",[156,249,250],{},"VPS dedicado 4 vCPU, 8 GB — R$120",[138,252,253,256,259],{},[156,254,255],{},"Réplica lectura",[156,257,258],{},"db.r6g.large",[156,260,261],{},"VPS 4 vCPU, 8 GB — R$120",[138,263,264,267,270],{},[156,265,266],{},"Storage 50 GB gp3",[156,268,269],{},"US$5,75",[156,271,192],{},[138,273,274,277,280],{},[156,275,276],{},"IOPS provisionado 3000",[156,278,279],{},"US$60",[156,281,192],{},[138,283,284,287,290],{},[156,285,286],{},"Backup 50 GB",[156,288,289],{},"US$4,75",[156,291,292],{},"R$5 (objeto compatible)",[138,294,295,298,301],{},[156,296,297],{},"Bandwidth",[156,299,300],{},"US$10",[156,302,192],{},[138,304,305,309,314],{},[156,306,307],{},[28,308,208],{},[156,310,311],{},[28,312,313],{},"US$280 = R$1.400\u002Fmes",[156,315,316],{},[28,317,318],{},"R$245\u002Fmes",[11,320,321,322,325],{},"Diferencia: R$1.155\u002Fmes = ",[28,323,324],{},"R$13,8 mil\u002Faño",". Aquí la conversación empieza. ¿Vale R$14 mil para no pensar en backup? Para un equipo de dos ingenieros, es un mes de trabajo de uno de ellos. Para un equipo de ocho, es despreciable.",[127,327,329],{"id":328},"escenario-grande-500-gb-10-mil-conexionesseg-alta-disponibilidad-real","Escenario grande: 500 GB, 10 mil conexiones\u002Fseg, alta disponibilidad real",[132,331,332,344],{},[135,333,334],{},[138,335,336,338,341],{},[141,337,143],{},[141,339,340],{},"RDS Multi-AZ",[141,342,343],{},"Cluster self-hosted",[151,345,346,356,366,377,386,397,408,419,430],{},[138,347,348,350,353],{},[156,349,244],{},[156,351,352],{},"db.r6g.4xlarge (16 vCPU, 128 GB) Multi-AZ",[156,354,355],{},"VPS dedicado 16 vCPU, 64 GB — R$650",[138,357,358,361,364],{},[156,359,360],{},"Réplica síncrona Multi-AZ",[156,362,363],{},"incluida",[156,365,355],{},[138,367,368,371,374],{},[156,369,370],{},"Réplica de lectura",[156,372,373],{},"db.r6g.2xlarge",[156,375,376],{},"VPS 8 vCPU, 32 GB — R$320",[138,378,379,382,384],{},[156,380,381],{},"Storage 500 GB io1",[156,383,279],{},[156,385,192],{},[138,387,388,391,394],{},[156,389,390],{},"IOPS provisionado 10 mil",[156,392,393],{},"US$650",[156,395,396],{},"NVMe local incluido",[138,398,399,402,405],{},[156,400,401],{},"Backup automático 500 GB",[156,403,404],{},"US$48",[156,406,407],{},"R$80 (WAL archiving)",[138,409,410,413,416],{},[156,411,412],{},"Performance Insights avanzado",[156,414,415],{},"US$112",[156,417,418],{},"gratis (Prometheus)",[138,420,421,424,427],{},[156,422,423],{},"Bandwidth salida",[156,425,426],{},"US$100",[156,428,429],{},"incluido hasta 20 TB",[138,431,432,436,441],{},[156,433,434],{},[28,435,208],{},[156,437,438],{},[28,439,440],{},"US$2.100 = R$10,5 mil\u002Fmes",[156,442,443],{},[28,444,445],{},"R$1.700\u002Fmes",[11,447,448,449,452],{},"Diferencia: R$8,8 mil\u002Fmes = ",[28,450,451],{},"R$105 mil\u002Faño",". Aquí es donde el gestionado se vuelve difícil de defender financieramente. Pero la cuenta financiera es solo la mitad. La otra mitad es tiempo.",[18,454,456],{"id":455},"la-cuenta-de-tiempo-mas-importante-que-la-financiera","La cuenta de tiempo (más importante que la financiera)",[11,458,459],{},"Tiempo de ingeniero en São Paulo cuesta entre R$80 y R$250 por hora útil dependiendo del nivel. Considera R$150\u002Fhora como media ponderada. Ese es el multiplicador que necesitas cruzar con cada ítem de abajo.",[11,461,462,465,466,469,470,473],{},[28,463,464],{},"Setup inicial."," RDS vía consola: treinta minutos. Defines instancia, storage, security group, parameter group, y está corriendo. Self-hosted bien hecho: cuatro a ocho horas. Postgres + PgBouncer + pgBackRest para S3 + monitoring + tuning de ",[122,467,468],{},"shared_buffers","\u002F",[122,471,472],{},"work_mem"," + script de restore + test de restore. Hacer eso en medio día exige experiencia previa. Sin experiencia, se vuelve un sprint entero.",[11,475,476,479],{},[28,477,478],{},"Operación continua mensual."," RDS: cero. Abres la consola cuando algo grita. Self-hosted bien hecho: dos a cuatro horas. Revisar slow queries, ajustar parámetro que quedó apretado, verificar que el backup se hizo, restore test mensual, actualizar versión menor. Eso es el régimen de crucero. Si gastas más que eso, hay problema.",[11,481,482,485],{},[28,483,484],{},"Cuando da pau a las tres de la mañana."," En RDS, abres ticket. Plan Business de AWS responde en cuatro horas para severidad alta, una hora para crítica. Te vas a dormir y te despiertas con workaround. En self-hosted, tú eres el soporte. Si tu sistema de monitoreo no te despertó, el cliente te despertó. Si tu plan de DR está en un documento que nadie leyó hace seis meses, estás improvisando.",[11,487,488],{},"La regla clara: tener monitoreo, plan de recuperación de desastre escrito, y test mensual de restore — no es opcional en self-hosted. Es lo que separa \"self-hosted profesional\" de \"accidente esperando suceder\".",[18,490,492],{"id":491},"stack-minimo-para-postgres-self-hosted-production-grade","Stack mínimo para Postgres self-hosted production-grade",[11,494,495],{},"No se puede correr Postgres en producción sin esa base. Cada componente de abajo resuelve un modo de fallo conocido.",[11,497,498,501],{},[28,499,500],{},"Postgres principal en servidor dedicado."," No compartas disco con la aplicación. El motor depende de IOPS predecibles, y un log de la app creciendo descontroladamente puede llenar el volumen y parar la base. Asigna un VPS solo para la base, o un volumen separado si es el mismo VPS al inicio.",[11,503,504,507,508,511],{},[28,505,506],{},"Pool de conexiones con PgBouncer o Pgpool."," Postgres asigna un proceso por conexión. En doscientas conexiones directas, consume más memoria que tu aplicación. PgBouncer en modo ",[122,509,510],{},"transaction"," resuelve: decenas de conexiones reales a la base sirviendo miles de conexiones de la aplicación. Sin eso, mueres en la primera hora pico.",[11,513,514,517,518,521,522,524,525,528],{},[28,515,516],{},"Backup con pgBackRest o WAL-E."," No uses ",[122,519,520],{},"pg_dump"," en cron como estrategia única. ",[122,523,520],{}," es dump lógico — bueno para migrar versión, malo para recuperar base grande en el minuto correcto. Quieres ",[122,526,527],{},"pg_basebackup"," semanal más archivado continuo de WAL para un bucket compatible con S3 (R2 de Cloudflare, B2 de Backblaze, Wasabi, o el propio S3). pgBackRest hace eso y además valida integridad.",[11,530,531,534],{},[28,532,533],{},"Réplica en hot standby por replicación en streaming."," Un segundo servidor recibiendo el WAL en tiempo real, listo para promover si el primario cae. Bono: usas ese mismo servidor para queries de lectura pesada, descargando el primario.",[11,536,537,544],{},[28,538,539,540,543],{},"Monitoreo con ",[122,541,542],{},"postgres_exporter"," + Prometheus + Grafana",", o un plug-in equivalente del orquestador que uses. Quieres ver: conexiones activas, ratio de cache, tasa de transacciones, lag de replicación, espacio en disco, slow queries. Sin eso, conduces con los ojos cerrados.",[11,546,547,550],{},[28,548,549],{},"Test de restore mensual automatizado."," Cron que toma el backup más reciente, restaura en un servidor temporal, valida que algunas tablas tienen filas. Si eso falla, alerta al equipo. Backup que nunca fue restaurado es placebo. Ya vimos equipos perder semana entera de datos porque el \"backup\" estaba corrupto desde hace tres meses y nadie testeó.",[18,552,554],{"id":553},"los-cinco-errores-que-rompen-postgres-self-hosted","Los cinco errores que rompen Postgres self-hosted",[11,556,557],{},"Son los mismos cinco desde hace quince años. No innovan.",[11,559,560,563],{},[28,561,562],{},"No testear restore."," Repetimos porque es el ítem más común. Backup que nunca fue restaurado no es backup, es archivo. Restore mensual automatizado es el mínimo civilizado.",[11,565,566,575,576,578,579,582,583,585],{},[28,567,568,569,571,572,574],{},"Mantener ",[122,570,468],{}," y ",[122,573,472],{}," en el por defecto."," El por defecto de Postgres está diseñado para correr en un servidor pequeño sin asumir nada. En producción, ",[122,577,468],{}," debe ser 25% de la RAM, ",[122,580,581],{},"effective_cache_size"," 50–75%, ",[122,584,472],{}," calculado por conexión simultánea. Sin eso, tienes 64 MB de cache en un servidor con 16 GB de RAM y el rendimiento está dejado en la mesa.",[11,587,588,591,592,595],{},[28,589,590],{},"No monitorear consultas lentas."," Una query mal escrita por un desarrollador distraído puede trabar la base entera. ",[122,593,594],{},"pg_stat_statements"," activado, alerta para cualquier query pasando de 500 ms en producción. Sin eso, descubres el problema cuando el cliente abre ticket.",[11,597,598,601,602,605],{},[28,599,600],{},"Disco compartido con el sistema operativo."," El log del sistema llena, el ",[122,603,604],{},"\u002Fvar"," de la base comparte el mismo volumen, y la base deja de aceptar escritura. Postgres tiene que estar en volumen dedicado. NVMe si es posible.",[11,607,608,611],{},[28,609,610],{},"Un solo servidor sin réplica."," Servidor cae — y cae, antes o después, hardware falla — y estás con downtime de una a tres horas restaurando del backup. Réplica síncrona en otro servidor reduce eso a segundos.",[18,613,615],{"id":614},"postgres-en-un-orquestador-como-heroctl","Postgres en un orquestador como HeroCtl",[11,617,618],{},"Aquí es donde la complejidad operacional cae. No porque Postgres se haya vuelto más simple — sigue siendo complejo — sino porque el orquestador absorbe la parte de plumbing que normalmente escribes a mano.",[11,620,621,624,625,628,629,632],{},[28,622,623],{},"Postgres como tarea del cluster."," La descripción del servicio es un archivo de configuración de aproximadamente treinta líneas: imagen oficial de Postgres, volumen nombrado para datos, variables de entorno para credenciales, recurso reservado de CPU y memoria, política de reinicio. Sin ",[122,626,627],{},"systemd unit",", sin ",[122,630,631],{},"apt install",", sin firewall manual.",[11,634,635,638],{},[28,636,637],{},"Persistencia vía volumen nombrado replicado."," Le dices \"este volumen es replicado entre dos servidores\", y el orquestador garantiza que los datos existen en los dos. Si el servidor que está corriendo Postgres cae, el cluster reagenda en el segundo servidor con los datos ya presentes. Tiempo de recuperación en el orden de segundos, no horas.",[11,640,641,644],{},[28,642,643],{},"Backup automático integrado"," en el plan Business: archivado continuo de WAL para objeto compatible con S3, snapshot semanal, retención configurable. La misma feature de RDS, sin cheque a AWS.",[11,646,647,650],{},[28,648,649],{},"Réplica de lectura como tarea adicional."," Describes un segundo servicio que apunta al primero como upstream de replicación. Cinco líneas extra en el manifiesto. Sin consola, sin clic, sin paso manual.",[11,652,653,656,657,659],{},[28,654,655],{},"Métricas embebidas."," El orquestador ya está colectando CPU, memoria, IO de cada contenedor. Añadir ",[122,658,542],{}," es una tarea más de quince líneas. Sin montar Prometheus separado, sin provisionar Grafana, sin reventar otro servidor.",[11,661,662,665],{},[28,663,664],{},"Failover automático"," si el servidor que coordina cae: el cluster elige otro coordinador en torno de siete segundos y sigue agendando. Postgres en sí vuelve en los servidores que sobraron en seguida.",[11,667,668],{},"La descripción completa de un Postgres con réplica + backup + métricas en HeroCtl es alrededor de cien líneas. En Kubernetes, el equivalente es un operador externo (CloudNativePG o Zalando) más 300 líneas de manifiesto, más un stack de monitoreo separado, más cert-manager para TLS interno entre nodos. Para el equipo de cinco personas, la diferencia es entre una tarde y un sprint.",[18,670,672],{"id":671},"tabla-comparativa","Tabla comparativa",[132,674,675,700],{},[135,676,677],{},[138,678,679,682,685,688,691,694,697],{},[141,680,681],{},"Criterio",[141,683,684],{},"RDS São Paulo",[141,686,687],{},"Cloud SQL",[141,689,690],{},"Supabase",[141,692,693],{},"Neon",[141,695,696],{},"Postgres VPS simple",[141,698,699],{},"Postgres en HeroCtl",[151,701,702,724,744,762,781,800,820,840,859,879,900,922],{},[138,703,704,707,710,713,716,719,722],{},[156,705,706],{},"Coste mínimo (50 GB medio)",[156,708,709],{},"R$1.400\u002Fmes",[156,711,712],{},"R$1.300\u002Fmes",[156,714,715],{},"R$125\u002Fmes (Pro)",[156,717,718],{},"R$95\u002Fmes (Launch)",[156,720,721],{},"R$240\u002Fmes",[156,723,318],{},[138,725,726,729,732,734,736,738,741],{},[156,727,728],{},"Backup automático",[156,730,731],{},"sí",[156,733,731],{},[156,735,731],{},[156,737,731],{},[156,739,740],{},"configuras tú",[156,742,743],{},"sí (Business)",[138,745,746,749,751,753,756,758,760],{},[156,747,748],{},"Recuperación point-in-time",[156,750,731],{},[156,752,731],{},[156,754,755],{},"sí (Pro)",[156,757,731],{},[156,759,740],{},[156,761,743],{},[138,763,764,767,770,772,775,777,779],{},[156,765,766],{},"Alta disponibilidad real",[156,768,769],{},"sí (Multi-AZ pago)",[156,771,731],{},[156,773,774],{},"parcial",[156,776,731],{},[156,778,740],{},[156,780,731],{},[138,782,783,786,789,791,793,795,798],{},[156,784,785],{},"Extensiones customizadas",[156,787,788],{},"restringido",[156,790,788],{},[156,792,788],{},[156,794,788],{},[156,796,797],{},"total",[156,799,797],{},[138,801,802,805,808,810,813,815,818],{},[156,803,804],{},"Lock-in",[156,806,807],{},"alto",[156,809,807],{},[156,811,812],{},"medio",[156,814,812],{},[156,816,817],{},"ninguno",[156,819,817],{},[138,821,822,825,828,830,833,835,838],{},[156,823,824],{},"Migración de salida",[156,826,827],{},"semanas",[156,829,827],{},[156,831,832],{},"días",[156,834,832],{},[156,836,837],{},"horas",[156,839,837],{},[138,841,842,845,847,849,851,853,856],{},[156,843,844],{},"Monitoreo incluido",[156,846,774],{},[156,848,731],{},[156,850,731],{},[156,852,731],{},[156,854,855],{},"montas tú",[156,857,858],{},"embebido",[138,860,861,864,867,869,871,873,876],{},[156,862,863],{},"Expertise mínima",[156,865,866],{},"ninguna",[156,868,866],{},[156,870,866],{},[156,872,866],{},[156,874,875],{},"senior",[156,877,878],{},"semi-senior",[138,880,881,884,887,889,892,895,898],{},[156,882,883],{},"Latencia app↔base",[156,885,886],{},"1–4 ms",[156,888,886],{},[156,890,891],{},"5–30 ms",[156,893,894],{},"10–50 ms",[156,896,897],{},"0,3 ms",[156,899,897],{},[138,901,902,905,908,910,913,916,919],{},[156,903,904],{},"Rango ideal",[156,906,907],{},"cualquier",[156,909,907],{},[156,911,912],{},"hasta 50 GB",[156,914,915],{},"hasta 100 GB",[156,917,918],{},"indie",[156,920,921],{},"startup a porte medio",[138,923,924,927,929,931,933,935,938],{},[156,925,926],{},"Compliance LGPD vía proveedor",[156,928,731],{},[156,930,731],{},[156,932,774],{},[156,934,774],{},[156,936,937],{},"documentas tú",[156,939,937],{},[11,941,942],{},"Ninguna columna gana en todo. Cada una es un conjunto coherente de tradeoffs. Quien intenta vender una columna como \"la mejor\" está vendiendo.",[18,944,946],{"id":945},"decision-honesta-por-perfil","Decisión honesta por perfil",[11,948,949,952],{},[28,950,951],{},"MVP hasta 10 GB y hasta cien conexiones\u002Fseg."," Postgres como contenedor al lado de la aplicación, en un único VPS. Backup diario para objeto compatible con S3. Coste total, base y todo, en el rango de R$10\u002Fmes por encima de lo que ya pagas por el VPS. En algún momento migras — y migrar con 10 GB es una noche de domingo, no un proyecto. Empieza simple.",[11,954,955,958],{},[28,956,957],{},"Indie hacker entre 10 y 100 GB."," Postgres en VPS dedicado, réplica asíncrona en segundo VPS, backup horario para objeto S3-compatible (Cloudflare R2 o Backblaze B2 sale en céntimos). Algo entre R$120 y R$200 al mes total. Si tienes hora para dedicar, ese es el punto donde self-hosted compensa mucho.",[11,960,961,964],{},[28,962,963],{},"Startup early entre 100 y 500 GB."," Aquí la decisión queda de verdad. Evalúa RDS São Paulo por el argumento de compliance LGPD (AWS ya tiene el cuaderno de certificaciones del datacenter) — saldrá en el rango de R$1,5 a R$3 mil al mes. O evalúa Postgres en cluster gestionado por el orquestador, en tres VPS dedicados, en el rango de R$400 al mes — pero exige disciplina operacional real. No es \"self-hosted descomplicado\". Es self-hosted con orquestador absorbiendo la parte de plumbing.",[11,966,967,970],{},[28,968,969],{},"Compliance pesada o Enterprise."," Gestionado tiene sentido cuando el framework de auditoría pide proveedor con certificación específica. Pero lee el contrato — algunas regiones de RDS en Brasil aún no tienen todas las certificaciones (HIPAA, FedRAMP, PCI nivel 1) que la región americana tiene. Si tu auditor pide un certificado específico, confirma que la región lo tiene antes de firmar.",[18,972,974],{"id":973},"preguntas-que-equipo-inexperto-hace","Preguntas que equipo inexperto hace",[11,976,977,980,981,983],{},[28,978,979],{},"¿Puedo empezar con self-hosted y migrar a RDS después?"," Puedes, y es una estrategia válida. Postgres es Postgres. Haces ",[122,982,520],{}," de la base, restauras en RDS, ajustas endpoint de la aplicación, decomisionas el servidor antiguo. Para hasta 50 GB, es una operación de algunas horas con ventana corta. El camino contrario (salir de RDS a self-hosted) también funciona, pero herramientas como AWS DMS facilitan más el ingreso que la salida.",[11,985,986,989,990,992],{},[28,987,988],{},"¿RDS São Paulo es confiable?"," La región ",[122,991,124],{}," es una de las más antiguas de AWS fuera de Estados Unidos, opera desde 2011, y tiene tres zonas de disponibilidad independientes. En incidentes globales de AWS, São Paulo suele ser tomada también. En incidentes regionales, cae sola — lo que pasó dos veces en los últimos cinco años por algunas horas. Confiable lo suficiente para producción, no confiable lo suficiente para prescindir de plan B.",[11,994,995,1001,1002,1004,1005,1007],{},[28,996,997,998,1000],{},"¿Backup con ",[122,999,520],{}," en cron resuelve?"," Resuelve para MVP, no resuelve para producción seria. ",[122,1003,520],{}," es dump lógico — no preserva el estado exacto, pierde en el tiempo de restore (lento para bases grandes), y no permite recuperar al minuto X. La combinación correcta es ",[122,1006,527],{}," físico semanal más archivado continuo de WAL. Herramienta: pgBackRest.",[11,1009,1010,1013,1014,1016],{},[28,1011,1012],{},"¿Cuándo vale la pena comprar Performance Insights en el rango avanzado?"," Cuando estás en RDS, tienes más de cinco ingenieros tocando el schema, y necesitas rastrear \"¿quién corrió esa query?\". En equipos pequeños, el ",[122,1015,594],{}," nativo ya entrega 80% del valor — actívalo primero y mira si necesitas más.",[11,1018,1019,1022],{},[28,1020,1021],{},"¿Y Supabase, Neon, Crunchy?"," Son productos diferentes encima de Postgres. Supabase es Postgres + autenticación + API REST generada + storage de archivos — bueno para proyecto que necesita todo eso integrado, malo para quien quiere solo base. Neon separa storage y compute, duerme cuando ocioso, óptimo para ambiente de staging y workload spiky. Crunchy es Postgres puro con foco enterprise y operador para Kubernetes. Los tres tienen capas gratis razonables para MVP — vale testear antes de cerrar con RDS.",[11,1024,1025,1028,1029,1032],{},[28,1026,1027],{},"¿Cómo hago HA real sin RDS Multi-AZ?"," Réplica síncrona en segundo servidor (",[122,1030,1031],{},"synchronous_standby_names"," configurado) garantiza que cada commit fue escrito en los dos antes de retornar OK a la aplicación. Failover vía Patroni, o vía orquestador como HeroCtl. El punto sensible es el split-brain: la réplica no puede promover sola sin confirmación externa. Patroni resuelve con etcd como árbitro. HeroCtl resuelve con el propio plano de control distribuido haciendo el papel de árbitro — sin montar servicio extra.",[11,1034,1035,1038],{},[28,1036,1037],{},"¿HeroCtl corre Postgres pesado en producción de verdad?"," Corre. El cluster público de la propia documentación sirve este blog a través de un stack que incluye un Postgres self-hosted como tarea del cluster, con réplica y backup. Para workloads por encima de 500 GB o con requisitos de IOPS en el orden de 50 mil, recomendamos evaluar gestionado — no porque el orquestador no aguante, sino porque el IOPS provisionado y el control de I\u002FO de AWS en ese rango empiezan a hacer diferencia operacional real.",[18,1040,1042],{"id":1041},"cierre","Cierre",[11,1044,1045],{},"No existe respuesta única para \"Postgres gestionado o auto-hospedado\". Existe tu planilla. Si abriste este post buscando confirmación, lo que encontraste fueron números — úsalos.",[11,1047,1048],{},"Para los perfiles en que self-hosted compensa pero la operación asusta, HeroCtl es la capa que reduce el roce. Backup, réplica, monitoreo y failover descritos en cien líneas de configuración, corriendo en tu cluster, sin cheque a proveedor, sin lock-in.",[11,1050,1051],{},"Instala con:",[1053,1054,1059],"pre",{"className":1055,"code":1056,"language":1057,"meta":1058,"style":1058},"language-bash shiki shiki-themes github-dark-default","curl -sSL get.heroctl.com\u002Finstall.sh | sh\n","bash","",[122,1060,1061],{"__ignoreMap":1058},[1062,1063,1066,1070,1074,1078,1082],"span",{"class":1064,"line":1065},"line",1,[1062,1067,1069],{"class":1068},"sQhOw","curl",[1062,1071,1073],{"class":1072},"sFSAA"," -sSL",[1062,1075,1077],{"class":1076},"s9uIt"," get.heroctl.com\u002Finstall.sh",[1062,1079,1081],{"class":1080},"suJrU"," |",[1062,1083,1084],{"class":1068}," sh\n",[11,1086,1087,1088,1093,1094,1098],{},"Para más sobre el coste total de alojar SaaS en 2026, lee ",[1089,1090,1092],"a",{"href":1091},"\u002Fes\u002Fblog\u002Fcuanto-cuesta-alojar-un-saas-2026","cuánto cuesta alojar un SaaS",". Para la transición práctica de Docker Compose a cluster con alta disponibilidad real, lee ",[1089,1095,1097],{"href":1096},"\u002Fes\u002Fblog\u002Fdeploy-docker-produccion-de-compose-a-cluster","deploy Docker en producción, del Compose al cluster",".",[11,1100,1101],{},"La cuenta honesta es la que cabe en tu planilla. Haz los números antes de decidir.",[1103,1104,1105],"style",{},"html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":1058,"searchDepth":1107,"depth":1107,"links":1108},2,[1109,1110,1111,1117,1118,1119,1120,1121,1122,1123,1124],{"id":20,"depth":1107,"text":21},{"id":73,"depth":1107,"text":74},{"id":116,"depth":1107,"text":117,"children":1112},[1113,1115,1116],{"id":129,"depth":1114,"text":130},3,{"id":224,"depth":1114,"text":225},{"id":328,"depth":1114,"text":329},{"id":455,"depth":1107,"text":456},{"id":491,"depth":1107,"text":492},{"id":553,"depth":1107,"text":554},{"id":614,"depth":1107,"text":615},{"id":671,"depth":1107,"text":672},{"id":945,"depth":1107,"text":946},{"id":973,"depth":1107,"text":974},{"id":1041,"depth":1107,"text":1042},"engineering",null,"2026-04-15","RDS empieza en US$15\u002Fmes — termina en US$500. Auto-hospedar empieza en $0 — termina despertándote a las 3 de la mañana. Cómo decidir entre los dos sin engañarte.",false,"md",{},true,"\u002Fes\u002Fblog\u002Fpostgres-en-produccion-gestionado-vs-auto-hospedado","14 min",{"title":5,"description":1128},{"loc":1133},"es\u002Fblog\u002Fpostgres-en-produccion-gestionado-vs-auto-hospedado",[1139,1140,1141,1142,1143],"postgres","base-de-datos","rds","self-hosted","ingenieria","bAVvBcP1TKuFb6Y_hxxzymp2Fo5YHDRVNBLYyiT4TtI",[1146,1153],{"title":1147,"path":1148,"stem":1149,"description":1150,"date":1151,"category":1152,"children":-1},"Por qué creamos HeroCtl","\u002Fes\u002Fblog\u002Fpor-que-creamos-heroctl","es\u002Fblog\u002Fpor-que-creamos-heroctl","Kubernetes exige un equipo de SRE. Los paneles simples no tienen alta disponibilidad real. El competidor técnico más cercano cambió de licencia y fue adquirido. Faltaba una alternativa — así que la construimos.","2025-11-12","release",{"title":1154,"path":1155,"stem":1156,"description":1157,"date":1158,"category":1125,"children":-1},"Redis (y Valkey) en producción: gestionado vs auto-hospedado en 2026","\u002Fes\u002Fblog\u002Fredis-en-produccion-gestionado-vs-auto-hospedado","es\u002Fblog\u002Fredis-en-produccion-gestionado-vs-auto-hospedado","Redis cambió de licencia en 2024, Valkey nació como fork OSS, Dragonfly bate benchmarks. En 2026, elegir cache ya no es elegir Redis — es elegir entre 4 productos. Análisis honesto con costes.","2026-05-20",1777362218092]