diff --git a/hetzner/hetzner-setup.md b/hetzner/hetzner-setup.md index f6d7b88..784535d 100644 --- a/hetzner/hetzner-setup.md +++ b/hetzner/hetzner-setup.md @@ -25,48 +25,213 @@ servers). Note the assigned IP address and temporary root password. ## 2. Proxmox installation -Hetzner provides two installation paths: +We use the official Proxmox VE ISO installer running inside QEMU from +the Hetzner rescue system. This gives the full graphical installer with +ZFS support, which is not available via Hetzner's `installimage`. The +method is documented in the +[Hetzner community tutorial](https://community.hetzner.com/tutorials/install-and-configure-proxmox_ve). -### Option A: installimage (recommended) +### 2.1 Boot the rescue system -Boot the rescue system from the Hetzner Robot panel, then SSH in: +In the Hetzner Robot panel, activate the rescue system (Linux 64-bit) +and reboot the server. Then SSH in: ```bash ssh root@ -installimage ``` -Select Proxmox VE from the list. The installer presents an editor for -disk configuration -- set up ZFS RAID1 mirror on two system disks: +### 2.2 Discover disks -``` -SWRAID 0 -SWRAIDLEVEL 1 -PART /boot ext4 1G -PART lvm pve all -LV pve root ext4 100G -LV pve swap swap 16G -``` - -Reboot after installation completes. - -### Option B: ISO install - -Upload the Proxmox VE ISO via Robot panel → Server → ISO Images, then -boot from it. Follow the standard Proxmox installer. This gives more -control over partitioning but requires KVM console access. - -### Verify +Identify which disks the server has: ```bash -ssh root@ -pvesh get /version +lsblk -d -o NAME,SIZE,MODEL,ROTA,TYPE +``` + +Example output on a typical auction server with 2 NVMe drives: + +``` +NAME SIZE MODEL ROTA TYPE +nvme0n1 477G Samsung SSD 970 EVO 0 disk +nvme1n1 477G Samsung SSD 970 EVO 0 disk +``` + +For ZFS RAID1 (mirror), you want two matching disks. NVMe pairs are the +strong favourite -- fast and reliable. Note the device names (`/dev/nvme0n1`, +`/dev/nvme1n1`) for the QEMU command. + +If you have additional disks beyond the pair (e.g. large SATA drives), +those can be set up as a separate storage pool later (section 6). Only +pass the system disks to QEMU for now. + +### 2.3 Check BIOS mode + +Determine whether the server boots in UEFI or legacy BIOS mode: + +```bash +[ -d "/sys/firmware/efi" ] && echo "UEFI" || echo "BIOS" +``` + +Most modern Hetzner servers are UEFI. The QEMU command below includes +the OVMF BIOS line for UEFI -- remove it if your server reports BIOS. + +### 2.4 Download the Proxmox ISO + +Get the latest Proxmox VE ISO from the official download page: + +```bash +wget https://enterprise.proxmox.com/iso/proxmox-ve_9.0-1.iso +``` + +Check [proxmox.com/en/downloads](https://www.proxmox.com/en/downloads) +for the current version and adjust the URL accordingly. + +### 2.5 Set up SSH port forwarding for VNC + +On your **workstation** (not the server), open an SSH tunnel forwarding +the VNC port: + +```bash +ssh -L 5900:localhost:5900 root@ +``` + +This forwards local port 5900 to the server's localhost:5900, where +QEMU will expose its VNC display. Keep this session open. + +### 2.6 Start the QEMU installer + +In the SSH session on the server, start QEMU with the ISO and the disks +you identified in step 2.2: + +```bash +qemu-system-x86_64 \ + -enable-kvm \ + -cpu host \ + -m 16G \ + -boot d \ + -cdrom ./proxmox-ve_9.0-1.iso \ + -drive file=/dev/nvme0n1,format=raw,if=virtio \ + -drive file=/dev/nvme1n1,format=raw,if=virtio \ + -bios /usr/share/OVMF/OVMF_CODE.fd \ + -vnc 127.0.0.1:0 +``` + +**Notes:** +- Remove the `-bios /usr/share/OVMF/OVMF_CODE.fd \` line for legacy + BIOS servers (step 2.3). +- For SATA drives, use `/dev/sda`, `/dev/sdb` instead of `/dev/nvmeXn1`. +- Disks appear as `/dev/vdX` inside the VM because of the virtio interface + -- this is normal and expected. +- The `-vnc 127.0.0.1:0` flag binds VNC to localhost only (safe, no + password needed since it's behind the SSH tunnel). + +### 2.7 Connect via VNC and install + +Open a VNC client on your workstation and connect to `127.0.0.1:5900` +(or just `127.0.0.1` -- most clients default to port 5900). + +The Proxmox graphical installer appears. Walk through it: + +1. Accept the EULA. +2. **Target disk**: Select the ZFS RAID1 (mirror) option across both + drives (`/dev/vda` and `/dev/vdb` in the VM -- these are your NVMe + drives passed through via virtio). +3. **Country/timezone/keyboard**: Set as appropriate. +4. **Root password and email**: Set a strong root password. This becomes + `HETZNER_PROXMOX_ROOT_PASSWORD` in your `env` file. +5. **Network**: The installer shows a virtualized NIC. Configure it with + the server's public IP, gateway, and hostname. This will be corrected + in the next step since the real NIC name differs. +6. Click **Install** and wait for completion. + +The VNC client may disconnect briefly during install -- just reconnect +to `127.0.0.1:5900`. + +### 2.8 Predict the real network interface name + +After installation completes, stop QEMU with `Ctrl+C` in the SSH +terminal. **Do not reboot yet** -- the network interface name configured +by the installer is wrong (it matches the virtual NIC, not the real one). + +Use the Hetzner `predict-check` tool to discover the real interface name: + +```bash +predict-check +``` + +Example output: + +``` +eth0 -> enp0s31f6 +``` + +Note the predicted name (e.g. `enp0s31f6`). You can also check the +current rescue interface for reference: + +```bash +netdata +``` + +### 2.9 Fix the network config before first real boot + +Boot Proxmox again in QEMU, **without** the ISO (no `-cdrom` flag): + +```bash +qemu-system-x86_64 \ + -enable-kvm \ + -cpu host \ + -m 16G \ + -boot d \ + -drive file=/dev/nvme0n1,format=raw,if=virtio \ + -drive file=/dev/nvme1n1,format=raw,if=virtio \ + -bios /usr/share/OVMF/OVMF_CODE.fd \ + -vnc 127.0.0.1:0 +``` + +Connect via VNC, log in as root, and edit the network configuration: + +```bash +nano /etc/network/interfaces +``` + +Replace the virtual interface name (e.g. `ens18`) with the predicted +real name (e.g. `enp0s31f6`). A minimal working config: + +``` +auto lo +iface lo inet loopback + +auto enp0s31f6 +iface enp0s31f6 inet static + address /32 + gateway +``` + +Save and shut down the VM (`shutdown -h now` inside the VNC session, +or `Ctrl+C` in the SSH terminal). + +### 2.10 Reboot into Proxmox + +Exit the rescue system and reboot the server from the Hetzner Robot +panel (or just `reboot` from SSH). The server now boots from disk +into Proxmox with the correct network configuration. + +### 2.11 Verify + +```bash +ssh root@ pvesh get /version # Should show Proxmox VE version and API info ``` The web UI is available at `https://:8006` (we'll lock this down to WireGuard-only in section 9). +> **Alternative method**: You can also install Debian 13 via Hetzner's +> `installimage` and then upgrade to Proxmox following the +> [official guide](https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_13_Trixie). +> This skips the QEMU/VNC process but does not offer ZFS-on-root from +> the installer. + --- ## 3. Network configuration