I describe my standard, reproducible homelab setup: a Proxmox-based system of three machines with nightly backups to a Synology NAS, where most apps run as Docker containers managed by docker compose inside LXCs cloned from a prepared template. An upgrade of Forgejo from 1.21.1 to 1.21.8 demonstrates how quick and low-risk maintenance has become under this arrangement, involving a container backup, an image pull, a restart, and some brief testing...
A guide to automating the setup of new self-hosted services on Proxmox by converting a fully configured LXC container into a reusable template. I cover preparing the base container with standard software such as Docker and Tailscale, addressing clone-specific issues like host names, machine IDs, and SSH host keys, then cloning the template to spin up new containers quickly...
My routine quarterly disaster-recovery test in my Proxmox homelab—shutting down the production node and restoring its backups onto a second machine—turned up a few minor issues: the backup node ran out of disk space, was still on an old Proxmox version, and was missing a config fix for backing up LXCs to NFS. The exercise also prompted me to reflect on sticking with Proxmox, Synology’s reliability, and the Uptime Kuma and ntfy monitoring that confirmed services came back up...
A walkthrough of my workflow for adding a new self-hosted service to my Proxmox homelab, using audiobookshelf—set up after abandoning Audible—as the worked example. It covers running the service as a Docker container inside an unprivileged Debian LXC, mounting NAS storage via fstab, Tailscale access, Ansible automation, monitoring with Uptime Kuma, and Proxmox backups...
A follow-up to my previous post on tagging Proxmox guests, showing how to use Ansible to automatically start VMs and LXC containers before running apt updates. I cover installing the proxmoxer Python library, my inventory and vault setup, and the differences between starting VMs by name with the proxmox_kvm module and containers by VMID with the proxmox module. I include a complete example playbook...
I use Proxmox’s tagging system to mark which VMs and containers need to be powered on before running my weekend Ansible update script on a dev server. My walkthrough covers applying tags in the web GUI, customizing colors via Tag Style Override, the three display styles available, and sorting machines by tag in the Datacenter search view...
When I ran Tailscale inside an unprivileged LXC container on Proxmox, it failed at tailscale up with a “no backend” error, because the container lacked access to the TUN/TAP device Tailscale needs. My fix was to stop the container, add a device allow rule and a bind mount entry for /dev/net/tun to its LXC config file, then start it and run tailscale up again...
While setting up an Ubuntu 20.04 LXC on Proxmox to run a TP-Link Omada controller, I found DNS resolution failing because Proxmox copies the host’s Tailscale-based resolv.conf into containers, and the container has no route to the Tailscale DNS address. In this post, I cover the diagnosis of why Debian templates behaved differently, plus two fixes: specifying DNS explicitly in the Proxmox GUI, or creating a .pve-ignore.resolv.conf file so Proxmox stops overwriting the container’s settings...
I found that backing up an unprivileged LXC container on Proxmox to an NFS share can fail with a permission denied error when the backup process tries to create a temporary file on the remote share. The fix is to edit /etc/vzdump.conf on my Proxmox node and set tmpdir to /tmp, so the temporary file is built locally before being copied to the share...
When reusing my old Proxmox boot SSD as a ZFS pool, a “has a holder (500)” error blocks wiping the drive in the web GUI. The workaround is to delete the old partitions with fdisk, reboot to release the kernel’s hold, and then wipe the drive normally. I also note the installer’s existing-volume-group prompt and recommend the graphical installer when adding a boot drive to an existing node...
Persuaded by the 2.5 Admins podcast’s enthusiasm for ZFS, I set up a mirrored ZFS pool in Proxmox using two 256GB NVME drives in a USB dual-bay enclosure. My walkthrough covers creating the pool via the Proxmox web GUI, a primer on ZFS terminology (pools, vdevs, datasets), and basic tasks like moving VM disks onto the pool and running a scrub. I also note enclosure temperatures under load and possible sustained write slowdowns on the Samsung PM981 SSDs...
Ahead of upgrading my Proxmox homelab node from 7.4 to 8.0, I migrate its guest VMs (Jellyfin and a Docker host) to another cluster node, which doubles as a test of the disaster-recovery plan, fixing a couple of hardware incompatibilities along the way. The node then gets a fresh Proxmox 8 install rather than the in-place upgrade, which I document as a runbook covering non-subscription repositories, SSL certificates, Tailscale, and NFS storage...
My Proxmox backup of an unprivileged LXC container to an NFS share failed with tar permission errors, even though privileged container backups to the same share worked. Testing with throwaway containers, I traced the problem to vzdump’s temp directory living on the NFS mount, and setting tmpdir to /tmp in /etc/vzdump.conf fixed it. I walk through the error logs and include some skepticism about the common forum explanation...
Proxmox saves VM backups to local storage by default, which is no help if the host dies and makes restoring to a different node awkward. My walkthrough covers creating a shared folder with NFS permissions on a Synology NAS, then adding that share as storage at the datacenter level in Proxmox so backups and restores can happen from any node, making it easy to move VMs between hosts...
How to switch a Proxmox server from a static IP to a DHCP-assigned address at boot, which I needed for a machine being shipped to a remote site for non-technical setup. Covers the edit to /etc/network/interfaces to change the vmbr0 bridge from static to DHCP, plus the follow-up task of updating /etc/hosts once the server has its new address...
Before adding RAM to my Proxmox production server, I shut down my VMs, take snapshots, and copy the backups off local storage. I locate the backup directory via Proxmox’s storage config, pull the files to a laptop with scp, and note a zsh gotcha where wildcards in the command need escaping...
After finding that memory, rather than CPU, is the bottleneck on my Proxmox server, I order physical RAM for the host. I also walk through increasing the RAM allocated to a Jellyfin VM from 6GB to 8GB via the Proxmox Hardware settings, noting the change takes effect only after a reboot...
DNS resolution failed on a fresh Proxmox install during apt updates because /etc/resolv.conf pointed at 127.0.0.1 instead of the router’s DNS server. After comparing configs on other machines and swapping the network cable, I reinstalled Proxmox from scratch, verified the network settings during setup, and everything worked. This was the third networking issue with this machine, following a DHCP address conflict and a misbehaving managed switch...
My attempt to set up a Jellyfin media server on a mini PC turns into a networking detour: after installing Proxmox, an IP address conflict with a Wi-Fi light bulb leaves the host unreachable over SSH, and reserving a new address doesn’t help because Proxmox hardcodes the IP it picks up via DHCP during installation. It ends with the unresolved problem of deploying the machine to a network with unknown configuration, where Proxmox’s expectation of a static IP is inconvenient...
I wrote a short how-to for fixing the 401 Unauthorized error that apt update throws on a freshly installed Proxmox server because the enterprise repository requires a paid license. The fix involves commenting out the pve-enterprise.list entry and switching sources.list over to the no-subscription Proxmox repository alongside standard Debian Bullseye repos...