Homelab
Proof

Index

All guides

U1 / Docker foundations

  1. 2026-11-0129.9.2How much RAM does a homelab need? 35 stacks measuredHalf of 35 self-hosted stacks idled under 85.2 MiB. 4 stacks fit in 2 GB, 12 ran in 4 GB with 378 MiB left, and 12 in 2 GB failed in both attempts.
  2. 2026-11-0129.9.2Install Docker on Ubuntu 24.04: 18 s, 388 MBDocker's apt repo took a median 17.8 s and added 387.9 MB of installed packages on Ubuntu 24.04; Ubuntu's docker.io was 29.1.3 against 29.9.2.
  3. 2026-11-0129.9.2Docker ignores UFW: fixes tested at runtimeA container published with -p 8080:80 stayed reachable with UFW deny incoming, while a host process on 8080 was blocked. Four fixes tested.
  4. 2026-11-0129.9.2Docker logs grow forever by default: measured capsA chatty container wrote 99.5 KiB/s of json-file log with Docker defaults. max-size=1m, max-file=3 kept it at three files of 1 MB. daemon.json missed old containers.
  5. 2026-11-0129.9.2Docker restart policies after a reboot, testedunless-stopped and always came back after 3 reboots; no never did. on-failure returned only when the process was killed, not when it exited 0.
  6. 2026-11-0129.9.2Volume vs bind mount: no clear speed gap, ownership differsfio showed overlapping results for volume, bind mount and container layer; a non-root Prometheus image failed on 2 of 4 bind-mount setups.
  7. 2026-11-012.5.8 to 2.5.9Updating Docker containers safely without WatchtowerWatchtower's repository is archived. Tested instead: pinned-tag upgrades with a backup, a Postgres 16 to 17 dump and restore, and Diun v4.33.1 alerts.
  8. 2026-11-022.45.3Portainer vs Dockge vs Komodo on one compose stackManaging the same 2-container stack, Portainer used 27.6 MiB, Dockge 128.4 and Komodo 242.9 with MongoDB. All three deployed, showed logs and swapped an image.

U2 / Networking and remote access

  1. 2026-11-012.11.7Caddy vs Traefik vs NGINX vs NPM: reverse proxy measuredOne test VM: NGINX with upstream keepalive hit 40,942 req/s, the same NGINX without it 2,081. Caddy managed 17,888 and Traefik 25,941.
  2. 2026-11-0115.5.0wg-easy 15.5.0: what a WireGuard tunnel costs in throughputA real wg-easy tunnel in a 4 vCPU VM: iperf3 ran at 2.35 Gbit/s through it against 27.54 Gbit/s without, with CPU use doubling.
  3. 2026-11-010.29.7Headscale 0.29.7 with two Tailscale clients, no DERP relayTwo Tailscale clients joined Headscale by pre-auth key in 7.88 s, but plain ping took 26.31 s to work and an empty DERP config would not boot.
  4. 2026-11-022026.10.1Pi-hole vs AdGuard Home on one 300,000-domain listSame 300,000-domain list, same upstream: AdGuard Home loaded it in 1.16 s, Pi-hole in 1.82 s; a Pi-hole with 64 MB /dev/shm and no rate limit crashed.
  5. 2026-11-012.11.7Local HTTPS without a public CA: Caddy internal vs step-caMedian issue time: 0.75 s (Caddy internal CA), 1.58 s (step-ca over ACME). Leaves lasted 12 h and 24 h. The first step-ca config used Caddy's CA instead.
  6. 2026-11-014.39.28Authelia vs authentik behind Caddy forward_auth, measuredBehind Caddy forward_auth: Authelia idled at 60.2 MiB and was up in 1.82 s; authentik used 822.6 MiB and took 110.53 s (one first start each).

U3 / Backups and restore

  1. 2026-11-010.19.1restic vs borg vs kopia: measured on 6 GBrestic 0.19.1, borg 1.4.5 and kopia 0.23.1 on one seeded 6.10 GB dataset: restic's repo was 3.86 GB, borg's 5.01 GB, kopia's 5.02 GB.
  2. 2026-11-021.37.4Vaultwarden restore drill in 29.1 s, and live SQLite copiesVaultwarden 1.37.4 backed up with restic, VM destroyed, data restored and verified in 29.1 s (one run). Plus 40 live SQLite copies under write load.
  3. 2026-11-0218.6Postgres in Docker: four backups taken under loadpg_dump, pg_basebackup and a raw copy of a live Postgres 18 data directory under pgbench load, each restored and checked: all 12 restores passed.
  4. 2026-11-012.2.2-0ubuntu9.5ZFS vs Btrfs snapshots: cost, rollback, send/receiveSnapshot time under write load, space held, rollback and incremental send/receive for ZFS 2.2.2 and Btrfs on virtual disks. Behaviors, not a speed contest.
  5. 2026-11-012.2.2-0ubuntu9.5ZFS mirror disk failure: offline, dd corruption, replaceA two-disk ZFS mirror on virtual disks: offline and online, 256 MiB of dd corruption healed by scrub, and zpool replace. All 6 runs verified every file.

