SSD Nodes Learn Hosting plans →
Guías Matt ConnorPor Matt Connor · Actualizado 2026-08-07

MinIO en un VPS: almacenamiento S3 autohospedado

Instala MinIO en Ubuntu 24.04 con binario verificado, systemd y mc. Configura URLs prefirmadas y usa el bucket como destino de copias con restic.

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, July 30, 2026.

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 cualquier SDK de S3 a su propio servidor, cambie un único ajuste del endpoint y el cliente no podrá distinguir la diferencia. Esta guía crea un nodo único en Ubuntu 24.04: un binario 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 guarda las copias de seguridad.

S3 (servicio de almacenamiento simple) es una API HTTP, no un sistema de archivos. Se carga un objeto en un bucket con una clave mediante PUT y se recupera mediante GET. No hay escritura parcial ni renombrado. A las herramientas de copia de seguridad les conviene este modelo porque un objeto llega completo o no llega.

Un nodo contiene una sola copia de los datos. Esa es la contrapartida. Se obtiene un endpoint de S3 bajo su control por el precio de un VPS, pero también se heredan todas las tareas que 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 esta contrapartida resulta adecuada.

El estado de la edición comunitaria de MinIO en julio de 2026

Lea esta sección antes de basarse en ella, porque ha cambiado recientemente. En mayo de 2025, MinIO eliminó las funciones de administración de la consola web en la edición comunitaria. En el navegador sólo queda 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 comunitarios precompilados. El README del proyecto indica ahora que la edición comunitaria se distribuye únicamente como código fuente. Las URL de descarga antiguas siguen funcionando: en julio de 2026 sirven la compilación del servidor RELEASE.2025-09-07T16-13-09Z y la compilación del cliente RELEASE.2025-08-13T08-35-41Z, y no ha aparecido ninguna compilación comunitaria más reciente. Por tanto, el binario siguiente es real y funciona, pero está congelado. No incluye las correcciones de seguridad publicadas después de septiembre de 2025.

Este hecho determina el resto de esta 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. Si prefiere seguir las correcciones, compile desde el código fuente. El README del proveedor proporciona un único comando, go install github.com/minio/minio@latest, que necesita una cadena de herramientas de Go y escribe el binario en ~/go/bin/minio. Instale ese binario en /usr/local/bin/minio y todos los demás pasos de esta guía seguirán siendo los mismos.

Instale el binario de MinIO y verifique la descarga

Descargue la versión fijada y su suma de comprobación publicada. 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, podría instalar una página 404 y preguntarse por qué no se puede ejecutar.

cd /tmp
REL=RELEASE.2025-09-07T16-13-09Z
curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/archive/minio.$REL" -o minio
curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/archive/minio.$REL.sha256sum" -o minio.sha256sum

Compare los dos hashes y compare únicamente los hashes.

published=$(awk '{print $1}' minio.sha256sum)
downloaded=$(sha256sum minio | awk '{print $1}')
[ "$published" = "$downloaded" ] && echo "checksum ok"

No use sha256sum -c minio.sha256sum aquí. La etiqueta escrita después del hash en ese archivo es minio.RELEASE.2025-09-07T16-13-09Z y guardamos la descarga como minio, por lo que -c busca un archivo que no existe. Informa de No such file or directory y después de WARNING: 1 listed file could not be read. Esto parece una descarga dañada, pero no lo es. La etiqueta sólo es un nombre. El hash es la parte que proporciona la garantía.

Tenga claro qué demuestra esta comprobación. El binario y el hash proceden del mismo proveedor y se han descargado mediante la misma conexión, por lo que 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. Ese es otro problema y ningún comando sha256sum lo resuelve.

sudo install -o root -g root -m 755 minio /usr/local/bin/minio
minio --version

minio --version muestra minio version RELEASE.2025-09-07T16-13-09Z seguido de un par de líneas de compilación. Un Permission denied en este caso significa que el modo es incorrecto, y command not found significa que /usr/local/bin no está en su PATH.

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/minio

tee 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.target

No 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/live

is-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 un recorrido de ida y vuelta

El cliente de MinIO es mc. No lo instale con apt install mc. Ese paquete corresponde a Midnight Commander, un gestor de archivos sin relación con MinIO.

cd /tmp
curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o mc
curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc.sha256sum -o mc.sha256sum
[ "$(awk '{print $1}' mc.sha256sum)" = "$(sha256sum mc | awk '{print $1}')" ] && echo "checksum ok"
sudo install -o root -g root -m 755 mc /usr/local/bin/mc

Registre el servidor como un alias y 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.txt

mc ls debe mostrar hello.txt con su tamaño, y mc cat debe imprimir hello object storage. Ese recorrido de ida y vuelta demuestra 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 más, mientras el servidor todavía está vacío.

