In the previous attempt to add this feature, I had forgotten to add the new tests to tests/default.nix, which meant I believed the feature worked when it did not. Additionally, real world testing shows that if the path does not exist on the remote already, that nix build --store will not work and will throw the following error: 'path '/nix/store/foo' is required, but there is no substituter that can build it' To fix this, I've decided to use nix copy --derivation and then nix-store --realise on the remote. A lot of refactoring is needed to make this codebase presentable anyway, so this hack is fine for now, though it is admittedly an unclean implementation. |
||
---|---|---|
examples | ||
tests | ||
.gitignore | ||
flake.lock | ||
flake.nix | ||
README.md |
Nixinate 🕶️
Nixinate is a proof of concept that generates a deployment script for each
nixosConfiguration
you already have in your flake, which can be ran via nix run
, thanks to the apps
attribute of the flake
schema.
Usage
To add and configure nixinate
in your own flake, you need to:
- Add the result of
nixinate self
to theapps
attribute of your flake. - Add and configure
_module.args.nixinate
to thenixosConfigurations
you want to deploy
Below is a minimal example:
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-21.11";
nixinate.url = "github:matthewcroughan/nixinate";
};
outputs = { self, nixpkgs, nixinate }: {
apps = nixinate.nixinate.x86_64-linux self;
nixosConfigurations = {
myMachine = nixpkgs.lib.nixosSystem {
modules = [
(import ./my-configuration.nix)
{
_module.args.nixinate = {
host = "itchy.scratchy.com";
sshUser = "matthew";
buildOn = "remote"; # valid args are "local" or "remote"
hermetic = false;
};
}
# ... other configuration ...
];
};
};
};
}
Each nixosConfiguration
you have configured should have a deployment script in
apps.nixinate
, visible in nix flake show
like this:
$ nix flake show
git+file:///etc/nixos
├───apps
│ └───nixinate
│ └───myMachine: app
└───nixosConfigurations
└───myMachine: NixOS configuration
To finally execute the deployment script, use nix run .#apps.nixinate.myMachine
Example Run
[root@myMachine:/etc/nixos]# nix run .#apps.nixinate.myMachine
🚀 Deploying nixosConfigurations.myMachine from /nix/store/279p8aaclmng8kc3mdmrmi6q3n76r1i7-source
👤 SSH User: matthew
🌐 SSH Host: itchy.scratchy.com
🚀 Sending flake to myMachine via nix copy:
(matthew@itchy.scratchy.com) Password:
🤞 Activating configuration on myMachine via ssh:
(matthew@itchy.scratchy.com) Password:
[sudo] password for matthew:
building the system configuration...
activating the configuration...
setting up /etc...
reloading user units for matthew...
setting up tmpfiles
Connection to itchy.scratchy.com closed.
Available arguments via _module.args.nixinate
-
host
string
A string representing the hostname or IP address of a machine to connect to via ssh.
-
sshUser
string
A string representing the username a machine to connect to via ssh.
-
buildOn
"remote"
or"local"
-
"remote"
Push the flake to the remote, build and activate entirely remotely, returning logs via SSH.
-
"local"
Build the system closure locally, copy to the remote and activate.
-
-
hermetic
bool
Whether to copy Nix to the remote for usage when building and activating, instead of using the Nix which is already installed on the remote.