HowTo install Debian on the Storage Node¶
Installation¶
Install Debian using the standard (non-minimal) ISO image. During installation:
- Select the target boot disk (e.g. the NVMe drive, not the data drives)
- When prompted, create a temporary user (Debian requires this; it can be removed later)
- Choose "automated network configuration" (will be changed to static IP post-install)
Minimal images
If you are using a Debian minimal/netinst image, you will need to install additional packages manually before proceeding with Ansible provisioning:
The standard ISO includes these by default.
Post-Install¶
Configure Network¶
If you have selected "automated network configuration" during installation process, you will need to update the network interface(s) to your desired settings to configure static IPs. To do so, modify the file located at /etc/network/interfaces with the following changes:
-allow-hotplug enp2s0
-iface enp2s0 inet dhcp
+auto enp2s0
+iface enp2s0 inet static
+ address 10.10.10.30/24
+ gateway 10.10.10.1
Repeat the same for all interfaces you want to use.
After that, restart the network interface(s) with ifdown enp2s0 followed by ifup enp2s0.
Info
See more details in the official Network Configuration documentation.
APT Sources¶
If you didn't configure additional apt sources during installation, you may want to configure those now.
Add debian.sources file under /etc/apt/sources.list.d directory with the following contents:
Types: deb
URIs: http://deb.debian.org/debian
Suites: trixie trixie-updates
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://deb.debian.org/debian-security
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Info
See more details in the official SourcesList documentation, or use man sources.list
SSH Access¶
- Add your ssh public key to
/root/.ssh/authorized_keys - Make sure you have the following line
AuthorizedKeysFile .ssh/authorized_keysin/etc/ssh/ssh_configfile - Then restart ssh service with
systemctl restart sshand check that it has "active (running)" status withsystemctl status ssh
Tip
The Ansible inventory expects to connect as root using the ~/.ssh/homelab_id_ed25519 key. Copy the public key from your controller machine:
If ssh-copy-id is not available, copy the key manually:
Enable Root SSH Login¶
Debian disables root login via password by default, but allows key-based authentication. Verify that /etc/ssh/sshd_config contains:
If it is set to no, change it to prohibit-password and restart SSH:
Remove the temporary user¶
Debian does not allow to skip user creation step during installation process. If you don't plan to use that user, or just made a temporary user to "skip" that installation step, remember to remove the user with deluser 'temp' --remove-all-files, where temp is the username you specified during installation process.
Ansible Pre-requisites Checklist¶
Before running the storage playbook (ansible-playbook -i inventory.sh storage.yml), verify the following on the storage node:
- Static IP configured (
10.10.10.30onenp2s0) - Node is reachable from the controller:
ping 10.10.10.30 - SSH key-based root login works:
ssh -i ~/.ssh/homelab_id_ed25519 root@10.10.10.30 - APT sources configured (for package installation)
- Data drives are physically installed and visible:
lsblkshows the expected disks - Data drives are partitioned (partition IDs match the inventory in
metal/inventory/metal.yml) - Controller is reachable from the homelab network (see firewall warning below)
Firewall: SSH lockout risk
The storage playbook configures UFW with a default deny incoming policy. Only networks listed in firewall_allowed_networks (defaults to 10.10.10.0/24) are allowed SSH and NFS access. If your Ansible controller is on a different subnet (e.g. 192.168.1.0/24), UFW will block SSH and you will be locked out of the storage node.
To avoid this, either:
- Run the playbook from a machine on the
10.10.10.0/24network, or -
Add your controller's subnet to
firewall_allowed_networkswhen running the playbook: