79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | layout: post | ||
|  | title: "Easy NixOS remote deployments" | ||
|  | date: 2023-11-14 | ||
|  | comments: true | ||
|  | tags: nixos, nix, flakes | ||
|  | --- | ||
|  | 
 | ||
|  | There exists a [mutitude](https://github.com/NixOS/nixops) | ||
|  | [of](https://github.com/DBCDK/morph) [tooling](https://github.com/krebs/krops) | ||
|  | 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](https://nixos.org/manual/nixos/stable/#sec-installation), and copy over | ||
|  | the generated configuration to `config/<hostname>/configuration.nix`. | ||
|  | 
 | ||
|  | On the root directory create `flake.nix`: | ||
|  | 
 | ||
|  | ```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](https://nixos-and-flakes.thiscute.world/), but | ||
|  | haven't read it | ||
|  | 
 | ||
|  | *This was first published at <https://pencil.lalalala.in/dbalan/easy-nixos-remote-deployments>* |