Tutoriales de VPS
Despliegue de MinIO Object Storage en un VPS (2026): Docker, S3, HTTPS, copias de seguridad y configuración de seguridad
Partiendo de Ubuntu 24.04, despliega MinIO en un VPS con Docker Compose, configura HTTPS con Caddy, clientes S3, privilegios mínimos, reglas de ciclo de vida, monitorización de disco y copias de seguridad externas; ideal para sitios personales y equipos pequeños que necesitan almacenamiento de objetos.

Despliegue de MinIO Object Storage en un VPS (2026): Docker, S3, HTTPS, copias de seguridad y configuración de seguridad
Si necesitas almacenamiento de objetos compatible con S3 para un sitio web, un servicio de imágenes, scripts de copia de seguridad o aplicaciones de IA, MinIO es una solución más clara que amontonar archivos directamente en un directorio del VPS. Tomando Ubuntu 24.04 y Docker Compose como ejemplo, este artículo recorre por completo un MinIO de nodo único: desde el despliegue, HTTPS, clientes S3 y reglas de ciclo de vida hasta las copias de seguridad y el endurecimiento de seguridad.
MinIO de nodo único es adecuado para proyectos personales, sitios web pequeños, bibliotecas multimedia y entornos de desarrollo; no equivale a un almacenamiento de objetos de alta disponibilidad. Se recomienda al menos 2 núcleos, 4 GB de RAM y 80 GB o más de SSD, con el directorio de datos en un volumen ampliable. Cuando las imágenes y las copias de seguridad crecen rápido, la capacidad se convierte en el cuello de botella antes que la CPU.
| Escenario | Configuración recomendada | Notas |
|---|---|---|
| Desarrollo y pruebas | 1 núcleo, 2 GB, 40 GB SSD | Pocos objetos; no puede ser la única copia de seguridad |
| Sitio personal | 2 núcleos, 4 GB, 100 GB SSD | Imágenes, adjuntos, artefactos de compilación |
| Producción de equipo pequeño | 4 núcleos, 8 GB, 200 GB+ SSD | Añadir copias de seguridad externas |
Si el disco del VPS muestra picos de E/S con frecuencia, consulta primero la guía de diagnóstico de E/S de disco en VPS; no apiles MinIO, bases de datos y tareas de compilación en el mismo disco de bajo rendimiento.
sudo apt update
sudo apt install -y ca-certificates curl
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker "$USER"
newgrp docker
sudo mkdir -p /opt/minio/{data,config}
sudo chown -R "$USER":"$USER" /opt/minio
cd /opt/minio
No coloques el directorio de datos en /tmp ni expongas los puertos 9000 y 9001 directamente a Internet.
Crea .env con credenciales suficientemente largas y que no se reutilicen de otros servicios:
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=替换为至少32位随机密码
Crea compose.yml:
services:
minio:
image: quay.io/minio/minio:latest
container_name: minio
restart: unless-stopped
env_file: .env
command: server /data --console-address ":9001"
ports:
- "127.0.0.1:9000:9000"
- "127.0.0.1:9001:9001"
volumes:
- ./data:/data
- ./config:/root/.minio
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:9000/minio/health/live"]
interval: 30s
timeout: 10s
retries: 3
Inicia y comprueba:
docker compose up -d
docker compose ps
docker logs --tail=100 minio
Apunta s3.example.com y minio.example.com al VPS y luego añade lo siguiente al Caddyfile:
s3.example.com {
reverse_proxy 127.0.0.1:9000
}
minio.example.com {
reverse_proxy 127.0.0.1:9001
}
Caddy solicita y renueva los certificados automáticamente. Si aún no tienes un punto de entrada de proxy inverso unificado, lee primero Configurar HTTPS automático con Caddy en un VPS. Tras los cambios, ejecuta:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
curl -I https://s3.example.com/minio/health/live
Usa dominios distintos para la API S3 y la Console, para no mezclar la interfaz de administración con el punto de subida de las aplicaciones.
Tras iniciar sesión en https://minio.example.com, crea el bucket uploads. No dejes que las aplicaciones usen la cuenta root; crea un usuario dedicado en Access > Users y asígnale solo las políticas necesarias:
{
"Version": "2012-10-17",
"Statement": [
{"Action": ["s3:GetBucketLocation", "s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::uploads"]},
{"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"], "Effect": "Allow", "Resource": ["arn:aws:s3:::uploads/*"]}
]
}
En el lado de la aplicación, guarda solo el dominio de la API, la Access Key, la Secret Key, el bucket y la región (normalmente us-east-1). Para subidas directas desde el frontend, usa URL prefirmadas de corta duración y nunca pongas la Secret Key en el código del navegador.
aws configure --profile minio
aws --profile minio --endpoint-url https://s3.example.com s3 ls
echo "minio test" > /tmp/minio-test.txt
aws --profile minio --endpoint-url https://s3.example.com s3 cp /tmp/minio-test.txt s3://uploads/health/minio-test.txt
aws --profile minio --endpoint-url https://s3.example.com s3 cp s3://uploads/health/minio-test.txt -
Si aparece SignatureDoesNotMatch, comprueba si el endpoint tiene una ruta adicional, si la hora del sistema es correcta, si el proxy inverso reescribe el Host y si el cliente ha habilitado el direccionamiento de estilo host virtual.
En Bucket > Lifecycle Rules, define la caducidad de los objetos temporales, por ejemplo tmp/ durante 7 días y backups/ durante 30 días. Vigila de forma continua:
df -h /opt/minio/data
du -sh /opt/minio/data/*
docker stats minio --no-stream
Cuando el uso del disco llegue al 80 %, amplía o limpia; al 90 %, no esperes más. El directorio /data no es una copia de seguridad: conserva al menos una copia externa:
mc alias set local https://s3.example.com ACCESS_KEY SECRET_KEY
mc alias set backup https://backup-s3.example.net BACKUP_KEY BACKUP_SECRET
mc mirror --overwrite --remove local/uploads backup/minio-uploads
Los scripts de copia de seguridad deben registrar el código de salida, el número de objetos y el tiempo empleado, y conviene probar las restauraciones periódicamente. Puedes seguir leyendo la guía de simulacros de copia de seguridad y restauración en VPS.
- Establece los permisos de
.enven600y no lo subas a Git:chmod 600 /opt/minio/.env. - Abre solo SSH, 80 y 443; mantén 9000/9001 escuchando solo en localhost.
- Crea una Access Key independiente para cada aplicación, limitando permisos por bucket y acción.
- Desactiva el acceso anónimo que no necesites; para descargas públicas usa políticas de solo lectura o URL temporales.
- Configura alertas de disco, contenedores, certificados y copias de seguridad, y realiza una prueba de restauración al menos una vez al mes.
- Fija la imagen de MinIO a una versión probada; antes de actualizar, haz una copia de seguridad y lee las notas de la versión.
Confirma que el navegador accede al dominio de la Console y que el endpoint S3 está configurado con el dominio de la API; revisa también la política del bucket, la política del usuario y CORS. No uses minio.example.com como endpoint S3.
Comprueba si Caddy conserva la cabecera Host, si el DNS apunta al VPS actual y si la hora del sistema es correcta. Las firmas S3 dependen del Host y de la hora de la solicitud; si la capa de proxy reescribe cualquiera de los dos, la autenticación puede fallar.
Confirma que Compose usa la ruta de montaje correcta y ejecuta docker inspect minio para inspeccionar los Mounts. Un directorio de trabajo incorrecto puede hacer que el contenedor monte otro directorio vacío.
La clave de un MinIO de nodo único no es solo poner el contenedor en marcha, sino diseñar juntos el dominio de la API, el dominio de administración, los privilegios mínimos, las alertas de disco y las copias de seguridad externas. Los proyectos personales pueden empezar con 2 núcleos y 4 GB; en cuanto el almacenamiento de objetos se convierta en la única copia de tus datos, añade copias de seguridad independientes o incluso migra a un despliegue multinodo o a un servicio S3 gestionado.