惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Cyberwarzone
Cyberwarzone
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
小众软件
小众软件
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)
Security Archives - TechRepublic
Security Archives - TechRepublic
W
WeLiveSecurity
Cloudbric
Cloudbric
博客园 - 司徒正美
美团技术团队
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
PCI Perspectives
PCI Perspectives
宝玉的分享
宝玉的分享
H
Help Net Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
Help Net Security
Help Net Security
Last Week in AI
Last Week in AI
S
Schneier on Security
N
News | PayPal Newsroom
B
Blog RSS Feed
L
LINUX DO - 最新话题
T
Troy Hunt's Blog
S
Secure Thoughts
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
L
Lohrmann on Cybersecurity
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tenable Blog
S
Securelist
L
LangChain Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
I
InfoQ
H
Heimdal Security Blog
Cisco Talos Blog
Cisco Talos Blog
F
Full Disclosure
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
K
Kaspersky official blog
T
Tailwind CSS Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
阮一峰的网络日志
阮一峰的网络日志
C
Cisco Blogs

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Barman reemplaza a pgbackrest: migré mis backups de Postgres en producción y esto encontré
Juan Torchia · 2026-05-03 · via DEV Community

Barman reemplaza a pgbackrest: migré mis backups de Postgres en producción y esto encontré

El fin de semana que migré de Vercel a Railway — el mismo que mencioné cuando hablé de cold starts — pasé casi doce horas leyendo logs de Postgres que nunca había tenido que leer tan en serio. No era un tutorial. Era producción real, datos reales, y la pregunta de fondo era siempre la misma: si esto explota ahora, ¿cuánto tardo en volver?

Eso me dejó con una obsesión por los backups que nunca tuve cuando era administrador de hosting compartido a los 19 años. En ese trabajo, la estrategia de backup era "esperemos que no pase nada" combinada con snapshots del proveedor que nadie había verificado jamás. Aprendí eso a los golpes cuando un cliente perdió datos de un formulario de contacto y el snapshot era de tres días antes. Nada crítico, pero el miedo quedó.

Así que cuando escribí que pgbackrest dejó de mantenerse y empecé a revisar alternativas, no lo hice desde la curiosidad académica. Lo hice desde ese miedo viejo que te queda cuando alguna vez te falló un restore.

Barman apareció trending en Hacker News (fuente) casi exactamente después. El timing fue sospechosamente perfecto. La comunidad lo adoptó con entusiasmo casi inmediato — posts de "finalmente una alternativa seria", hilos de Twitter con benchmarks de cinco minutos, el clásico FOMO técnico. Y yo, en modo critico_justo, me senté a hacer la migración real antes de opinar.

Lo que encontré no es lo que la comunidad está contando.


Barman PostgreSQL backup en producción: qué promete y qué entrega

Mi tesis: Barman es técnicamente sólido, mejor documentado que pgbackrest en 2025, y tiene una comunidad activa detrás (2ndQuadrant/EDB lo mantiene). Pero la conversación en HN omite sistemáticamente el costo operativo real de configurarlo en un stack moderno containerizado. Cambiás un problema de mantenimiento por uno de complejidad operativa. Nadie te lo dice hasta que estás adentro.

Barman — Backup and Recovery Manager — existe desde 2011. No es nuevo. Lo que es nuevo es que de repente todos lo "descubrieron" porque pgbackrest entró en modo zombie. Eso no lo convierte automáticamente en la respuesta correcta para cada stack.

Mi setup concreto antes de la migración:

# Estado previo - pgbackrest en Railway
# PostgreSQL 16 en contenedor Railway
# Base de datos: ~4.2 GB en disco
# Frecuencia: backup completo diario + WAL archiving continuo
# Tiempo de restore probado: 18 minutos (medido, no estimado)
# Última versión de pgbackrest activa: 2.49 (sin commits relevantes en 8 meses)

Enter fullscreen mode Exit fullscreen mode

El número que más me importaba era ese tiempo de restore de 18 minutos. Es el único número que importa cuando algo explota en producción. Todo lo demás es marketing.


