Easy NixOS remote deployments

There exists a mutitude of tooling to remotely manage nixos machines, each with its own features and compromises.

In my experience, for a simple deployment of few hosts nixos-rebuild --target-host is pretty powerful.

This is the workflow I’ve been using to manage my personal systems:

I bootstrap the machines manually by following the nixos install guide, and copy over the generated configuration to config/<hostname>/configuration.nix.

On the root directory create flake.nix:

  description = "systems needed";
  inputs = {
     # extra inputs go here

  outputs = { self, nixpkgs }@attrs: {
    # this is where we add new machines
    nixosConfigurations = {
     # host fancyHostname
      fancyHostname = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        specialArgs = attrs;
        modules = [
          # This points to the actual machine configuration
          (import ./config/nixmachine/configuration.nix)

From there, hosts can deployed over SSH!

nixos-rebuild switch  --target-host root@fancyHostname --flake '.#fancyHostname'

More hosts can be added by adding them to the nixosConfigurations attribute set.

nixosConfigurations = {
    fancySecondHost = { ... }

Should I do this?

I think this is an easier workflow for me to manage and debug, However a lot of things in this space has non-linear learning curves and has sparse documentation at best.

So maybe a tool with better documentation might work well for you?

This also relies heavily on flakes, which is “experimental”. In my experience, ground reality is everyone uses flakes, but good documentation is hard to come by

I’ve herd good things about Nix Flakes Book, but haven’t read it

This was first published at https://pencil.lalalala.in/dbalan/easy-nixos-remote-deployments