A tu factura de AWS S3 no le importa que solo guardes respaldos del homelab. A MinIO sí. Es un almacén de objetos compatible con S3 que corre como un solo binario, cabe sin problema en un contenedor LXC de Proxmox y habla la misma API que cualquier cliente de almacenamiento en la nube. Una vez que está funcionando, puedes apuntar Proxmox Backup Server hacia él, guardar ahí los originales de Immich, respaldar tu clúster K3s con Velero y no volver a pagar un cargo de salida (egress).
Esta guía recorre un despliegue de MinIO de nivel producción en Proxmox LXC: crear el contenedor, instalar y configurar MinIO como servicio de systemd, ponerle Traefik delante para tener HTTPS y conectarlo con el resto del stack de tu homelab.
Qué necesitas antes de empezar
Un nodo de Proxmox VE funcionando (8.x o 9.x; mira la guía de actualización a Proxmox VE 9 si todavía estás en 7.x). Traefik ya desplegado en un LXC como proxy inverso; si todavía no lo tienes, la guía de Traefik en Proxmox LXC lo cubre de punta a punta. Un registro DNS que apunte minio.yourdomain.com a la IP de tu LXC de Traefik, y al menos un disco o directorio dedicado para los datos de objetos. No quieres que MinIO escriba en tu disco raíz.
En hardware, el modo de un solo nodo de MinIO es liviano. Un mini PC Beelink EQ12 o similar con 16 GB de RAM puede alojar MinIO sin problema junto a una docena de contenedores LXC más. El almacenamiento es donde conviene invertir: discos NAS Seagate IronWolf si vas con discos mecánicos, o un SSD Samsung 870 EVO si quieres mejor rendimiento con objetos pequeños. Para una capa NVMe, el Crucial P3 Plus NVMe ofrece buen rendimiento secuencial por cada dólar.
Si estás armando un NAS de verdad bajo Proxmox, una tarjeta HBA LSI 9207-8i pasada a una VM de almacenamiento te da acceso directo a los discos sin que una controladora RAID se meta en el medio, algo importante si piensas usar ZFS.
¿Cómo se crea el contenedor LXC en Proxmox?
Crea un contenedor Debian 12 sin privilegios. En la interfaz web de Proxmox: Datacenter → tu nodo → Create CT. Desmarca la casilla "Privileged". Asigna 2 vCPU, 2048 MB de RAM y un disco raíz modesto de 8 GB: MinIO en sí es un solo binario de menos de 100 MB. Los datos van en otro lado.
El paso crítico: agrega un segundo punto de montaje para los datos de objetos. En la pestaña Resources del contenedor, agrega un Mount Point:
mp0: /dev/disk/by-id/your-disk,mp=/data
O, si usas un almacenamiento de tipo directorio en Proxmox:
mp0: local-zfs:32,mp=/data
Dimensiona ese punto de montaje según el almacenamiento de objetos que realmente necesites. MinIO en modo de un solo disco no tiene mínimo, pero en modo multidisco con erasure coding necesita al menos 4 discos. Para un despliegue de homelab en un solo nodo, un punto de montaje grande es suficiente.
Arranca el contenedor, ejecuta apt update && apt upgrade -y y sigue adelante.
¿Cómo se instala MinIO en el LXC?
MinIO se distribuye como un único binario enlazado estáticamente. Descarga la última versión desde el endpoint oficial de releases:
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
mv minio /usr/local/bin/minio
Verifica que funcione:
minio --version
# minio version RELEASE.2026-XX-XXTXX-XX-XXZ
Crea un usuario de sistema dedicado (nunca corras MinIO como root):
useradd -r -s /sbin/nologin minio-user
chown -R minio-user:minio-user /data
Crea el archivo de configuración de entorno que va a leer la unidad de systemd de MinIO:
cat > /etc/default/minio << 'EOF'
# MinIO root credentials — change these
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=change-this-strong-password
# Data directory — can be a space-separated list for erasure coding
MINIO_VOLUMES=/data
# Optional: set a friendly site name
MINIO_SITE_NAME=homelab-minio
# Bind address for the S3 API
MINIO_ADDRESS=:9000
# Bind address for the web console
MINIO_CONSOLE_ADDRESS=:9001
EOF
chmod 600 /etc/default/minio
Ahora crea la unidad de systemd:
cat > /etc/systemd/system/minio.service << 'EOF'
[Unit]
Description=MinIO Object Storage
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
User=minio-user
Group=minio-user
ProtectProc=invisible
EnvironmentFile=/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z ${MINIO_VOLUMES} ]; then echo 'Variable MINIO_VOLUMES not set in /etc/default/minio'; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always
LimitNOFILE=65536
TasksMax=infinity
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now minio
systemctl status minio
El servicio debería quedar en active (running). La API S3 de MinIO está en el puerto 9000 y la consola web en el 9001. En este punto ya es accesible en tu LAN en http://lxc-ip:9001, pero quieres HTTPS antes de guardar ahí algo importante.
¿Cómo se pone MinIO detrás de Traefik con HTTPS?
En tu LXC de Traefik, agrega el router de MinIO a la configuración dinámica. Si usas configuración basada en archivos:
# /etc/traefik/dynamic/minio.yml
http:
routers:
minio-api:
rule: "Host(`minio.yourdomain.com`)"
service: minio-api
entryPoints:
- websecure
tls:
certResolver: letsencrypt
minio-console:
rule: "Host(`minio-console.yourdomain.com`)"
service: minio-console
entryPoints:
- websecure
tls:
certResolver: letsencrypt
services:
minio-api:
loadBalancer:
servers:
- url: "http://minio-lxc-ip:9000"
passHostHeader: true
minio-console:
loadBalancer:
servers:
- url: "http://minio-lxc-ip:9001"
passHostHeader: true
Dos detalles importantes: las reescrituras de la consola web de MinIO asumen que se sirve en un hostname distinto al de la API S3; mezclar ambos en el mismo host con prefijos de ruta rompe cosas. Mantén separados los dos subdominios. Además, agrega MINIO_BROWSER_REDIRECT_URL=https://minio-console.yourdomain.com a /etc/default/minio y reinicia el servicio para que la consola conozca su URL pública.
¿Cómo se conecta MinIO con el resto de tu homelab?
Aquí es donde MinIO se gana su lugar. Con un bucket y una llave de acceso, una docena de servicios pueden usarlo como backend S3 directo.
Crea un bucket y credenciales de acceso con el cliente de MinIO:
# Install mc on your workstation or in the LXC
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc && mv mc /usr/local/bin/mc
mc alias set homelab https://minio.yourdomain.com admin your-password
mc mb homelab/pbs-backups
mc mb homelab/immich-media
mc mb homelab/velero-k3s
# Create a dedicated service account for each app
mc admin user add homelab pbs-user strong-password
mc admin policy attach homelab readwrite --user pbs-user
Proxmox Backup Server con MinIO como destino de respaldos:
Las versiones recientes de PBS (4.x) agregaron soporte para datastores en S3, todavía marcado como vista previa técnica, así que revisa las notas de tu versión antes de depender de él. En la interfaz web de PBS, agrega un endpoint S3 y crea un datastore sobre él. Usa el endpoint de la API de MinIO (https://minio.yourdomain.com), el bucket que creaste (pbs-backups) y las credenciales de la cuenta de servicio. Desactiva la verificación de SSL solo si usas certificados autofirmados; con Let's Encrypt debería funcionar sin eso. Una vez conectado, PBS crea la estructura del datastore dentro del bucket y puedes programar respaldos de VMs y CTs de Proxmox hacia MinIO. Combinado con un disco NAS WD Red Plus de 4 TB como volumen de MinIO, tienes un destino de respaldos local, respaldado en S3 y deduplicado.
Originales de Immich en MinIO:
Immich no guarda los originales en S3 de forma nativa: espera un sistema de archivos. La forma práctica de usar MinIO es montar el bucket con rclone (rclone mount) apuntando al endpoint https://minio.yourdomain.com y al bucket immich-media con la cuenta de servicio dedicada, y usar ese montaje como biblioteca externa o ruta de almacenamiento, dejando las miniaturas y los vectores de ML en disco local. Para una biblioteca de fotos grande, mover los originales a MinIO sobre un Seagate Exos de 16 TB sale bastante más barato que ampliar tu pool ZFS raíz. Prueba bien el rendimiento del montaje antes de mover toda la biblioteca. Mira la guía de Immich en Proxmox LXC para la instalación completa de Immich si todavía no lo desplegaste.
Respaldos del clúster K3s con Velero:
Velero es la herramienta estándar de respaldos para K3s/Kubernetes y habla S3 de forma nativa. Instálalo apuntando a MinIO:
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.10.0 \
--bucket velero-k3s \
--secret-file ./minio-credentials \
--use-volume-snapshots=false \
--backup-location-config \
region=us-east-1,s3ForcePathStyle=true,s3Url=https://minio.yourdomain.com
La opción s3ForcePathStyle=true es crítica: sin ella, Velero intenta usar URLs de estilo virtual-hosted (velero-k3s.minio.yourdomain.com), que MinIO no sirve por defecto. Mira la guía de K3s en Proxmox para el contexto completo del clúster.
¿Qué hay que considerar al dimensionar el hardware?
MinIO en un solo nodo usa poca CPU, pero depende mucho de la E/S. En un homelab con varios trabajos de respaldo simultáneos más las subidas de Immich, el cuello de botella casi siempre es el rendimiento del disco, no el cómputo. Algunas notas prácticas:
- RAM: 2 GB alcanzan para menos de 10 millones de objetos. El uso de memoria de MinIO crece con la cantidad de objetos y de conexiones simultáneas, no con el volumen de datos.
- CPU: 2 vCPU son de sobra. El cifrado y el erasure coding de MinIO son rápidos incluso en hardware modesto.
- Red: Gigabit Ethernet se satura en unos 125 MB/s. Para cargas de alto rendimiento, una tarjeta PCIe de 10GbE y un switch barato con enlaces de 10G marcan una diferencia real. El TP-Link TL-SX1008 es un switch no administrable de 10GbE razonable para un laboratorio.
- Almacenamiento: evita poner los datos de MinIO en el mismo pool que la raíz de Proxmox. La E/S de los respaldos grandes va a degradar el rendimiento de las VMs. Un pool ZFS dedicado en discos mecánicos aparte, o un NVMe dedicado como un Kingston KC3000 de 2 TB, mantiene las cargas aisladas.
Para setups más grandes, como un rack con un mini servidor Intel Xeon o un Dell PowerEdge usado, MinIO puede escalar al modo distribuido con erasure coding usando cuatro o más discos. En ese modo, MinIO sobrevive a la falla de un disco sin perder datos y sin necesitar una controladora RAID. Para la mayoría de los homelabs, el modo de un solo disco con redundancia ZFS por debajo es el camino más simple.
¿Cómo se gestiona la retención de respaldos con políticas de ciclo de vida?
Una de las funciones de MinIO más subestimadas para destinos de respaldo es la gestión del ciclo de vida de los objetos. En lugar de limpiar a mano bloques viejos de PBS o snapshots vencidos de Velero, puedes definir reglas de expiración directamente en el bucket:
# Expire objects in pbs-backups older than 30 days
mc ilm rule add --expire-days 30 homelab/pbs-backups
# List current rules
mc ilm rule ls homelab/pbs-backups
Para PBS es una capa extra de seguridad además de su propio trabajo de prune/GC, útil si un prune falla en silencio y los bloques se acumulan. Para Velero, las políticas de ciclo de vida evitan que snapshots viejos del clúster consuman cientos de GB sin que lo notes. También puedes definir reglas por prefijo de objeto, lo que te permite guardar respaldos diarios por 7 días y semanales por 30, todo en el mismo bucket.
Advertencias y trampas comunes
TLS no es opcional. MinIO corre feliz sobre HTTP plano, pero los clientes S3 mandan credenciales en los encabezados de las peticiones. Saltarse HTTPS en cualquier cosa que salga de tu LAN es mala idea. Let's Encrypt con Traefik no cuesta nada de esfuerzo.
MinIO en un solo nodo no tiene redundancia integrada. Tu durabilidad depende de lo que haya debajo: espejo ZFS, RAID o lo que uses. El modo distribuido de MinIO requiere 4 o más discos y otra configuración. Ten claro en qué modo estás.
El rendimiento de red en LXC es excelente, pero los contenedores sin privilegios no pueden acceder a dispositivos de bloque directamente. Si quieres pasar un disco físico directo al LXC de MinIO (en lugar de montar un directorio de almacenamiento de Proxmox), tendrás que agregar el dispositivo a la configuración del contenedor a mano y definir los permisos cgroup correspondientes. Funciona, pero son unos pasos extra comparado con usar un montaje de directorio de Proxmox.
El cliente mc es tu amigo. La consola web de MinIO es pulida, pero mc es más rápido para scripts, políticas de buckets y chequeos de salud. Agrega mc admin info homelab a un cron o a un script de monitoreo para detectar problemas a tiempo.
Veredicto
MinIO en Proxmox LXC es de esos servicios que mejoran todo lo demás en tu homelab sin hacer ruido. Una vez que está funcionando, cualquier app que hable S3 puede guardar ahí su almacenamiento, y la mayoría de las apps autoalojadas modernas lo hacen. La instalación es sencilla, el consumo de recursos es mínimo y el modelo operativo (un binario, systemd, un archivo de configuración) es justo lo que quieres en un servicio del que te vas a olvidar después de la primera semana.
Si ya corres Proxmox Backup Server para snapshots de VMs, Immich para tus fotos o K3s para cargas en contenedores, MinIO es la capa de almacenamiento que faltaba para unirlos sin una factura de la nube.
Aviso: este artículo contiene enlaces de afiliado. Si compras a través de ellos, puedo ganar una pequeña comisión sin costo extra para ti.
¿Quieres algo así para tu negocio?
Instalo infraestructura privada y autoalojada en Proxmox: IA, automatización y herramientas internas en hardware que es tuyo, documentado y entregado. Ver el stack de IA privada →
¿No sabes qué necesitas? Agenda una llamada gratis.