NixOS en Hetzner Cloud: guia completa con las 8 trampas que nos mordieron
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
- nixos-anywhere: instala NixOS en cualquier servidor Linux via SSH
- disko: particionado declarativo
- Un flake NixOS con arquitectura clone-first
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/shadowEl 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 bootResultado
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.
Comentarios (0)
Sin comentarios todavia. Se el primero!
Deja un comentario