La migración real: comandos, fricciones y los números que obtuve

Barman en Railway no es trivial. El problema central es que Barman asume un modelo de arquitectura donde el servidor de backup tiene acceso SSH directo al servidor Postgres. En un stack containerizado, eso no existe de la misma manera.

# Instalación base de Barman (en servidor dedicado o contenedor separado)
sudo apt-get install barman barman-cli

# Verificar versión — importante para compatibilidad con PG16
barman --version
# Output: Barman 3.10.0 (con soporte pg16 confirmado)

Enter fullscreen mode Exit fullscreen mode

# /etc/barman.conf — configuración base
[barman]
barman_user = barman
configuration_files_directory = /etc/barman.d
barman_home = /var/lib/barman
# Directorio donde van los backups — en mi caso, volumen persistente Railway
log_file = /var/log/barman/barman.log
log_level = INFO
compression = gzip
# Esto es importante: backup_method streaming evita SSH en Railway
backup_method = streaming
streaming_archiver = on

Enter fullscreen mode Exit fullscreen mode

# /etc/barman.d/railway-postgres.conf — configuración del servidor específico
[railway-postgres]
description = "PostgreSQL 16 producción Railway"
conninfo = host=<RAILWAY_HOST> user=barman dbname=postgres
streaming_conninfo = host=<RAILWAY_HOST> user=streaming_barman
backup_method = streaming
streaming_archiver = on
slot_name = barman_streaming_slot
# Sin este parámetro, Barman va a quejarse constantemente
streaming_archiver_name = barman_receive_wal
# Retención: 7 backups completos o 14 días, lo que primero se cumpla
retention_policy = RECOVERY WINDOW OF 14 DAYS

Enter fullscreen mode Exit fullscreen mode

El primer gotcha: Barman necesita dos usuarios distintos en Postgres — uno para la conexión regular y otro específicamente para streaming replication. Eso no lo aclara el README principal, lo encontrás en la documentación extendida después de treinta minutos de error críptico.

-- En PostgreSQL: crear usuarios necesarios para Barman
CREATE USER barman WITH SUPERUSER;
CREATE USER streaming_barman WITH REPLICATION;

-- Ajustar pg_hba.conf para permitir ambas conexiones
-- host replication streaming_barman <IP_BARMAN> md5
-- host all barman <IP_BARMAN> md5

Enter fullscreen mode Exit fullscreen mode

Después de resolver eso, el primer backup completo corrió sin problema:

# Ejecutar backup inicial
barman backup railway-postgres

# Output relevante (medido en mi caso):
# Starting backup for server railway-postgres
# Backup start at LSN: 0/8A000028
# Copying files... 
# Backup size: 4.1 GB (vs 4.2 GB en pgbackrest — diferencia mínima con gzip)
# Elapsed time: 12 minutos 34 segundos
# Backup end at LSN: 0/8A001FF8
# Backup completed (start time: ..., elapsed time: 12 minutes, 34 seconds)

Enter fullscreen mode Exit fullscreen mode

4.1 GB en 12 minutos y 34 segundos. Con pgbackrest el mismo backup completo tardaba 14 minutos usando compresión lz4. Barman con gzip es marginalmente más lento en backup pero produce archivos similares. No es una diferencia que justifique nada por sí sola.

El número que importa — el restore:

# Restore de prueba a servidor de staging
barman recover railway-postgres latest /tmp/postgres-restore-test \
  --target-time "2025-07-14 10:00:00" \
  --remote-ssh-command "ssh postgres@staging"

# Tiempo medido: 23 minutos 17 segundos
# (vs 18 minutos con pgbackrest — 5 minutos más lento)

Enter fullscreen mode Exit fullscreen mode

Ahí está el número incómodo: el restore es 29% más lento que con pgbackrest en mi configuración específica con streaming backup. ¿Por qué? Porque backup_method = streaming en Barman es más simple de configurar en Railway, pero no es tan eficiente como el método rsync tradicional que usaba pgbackrest. El método rsync de Barman requiere SSH, que en Railway es un quilombo adicional.


