NixOS en Hetzner Cloud: guia completa con las 8 trampas que nos mordieron


20 de marzo de 2026

Esta guia documenta como instalamos NixOS en un VPS de Hetzner Cloud usando nixos-anywhere. No es una guia idealizada – es lo que realmente paso, con todos los errores y sus soluciones.

Herramientas

Las 8 trampas de Hetzner + NixOS

1. UEFI, no BIOS

Hetzner Cloud usa firmware UEFI. Si pones grub.devices, arranca en UEFI Shell. Usa systemd-boot:

boot.loader.systemd-boot.enable = lib.mkForce true;
boot.loader.grub.enable = lib.mkForce false;
boot.loader.efi.canTouchEfiVariables = true;

2. IP /32 con gateway fantasma

Hetzner asigna IPs con mascara /32 y un gateway (172.31.1.1) que NO esta en tu subred. DHCP no funciona. Necesitas config estatica con ruta explicita al gateway:

networking.useDHCP = false;
networking.interfaces.eth0.ipv4.addresses = [{
  address = "TU_IP";
  prefixLength = 32;
}];
networking.interfaces.eth0.ipv4.routes = [{
  address = "172.31.1.1";
  prefixLength = 32;
}];
networking.defaultGateway = {
  address = "172.31.1.1";
  interface = "eth0";
};

3. Nombres de interfaz

NixOS usa nombres predictivos (enp0s3) pero tu config dice eth0. Desactiva:

networking.usePredictableInterfaceNames = false;

4. networkd vs scripted

No mezcles. Si tu flake base usa networking clasico, fuerza:

networking.useNetworkd = lib.mkForce false;

5. Particion EFI en disko

UEFI necesita ESP (EF00), no BIOS boot (EF02):

ESP = {
  size = "512M";
  type = "EF00";
  content = { type = "filesystem"; format = "vfat"; mountpoint = "/boot"; };
};

6. OOM compilando en el VPS

4GB de RAM no dan para compilar NixOS con desktop. NO uses --build-on-remote. Deja que nixos-anywhere builde en tu maquina local y copie el resultado.

7. CrowdSec sin credentials

Si tu base incluye CrowdSec, falla en una instalacion nueva. Desactivalo:

services.crowdsec.enable = lib.mkForce false;
services.crowdsec-firewall-bouncer.enable = lib.mkForce false;

8. Sin password = sin acceso

mutableUsers = true (default) no sobreescribe /etc/shadow despues de la primera instalacion. Si no configuraste password antes de instalar, entra por rescue mode y setealo directamente:

mount /dev/sda2 /mnt
HASH=$(python3 -c "import crypt; print(crypt.crypt('tupass', crypt.mksalt(crypt.METHOD_SHA512)))")
sed -i "s|^root:[^:]*:|root:$HASH:|" /mnt/etc/shadow

El comando magico

nix-shell -p nixos-anywhere --run \
  'nixos-anywhere --flake .#mi-host root@MI_IP'

Esto: sube kexec, reinicia en instalador, particiona con disko, builda local, copia closure, instala bootloader, reinicia. Un comando.

Actualizaciones via rescue

Si pierdes acceso SSH:

# Build local
nix build .#nixosConfigurations.mi-host.config.system.build.toplevel
NUEVA=$(nix path-info .#nixosConfigurations.mi-host.config.system.build.toplevel)

# Boot rescue, instalar nix, montar, copiar, setear profile
mount /dev/sda2 /mnt && mount /dev/sda1 /mnt/boot
nix copy --to "ssh://root@IP?remote-store=local%3Froot=%2Fmnt" $NUEVA
nix-env --store /mnt -p /mnt/nix/var/nix/profiles/system --set $NUEVA
NIXOS_INSTALL_BOOTLOADER=1 chroot /mnt /nix/var/nix/profiles/system/bin/switch-to-configuration boot

Resultado

NixOS corriendo en Hetzner Cloud. Blog con 90 posts, WebSocket chat, MCP para agentes de IA. Todo desde un VPS que es un clon mas de nuestro flake.

La proxima vez con esta guia: 30 minutos en vez de dos dias.

Comparte este post:

Es tu post

Estas seguro? Esto no se puede deshacer.

Comentarios (0)

Sin comentarios todavia. Se el primero!

Deja un comentario