mc alias set defaultcheck http://127.0.0.1:9000 minioadmin minioadmin

Este comando debe fallar. Si se ejecuta correctamente, el archivo de entorno nunca llegó al proceso y el servidor está utilizando las credenciales predeterminadas. Corrija esto antes de que cualquier otra cosa acceda al equipo.

mc almacena los alias en ~/.mc/config.json en texto plano, por lo que esas credenciales quedan en el directorio personal del usuario que ejecutó el comando. Ejecutar mc con sudo almacena 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 con 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 un cliente.

mc share download --expire 12h local/backups/hello.txt

La salida incluye X-Amz-Signature y X-Amz-Expires en la cadena de consulta. Hay dos aspectos que suelen sorprender. El enlace se crea a partir del endpoint del alias que usó, por lo que un alias en 127.0.0.1 genera un enlace que sólo puede abrir este equipo: cree un segundo alias en su nombre de host público para los enlaces que vaya a enviar. Además, no existe un botón para revocarlo. La firma sigue siendo válida hasta que caduca, por lo que una caducidad corta es el único control disponible. 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-backup

MinIO 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/backups

El 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 snapshots

restic 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 minio

El 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 real

Un solo nodo significa aquí una unidad sin paridad. La documentación de MinIO describe esta configuración como adecuada para pruebas y cargas pequeñas sin requisitos de disponibilidad. No hay una segunda copia dentro del despliegue, por lo que la durabilidad de cada objeto depende de la durabilidad del disco de un único VPS. Las funciones que presuponen un backend distribuido con codificación de borrado, incluida la replicación de buckets y el bloqueo de objetos, corresponden a despliegues con varias unidades. Por tanto, no prometa 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 desarrollo y artefactos de CI, cuando perder un bucket implica reconstruirlo y nada más. También es razonable para las cargas de archivos de los usuarios en una aplicación pequeña, siempre que usted sea responsable del plan de recuperación y haya probado realmente una restauración.

Elija S3 gestionado cuando un contrato o un regulador exija el bloqueo de objetos o durabilidad en varias regiones, o cuando prefiera no recibir una alerta a las 03:00 porque se ha llenado un disco. La compilación congelada es la otra razón objetiva. En julio de 2026, el binario precompilado de la comunidad corresponde a septiembre de 2025 y no recibe correcciones. Ejecutarlo implica aceptar esa situación, o compilarlo desde el código fuente y mantenerlo actualizado por su cuenta.

Conviene indicar un límite porque aparece con frecuencia. El almacenamiento de objetos no es una base de datos. Cada escritura reemplaza un objeto completo, por lo que un archivo SQL activo en un bucket S3 es lento e inseguro. 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 /etc/default/minio falta 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, así que 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 las credenciales raíz una sola vez durante el arranque, por lo que editar ese archivo sin reiniciar no cambia nada.

Address already in use durante el arranque. Otro proceso está usando el puerto 9000. Búsquelo 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 server.

SignatureDoesNotMatch. La clave secreta es incorrecta o algo entre el cliente y MinIO modificó la cabecera Host, que está incluida en la firma.

RequestTimeTooSkewed. El reloj del cliente o del servidor es incorrecto. Todas las solicitudes S3 contienen una marca de tiempo y se rechazan fuera de una ventana de 15 minutos. 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 la política permite realmente con mc admin policy info local restic-rw y compare el nombre del bucket en las líneas de recursos.

FAQ

¿Es suficiente MinIO de un solo nodo para realizar copias de seguridad reales?

Es suficiente como destino de restic si se ejecuta en una máquina distinta de aquella donde están 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 ese VPS pierde datos, los objetos desaparecen. Mantenga un segundo destino en otra ubicación y restaure desde ambos al menos una vez para comprobar que el proceso funciona.

¿Por qué sha256sum -c falla con el archivo de suma de comprobación de MinIO?

Porque la etiqueta que aparece después del hash dentro de ese archivo identifica la versión, 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 suma 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 de hash e ignore la etiqueta, porque no tiene ninguna implicación de seguridad.

¿Qué ocurrió con la consola web de administración de MinIO?

MinIO retiró 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 compatible de hacerlo en la edición comunitaria, no una solución provisional. 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 solo bucket no tiene permisos para crear buckets. restic cifra todo con la 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, porque las credenciales S3 y los datos de los objetos viajan dentro de la petición. Un proxy en el puerto 443 con un certificado de certbot es la forma más sencilla de hacerlo 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. Sin embargo, la cuenta de servicio necesita acceso de lectura a la clave privada renovada, lo que añade trabajo para obtener el mismo resultado.

#minio#s3#object-storage#self-hosted#vps