U4 / Apps under test

  1. 2026-11-011.37.4Vaultwarden behind Caddy: RAM, sync times and hardeningVaultwarden 1.37.4 held 2,000 items in 52 MiB with Caddy, synced them in a median of 102 ms and kept a 57 MB write-ahead log until a checkpoint.
  2. 2026-11-0133.0.10Nextcloud vs Seafile: upload, download, RAM and diskSeafile moved 1,000 small files in 12.8 s down and 77.5 s up; Nextcloud took 53.8 s and 113.0 s but sent one 512 MiB file in 2.0 s.
  3. 2026-11-013.3.5Immich on 6 GB RAM: import 500 photos with ML on and offImporting 500 generated JPEGs took 321 s with machine learning and 95 s without; total RAM peaked at 3,855 MiB against 2,760 MiB.
  4. 2026-11-0112.4.0.0Jellyfin CPU transcoding on 4 vCPU: how many streams?Software transcoding of 1080p H.264 to 720p kept 13 simultaneous streams at 1.0x or better on 4 vCPU; direct play used under 1 % of one core.
  5. 2026-11-013.4.1Paperless-ngx OCR speed: 100 scanned pages on 4 vCPUPaperless-ngx 3.4.1 OCRed 100 generated scan pages in 272 s (2.7 s per page) with 1,022 MiB peak RAM and a 0.08 % median word error rate.
  6. 2026-11-012.5.9Uptime Kuma vs Gatus vs Beszel on 10 checksTen HTTP checks every 60 s: Gatus used 8.6 MiB, Uptime Kuma 204.0 MiB, Beszel 19.7 MiB with its agent. All three flagged a dead target within 73 s.
  7. 2026-11-023.15.1Prometheus + Grafana vs Netdata: RAM, disk, setupNetdata showed live charts 7.3 s after one command; Prometheus + Grafana took five actions and 34.9 s. RAM after 50 minutes was similar: 331.6 vs 360.3 MiB.
  8. 2026-11-0228.3.0Gitea vs Forgejo vs GitLab: RAM and git speedConfigured Gitea used 94.5 MiB and Forgejo 105.6 MiB; GitLab CE used 4,217.3 MiB. Pushing a 300-commit repo took a median 2.50 to 2.63 s on all three.
  9. 2026-11-021.0.1Self-hosted email: RAM of Stalwart and docker-mailserverBefore any mail, docker-mailserver used 37.4 to 273.1 MiB depending on spam filters and Stalwart 103.9 MiB. Delivery to Gmail or Outlook was not tested.
  10. 2026-11-021.30.4FreshRSS vs Miniflux with 50 feeds and 1,000 entriesMiniflux fetched 50 local feeds in 1.18 s and used 72.2 MiB; FreshRSS took 13.50 s with 17.3 MiB idle. Both reached 1,000 entries per user.
  11. 2026-11-0226.09.2BookStack vs Wiki.js: 200 pages, search and backupsBookStack took 57.98 s to create 200 pages through its API, Wiki.js 375.52 s. Wiki.js's default search found no word that appears only in a page body.
  12. 2026-11-020.40.13Ollama on CPU only: tokens per second on 4 coresqwen3:1.7b generated 26 to 28 tokens/s on 4 vCPU, the 4B models about 13, and qwen3:8b was killed for lack of memory in a 6 GB VM.

U5 / Hypervisors and platforms

  1. 2026-11-0218.4Home Assistant OS vs Container: boot, RAM and diskHAOS 18.4 in a nested guest reached onboarding in 88 s, used 659 MiB inside and 2,118 MiB on the host; Container took 5 s and 346 MiB, no apps.
  2. 2026-11-029.2.24Install Proxmox VE 9 on Debian 13: timed steps and RAMThe Proxmox wiki's Debian 13 route took 5 min 48 s in a nested VM, idled at 1,496 MiB of RAM, and left apt failing on the enterprise repository.
  3. 2026-11-029.2.24Proxmox LXC vs KVM guest: create, boot and RAM for nginxOn a nested Proxmox 9.2, an nginx LXC answered in 3.2 s and held 100 MiB; the same service in a KVM guest took 12.0 s and 291 MiB of QEMU memory.