{"id":287,"date":"2026-05-04T08:36:43","date_gmt":"2026-05-04T12:36:43","guid":{"rendered":"https:\/\/juredev.com\/blog\/?p=287"},"modified":"2026-05-04T08:36:45","modified_gmt":"2026-05-04T12:36:45","slug":"guia-completa-de-respaldos-con-borgbackup-en-debian-13","status":"publish","type":"post","link":"https:\/\/juredev.com\/blog\/2026\/05\/guia-completa-de-respaldos-con-borgbackup-en-debian-13\/","title":{"rendered":"Gu\u00eda completa de respaldos con BorgBackup en Debian 13"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Cuando los backups fallan<\/h2>\n\n\n\n<p>Era un martes a las 2 de la ma\u00f1ana. Un script mal escrito empez\u00f3 a recorrer <code>\/home<\/code> y borr\u00f3 archivos de configuraci\u00f3n de decenas de usuarios. El equipo ten\u00eda backups\u2026 pero estaban en el mismo servidor. Y ese servidor ya estaba comprometido.<\/p>\n\n\n\n<p>Esta historia se repite m\u00e1s veces de las que se cuenta en p\u00fablico. Casi nunca es por falta de herramientas, sino por una arquitectura de respaldos negligente.<\/p>\n\n\n\n<p>Esta gu\u00eda te muestra c\u00f3mo montar una estrategia de backups <strong>seria y robusta<\/strong> con <strong>BorgBackup<\/strong> en Debian 13: deduplicada, cifrada de extremo a extremo, automatizada y \u2014sobre todo\u2014 recuperable cuando realmente lo necesites.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfPor qu\u00e9 BorgBackup?<\/h2>\n\n\n\n<p>Borg no es el \u00fanico software de backups, pero s\u00ed uno de los pocos que combina varias caracter\u00edsticas clave en una sola herramienta:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Deduplicaci\u00f3n a nivel de bloqu<\/strong>e: solo guarda los cambios entre snapshots, lo que reduce dr\u00e1sticamente el espacio necesario.<\/li>\n\n\n\n<li><strong>Cifrado zero-knowledge del lado del cliente<\/strong>: tus datos salen cifrados del servidor. El proveedor remoto nunca puede acceder a ellos.<\/li>\n\n\n\n<li><strong>Compresi\u00f3n eficiente<\/strong>: soporta LZ4 (priorizando velocidad) y Zstandard (mejor ratio).<\/li>\n\n\n\n<li><strong>Montaje v\u00eda FUSE<\/strong>: puedes explorar cualquier backup como si fuera un sistema de archivos normal.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">C\u00f3mo funciona internamente (sin complicaciones)<\/h3>\n\n\n\n<p>Antes de ejecutar el primer comando, vale la pena entender el flujo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Chunking<\/strong>: Borg divide los archivos en bloques de tama\u00f1o variable.<\/li>\n\n\n\n<li><strong>Deduplicaci\u00f3n local<\/strong>: compara esos bloques con los que ya tiene y solo env\u00eda los nuevos.<\/li>\n\n\n\n<li><strong>Cifrado<\/strong>: cada bloque se cifra con la clave del repositorio antes de salir.<\/li>\n\n\n\n<li><strong>Transmisi\u00f3n por SSH<\/strong>: usa el SSH est\u00e1ndar, sin dependencias extra.<\/li>\n\n\n\n<li><strong>Almacenamiento remoto<\/strong>: el destino solo recibe bloques opacos que no puede descifrar.<\/li>\n<\/ul>\n\n\n\n<p>Este dise\u00f1o explica por qu\u00e9 los backups incrementales de Borg son tan eficientes. Puedes modificar 10 archivos de 1 GB y, si solo cambiaron 50 MB en total, Borg solo transmitir\u00e1 esos ~50 MB.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Requisitos previos<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Servidor con Debian 13 (nuestro caso) y acceso root.<\/li>\n\n\n\n<li>Conexi\u00f3n a internet.<\/li>\n\n\n\n<li>Una cuenta en <a href=\"https:\/\/www.borgbase.com\/\">BorgBase<\/a> (nuestro caso) o un servidor SSH propio.<\/li>\n\n\n\n<li>10-15 minutos para la configuraci\u00f3n inicial.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">1. Instalaci\u00f3n<\/h2>\n\n\n\n<p>BorgBackup est\u00e1 disponible directamente en los repositorios de Debian 13:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apt update &amp;&amp; apt install borgbackup -y<\/code><\/pre>\n\n\n\n<p>Verifica la versi\u00f3n instalada:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>borg --version<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2. Generaci\u00f3n de claves SSH<\/h2>\n\n\n\n<p>Para la automatizaci\u00f3n necesitamos acceso SSH sin contrase\u00f1a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-keygen -t ed25519 -a 100 -C \"root@tu-servidor-borg\"<\/code><\/pre>\n\n\n\n<p>Se generar\u00e1n dos archivos:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Archivo<\/th><th>Uso<\/th><\/tr><tr><td><code>\/root\/.ssh\/id_ed25519<\/code><\/td><td>Clave privada (nunca sale del servidor)<\/td><\/tr><tr><td><code>\/root\/.ssh\/id_ed25519.pub<\/code><\/td><td>Clave p\u00fablica (la subir\u00e1s al destino)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Puedes ver la clave p\u00fablica con:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/root\/.ssh\/id_ed25519.pub<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3. Configuraci\u00f3n del repositorio remoto<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Opci\u00f3n A: BorgBase (recomendada para la mayor\u00eda)<\/h3>\n\n\n\n<p>BorgBase es un servicio dise\u00f1ado espec\u00edficamente para Borg.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Sube tu clave p\u00fablica en el panel de control.<\/li>\n\n\n\n<li>Crea un nuevo repositorio.<\/li>\n\n\n\n<li>Asigna permisos <strong>Full Access<\/strong> a la clave.<\/li>\n\n\n\n<li>Copia la URL del repositorio (formato: <code>usuario@usuario.repo.borgbase.com:repo<\/code>).<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Opci\u00f3n B: Servidor SSH propio (self-hosted)<\/h3>\n\n\n\n<p>Cualquier servidor Linux con Borg instalado sirve. Solo necesitas un directorio vac\u00edo para el repositorio y acceso SSH con clave.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Inicializaci\u00f3n del repositorio<\/h2>\n\n\n\n<p>Este comando se ejecuta una sola vez:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export BORG_RSH='ssh -i ~\/.ssh\/id_ed25519'\nborg init --encryption=repokey-blake2 usuario@repo:repo<\/code><\/pre>\n\n\n\n<p>Borg te pedir\u00e1 una passphrase.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Importante<\/strong>: sin esta passphrase y la clave del repositorio, los datos son irrecuperables para siempre. Gu\u00e1rdalos en un lugar seguro y fuera del servidor.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">5. Primer backup manual<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>borg create --stats --progress --compression lz4 \\\n    usuario@repo:repo::home-{now:%Y-%m-%d} \\\n    \/home<\/code><\/pre>\n\n\n\n<p>La primera ejecuci\u00f3n enviar\u00e1 todos los datos. Las siguientes solo enviar\u00e1n los cambios. Al final ver\u00e1s estad\u00edsticas detalladas de deduplicaci\u00f3n y compresi\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Automatizaci\u00f3n con script<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Script de respaldo (<code>\/root\/backupborg.sh<\/code>)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n\nexport BORG_RSH='ssh -i ~\/.ssh\/id_ed25519'\nexport BORG_PASSPHRASE='TU_CONTRASE\u00d1A_SEGURA'\nREPO='usuario@repo:repo'\n\n# Crear backup\nborg create --stats $REPO::home-{now:%Y-%m-%d_%H%M} \/home\n\n# Pol\u00edtica de retenci\u00f3n\nborg prune -v --list \\\n    --keep-daily=7 \\\n    --keep-weekly=4 \\\n    $REPO\n\n# Liberar espacio\nborg compact $REPO<\/code><\/pre>\n\n\n\n<p><strong>Nota de seguridad<\/strong>: Tener la passphrase en el script es un compromiso pr\u00e1ctico. El archivo debe tener permisos muy restrictivos (<code>chmod 700<\/code>). Si necesitas mayor seguridad, considera <code>systemd<\/code> credentials, <code>pass<\/code> o un secret manager.<\/p>\n\n\n\n<p>Aplica los permisos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chmod 700 \/root\/backupborg.sh<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Programaci\u00f3n con cron<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>crontab -e<\/code><\/pre>\n\n\n\n<p>A\u00f1ade:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>00 03 * * 0 \/root\/backupborg.sh >> \/var\/log\/borg_backup.log 2>&amp;1<\/code><\/pre>\n\n\n\n<p>(Ejecuta cada domingo a las 3:00 AM). Revisa el log despu\u00e9s de la primera ejecuci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Plan de recuperaci\u00f3n ante desastres (DRP)<\/h2>\n\n\n\n<p>Este es el punto donde fallan la mayor\u00eda de las estrategias de backup.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exportar la clave de recuperaci\u00f3n<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>borg key export --paper usuario@repo:repo > llave_recuperacion.txt<\/code><\/pre>\n\n\n\n<p>Guarda este archivo <strong>fuera del servidor<\/strong> (papel, gestor de contrase\u00f1as offline, USB en otro sitio f\u00edsico).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Qu\u00e9 necesitas para recuperar<\/h3>\n\n\n\n<p>Exactamente tres elementos:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Acceso SSH al repositorio (clave privada).<\/li>\n\n\n\n<li>La passphrase.<\/li>\n\n\n\n<li>La clave del repositorio (o el paper key).<\/li>\n<\/ol>\n\n\n\n<p>Si falta cualquiera de los tres, los datos son inaccesibles.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Operaciones de recuperaci\u00f3n<\/h3>\n\n\n\n<p><strong>Listar backups:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>borg list $REPO<\/code><\/pre>\n\n\n\n<p><strong>Restaurar un backup completo:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>borg extract $REPO::home-2025-06-15 \/ruta\/destino<\/code><\/pre>\n\n\n\n<p><strong>Explorar sin extraer (con FUSE):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>borg mount $REPO::home-2025-06-15 \/mnt\/borg-restore\nls \/mnt\/borg-restore\nborg umount \/mnt\/borg-restore<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Recomendaci\u00f3n fuerte<\/strong>: realiza al menos un simulacro de recuperaci\u00f3n completa antes de necesitarlo de verdad. La presi\u00f3n es mala consejera.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">8. Self-hosted vs. Servicio gestionado<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Self-hosted (NAS, otro servidor, Raspberry Pi)<\/h3>\n\n\n\n<p><strong>Ventajas:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Control total.<\/li>\n\n\n\n<li>Sin costos recurrentes.<\/li>\n\n\n\n<li>Sin dependencia de terceros.<\/li>\n<\/ul>\n\n\n\n<p><strong>Desventajas importantes:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Requiere mantenimiento constante.<\/li>\n\n\n\n<li>Vulnerable a desastres f\u00edsicos o fallos simult\u00e1neos.<\/li>\n\n\n\n<li>Sin alertas autom\u00e1ticas si algo falla silenciosamente<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">BorgBase (nuestro caso)<\/h3>\n\n\n\n<p><strong>Ventajas:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Infraestructura profesional y monitorizada.<\/li>\n\n\n\n<li>Modo <strong>append-only<\/strong> (un servidor comprometido no puede borrar backups antiguos).<\/li>\n\n\n\n<li>Alertas autom\u00e1ticas.<\/li>\n\n\n\n<li>Panel visual claro y estad\u00edsticas \u00fatiles.<\/li>\n\n\n\n<li>Optimizado para Borg.<\/li>\n<\/ul>\n\n\n\n<p><strong>Desventajas:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Costo mensual seg\u00fan uso.<\/li>\n\n\n\n<li>Dependes de un proveedor externo (aunque el cifrado mitiga el riesgo).<\/li>\n<\/ul>\n\n\n\n<p><strong>Criterio clave<\/strong>: si tu servidor de backups puede caer al mismo tiempo que el principal (mismo proveedor, mismo datacenter), el self-hosting pierde su principal ventaja. Un servicio externo resuelve el problema del aislamiento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tener un buen respaldo es parte de la seguridad<\/h2>\n\n\n\n<p>BorgBackup en Debian 13, especialmente combinado con BorgBase, ofrece una de las soluciones m\u00e1s equilibradas actualmente: eficiente en almacenamiento y ancho de banda, extremadamente segura gracias al cifrado zero-knowledge, y confiable en operaci\u00f3n diaria.<\/p>\n\n\n\n<p>Sin embargo, la mejor herramienta del mundo no sirve de nada si nunca la has probado en un escenario real de recuperaci\u00f3n.<\/p>\n\n\n\n<p><strong>La verdadera diferencia la marca la disciplina operativa<\/strong>: configura el backup, automat\u00edzalo, protege tus claves y, sobre todo, practica la restauraci\u00f3n al menos una vez.<\/p>\n\n\n\n<p>Hazlo bien desde el principio. Cuando llegue el momento en que realmente necesites recuperar tus datos, agradecer\u00e1s haber invertido ese tiempo extra.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cuando los backups fallan Era un martes a las 2 de la ma\u00f1ana. Un script mal escrito empez\u00f3 a recorrer \/home y borr\u00f3 archivos de configuraci\u00f3n de decenas de usuarios. El equipo ten\u00eda backups\u2026 pero estaban en el mismo servidor. Y ese servidor ya estaba comprometido. Esta historia se repite m\u00e1s veces de las que [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[24],"class_list":["post-287","post","type-post","status-publish","format-standard","hentry","category-guia","tag-linux"],"_links":{"self":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/287","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/comments?post=287"}],"version-history":[{"count":0,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/287\/revisions"}],"wp:attachment":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/media?parent=287"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/categories?post=287"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/tags?post=287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}