Skip to main content

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:

ParameterExample valueWhat it does
DRIVE1/dev/nvme0n1First drive, identified in Step 1
DRIVE2/dev/nvme1n1Second drive — both are mirrored
SWRAID1Enables Linux software RAID via mdadm
SWRAIDLEVEL1RAID-1 mirrors all data identically across both drives; if one drive fails, the system continues running from the other
BOOTLOADERgrubInstalls GRUB on both drives so the system remains bootable even after a single drive failure
HOSTNAMEpve.yourdomain.comMust be a fully-qualified domain name (FQDN); Proxmox requires this and will not configure correctly with a bare hostname
PART /boot/efi esp 512MEFI System Partition — only include this line on UEFI systems
PART /boot ext4 1GDedicated boot partition; keeps GRUB and kernel files outside the root filesystem
PART swap swap 8GSwap partition (see note below)
PART / ext4 allRoot partition using all remaining disk space, formatted as ext4
IMAGEtrixie image pathExact 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.