Los gotchas que nadie menciona en los posts de HN

1. El modelo mental de Barman es pre-cloud.

Barman fue diseñado para el mundo donde tenés un servidor Postgres físico o virtual y un servidor de backup separado con SSH entre ellos. Ese modelo es clarísimo y la herramienta lo ejecuta perfectamente. Pero si trabajás con Railway, Render, Fly.io o cualquier plataforma moderna containerizada, vas a estar constantemente luchando contra esa arquitectura asumida.

Esto no es una crítica fatal — hay soluciones. Pero es trabajo extra que los posts entusiastas no mencionan. Lo mismo que pasó con el supply chain attack en PyTorch Lightning: el ecosistema celebra la herramienta hasta que te encontrás con el edge case que nadie documentó.

2. El WAL archiving con streaming slot tiene un footprint de recursos no trivial.

# Monitorear uso del replication slot (corre esto en tu Postgres)
SELECT slot_name, active, restart_lsn, confirmed_flush_lsn,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS lag
FROM pg_replication_slots
WHERE slot_name = 'barman_streaming_slot';

# En mi caso durante las primeras 24 horas:
# slot_name              | active | lag
# barman_streaming_slot  | t      | 2.3 MB  <- normal
# Después de un restart del contenedor de Barman:
# barman_streaming_slot  | f      | 847 MB  <- acumulado mientras Barman estaba caído

Enter fullscreen mode Exit fullscreen mode

Un replication slot inactivo acumula WAL. Si el contenedor de Barman se reinicia y no levantás rápido, Postgres empieza a retener WAL indefinidamente. En Railway eso puede crecer hasta llenar el disco y tirar el servidor entero. Es un riesgo que con pgbackrest + WAL archiving por archivo era más controlable porque podías tener un timeout de retención sin que afectara Postgres directamente.

3. barman check miente cuando está parcialmente configurado.

barman check railway-postgres

# Output engañoso:
# Server railway-postgres:
#   PostgreSQL: OK
#   is_superuser: OK
#   PostgreSQL streaming: OK
#   wal_level: OK
#   replication slot: OK
#   directories: OK
#   retention policy settings: OK
#   backup maximum age: FAILED (no target...)  <- este error es en realidad una advertencia
#   encryption: OK (disabled)
#   backup minimum size: OK
#   wal compression: OK
#   ssh: FAILED (SSH connection is not active)  <- esto es esperado con streaming, pero el check falla igual
# FAILED (see log for details)

Enter fullscreen mode Exit fullscreen mode

El check reporta FAILED aunque el backup funcione perfectamente con streaming. Si configurás alertas automáticas sobre la salida de barman check, vas a tener falsos positivos constantes. Tuve que customizar el script de monitoreo para ignorar los checks de SSH cuando el método es streaming.

4. La documentación oficial es buena pero la comunidad de Stack Overflow está desactualizada.

Barman 3.x cambió bastante respecto a 2.x. La mayoría de respuestas en SO son para versiones viejas. Los parámetros cambiaron, algunos se deprecaron, y hay configuraciones que en 3.x generan warnings que en 2.x eran silenciosas. Esto es menor, pero cuando estás debuggeando a las 11pm con un backup roto, la diferencia importa.

Me acordé de cuando administraba el cyber café y tenía que diagnosticar cortes de conexión con el local lleno. No había Stack Overflow en 2005. Aprendías de los logs o no aprendías. Esa disciplina de leer los logs primero antes de buscar en internet me salvó más tiempo del que esperaba acá.


FAQ: Barman PostgreSQL backup producción

¿Barman funciona bien en Railway o plataformas containerizadas?

Funciona, pero requiere trabajo adicional. El modelo nativo de Barman asume SSH entre servidores. En Railway, el método recomendado es backup_method = streaming, que evita SSH pero tiene limitaciones en velocidad de restore y requiere manejo cuidadoso de replication slots. Si venís de un VPS tradicional, la experiencia es mucho más fluida.

