[{"data":1,"prerenderedAt":246},["ShallowReactive",2],{"seo-verification":3,"blog-migrar-minio-a-garage-o-rustfs-vps-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-migrar-minio-a-garage-o-rustfs-vps-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":30,"intro":33,"sections":34,"ctaTitle":184,"ctaBody":185,"ctaButton":186,"ctaUrl":187,"relatedPosts":188},499,"migrar-minio-a-garage-o-rustfs-vps",{"fr":12,"en":13,"ar":14,"es":10},"migrer-minio-vers-garage-ou-rustfs-vps","migrate-minio-to-garage-or-rustfs-vps","ترحيل-minio-إلى-garage-أو-rustfs-على-vps","Migrar MinIO a Garage o RustFS sin perder un objeto actual","MinIO está archivado: copie sus buckets a Garage o RustFS con rclone, demuestre que no falta nada y cambie su aplicación sin romper las URL.",13,0,false,"2026-10-23T00:00:00+00:00","2026-10-23T23:43:01+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fmigrer-minio-vers-garage-ou-rustfs-vps-poster.svg","El repositorio de MinIO está archivado desde el 25 de abril de 2026: su almacenamiento S3 funciona ahora sin parches de seguridad en origen. Garage y RustFS son los dos destinos autoalojables que más se mencionan, pero copiar los objetos es solo la mitad del trabajo. Las políticas IAM, el historial de versiones y las URL prefirmadas no se trasladan. Esta guía inventaría el origen, copia con rclone, demuestra el resultado con recuentos y comprobaciones, y cambia la aplicación en tres tiempos, con un corte de escritura mínimo y la vuelta atrás preparada.",[35,39,49,52,71,111,114,132,150,153,156,174,178,181],{"type":36,"title":37,"body":38},"h2","Por qué no dejar MinIO donde está","El repositorio `minio\u002Fminio` fue archivado por su propietario el 25 de abril de 2026: es de solo lectura, su README indica que el proyecto ya no se mantiene y que los binarios ya publicados no recibirán actualizaciones. En la práctica, nadie corregirá en origen el próximo fallo que se descubra en su servidor S3. El cliente `mc`, también bajo AGPLv3, fue archivado el 14 de julio de 2026.\n\nSu MinIO sigue funcionando, y eso es lo que hace traicionero el asunto: el día del archivado no se rompe nada. Pero un almacenamiento de objetos está expuesto, contiene sus archivos multimedia, copias de seguridad o exportaciones, y ahora funciona sin parches de seguridad. Dos destinos autoalojables aparecen una y otra vez en las discusiones: Garage, publicado bajo AGPLv3, y RustFS, publicado bajo licencia Apache 2.0.\n\nEste artículo no repite la instalación de ninguno de los dos, que tienen su propia guía: \u003Ca href=\"\u002Fes\u002Fblog\u002Falojar-garage-s3-en-un-vps\">Garage en un VPS\u003C\u002Fa> y \u003Ca href=\"\u002Fes\u002Fblog\u002Fautoalojar-rustfs-en-vps-almacenamiento-objetos-s3\">RustFS en un VPS\u003C\u002Fa>. Aquí partimos de un MinIO en producción y respondemos a una sola pregunta: cómo mover los datos, demostrar que no falta nada y cambiar la aplicación sin URL rotas.",{"type":40,"title":41,"items":42},"ul","Lo que una copia de bucket no traslada por sí sola",[43,44,45,46,47,48],"**Los objetos actuales** — es la parte fácil: `rclone` o `mc mirror` los copian, con una comprobación posterior.","**Las versiones anteriores** — la documentación de `mc mirror` precisa que solo sincroniza el objeto actual, sin información de versión.","**Los usuarios y las políticas IAM** — viven en MinIO, no en los buckets. Los secretos no se exportan: se generan claves nuevas en el destino.","**Las URL prefirmadas ya distribuidas** — la firma depende del host, de la región y de las claves. Cambiar el endpoint las invalida.","**Las diferencias de compatibilidad S3** — ACL, políticas de bucket, acceso anónimo, versionado: cada destino tiene sus huecos, que se leen en su documentación en lugar de suponerlos.","**La configuración de los clientes** — endpoint, región, direccionamiento path-style: todo lo que su aplicación, sus copias `restic` o su CDN llevan fijado.",{"type":36,"title":50,"body":51},"Requisitos y plan de capacidad","Necesita acceso de administrador a MinIO, un equipo o un VPS con `mc` y `rclone`, y un destino ya instalado y accesible por HTTPS (consulte las dos guías anteriores para el proxy inverso y el certificado). La regla de capacidad es simple: mientras no haya validado la migración, conserva el origen intacto, así que paga el disco dos veces.\n\nNuestra recomendación editorial: prever en el destino el tamaño total de los datos del origen, más un margen de alrededor del 30 % para los metadatos y las diferencias de reparto. En el mismo VPS, eso significa disponer como mínimo del doble del volumen actual más el margen; en dos VPS, cada uno asume su parte. Un único nodo Garage con `replication_factor = 1` guarda una sola copia de cada objeto: no es una copia de seguridad, y el origen aún en pie es su única red de seguridad durante la migración.",{"type":53,"title":54,"steps":55},"steps","Paso 1: inventariar el origen antes de copiar",[56,59,62,65,68],{"title":57,"body":58},"Declarar MinIO como alias","Cree un alias `src` con credenciales que lean todos los buckets:\n`mc alias set src https:\u002F\u002Fs3.your-domain.com ACCESS_KEY SECRET_KEY`",{"title":60,"body":61},"Contar los objetos y el tamaño","Para cada bucket, anote el número de objetos y el volumen:\n`mc du --recursive src\u002Fmedias`\n`mc ls --recursive src\u002Fmedias | wc -l`\nLleve estas cifras a una tabla «antes \u002F después»: es su prueba de que la migración está completa.",{"title":63,"body":64},"Contar las versiones","Si el versionado está activo, la lista de versiones es más larga que la de objetos:\n`mc ls --recursive --versions src\u002Fmedias | wc -l`\nLa documentación de `mc ls` precisa que `--versions` exige un servicio que admita el versionado. Una gran diferencia entre ambos recuentos indica cuánto historial está en juego.",{"title":66,"body":67},"Exportar la lista de políticas y de usuarios","Conserve un registro de lo que tendrá que recrear:\n`mc admin policy list src`\n`mc admin user list src`\nLos secretos no aparecen en esta salida y no pueden aparecer: los regenerará.",{"title":69,"body":70},"Anotar la configuración de los clientes","En cada aplicación que habla con MinIO, anote el endpoint, la región, el estilo de direccionamiento y el nombre de la variable de entorno que los contiene. El cambio final solo modificará estos valores.",{"type":72,"title":73,"headers":74,"rows":78},"comparison","Garage y RustFS: las diferencias que conviene conocer antes de elegir",[75,76,77],"Tema","Garage","RustFS",[79,83,87,91,95,99,103,107],[80,81,82],"Licencia","AGPLv3 (README del repositorio)","Apache 2.0 (README del repositorio)",[84,85,86],"Versionado","No admitido: `PutBucketVersioning` y `ListObjectVersions` figuran como ausentes","Indicado como disponible en el README",[88,89,90],"Políticas de bucket y ACL","Ninguna de las dos: un sistema propio, por clave y por bucket","IAM y políticas de bucket; las ACL no se admiten de forma deliberada",[92,93,94],"Acceso anónimo","Rechazado, con una respuesta 403","Evaluado según la política del bucket",[96,97,98],"Región del cliente","`s3_region` de `garage.toml`, que hay que copiar en el cliente","`RUSTFS_REGION`, `us-east-1` por defecto, que hay que copiar en el cliente",[100,101,102],"Direccionamiento","Path-style y vhost-style admitidos","Path-style por defecto, sin configuración DNS",[104,105,106],"URL prefirmadas","Admitidas","Admitidas; host, esquema, puerto, región y ruta deben coincidir con la firma",[108,109,110],"API de administración de MinIO","No aplica: se administra con el comando `garage`","Superficie separada: el S3 funciona sin que `mc admin` esté garantizado",{"type":36,"title":112,"body":113},"Versionado: lo que pierde la copia y qué hacer","Este punto decide la elección del destino. Garage no admite el versionado: su página de compatibilidad S3 lo dice sin rodeos. Si sus buckets conservan un historial que la aplicación consulta o que debe guardar por razones de negocio, Garage no es el destino. RustFS indica el versionado como disponible, pero la copia con `rclone sync` o `mc mirror` no recreará allí su historial.\n\nTres vías, a elegir bucket por bucket. Asumir la pérdida: solo pasa la versión actual, lo cual basta cuando el versionado era solo una red de seguridad contra el error humano. Copiar versión por versión: se listan los identificadores con `mc ls --versions` y se reproducen las versiones de la más antigua a la más reciente hacia un destino que admita el versionado, tras activarlo en el bucket; las fechas de las versiones serán las de la copia, no las originales. O archivar el historial aparte, en un bucket de archivo, y migrar solo lo actual. En todos los casos, pruebe con un objeto de varias versiones antes de lanzar la copia general.",{"type":53,"title":115,"steps":116},"Paso 2: preparar el destino, Garage o RustFS",[117,120,123,126,129],{"title":118,"body":119},"Garage: asignar y luego aplicar el layout","Ningún bucket es utilizable hasta que se aplica el layout. Obtenga el identificador del nodo y asígnele una zona y una capacidad:\n`garage status`\n`garage layout assign -z dc1 -c 1G \u003Cnode_id>`\n`garage layout apply --version 1`\nAjuste `-c` al espacio en disco realmente asignado.",{"title":121,"body":122},"Garage: crear la clave, el bucket y los permisos","Los permisos se conceden por clave y por bucket:\n`garage key create app-key`\n`garage bucket create medias`\n`garage bucket allow --read --write --owner medias --key app-key`\nEl secreto se muestra al crear la clave: cópielo enseguida en su gestor de secretos.",{"title":124,"body":125},"Garage: copiar la región en el cliente","La sección `[s3_api]` de `garage.toml` define `s3_region`. Ponga exactamente ese valor en la configuración de sus clientes y mantenga el direccionamiento path-style. Una región distinta provoca firmas rechazadas.",{"title":127,"body":128},"RustFS: alias y bucket","Con `mc` configurado sobre el destino:\n`mc alias set dst http:\u002F\u002F127.0.0.1:9000 ACCESS_KEY SECRET_KEY`\n`mc mb dst\u002Fmedias`\nLa documentación de RustFS recomienda usuarios IAM o cuentas de servicio en lugar de las claves raíz para las aplicaciones.",{"title":130,"body":131},"RustFS: recrear usuarios y políticas","Tome la lista exportada en el paso 1 y recree cada usuario y cada política en RustFS, con una clave nueva por aplicación. Después alinee la región: `RUSTFS_REGION` vale `us-east-1` por defecto, y el cliente debe usar la misma.",{"type":53,"title":133,"steps":134},"Paso 3: copiar con rclone y demostrar el resultado",[135,138,141,144,147],{"title":136,"body":137},"Declarar los dos remotes","Use el proveedor `Minio` para el origen y `Other` para el destino:\n`rclone config create src s3 provider=Minio access_key_id=ACCESS_KEY secret_access_key=SECRET_KEY endpoint=https:\u002F\u002Fs3.your-domain.com`\n`rclone config create dst s3 provider=Other access_key_id=ACCESS_KEY secret_access_key=SECRET_KEY endpoint=http:\u002F\u002F127.0.0.1:3900 region=garage`\n`region=garage` supone `s3_region = \"garage\"`, el valor del ejemplo de Garage: ponga el suyo si difiere. Para RustFS, sustituya el endpoint por el del destino y la región por el valor de `RUSTFS_REGION`.",{"title":139,"body":140},"Hacer un ensayo en seco","`rclone sync` modifica el destino para que refleje el origen, incluidas las eliminaciones. No lo invierta nunca, y ejecute primero el ensayo:\n`rclone sync src:medias dst:medias --checksum --metadata --transfers 16 --dry-run`",{"title":142,"body":143},"Lanzar la copia en caliente","MinIO sigue en servicio durante esta primera pasada:\n`rclone sync src:medias dst:medias --checksum --metadata --transfers 16 --progress`\n`--metadata` pide a rclone que conserve los metadatos: compruebe en un objeto de prueba que el tipo de contenido ha llegado intacto.",{"title":145,"body":146},"Verificar la copia","Compruebe que todo lo que está en el origen existe en el destino:\n`rclone check src:medias dst:medias --one-way --combined \u002Ftmp\u002Fcheck-medias.txt`\nEl archivo lista cada ruta con un símbolo: `=` idéntico, `+` ausente del destino, `*` distinto, `!` error. El objetivo es cero líneas `+`, `*` o `!`.",{"title":148,"body":149},"Volver a contar tras la copia","Repita `mc du --recursive` y el recuento de objetos en el destino, con el alias `dst`, y rellene la columna «después» de su tabla. Las dos cifras deben ser idénticas, salvo diferencias explicadas por las versiones.",{"type":36,"title":151,"body":152},"ETag multipart y mc mirror: leer las diferencias sin equivocarse","El ETag de un objeto pequeño enviado en una sola petición es su MD5, y `rclone` lo usa como suma de control. En un objeto multipart, la documentación de rclone recuerda que el ETag deja de ser el MD5 de los datos: es el MD5 de la sucesión de los MD5 de cada parte, seguido del número de partes. Depende, por tanto, del tamaño de las partes, que eligió el cliente al subir.\n\nSu MinIO recibió el objeto con un troceado, `rclone` lo envía al destino con otro: el contenido es idéntico byte a byte, el ETag no. Un `rclone check` que señale esos objetos como distintos no tiene por qué tener razón. Repítalo sobre ellos con `--download`, que descarga ambos lados y compara los propios datos: más lento, pero sin ambigüedad. La misma cautela vale para `mc mirror`: su documentación precisa que las sumas compuestas pueden diferir simplemente porque cambió el reparto en partes.\n\nSi prefiere quedarse en el ecosistema `mc`, la copia se escribe `mc mirror --preserve src\u002Fmedias dst\u002Fmedias`. `--preserve` conserva los atributos del origen y sus reglas de política de bucket; esto último solo tiene sentido si el destino sabe leerlas, lo que excluye a Garage. Sin `--overwrite`, un objeto ya presente en el destino no se vuelve a copiar: el error se registra y la copia continúa. Con `--remove`, se eliminan los objetos del destino ausentes del origen. Y `mc mirror` solo sincroniza el objeto actual, sin versiones. Su comparación se basa en el nombre, el tamaño, la fecha y la suma de control, sin leer el contenido. El repositorio de `mc` también está archivado: la herramienta funciona, pero no evolucionará.",{"type":36,"title":154,"body":155},"URL prefirmadas: por qué fallan en el cambio","Una URL prefirmada contiene una firma calculada con la clave secreta, el host, la región y la ruta. La documentación de RustFS lo dice: el host, el esquema, el puerto, la región y la ruta de la petición deben coincidir con los usados para firmar. Cambiar de endpoint o de clave invalida, por tanto, todos los enlaces ya emitidos, sin excepción, y nada los redirige.\n\nLa consecuencia es una cuestión de secuencia. Los enlaces que su aplicación genera al vuelo se regeneran solos en cuanto se reconecta al nuevo destino. Los que envió por correo o guardó en base de datos morirán en el cambio. Acorte, pues, la vida útil de los enlaces unos días antes, para que circulen pocos enlaces largos, y avise a los equipos que los reparten a mano.",{"type":53,"title":157,"steps":158},"Paso 4: cambiar en tres tiempos, sin corte brusco",[159,162,165,168,171],{"title":160,"body":161},"Sincronización inicial en caliente","Es la copia del paso 3, ejecutada mientras MinIO sigue sirviendo tráfico. Dura lo que tenga que durar y no molesta a nadie. Anote la hora de finalización.",{"title":163,"body":164},"Congelar las escrituras","Ponga la aplicación en solo lectura o en un mantenimiento breve, o active una doble escritura si su código lo permite. Las lecturas pueden seguir en MinIO mientras se ejecuta la sincronización final.",{"title":166,"body":167},"Sincronización final con --update","Transfiera solo lo que ha cambiado desde entonces:\n`rclone sync src:medias dst:medias --update --metadata --transfers 16 --progress`\n`rclone check src:medias dst:medias --one-way`\nVuelva a contar los objetos y el tamaño, y compare con la tabla del paso 1.",{"title":169,"body":170},"Cambiar el endpoint mediante una variable de entorno","Su aplicación debe leer el endpoint, la región y las claves de su entorno, nunca del código. Modifique esas variables, reinicie el servicio y pruebe una subida, una lectura y un borrado sobre un objeto de prueba. Regenere los enlaces prefirmados que importen.",{"title":172,"body":173},"Vigilar y solo después desmontar","Deje MinIO en su sitio, detenido o en solo lectura, el tiempo necesario para ver pasar un ciclo completo de sus copias de seguridad y de sus tareas programadas. Vuelva a apuntar sus copias `restic` al destino; vea la guía sobre las \u003Ca href=\"\u002Fes\u002Fblog\u002Fcopias-de-seguridad-vps-con-restic\">copias de seguridad con restic\u003C\u002Fa>.",{"type":175,"title":176,"body":177},"tip","La vuelta atrás se reduce a una variable","Mientras MinIO no se haya eliminado y la última sincronización se haya hecho en solo lectura, volver atrás consiste en poner el endpoint antiguo en el entorno y reiniciar. Si ha habido escrituras en el destino desde el cambio, tráigalas antes al origen con un `rclone copy` en sentido contrario (nunca un `sync`, que eliminaría) y después vuelva. Borre MinIO solo tras un periodo de observación fijado de antemano.",{"type":36,"title":179,"body":180},"Solución de problemas: los síntomas que se repiten","Una llamada sin firma a Garage responde 403 con el mensaje `Garage does not support anonymous access yet`. Es el comportamiento esperado de Garage, y la petición de acceso anónimo sigue en el seguimiento del proyecto como una función que nunca se priorizó. Si su aplicación servía archivos públicos sin firma, tendrá que usar URL prefirmadas o un proxy delante del bucket.\n\nSi las escrituras se rechazan con errores de firma justo después del cambio, compare la región del cliente con la del destino (`s3_region` en Garage, `RUSTFS_REGION` en RustFS) y compruebe que el cliente usa direccionamiento path-style. Si `rclone check` señala objetos multipart como distintos aunque sus tamaños sean iguales, repítalo con `--download`. Si una nueva ejecución de `mc mirror` no copia un objeto modificado, la causa es la falta de `--overwrite`. Por último, si un bucket está vacío en el destino aunque la sincronización haya terminado bien, compruebe que la clave recibió `--read --write` sobre ese bucket en Garage, o la política adecuada en RustFS.",{"type":36,"title":182,"body":183},"La documentación oficial","Relea estas fuentes antes de actuar, porque estos proyectos evolucionan: el repositorio github.com\u002Fminio\u002Fminio para el estado y la licencia de MinIO; github.com\u002Frustfs\u002Frustfs y docs.rustfs.com para RustFS; garagehq.deuxfleurs.fr para la compatibilidad S3 de Garage; rclone.org para `sync` y `check`; la documentación de MinIO sobre `mc mirror`. Para respaldar este almacenamiento, consulte \u003Ca href=\"\u002Fes\u002Fblog\u002Festrategia-3-2-1-backup-vps-restic-s3\">el artículo 3-2-1 con restic y S3\u003C\u002Fa>.","Un segundo VPS para probar el destino antes de apagar MinIO","Un segundo VPS con acceso root y disco NVMe aloja el destino durante la migración: prueba junto a producción y solo apaga MinIO cuando los recuentos de objetos estén validados. El cambio se hace sin tocar la máquina de origen.","Ver los VPS Cloud","\u002Fvps-cloud",[189,208,228],{"id":190,"slug":191,"slugs":192,"title":196,"excerpt":197,"readTime":23,"views":18,"isPinned":19,"publishedAt":198,"updatedAt":21,"category":199,"categories":205,"featuredImage":30,"bgImage":31,"posterImage":207,"relatedSolution":30},70,"alojar-minio-en-un-vps",{"fr":193,"en":194,"ar":195,"es":191},"heberger-minio-vps","hosting-minio-on-a-vps","استضافة-minio-على-خادم-vps","Alojar MinIO en un VPS","MinIO en un VPS: buckets, consola, TLS y copias. La edición Community está archivada: cómo decidir entre quedarse y migrar.","2026-04-11T00:00:00+00:00",{"id":200,"name":201,"slug":202,"color":203,"icon":204},6,"Bases de datos","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[206],{"id":200,"name":201,"slug":202,"color":203,"icon":204},"\u002Fblog\u002Fcovers\u002Fheberger-minio-vps-poster.svg",{"id":209,"slug":210,"slugs":211,"title":215,"excerpt":216,"readTime":217,"views":218,"isPinned":19,"publishedAt":219,"updatedAt":220,"category":221,"categories":222,"featuredImage":30,"bgImage":31,"posterImage":224,"relatedSolution":225},245,"alojar-garage-s3-en-un-vps",{"fr":212,"en":213,"ar":214,"es":210},"heberger-garage-s3-vps","host-garage-on-a-vps-s3-object-storage-that-belongs-to-you","استضافة-garage-على-خادم-vps-تخزين-كائنات-s3-يملكه-أنت","Alojar Garage en un VPS: storage bucket S3 propio y autoalojado","Despliega Garage en un VPS para tener un storage bucket S3 propio — copias de seguridad, archivos de app, sitio estático — sin depender de ninguna nube externa.",8,2,"2026-08-10T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[223],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-garage-s3-vps-poster.svg",{"categorySlug":226,"appSlug":227},"bases-de-datos","garage",{"id":229,"slug":230,"slugs":231,"title":235,"excerpt":236,"readTime":237,"views":18,"isPinned":19,"publishedAt":238,"updatedAt":239,"category":240,"categories":241,"featuredImage":30,"bgImage":31,"posterImage":243,"relatedSolution":244},407,"autoalojar-rustfs-en-vps-almacenamiento-objetos-s3",{"fr":232,"en":233,"ar":234,"es":230},"self-host-rustfs-vps","self-host-rustfs-s3-object-storage-vps","استضافة-rustfs-على-vps-تخزين-كائنات-s3","Alojar RustFS en un VPS: almacenamiento de objetos S3","Guía para autoalojar RustFS en un VPS: consola web S3, credenciales generadas, volúmenes persistentes — alternativa a MinIO y Garage.",5,"2026-10-01T00:00:00+00:00","2026-10-02T21:10:18+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[242],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-rustfs-vps-poster.svg",{"categorySlug":226,"appSlug":245},"rustfs",1792799485528]