Set a friend up with his own server on my homelab tonight. Full root, do whatever he wants, zero risk to anything of mine.
Went with an Incus system container instead of Docker or a full VM. It behaves like a real machine (its own systemd, sudo, persistent disk) but rides the host kernel, so the overhead is basically nothing. Capped it at 6GB RAM, 3 cores, 40GB disk on a size-limited btrfs pool so it can never starve or fill the box that runs my other 43 containers.
Inside: a full LAMP stack, SSH, and Claude Code. He brings his own model keys, so none of my gateways are in the blast radius. Remote access is Tailscale SSH, identity-based, no keys to mail around.
The real work was the isolation. He is root in his box, but the box is walled off two ways. A host firewall that drops everything from his bridge toward my LAN, my host, every other container, and the gateway, while still allowing the open internet. And a tailnet ACL so even over Tailscale he can reach his own node and nothing else of mine. Tested every direction, in and out. The firewall missed one path on the first pass: traffic to the host's own IP rides the INPUT chain, not FORWARD. Caught it, closed it, re-verified.
Then I made it boring. Automatic security updates inside the box, a five-minute timer that re-applies the firewall in case Docker ever rewrites its chains, and a weekly export to the NAS. The whole build is one folder of scripts in the repo, so I can rebuild it in minutes.
Best kind of favor: hand someone real keys to a real machine and still sleep fine.