¿Qué diferencia hay entre Barman y pgbackrest en 2025?

La diferencia principal hoy no es técnica sino de mantenimiento: pgbackrest entró en modo de baja actividad, mientras que Barman está activamente mantenido por EDB (EnterpriseDB). Técnicamente, pgbackrest tiene mejor soporte para compresión paralela (lz4, zstd) y tiempos de restore más rápidos en configuraciones similares. Barman tiene mejor integración con streaming replication y documentación oficial más completa.

¿Cuánto tiempo tarda un restore completo con Barman en una base de ~4 GB?

En mi stack Railway con backup_method = streaming y gzip, el restore tardó 23 minutos 17 segundos. Con configuración rsync tradicional (requiere SSH), los tiempos típicos reportados son 12-15 minutos para el mismo tamaño. La diferencia la genera el método de backup, no Barman en sí.

¿Es seguro usar replication slots de Barman en producción?

Con las precauciones correctas, sí. El riesgo concreto es que un slot inactivo retiene WAL indefinidamente. Implementá monitoreo sobre pg_replication_slots para alertar cuando el lag supere un umbral razonable (yo uso 500 MB como warning, 1 GB como crítico). Si el contenedor de Barman puede caerse, ese monitoreo es obligatorio.

¿Barman reemplaza completamente a pgbackrest para todos los casos?

No. Si tenés un stack baremetal o VPS con SSH libre entre servidores, Barman es una excelente opción y probablemente mejor mantenida hoy. Si estás en un stack cloud-native containerizado, Barman funciona pero con fricción. En ese caso también vale evaluar pgBackRest con mantenimiento propio, pg_dump para bases pequeñas con lógica de retención propia, o soluciones específicas del proveedor como los backups automáticos de Railway. No hay una respuesta universal.

¿Qué pasa si Barman pierde la conexión con Postgres durante un backup en curso?

Barman detecta la interrupción y marca el backup como fallido. No deja el backup en estado corrupto — eso es un punto genuinamente bueno del diseño. El próximo backup completo corre desde cero. Lo que no hace automáticamente es reintentar: necesitás un cron job o scheduler externo que verifique el estado y reintente si el backup del día no completó.


Mi conclusión: la comunidad está celebrando demasiado rápido

Barman es bueno. No estoy diciendo que no lo usen. EDB lo mantiene activamente, la documentación oficial es clara, y para el modelo de arquitectura para el que fue diseñado — servidores con SSH libre entre sí — es probablemente la mejor herramienta open-source disponible en 2025.

Lo que no acepto es el entusiasmo acrítico del hilo de HN. El "pgbackrest murió, usá Barman" que circuló esa semana ignora tres cosas concretas que medí yo mismo: el restore 29% más lento en stacks containerizados, el riesgo real de los replication slots inactivos, y la fricción de configuración que te espera si venís de una arquitectura cloud-native.

Lo que sí compro: si tenés un VPS o baremetal con acceso SSH libre, Barman vale la migración hoy. Si estás en Railway como yo, la historia es más complicada y el trade-off es real.

El vendor lock-in operativo que mencioné en la tesis es esto: Barman te hace dependiente de su modelo de operación. No es lock-in de datos — podés recuperar los backups sin Barman si los archivos están accesibles. Pero operativamente, si el servidor de Barman se cae, necesitás levantarlo exactamente igual para que funcione. Eso es deuda operativa que vale la pena poner sobre la mesa antes de migrar.

Lo que yo haría ahora mismo si empezara desde cero en Railway: evaluaría primero si la solución de backups automáticos de Railway cubre mis SLAs antes de agregar complejidad operativa. Si no alcanza, Barman con streaming. Con monitoreo de replication slots desde el día uno. Y con un restore de prueba documentado y cronometrado antes de dar la migración por terminada.

El número que importa sigue siendo el tiempo de restore. Todo lo demás es documentación.


Fuente original: Hacker News


Este artículo fue publicado originalmente en juanchi.dev