MinIO en un VPS: almacenamiento S3 autogestionado
Configura MinIO en un VPS con Ubuntu 24.04: compila el binario verificado, crea la unidad systemd, usa mc y restic, y genera URLs presignadas.
Qué ofrece el almacenamiento de objetos autohospedado con MinIO
MinIO es un almacenamiento de objetos autohospedado que utiliza la API de Amazon S3. Apunte restic o un SDK de S3 a su propio servidor, cambie un ajuste del endpoint y eso es todo lo necesario para las operaciones habituales de lectura, escritura y listado de objetos, así como para los enlaces presigned. Sin embargo, compatible no significa idéntico. Por ejemplo, MinIO no implementa las ACL de objetos de Amazon y sus mantenedores han dicho que no tienen intención de hacerlo. Por tanto, una aplicación que dependa del comportamiento de las ACL necesita algo más que un endpoint nuevo. Esta guía crea un nodo único en Ubuntu 24.04: un binario compilado a partir de código fuente verificado, un usuario de sistema dedicado, una unidad de systemd que mantiene las credenciales root fuera del archivo de unidad y un bucket en el que restic almacena las copias de seguridad.
S3 (simple storage service) es una API HTTP, no un sistema de archivos. Se coloca un objeto en un bucket con una clave mediante PUT y se recupera mediante GET. En un bucket estándar no existen la escritura parcial ni el renombrado. Los buckets de directorio de Amazon S3 Express One Zone son la excepción: tienen sus propias operaciones de anexado y renombrado. Sin embargo, se trata de una clase de almacenamiento concreta y nada de esta guía depende de ella. A las herramientas de copia de seguridad les conviene el modelo estándar, porque un objeto se recibe completo o no se recibe.
Un nodo almacena una sola copia de los datos. Ese es el intercambio que está haciendo. Obtiene un endpoint de S3 bajo su control por el precio de un VPS, pero también asume todas las tareas que antes realizaba el proveedor cloud, desde sustituir un disco averiado hasta aplicar parches al software del servidor. La sección cercana al final explica claramente cuándo este intercambio es una buena opción.
El estado de la edición Community de MinIO en octubre de 2026
Lea esta sección antes de basarse en ella, porque la situación cambió recientemente. En mayo de 2025, MinIO eliminó las funciones de administración de la consola web en la edición Community. El navegador conserva un explorador de objetos, por lo que los buckets y las claves de acceso se administran con el cliente de línea de comandos mc.
Más adelante, en 2025, MinIO dejó de publicar binarios precompilados de la edición Community. El README del proyecto indica que esta edición se distribuye únicamente como código fuente y que, desde abril de 2026, el repositorio minio/minio está archivado con el aviso THIS REPOSITORY IS NO LONGER MAINTAINED. El servidor de descargas antiguo también dejó de servir los archivos de la edición Community. Al comprobarlo el 12 de octubre de 2026, todas las rutas dl.min.io que esta guía usaba para descargar el binario del servidor, el binario del cliente y sus archivos de suma de comprobación respondían con 410 Gone. Se trata de una eliminación deliberada, no de una interrupción del servicio. La página de descargas de min.io ahora muestra AIStor Server, AIStor Client, AIStor SDK y algunos complementos de AIStor, pero no ofrece ninguna compilación de la edición Community.
El código fuente sigue disponible y es más reciente que el último binario. La versión final de la edición Community es RELEASE.2025-10-15T17-29-55Z, publicada el 16 de octubre de 2025 como una actualización de seguridad. Corrige una escalada de privilegios mediante una omisión de las políticas de sesión en las cuentas de servicio y STS. Las notas de la versión recomiendan a todos los usuarios actualizar inmediatamente. El último binario precompilado correspondía a la compilación de septiembre de 2025, por lo que nunca recibió esta corrección. Esta guía compila la versión de octubre y, como el repositorio está archivado, esta es también la última corrección que recibirá la edición Community.
Este hecho determina el resto de la guía. Por eso MinIO escucha aquí en 127.0.0.1 y sólo accede a Internet a través de un proxy bajo su control.
Instala el binario de MinIO y verifica la descarga
MinIO está escrito en Go, y el README del proveedor lo compila con un único comando go install que requiere Go 1.24 o una versión posterior. Instala primero Go desde el tarball oficial. El 12 de octubre de 2026, la versión estable actual en go.dev/dl es go1.27.2, y el hash siguiente es el publicado en esa página para el archivo linux-amd64. Si eliges una versión más reciente de Go, toma su hash de la misma página. La opción -f hace que curl falle ante un error HTTP en lugar de guardar la página de error con el nombre solicitado. De lo contrario, es posible terminar descomprimiendo una página 404 y preguntarse por qué no es un archivo.
cd /tmp
GOVER=go1.27.2
curl -fsSL "https://go.dev/dl/$GOVER.linux-amd64.tar.gz" -o go.tar.gzCompara los dos hashes y compara únicamente los hashes.
published=ecbadb99091a3f46e31f5f934b068b1864eafa7995211b39eaddf76996045fe5
downloaded=$(sha256sum go.tar.gz | awk '{print $1}')
[ "$published" = "$downloaded" ] && echo "checksum ok"Ten claro qué demuestra esta comprobación. Una coincidencia demuestra que la descarga está completa y que no se dañó ni modificó durante la transferencia. No demuestra que el proveedor sea fiable. Es un problema distinto y ningún comando sha256sum lo resuelve.
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go.tar.gz
export PATH=$PATH:/usr/local/go/bin
go versionAhora compila la versión final de la comunidad como tu usuario normal. go install comprueba cada módulo que descarga, incluido el código fuente del propio MinIO, contra la base de datos pública de sumas de comprobación de Go en sum.golang.org. Por tanto, un módulo manipulado o sustituido detiene la compilación con un error de seguridad en lugar de producir un binario.
go install github.com/minio/minio@RELEASE.2025-10-15T17-29-55Z
sudo install -o root -g root -m 755 ~/go/bin/minio /usr/local/bin/minio
minio --version
go version -m /usr/local/bin/minio | head -n 3minio --version muestra DEVELOPMENT.GOGET donde antes se usaba el nombre de una versión, porque go install no aplica las opciones de compilación que el proveedor utilizó para marcar sus propios binarios. go version -m lee la información del módulo que Go incorpora en cada binario, y su línea mod github.com/minio/minio indica el commit que compilaste. Un Permission denied aquí significa que el modo es incorrecto, y command not found significa que /usr/local/bin no está en tu PATH. Si el VPS tiene poca memoria para la compilación, ejecuta el mismo go install en otra máquina Linux con la misma arquitectura y copia allí el binario.
Cree un usuario de sistema y un directorio de datos
MinIO acepta cargas desde la red, por lo que no debe ejecutarse como root. Asígnele una cuenta sin directorio personal y sin shell de inicio de sesión.
sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user -s /usr/sbin/nologin minio-user
sudo mkdir -p /var/lib/minio/data
sudo chown -R minio-user:minio-user /var/lib/minio
sudo chmod 750 /var/lib/minio-r crea una cuenta de sistema con un UID inferior a 1000, lo que la mantiene fuera del rango utilizado por las personas. -M omite el directorio personal, porque una cuenta que nunca inicia sesión no necesita conservar uno. Compruebe el resultado con id minio-user y con stat -c '%U %a' /var/lib/minio, que debería mostrar minio-user 750.
El usuario debe tener permisos de escritura en el directorio de datos, no sólo de lectura. En el primer inicio, MinIO crea un directorio .minio.sys dentro del volumen para guardar su propia configuración. Por eso, un directorio cuyo propietario sea root hace que MinIO termine durante el inicio con un mensaje que acaba en permission denied. La misma regla se aplica a todos los servicios que ejecute de esta forma, y usuarios de servicio con privilegios mínimos en un VPS lo explica correctamente.
Introduzca las credenciales de root en un archivo de entorno
Las credenciales de root permiten acceder a todos los buckets, por lo que no deben estar en el archivo de unidad, que es legible por todos los usuarios. Cree primero el archivo con los permisos correctos y escriba en él después. Así, la contraseña no queda ni siquiera un momento en un archivo legible.
sudo install -o root -g root -m 600 /dev/null /etc/default/minio
printf 'MINIO_ROOT_USER=minio-root\nMINIO_ROOT_PASSWORD=%s\nMINIO_VOLUMES="/var/lib/minio/data"\nMINIO_OPTS="--address 127.0.0.1:9000 --console-address 127.0.0.1:9001"\n' "$(openssl rand -base64 24)" | sudo tee /etc/default/minio > /dev/null
sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/miniotee trunca un archivo existente en lugar de volver a crearlo, por lo que los permisos siguen siendo 600 y el propietario sigue siendo root. Es intencionado. systemd lee EnvironmentFile como root antes de reducir privilegios a User=. Por tanto, la cuenta de servicio nunca necesita leer sus propias credenciales. Cuando el servicio esté en ejecución, compruébelo con sudo -u minio-user cat /etc/default/minio. Ese comando debe mostrar Permission denied.
Conviene conocer dos comportamientos de MinIO antes de iniciarlo. Si no tiene MINIO_ROOT_USER ni MINIO_ROOT_PASSWORD en su entorno, MinIO no rechaza el inicio. Inicia con las credenciales predeterminadas documentadas minioadmin:minioadmin, que son el primer par que prueba cualquier escáner, y parece completamente saludable mientras las utiliza. En cambio, rechaza una contraseña de menos de 8 caracteres: MinIO termina durante el inicio con un error que indica que las credenciales no son válidas, porque la clave de acceso necesita al menos 3 caracteres y la clave secreta al menos 8.
MINIO_VOLUMES es la ruta de datos y MINIO_OPTS contiene las opciones. Enlazar con 127.0.0.1 significa que nada fuera de este VPS puede acceder todavía a la API de S3, lo que constituye el valor predeterminado adecuado. Ábrala deliberadamente más adelante mediante un proxy que tenga un certificado.
Escriba la unidad de systemd
Cree /etc/systemd/system/minio.service:
[Unit]
Description=MinIO object storage
Documentation=https://github.com/minio/minio
Wants=network-online.target
After=network-online.target
[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS
Restart=always
RestartSec=5
LimitNOFILE=65536
NoNewPrivileges=true
[Install]
WantedBy=multi-user.targetNo hay un - inicial en EnvironmentFile. Es una decisión, no un error tipográfico. Con el guion, systemd ignora la ausencia del archivo e inicia MinIO de todos modos. Por tanto, un archivo eliminado o una ruta mal escrita puede dejar inadvertidamente un servidor ejecutándose con minioadmin:minioadmin. Sin el guion, la ausencia del archivo hace que la unidad falle antes de que MinIO se ejecute, y journalctl -u minio muestra Failed to load environment files: No such file or directory. Es mucho más fácil detectar una unidad que se niega a iniciarse que un servidor que acepta silenciosamente la contraseña predeterminada.
$MINIO_VOLUMES y $MINIO_OPTS no están entre comillas de forma intencionada, porque systemd divide las variables sin comillas en argumentos separados mediante los espacios en blanco. Así, las cuatro palabras de MINIO_OPTS se convierten en cuatro argumentos para minio server. LimitNOFILE=65536 aumenta el límite de descriptores de archivo, porque cada conexión abierta y cada archivo de datos abierto consume un descriptor, y el valor predeterminado de 1024 se agota bajo carga.
sudo systemctl daemon-reload
sudo systemctl enable --now minio
systemctl is-active minio
curl -fsS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000/minio/health/liveis-active debería mostrar active, y el endpoint de comprobación de estado debería responder 200. journalctl -u minio -n 20 --no-pager muestra la dirección de API en la que el servidor está escuchando. Si la unidad continúa reiniciándose, systemd se rinde y registra Start request repeated too quickly. Esto significa que MinIO termina en cada intento. El motivo aparece en las líneas anteriores a ese mensaje, así que desplácese hacia arriba para leerlas.
Para obtener un aislamiento mayor, añada ProtectSystem=full y ProtectHome=true a la sección [Service]. Ambos necesitan espacios de nombres de montaje proporcionados por el kernel del host. En una virtualización de contenedores que comparte el kernel del host, como OpenVZ o LXC, pueden fallar, y la unidad informa entonces de status=226/NAMESPACE. Elimine esas dos líneas y se iniciará. La unidad es una unidad normal, y los servicios y temporizadores de systemd en un VPS cubre el resto de las directivas.
Instale mc y compruebe una operación de ida y vuelta
El cliente de MinIO es mc. No lo instale con apt install mc. Ese paquete es Midnight Commander, un gestor de archivos sin relación con MinIO.
dl.min.io ya no sirve el cliente, y el repositorio minio/mc está archivado desde July 2026. Por tanto, compile su última versión, RELEASE.2025-08-13T08-35-41Z, con la misma cadena de herramientas de Go. La base de datos de sumas de comprobación también cubre esta descarga.
go install github.com/minio/mc@RELEASE.2025-08-13T08-35-41Z
sudo install -o root -g root -m 755 ~/go/bin/mc /usr/local/bin/mcRegistre el servidor como un alias y, a continuación, mueva un objeto a través de él.
MINIO_PASS=$(sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minio)
mc alias set local http://127.0.0.1:9000 minio-root "$MINIO_PASS"
mc mb local/backups
echo "hello object storage" > /tmp/hello.txt
mc cp /tmp/hello.txt local/backups/hello.txt
mc ls local/backups
mc cat local/backups/hello.txtmc ls debe mostrar hello.txt con su tamaño, y mc cat debe imprimir hello object storage. Esta operación de ida y vuelta demuestra realmente que el servidor funciona, porque genera las mismas solicitudes S3 firmadas que generará cualquier otro cliente. mc admin info local muestra el estado del servidor si quiere una segunda comprobación.
Ejecute ahora una comprobación adicional, mientras el servidor todavía está vacío.
mc alias set defaultcheck http://127.0.0.1:9000 minioadmin minioadminEste comando debe fallar. Si tiene éxito, el archivo de entorno nunca llegó al proceso y el servidor está usando las credenciales predeterminadas. Corrija esto antes de que cualquier otra cosa acceda al equipo.
mc almacena los alias en ~/.mc/config.json en texto sin formato, por lo que esas credenciales quedan en el directorio personal de quien ejecutó el comando. Ejecutar mc con sudo guarda las credenciales de root en /root/.mc/config.json. Mantenga el alias de root en una sola cuenta de administrador y asigne a cada aplicación su propia clave.
Entregar un objeto mediante una URL prefirmada
Una URL prefirmada es un enlace HTTPS normal con una firma y una fecha de caducidad. Cualquiera que tenga el enlace puede descargar ese objeto sin una cuenta y sin usar un cliente.
mc share download --expire 12h local/backups/hello.txtLa salida incluye X-Amz-Signature y X-Amz-Expires en la cadena de consulta. Hay dos aspectos que suelen sorprender. El enlace se genera a partir del endpoint del alias que usó. Por eso, un alias en 127.0.0.1 genera un enlace que sólo puede abrir esta máquina. Cree otro alias en su nombre de host público para los enlaces que vaya a compartir. Además, no existe un botón para revocar cada enlace individualmente. La firma sigue siendo válida hasta que caduca o hasta que se elimina o cambia la clave que la firmó. Si el enlace se firmó con las credenciales de root, esto implica rotarlas. Por tanto, una caducidad breve es el control práctico. Siete días es el máximo que permite el formato de firma de S3.
Asigne a usuario y un bucket propios a restic
Las credenciales de root pueden leer y eliminar todos los buckets, por lo que un trabajo de copia de seguridad no debe utilizarlas. Cree un bucket, una política limitada a ese bucket y un usuario sin ningún otro permiso.
mc mb local/restic
cat > /tmp/restic-rw.json <<'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket", "s3:GetBucketLocation"],
"Resource": ["arn:aws:s3:::restic"]
},
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
"Resource": ["arn:aws:s3:::restic/*"]
}
]
}
EOF
RESTIC_KEY=$(openssl rand -base64 24)
mc admin policy create local restic-rw /tmp/restic-rw.json
mc admin user add local restic-backup "$RESTIC_KEY"
mc admin policy attach local restic-rw --user restic-backupMinIO incluye una política readwrite integrada que habría permitido usar un comando menos, pero concede acceso completo a todos los buckets del servidor. La política anterior menciona el bucket dos veces de forma intencionada: una vez como arn:aws:s3:::restic para que funcione la enumeración del bucket y otra vez como arn:aws:s3:::restic/* para los objetos que contiene. En S3, un bucket y sus objetos son recursos independientes. Por eso, una política que menciona sólo uno de ellos falla de una forma que parece un problema del cliente.
Pruebe la restricción antes de confiar en ella.
mc alias set resticuser http://127.0.0.1:9000 restic-backup "$RESTIC_KEY"
mc ls resticuser/restic
mc ls resticuser/backupsEl primer ls funciona y el segundo falla con Access Denied. Una política que no se ha probado es sólo una suposición.
Ahora indique a restic que use el bucket. restic lee las credenciales de S3 desde las variables de entorno estándar de AWS, por lo que no se utiliza ningún archivo de credenciales específico de restic.
sudo apt install -y restic
export AWS_ACCESS_KEY_ID=restic-backup
export AWS_SECRET_ACCESS_KEY="$RESTIC_KEY"
restic -r s3:http://127.0.0.1:9000/restic init
restic -r s3:http://127.0.0.1:9000/restic backup /etc
restic -r s3:http://127.0.0.1:9000/restic snapshotsrestic init solicita una contraseña para el repositorio. Esa contraseña cifra el repositorio, por lo que MinIO sólo almacena texto cifrado. Si pierde la contraseña, pierde la copia de seguridad. Un proceso iniciado por un temporizador de systemd no tiene un terminal donde introducirla, por lo que debe establecer RESTIC_PASSWORD_FILE en un archivo con permisos 600 para las copias de seguridad programadas.
Hay una regla de ubicación más importante que cualquiera de los comandos anteriores. Un repositorio de restic en el mismo VPS que los datos que protege evita un rm y nada más. El nodo de MinIO debe estar en otra máquina, preferiblemente en otra región. copias de seguridad de restic en un VPS explica cómo configurar la programación y la retención a partir de este punto.
Terminación TLS con nginx
MinIO está en localhost, por lo que nginx es la superficie pública. Emita primero el certificado, como se explica en Certificados de Let's Encrypt con certbot y nginx, y después use este bloque de servidor.
server {
listen 443 ssl;
server_name s3.example.com;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://127.0.0.1:9000;
}
}Varias de esas líneas son esenciales. client_max_body_size 0 elimina el límite predeterminado de 1 MB para el cuerpo de la petición. De lo contrario, cualquier carga más grande se rechaza con 413 Request Entity Too Large antes de que MinIO reciba la petición. proxy_request_buffering off transmite la carga directamente, porque la configuración predeterminada guarda primero toda la petición en un archivo temporal. Un objeto grande necesita entonces el doble de espacio en disco. proxy_set_header Host $http_host es la parte más sutil: una firma S3 incluye la cabecera Host. Si el proxy la reescribe, todas las peticiones fallan con SignatureDoesNotMatch, aunque el registro de acceso muestre que una petición normal ha llegado.
Indique también a MinIO su nombre público para que los enlaces que genere apunten al proxy y no a localhost.
echo 'MINIO_SERVER_URL=https://s3.example.com' | sudo tee -a /etc/default/minio
sudo systemctl restart minioEl firewall sólo necesita unas pocas reglas. Permita SSH y HTTPS, y no añada ninguna regla para los puertos 9000 y 9001. Una dirección enlazada a 127.0.0.1 no es accesible desde otra máquina, independientemente de la configuración del firewall. Conceptos básicos del firewall ufw en un VPS contiene los comandos.
Cuándo basta con MinIO en un solo nodo y cuándo conviene usar S3 administrado
Aquí, un solo nodo significa un disco. Por tanto, no hay paridad ni una segunda copia dentro del despliegue, y la durabilidad de cada objeto depende de la durabilidad del disco de un único VPS. La documentación propia de MinIO, que desde que se retiró la documentación comunitaria alojada en octubre de 2025 sólo existe como código fuente en el repositorio minio/docs, describe el despliegue independiente como una opción destinada al desarrollo inicial y la evaluación, y afirma que MinIO no lo recomienda en producción. Se puede activar el bloqueo de objetos para un bucket, pero en un único VPS sólo impide la eliminación mediante la API de S3. Cualquier persona con acceso root a la máquina todavía puede eliminar los archivos del disco, por lo que no debe prometer a nadie una política de retención inmutable en esta configuración.
Es una buena opción como destino de restic en un segundo VPS de otra región y como endpoint S3 para trabajos de desarrollo y artefactos de CI, donde perder un bucket obliga a reconstruirlo, pero no causa más consecuencias. También es una opción razonable para las cargas de archivos de los usuarios en una aplicación pequeña, siempre que usted controle el plan de recuperación y haya probado realmente una restauración.
Elija S3 administrado cuando un contrato o un regulador exija el bloqueo de objetos o durabilidad en varias regiones, o cuando prefiera no ser la persona a la que despiertan a las 03:00 porque se llenó un disco. El código congelado es el otro motivo evidente. A fecha de 12 de octubre de 2026, la edición comunitaria está archivada y ya no recibe mantenimiento, y su última versión, RELEASE.2025-10-15T17-29-55Z, es la que compila esta guía. No se corregirá nada después de esa versión, así que ejecutarla implica aceptar esa situación o migrar a la línea comercial AIStor de MinIO o a otro almacén autohospedado; alternativas autohospedadas a MinIO compara estas opciones.
Conviene aclarar un límite porque aparece con frecuencia. El almacenamiento de objetos no es una base de datos. En un bucket estándar, cada escritura reemplaza un objeto completo. Incluso la llamada de anexión que Amazon añadió para S3 Express One Zone sólo agrega datos al final, por lo que un archivo SQL activo en un bucket S3 es lento y no es seguro. Mantenga la base de datos en el disco local y haga copias de seguridad en el bucket: ejecutar SQLite en producción en un VPS describe esta separación.
Modos de fallo y mensajes que verá
La unidad falla justo después de systemctl enable --now. Lea journalctl -u minio -n 30 --no-pager. Failed to load environment files: No such file or directory significa que falta /etc/default/minio o que su ruta está mal escrita en la unidad. Un mensaje que termina en permission denied significa que la cuenta de servicio no puede escribir en el directorio de datos. Compruebe que stat -c '%U' /var/lib/minio/data muestre minio-user.
minioadmin:minioadmin todavía permite iniciar sesión. El archivo de entorno nunca llegó al proceso. Confirme que la unidad contiene EnvironmentFile=/etc/default/minio, ejecute sudo systemctl daemon-reload y reinicie el servicio. MinIO lee sus credenciales root una sola vez durante el arranque. Editar ese archivo sin reiniciar no cambia nada.
Address already in use durante el arranque. Otro proceso está usando el puerto 9000. Encuéntrelo con sudo ss -ltnp | grep :9000 antes de cambiar el puerto de MinIO.
Las cargas de más de 1 MB fallan a través del proxy. nginx respondió 413 Request Entity Too Large y MinIO nunca recibió la solicitud. Establezca client_max_body_size 0 en el bloque de servidor.
SignatureDoesNotMatch. La clave secreta es incorrecta o algún componente entre el cliente y MinIO reescribió la cabecera Host, que forma parte de la firma.
RequestTimeTooSkewed. El reloj del cliente o del servidor es incorrecto. Cada solicitud S3 firmada incluye una marca de tiempo y MinIO, igual que Amazon S3, rechaza una solicitud firmada mediante cabecera cuya marca de tiempo difiere más de 15 minutos de su propio reloj. Los enlaces presigned se comprueban según su caducidad. Compruebe timedatectl y confirme que la sincronización horaria esté activa.
Access Denied en un bucket cuya existencia conoce. La clave está limitada a otro bucket. Muestre lo que permite realmente la política con mc admin policy info local restic-rw y compare el nombre del bucket en las líneas de recursos.
FAQ
¿Es suficiente un MinIO de un solo nodo para las copias de seguridad reales?
Es suficiente como destino de restic si se ejecuta en una máquina separada de los datos que protege. No es suficiente como única copia. Una implementación con una sola unidad no tiene paridad, por lo que no existe una segunda copia dentro de MinIO. Si el disco de esa VPS pierde datos, los objetos desaparecen. Mantenga un segundo destino en otro lugar y restaure desde ambos al menos una vez para comprobar que el proceso funciona.
¿Por qué sha256sum -c falla con el archivo de sumas de comprobación de MinIO?
Sólo encontrará ese archivo en una copia guardada anteriormente, porque dl.min.io devolvía 410 Gone para todos los archivos binarios y de sumas de comprobación de la comunidad al comprobarlo el 12 de octubre de 2026. La etiqueta que aparece después del hash dentro de ese archivo identifica la versión, como minio.RELEASE.2025-09-07T16-13-09Z, mientras que el archivo descargado normalmente se llama minio. sha256sum -c busca un archivo con el nombre escrito dentro del archivo de sumas de comprobación, no lo encuentra y muestra No such file or directory y WARNING: 1 listed file could not be read. La descarga es correcta. Compare directamente las cadenas hash e ignore la etiqueta, que no tiene ningún significado de seguridad.
¿Qué ocurrió con la consola web de administración de MinIO?
MinIO eliminó las funciones de administración de la consola de la edición comunitaria en mayo de 2025 y dejó un explorador de objetos en la interfaz web. Los buckets y los usuarios se administran ahora con el cliente mc, mediante comandos como mc admin user add y mc admin policy attach. Esta es la forma prevista en la edición comunitaria, no una solución alternativa. Por eso esta guía realiza todas las operaciones desde la línea de comandos.
¿Cómo configuro restic para usar MinIO como backend S3?
Defina AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY con una clave de acceso de MinIO y su secreto. Después, use una cadena de repositorio con el formato s3:https://s3.example.com/restic, donde el último elemento de la ruta es el nombre del bucket. Cree primero el bucket con mc mb, porque una clave limitada a un bucket no tiene permisos para crear buckets. restic cifra todo con su propia contraseña del repositorio antes de cargarlo. Por tanto, MinIO almacena texto cifrado y nunca ve sus archivos.
¿Tengo que ejecutar MinIO detrás de nginx?
Necesita TLS (seguridad de la capa de transporte) cuando un cliente no está en la misma máquina. Sin TLS, cada objeto atraviesa la red en texto plano, junto con el ID de la clave de acceso y la firma de la solicitud. La clave secreta nunca sale del cliente, porque la firma S3 sólo la utiliza localmente para calcular esa firma. Sin embargo, cualquiera que pueda interceptar el tráfico puede leer los datos y repetir una solicitud capturada mientras su marca de tiempo siga siendo válida. Un proxy en el puerto 443 con un certificado de certbot es la forma más sencilla de obtener TLS y mantiene la renovación del certificado fuera de MinIO. MinIO también puede terminar TLS directamente si configura --certs-dir para usar un directorio que contenga public.crt y private.key. En ese caso, la cuenta de servicio necesita acceso de lectura a la clave privada renovada. Esto añade trabajo para obtener el mismo resultado.