Tech Digest

Category

Choosing the base layer for a home server

Applications move between machines in an afternoon. The layer underneath them does not, which is why this is the one decision worth slowing down for.

11 tools profiledMedian idle memory 900 MBLast reviewed

Everything above the base layer is portable. You can move a media server to another machine in an afternoon and nobody notices. The base layer is not: changing it means moving storage, network configuration and every service at once, offline, with no rollback except the backup you took first. It is the hardest thing in this index to change your mind about.

So the question is not which platform is best. It is how much machinery you want between your applications and the disks, and what that costs in memory and attention every month for the next five years.

The default: Debian plus Docker, and nothing else#

Install Debian stable, install Docker Engine, write compose files. Docker Engine is Apache-2.0, idles around 120 MB with containerd before a single container starts, upgrades cleanly through apt, and scores 2 on ops load. Every guide you will read assumes it, so you spend your evenings on applications rather than on translating instructions.

Two costs before you commit. Anyone in the docker group is effectively root on the host. And Docker writes its own iptables chains, so a container published with -p 8080:80 is reachable even when ufw says that port is denied. Bind to an interface (-p 127.0.0.1:8080:80) and put a proxy in front.

That default is wrong in two situations.

You are consolidating machines, or you want a rollback before every risky change. Then Proxmox VE, and accept what it costs: 2 GB of RAM for the host before guests get any, 8 GB as a starting point plus roughly 1 GB per TB of pool if you use ZFS, and an ops load of 4. Upgrades have a required order and a pve8to9 pre-flight check. In exchange you get VM and container snapshots, ZFS replication to a second node without writing send scripts, and a normal Debian underneath when something needs fixing over SSH.

The host has other users, or you want boot ordering that works. Then Podman with Quadlet. Forty megabytes idle, no daemon, and ~/.config/containers/systemd/app.container becomes a real systemd unit with dependency ordering, restart policy and journald logging. The tradeoff: podman compose shells out to an external provider, so compose files leaning on depends_on conditions or profiles behave in ways their authors never tested.

Should a homelab run Kubernetes#

Usually not. A single-node cluster asks you to operate a control plane, a CNI, an ingress controller, a storage class and a certificate controller to run the same containers a compose file already runs, each with its own upgrade cadence. The genuine exception is career: Kubernetes is a job skill and practicing it at home is a real reason. If that is your reason, run it somewhere that is not also serving your family's photos.

If you have three or more Docker hosts and are tired of SSHing into each one, Komodo is the middle path. It is one Rust binary plus an agent per host, and it thinks in compose files rather than manifests. Be clear that it brings MongoDB with it, which is a real database service on your home server, and that v2 changed both the image tag and the schema.

The mistakes people actually make#

  • Leaving the Proxmox enterprise repository enabled. A fresh install ships pve-enterprise.sources pointing at a subscription-only host, so every apt update fails and people conclude the free version is crippled. Disable that file and enable pve-no-subscription from download.proxmox.com. Proxmox 9 uses deb822 format, so one-line edits from 7.x guides do not apply.
  • Publishing a management UI. Portainer mounts the Docker socket, which is root on the host, so keep it on the LAN. Its setup token expires five minutes after first start.
  • Editing stacks in two places. A stack created in Portainer's editor lives in /data/compose and diverges silently from the copy in your git repo. Whichever ran last wins. Pick one source of truth.
  • Assuming rootless containers can bind 443. They cannot, without setcap cap_net_bind_service=ep on rootlesskit or an ip_unprivileged_port_start sysctl. And without loginctl enable-linger, the whole thing stops when you log out.
  • Running Proxmox on a consumer SSD. pmxcfs and ZFS metadata generate constant small synchronous writes. Wearout climbs several percent a month on DRAM-less QLC drives. Check Node > Disks for the Wearout column.

Start with Your first self-hosted server, which is about exactly the decisions that are hard to undo, then Choosing home server hardware and Mini PC vs NAS vs used enterprise for what to buy. Proxmox vs TrueNAS and Unraid vs TrueNAS settle the NAS question; Docker vs Podman and Portainer vs Komodo settle the runtime and management ones. Before your first compose file, read Docker Compose conventions, then price it with What a home server costs to run and Stack planner.

Every platforms tool we profile#

