NixOS remote deploys: compilar aqui, activar alla


3 de abril de 2026

Tenemos un VPS en Hetzner (Nuremberg) con 4GB de RAM. Compilar NixOS ahi tarda una eternidad y puede hacer OOM. Tenemos aurin en casa con 72 cores Xeon y 128GB de RAM. La solucion es obvia: compilar en aurin, activar en el VPS.

Las tres formas de hacerlo

Forma 1: El atajo (nixos-rebuild –target-host)

Un solo comando que hace todo:

cd ~/dotfiles
sudo nixos-rebuild switch --flake .#cohete --target-host root@cohete

Esto:

  1. Evalua el flake localmente (aurin)
  2. Compila todo lo que falta (72 cores, 128GB RAM)
  3. Copia los paquetes al VPS por SSH (nix copy)
  4. Ejecuta switch-to-configuration switch en el VPS
  5. La nueva generacion se activa

Es la forma mas limpia. Un comando, cero intervencion manual. Requiere que aurin tenga SSH con clave al VPS (ssh root@cohete sin password).

Forma 2: Manual en 3 pasos

Si quieres control total o el --target-host falla:

# Paso 1: Compilar en aurin
cd ~/dotfiles
nix build .#nixosConfigurations.cohete.config.system.build.toplevel

# Paso 2: Copiar al VPS
nix copy --to ssh://root@cohete $(readlink result)

# Paso 3: Activar en el VPS
ssh root@cohete "$(readlink result)/bin/switch-to-configuration switch"

Misma mecanica pero paso a paso. Util para diagnosticar si algo falla en un paso concreto.

Forma 3: Para la Raspberry Pi (cross-compilacion)

Si el destino es ARM (Pi 3 aarch64) y el origen es x8664:

# Requiere binfmt en aurin:
# boot.binfmt.emulatedSystems = [ "aarch64-linux" ];

cd ~/dotfiles
nix build .#nixosConfigurations.retropix.config.system.build.toplevel

# Firmar (la Pi solo acepta paquetes firmados)
sudo nix store sign --key-file /etc/nix/signing-key.sec -r $(readlink result)

# Copiar
nix copy --to ssh-ng://[email protected] $(readlink result)

# Activar
ssh [email protected] "$(readlink result)/bin/switch-to-configuration switch"

Esto usa QEMU para cross-compilar aarch64 en x8664. Es lento (un kernel tarda horas) pero funciona.

Por que no compilar en el VPS directamente?

Numeros reales:

Maquina Cores RAM Tiempo de rebuild tipico
Aurin (Dual Xeon) 72 128GB 2-5 minutos
Cohete VPS (shared) 3 4GB 15-45 minutos
Retropix Pi 3 4 ARM 1GB Imposible (OOM)

El VPS de Hetzner CPX22 tiene 3 cores compartidos y 4GB de RAM. Un nixos-rebuild con un flake update puede hacer OOM facilmente. Compilar en aurin y copiar es mas rapido, mas fiable, y no afecta al rendimiento del VPS durante el deploy.

El truco: ssh-ng:// vs ssh://

Para copiar paquetes al nix store remoto, hay dos protocolos:

Para VPS con buena conectividad: ssh:// va bien. Para la Pi por LAN lenta: ssh-ng:// ahorra mucho ancho de banda.

Firmar paquetes (para la Pi)

Si el destino tiene require-sigs = true (por defecto), necesita que los paquetes esten firmados por una clave de confianza:

# En aurin (una vez): generar clave
sudo nix-store --generate-binary-cache-key aurin-1 \
  /etc/nix/signing-key.sec /etc/nix/signing-key.pub

# En el destino: confiar la clave
nix.settings.trusted-public-keys = [
  "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
  "aurin-1:q1/yLntnfrg43hE2q7dww3+f4XEwrSl3ftxLotXY1L0="
];

Para el VPS no hace falta si deployamos como root (tiene acceso directo al store).

Nuestro setup

Aurin (campo)                     Cohete VPS (Nuremberg)
72 cores, 128GB                   3 cores, 4GB
============                      ============

nix build .#cohete                     |
     |                                 |
     +-- compila todo localmente       |
     |                                 |
     v                                 |
nix copy --to ssh://root@cohete       |
     |                                 |
     +--- transfiere paquetes -------->|
     |                                 |
     v                                 v
ssh root@cohete switch         switch-to-configuration
     |                                 |
     v                                 v
DONE                             Nueva generacion activa

5 maquinas, una sola workstation que compila. Aurin es el build server de todo el sistema. NixOS hace que esto sea trivial: el mismo flake, diferentes hosts, un solo punto de compilacion.

sudo nixos-rebuild switch --flake .#cohete --target-host root@cohete y a otra cosa.

Comparte este post:

Es tu post

Estas seguro? Esto no se puede deshacer.

Comentarios (0)

Sin comentarios todavia. Se el primero!

Deja un comentario