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.
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.sourcespointing at a subscription-only host, so everyapt updatefails and people conclude the free version is crippled. Disable that file and enablepve-no-subscriptionfromdownload.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/composeand 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=eponrootlesskitor anip_unprivileged_port_startsysctl. And withoutloginctl 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 > Disksfor the Wearout column.
What to read next#
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.
| Tool | Ops load | Idle RAM | Licence | Identity | Backup shape |
|---|---|---|---|---|---|
| Portainer | 1, Set and forget | 90 MB | zlib (Community Edition); Business Edition is proprietary | Native OIDC | Embedded key-value store |
| CasaOS | 2, Light | 300 MB | Apache-2.0 | Local accounts only | SQLite backup |
| Docker Engine | 2, Light | 120 MB | Apache-2.0 (Engine and Compose); Docker Desktop is proprietary | Not applicable | File copy |
| Podman | 2, Light | 40 MB | Apache-2.0 | Not applicable | SQLite backup |
| Unraid | 2, Light | 2048 MB | Proprietary, perpetual per-device licence | Native OIDC | File copy |
| Coolify | 3, Moderate | 1200 MB | Apache-2.0 | Native OIDC | Postgres dump |
| Dokploy | 3, Moderate | 900 MB | Apache-2.0, with DSAL 1.0 reserved for a /proprietary path | Local accounts only | Postgres dump |
| Komodo | 3, Moderate | 250 MB | GPL-3.0 | Native OIDC | Mongo dump |
| TrueNAS Community Edition | 3, Moderate | 8192 MB | LGPL-3.0 (middleware) | Native OIDC | SQLite backup |
| Proxmox VE | 4, Heavy | 2048 MB | AGPL-3.0-only | Native OIDC | SQLite backup |
| k3s | 4, Heavy | 2048 MB | Apache-2.0 | Not applicable | SQLite backup |
Profiles#
Portainer
Web UI for Docker, Swarm and Kubernetes, with a free tier that is not the open source one
ops 2/5 · 300 MBCasaOS
Friendly app-store dashboard bolted onto an existing Linux install, now in maintenance mode
ops 2/5 · 120 MBDocker Engine
The container runtime and Compose tooling that most self-hosted guides assume you have
ops 2/5 · 40 MBPodman
Daemonless OCI container engine that runs rootless and turns containers into systemd units
ops 2/5 · 2048 MBUnraid
Paid NAS OS with a mixed-drive parity array, Docker apps and VMs, licensed per device count
ops 3/5 · 1200 MBCoolify
Self-hosted PaaS for apps, databases and one-click services, finally out of beta in 2026
ops 3/5 · 900 MBDokploy
Self-hosted PaaS on Docker Swarm and Traefik, with git push deploys and managed databases
ops 3/5 · 250 MBKomodo
Rust build and deploy server that manages Docker Compose stacks across many machines
ops 3/5 · 8192 MBTrueNAS Community Edition
ZFS storage appliance OS, now one product line with Docker apps and no more SCALE branding
ops 4/5 · 2048 MBProxmox VE
Debian-based hypervisor with KVM, LXC, ZFS and clustering in one web UI
ops 4/5 · 2048 MBk3s
Certified Kubernetes in one binary, with SQLite instead of etcd and batteries included
Head to head in this category#
- Coolify vs DokployBoth give you Heroku on your own box. Both are young enough that you should plan for a breaking release.
- Docker vs PodmanMost self-hosters should still run Docker. Here is precisely who should not, and what switching costs.
- Portainer vs KomodoA console you click versus a deploy system driven from git. Which one belongs in front of a stack you care about.
- Proxmox VE vs TrueNASWhich one goes on bare metal, what HBA passthrough really requires, and what ZFS costs you in RAM.
- Unraid vs TrueNASThe real axis is your drive pile: mismatched disks favor Unraid, matched sets favor ZFS.
Guides for this category#
- Choosing hardware for a home serverThree builds, real prices, and why CPU cores are the last thing you should pay for.
- Docker Compose conventions that survive year twoOne directory per service, bind mounts under one root, pinned tags, and why latest is a data-loss risk.
- Mini PC, NAS or used enterprise gearWatts, dollars per year and drive bays, for the three shapes a home server comes in.
- What a home server actually costs to runThe five-year arithmetic, and the point at which self-hosting stops losing money.
- A security baseline for a home serverNine things, in order of what actually gets people compromised. Plus the popular advice you can skip.
- Your first self-hosted server: the decisions that are hard to undoThe OS, the disk layout, remote access and backups are hard to undo. Everything else is an afternoon.
- Storage layout: ZFS, btrfs, mdadm, or just one diskThe write hole, the resilver window, the RAM appetite, and one recommendation per situation.
- An update strategy that does not lose dataNotify, do not auto-update. Pin tags, snapshot before upgrading, and know which projects cannot be rolled back.
- When not to self-hostFive categories where self-hosting is a bad trade, one decision test, and the cases where it genuinely wins.
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.