NixOS remote deploys: compilar aqui, activar alla
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@coheteEsto:
- Evalua el flake localmente (aurin)
- Compila todo lo que falta (72 cores, 128GB RAM)
- Copia los paquetes al VPS por SSH (
nix copy) - Ejecuta
switch-to-configuration switchen el VPS - 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:
ssh://- copia via SSH normal. Compatible con cualquier nix. Mas lento.ssh-ng://- protocolo optimizado de Nix. Transfiere solo los paths que faltan. Mucho mas rapido.
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.
Comentarios (0)
Sin comentarios todavia. Se el primero!
Deja un comentario