Assumptions & Debian 13 Setup
Assumptions
This guide walks you through deploying a production-ready Proxmox VE 9.1 installation on a Hetzner dedicated root server running Debian 13 (Trixie). It covers everything from OS installation through post-install hardening and optimization — no clustering, no VM templates, no vSwitches.
What you need before you start
- A Hetzner Robot account with a dedicated root server ordered and provisioned
- Access to the Robot panel to activate the rescue system and retrieve your root password
- A domain name you control, with the ability to create DNS A records pointing to the server’s public IP
- An SSH client on your local machine
- Basic Linux command-line comfort — editing files, running commands as root, reading command output
What this guide assumes about your server
- Two NVMe or SSD drives — size does not matter, but both will be used in a RAID-1 mirror
- A single public IPv4 address assigned by Hetzner
- No data to preserve — the installer wipes both drives completely
Target stack
- OS: Debian 13 (Trixie)
- Proxmox VE: 9.1
- Repository: No-subscription (free tier)
Debian 13 Setup
Hetzner’s rescue system includes the installimage tool — a scriptable installer that handles partitioning, RAID setup, image extraction, and bootloader configuration in a single pass. The steps below gather the information needed to build the config file, then run the installer.
Step 1 — Identify Your Drives
lsblk -d -o NAME,SIZE,MODEL
Lists all disks (not partitions) with their size and model. NVMe drives appear as /dev/nvme0n1, /dev/nvme1n1. SATA and SSD drives appear as /dev/sda, /dev/sdb. Note both device names — they go directly into the config.
ls /dev/disk/by-id/
Shows drives by hardware ID. Use this to cross-reference and confirm you have the correct devices before the installer wipes them.
Step 2 — Check for UEFI
ls /sys/firmware/efi
If the directory exists and contains files, the server boots in UEFI mode. If it returns No such file or directory, it uses legacy BIOS. This determines the partition layout — UEFI requires an EFI System Partition (ESP), BIOS does not.
Step 3 — Find the Debian 13 Image
ls /root/images/ | grep -i debian
Lists Hetzner-provided OS images available in the rescue system. Identify the filename matching Debian-13*trixie*, then store it in a variable — Step 4 references it directly so the config is always built from the actual image present in the rescue environment:
DEBIAN_IMAGE=$(ls /root/images/ | grep -i trixie | head -1)
echo "$DEBIAN_IMAGE"
If the output is empty, run ls /root/images/ without filtering to view all available images and identify the correct filename manually.
One thing worth mentioning about Step 3: the filename changes with each Hetzner rescue environment update. If you run the grep and get no output, don't assume Debian 13 isn't available — the image name format occasionally shifts between rescue system versions. Run ls /root/images/ without filtering and look for anything trixie-related.
Step 4 — Create the Install Config
UEFI systems:
cat > /tmp/install.conf << EOF
DRIVE1 /dev/nvme0n1
DRIVE2 /dev/nvme1n1
SWRAID 1
SWRAIDLEVEL 1
BOOTLOADER grub
HOSTNAME pve.yourdomain.com
PART /boot/efi esp 512M
PART /boot ext4 1G
PART swap swap 8G
PART / ext4 all
IMAGE /root/images/$DEBIAN_IMAGE
EOF
BIOS / legacy systems — same config, remove the ESP line:
cat > /tmp/install.conf << EOF
DRIVE1 /dev/nvme0n1
DRIVE2 /dev/nvme1n1
SWRAID 1
SWRAIDLEVEL 1
BOOTLOADER grub
HOSTNAME pve.yourdomain.com
PART /boot ext4 1G
PART swap swap 8G
PART / ext4 all
IMAGE /root/images/$DEBIAN_IMAGE
EOF
Parameter reference:
| Parameter | Example value | What it does |
|---|---|---|
DRIVE1 | /dev/nvme0n1 | First drive, identified in Step 1 |
DRIVE2 | /dev/nvme1n1 | Second drive — both are mirrored |
SWRAID | 1 | Enables Linux software RAID via mdadm |
SWRAIDLEVEL | 1 | RAID-1 mirrors all data identically across both drives; if one drive fails, the system continues running from the other |
BOOTLOADER | grub | Installs GRUB on both drives so the system remains bootable even after a single drive failure |
HOSTNAME | pve.yourdomain.com | Must be a fully-qualified domain name (FQDN); Proxmox requires this and will not configure correctly with a bare hostname |
PART /boot/efi esp 512M | — | EFI System Partition — only include this line on UEFI systems |
PART /boot ext4 1G | — | Dedicated boot partition; keeps GRUB and kernel files outside the root filesystem |
PART swap swap 8G | — | Swap partition (see note below) |
PART / ext4 all | — | Root partition using all remaining disk space, formatted as ext4 |
IMAGE | trixie image path | Exact filename found in Step 3 |
A note on swap
Swap is overflow space the kernel uses when physical RAM is fully utilized. Without it, the kernel’s OOM killer will forcibly terminate processes — on a Proxmox host, that can mean a running VM is killed without warning.
On NVMe and SSD drives the performance cost of swap is negligible compared to spinning disks. A value of 8G is a reasonable baseline for most servers. If your server has 64GB or more of RAM and you are confident in your workload’s memory profile, you can remove the swap line entirely — but for most setups keeping it is the safer choice.
Two things I've learned from doing this wrong: don't skip swap just because you have plenty of RAM — a single runaway VM can still trigger the OOM killer at the worst possible moment. And 8G is deliberately conservative; I've seen 64G servers swap under workloads nobody predicted would be memory-hungry. Size it once and forget about it.
Step 5 — Run the Installer
installimage -a -c /tmp/install.conf
The -a flag runs the installer non-interactively. It partitions both drives, assembles the RAID array, extracts the Debian image, installs and configures GRUB on both drives, and writes the hostname. This typically takes 2–5 minutes depending on drive speed.
If any errors are reported, review the install log before proceeding:
cat /tmp/installimage.log
Step 6 — Reboot
reboot
The server boots into the fresh Debian 13 installation. Reconnect via SSH as root using the root password shown at the end of the installer output.
No comments to display
No comments to display