MinIO on Proxmox LXC: Self-Hosted S3 Object Storage for Your Home Lab (2026)
Self-Hosting

MinIO on Proxmox LXC: Self-Hosted S3 Object Storage for Your Home Lab (2026)

Ricardo Gil
August 5, 2026
9 min read
#MinIO #Proxmox #Self-Hosting #S3 #Home Lab

Your AWS S3 bill doesn't care that you're only storing home lab backups. MinIO does. It's an S3-compatible object store that runs on a single binary, fits comfortably in a Proxmox LXC container, and speaks the same API as every cloud storage client ever written. Once it's running, you can point Proxmox Backup Server at it, store Immich originals in it, back up your K3s cluster with Velero, and never pay an egress fee again.

This guide walks through a production-grade MinIO deployment on Proxmox LXC: creating the container, installing and configuring MinIO as a systemd service, putting Traefik in front for HTTPS, and wiring it into the rest of your home lab stack.

What You'll Need Before Starting

A working Proxmox VE node (8.x or 9.x — see the Proxmox VE 9 upgrade guide if you're still on 7.x). Traefik already deployed in an LXC for reverse proxying — if you haven't done that yet, the Traefik on Proxmox LXC guide covers it end to end. A DNS record pointing minio.yourdomain.com at your Traefik LXC IP, and at least one dedicated disk or directory for object data. You don't want MinIO writing to your root disk.

For hardware, MinIO's single-node mode is lightweight. A Beelink EQ12 mini PC or similar with 16GB RAM can easily host MinIO alongside a dozen other LXC containers. Storage is where you want to invest: Seagate IronWolf NAS drives for spinning rust, or a Samsung 870 EVO SSD if you want snappier small-object performance. For NVMe tiering, the Crucial P3 Plus NVMe offers solid sequential throughput per dollar.

If you're building out a proper NAS under Proxmox, an LSI 9207-8i HBA card passed through to a storage VM gives you direct disk access without the RAID controller getting in the way — important if you're planning ZFS.

How Do You Create the LXC Container on Proxmox?

Create an unprivileged Debian 12 container. In the Proxmox web UI: Datacenter → your node → Create CT. Uncheck the "Privileged" box. Allocate 2 vCPUs, 2048 MB RAM, and a modest 8 GB root disk — MinIO itself is a single binary under 100 MB. The data lives elsewhere.

The critical step: add a second mount point for your object data. In the container's Resources tab, add a Mount Point:

code
mp0: /dev/disk/by-id/your-disk,mp=/data

Or if you're using a Proxmox directory storage:

code
mp0: local-zfs:32,mp=/data

Size that mount point to however much object storage you actually need. MinIO in single-drive mode has no minimum, but in erasure-coded multi-drive mode it needs at least 4 drives. For a home lab single-node deployment, one large mount point is fine.

Boot the container, run apt update && apt upgrade -y, then proceed.

How Do You Install MinIO in the LXC?

MinIO ships as a single statically-linked binary. Grab the latest from the official release endpoint:

bash
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
mv minio /usr/local/bin/minio

Verify it's working:

bash
minio --version
# minio version RELEASE.2026-XX-XXTXX-XX-XXZ

Create a dedicated system user (never run MinIO as root):

bash
useradd -r -s /sbin/nologin minio-user
chown -R minio-user:minio-user /data

Create the environment config file MinIO's systemd unit will source:

bash
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

Now create the systemd unit:

bash
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

The service should reach active (running). MinIO's S3 API is on port 9000, web console on 9001. At this point it's accessible on your LAN at http://lxc-ip:9001 — but you want HTTPS before you put anything real in it.

How Do You Put MinIO Behind Traefik with HTTPS?

In your Traefik LXC, add the MinIO router to your dynamic configuration. If you're using file-based config:

yaml
# /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

Two important details: MinIO's web console rewrites assume it's served on a separate hostname from the S3 API — mixing them on the same host with path prefixes breaks things. Keep the two subdomains separate. Also add MINIO_BROWSER_REDIRECT_URL=https://minio-console.yourdomain.com to /etc/default/minio and restart the service so the console knows its public URL.

How Do You Wire MinIO Into the Rest of Your Home Lab?

This is where MinIO earns its keep. Once you have a bucket and an access key, a dozen services can use it as a drop-in S3 backend.

Create a bucket and access credentials via the MinIO client:

bash
# 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 as a MinIO backup target:

PBS 3.x added S3 storage support. In the PBS web UI, go to Storage → Add → S3. Use your MinIO API endpoint (https://minio.yourdomain.com), the bucket you created (pbs-backups), and the service account credentials. Uncheck "Verify SSL" only if you're on self-signed certs — with Let's Encrypt it should work without it. Once connected, PBS will create its datastore structure inside the bucket and you can schedule Proxmox VM/CT backups to land in MinIO. Combined with a WD Red Plus 4TB NAS drive backing your MinIO volume, this gives you an on-site, S3-backed, deduplicated backup target.

Immich external object storage:

Immich supports S3-compatible external storage for original files starting in v1.90. In the Immich admin panel, go to Administration → Storage → External Storage. Set the endpoint to https://minio.yourdomain.com, bucket to immich-media, and use the dedicated service account. Immich will upload new originals to MinIO while keeping thumbnails and ML vectors local. For a large photo library, offloading originals to MinIO on a Seagate Exos 16TB is substantially cheaper than expanding your root ZFS pool. See the Immich on Proxmox LXC guide for the full Immich setup if you haven't deployed it yet.

K3s cluster backups with Velero:

Velero is the standard K3s/Kubernetes backup tool and speaks S3 natively. Install it pointing at MinIO:

bash
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

The s3ForcePathStyle=true flag is critical — without it, Velero tries to use virtual-hosted-style URLs (velero-k3s.minio.yourdomain.com) which MinIO doesn't serve by default. See the K3s on Proxmox guide for the full cluster setup context.

What Are the Hardware Sizing Considerations?

Single-node MinIO is CPU-light but I/O bound. For a home lab handling multiple concurrent backup jobs plus Immich uploads, the bottleneck is almost always disk throughput, not compute. A few practical notes:

  • RAM: 2GB is fine for under 10M objects. MinIO's memory usage scales with object count and concurrent connections, not data volume.
  • CPU: 2 vCPUs is plenty. MinIO's encryption and erasure coding are fast even on low-end hardware.
  • Network: Gigabit Ethernet saturates at ~125 MB/s. For high-throughput workloads, a 10GbE PCIe card and a cheap managed switch with 10G uplinks make a real difference. The TP-Link TL-SX1008 is a reasonable unmanaged 10GbE switch for lab use.
  • Storage: Avoid putting MinIO data on the same pool as your Proxmox root. Noisy-neighbor I/O from large backup jobs will degrade VM performance. A dedicated ZFS pool on separate spinners, or a dedicated NVMe on a Kingston KC3000 2TB, keeps workloads isolated.
  • For beefier setups — a rack with an Intel Xeon mini server or used Dell PowerEdge — MinIO can scale into distributed/erasure-coded mode with four or more drives. In that mode, MinIO survives single-drive failure with no data loss and no RAID controller required. For most home labs, single-drive mode with ZFS redundancy underneath is the simpler path.

    How Do You Manage Backup Retention with MinIO Lifecycle Policies?

    One of the underrated MinIO features for backup targets is object lifecycle management. Instead of manually cleaning up old PBS backup chunks or expired Velero snapshots, you can set expiration rules directly on the bucket:

    bash
    # 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

    For PBS this is a belt-and-suspenders approach alongside PBS's own prune/GC job — useful if a prune job fails silently and chunks accumulate. For Velero, lifecycle policies ensure stale cluster snapshots don't quietly consume hundreds of GBs. You can also set rules per object prefix, which lets you keep daily backups for 7 days and weekly backups for 30, all within the same bucket.

    Caveats and Gotchas

    TLS is non-negotiable. MinIO will happily run over plain HTTP, but S3 clients send credentials in request headers. Skipping HTTPS on anything that leaves your LAN is a bad idea. Let's Encrypt via Traefik is zero-friction.

    Single-node MinIO has no built-in redundancy. Your durability story is whatever lives under it — ZFS mirror, RAID, whatever. MinIO's distributed mode requires 4+ drives and a different configuration. Know which mode you're in.

    LXC networking performance is excellent, but unprivileged containers can't access raw block devices. If you want to pass a physical disk directly through to the MinIO LXC (rather than mounting a Proxmox storage directory), you'll need to add the device to the container config manually and set the appropriate cgroup permissions. It works, but it's a few extra steps compared to just using a Proxmox directory mount.

    The mc client is your friend. MinIO's web console is polished but mc is faster for scripting, bucket policies, and health checks. Add mc admin info homelab to a cron or monitoring script to catch issues early.

    Verdict

    MinIO on Proxmox LXC is one of those services that quietly improves everything else in your home lab. Once it's running, any app that speaks S3 can offload storage to it — and most modern self-hosted apps do. The setup is straightforward, the resource footprint is minimal, and the operational model (single binary, systemd, one config file) is exactly what you want in a service you'll forget about after the first week.

    If you're already running Proxmox Backup Server for VM snapshots, Immich for photo management, or K3s for containerized workloads, MinIO is the missing storage layer that ties them together without a cloud bill.

    ---

    > Disclosure: This post contains affiliate links. If you purchase through these links, I may earn a small commission at no extra cost to you.

    📬Weekly Newsletter

    Get the best home lab & AI content

    No spam. One email per week. Unsubscribe anytime.

    Share this article