Sorted by operational load, lightest commitment first. Every row links to a full profile with the resource numbers, the upgrade traps and the restore path.

ToolOps loadIdle RAMLicenceIdentityBackup shape
Portainer1, Set and forget90 MBzlib (Community Edition); Business Edition is proprietaryNative OIDCEmbedded key-value store
CasaOS2, Light300 MBApache-2.0Local accounts onlySQLite backup
Docker Engine2, Light120 MBApache-2.0 (Engine and Compose); Docker Desktop is proprietaryNot applicableFile copy
Podman2, Light40 MBApache-2.0Not applicableSQLite backup
Unraid2, Light2048 MBProprietary, perpetual per-device licenceNative OIDCFile copy
Coolify3, Moderate1200 MBApache-2.0Native OIDCPostgres dump
Dokploy3, Moderate900 MBApache-2.0, with DSAL 1.0 reserved for a /proprietary pathLocal accounts onlyPostgres dump
Komodo3, Moderate250 MBGPL-3.0Native OIDCMongo dump
TrueNAS Community Edition3, Moderate8192 MBLGPL-3.0 (middleware)Native OIDCSQLite backup
Proxmox VE4, Heavy2048 MBAGPL-3.0-onlyNative OIDCSQLite backup
k3s4, Heavy2048 MBApache-2.0Not applicableSQLite backup

Profiles#

Head to head in this category#

Guides for this category#

Questions#

Should I install Proxmox or just put Docker on Debian?

Install Docker on Debian unless you have a specific reason to virtualize. Proxmox VE wants 2 GB of RAM for the hypervisor before any guest gets memory, and its own docs say start at 8 GB if you use ZFS and add roughly 1 GB per TB of pool. It scores 4 on the operational load rubric against Docker's 2, because major upgrades have a required order and a pre-flight checker. The reason to accept that is snapshots and VMs: rolling a whole machine back in 30 seconds, or running an OS that is not Linux. Consolidating three always-on boxes is a good reason. Running six containers is not.

Do I need Kubernetes for a homelab?

No. A single-node Kubernetes install adds a control plane, a CNI, an ingress controller, a storage class and a certificate controller so you can run the same containers a 30 line compose file already runs, and every one of those pieces has its own upgrade notes. k3s idles around 2 GB before your workloads. The honest exception is that Kubernetes is a job skill, so if learning it is the actual goal, say so and run it deliberately on a machine that is not also your family's media server. For deploying software you rely on, Compose plus a deploy tool is less to keep alive.

Is Portainer safe to leave running?

On a private network, yes. On the internet, no. Portainer needs /var/run/docker.sock to do anything useful, and that socket is root-equivalent: anyone who reaches the UI can start a privileged container that mounts the host filesystem. Community Edition has no RBAC fine-grained enough to prevent it. Keep it on your LAN or behind a VPN, never behind a port forward, and note that the initial setup token expires five minutes after first start, so claim the admin account immediately or restart the container for a new window.

Docker or Podman?

Docker if you copy compose files from project READMEs and want them to behave exactly as written. Podman if the host has other users, since docker group membership is a straight path to root, or if you want containers as systemd units with real dependency ordering, which Quadlet does natively. Podman idles around 40 MB against Docker's 120 MB because there is no resident daemon. The catch: podman compose is a wrapper that shells out to docker-compose or podman-compose, so compose behavior is whatever that provider does.

How much RAM should the base layer use?

On bare Debian with Docker, budget about 120 MB for dockerd and containerd plus roughly 400 MB for the OS, so under 600 MB before your first container. Proxmox VE is a different scale: 2 GB documented for the host services, and 8 GB or more once ZFS is involved, because ARC is capped at 10 percent of RAM on installs from the 8.1 ISO onward but defaults to half your RAM on upgraded systems. That difference is 32 GB on a 64 GB host, and it shows up as guests being killed for memory.

Can I change hypervisors later?

You can, but it is the most expensive migration in self-hosting. Moving off Proxmox means exporting or re-creating every guest, rebuilding your storage layout, and reconfiguring networking, all with the machine offline. There is no in-place path between Proxmox, TrueNAS and Unraid because each owns the disks differently. Plan for a second machine or an accepted outage window measured in days, not hours. Pick the base layer once, with your five year storage plan in mind, and treat that choice as permanent for practical purposes.

Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.