Skip to content

Deploy a machine

Now that you have created a machines, added some services and setup secrets. This guide will walk through how to deploy it.

Prerequisites

General Requirements

  • RAM > 2GB
  • Two Computers: You need one computer that you're getting ready (we'll call this the Target Computer) and another one to set it up from (we'll call this the Setup Computer). Make sure both can talk to each other over the network using SSH.
  • Machine configuration: See our basic adding and configuring machine guide

Physical Hardware

skip this if using a cloud VM

Steps:

  • Create a NixOS installer image and transfer it to a bootable USB drive as described in the installer.
  • Boot the target machine and connect it to a network that makes it reachable from your setup computer.
  • Note down a reachable ip address (ipv4, ipv6 or tor)

The installer will generate a password and local addresses on boot, then run ssh with these preconfigured. The installer shows it's deployment relevant information in two formats, a text form, as well as a QR code.

Sample boot screen shows:

  • Root password
  • IP address
  • Optional Tor and mDNS details
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                       β”‚
β”‚ β”‚β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ”‚ # This is the QR Code (1)                             β”‚
β”‚ β”‚β–ˆβ–ˆ β–„β–„β–„β–„β–„ β–ˆβ–€β–„β–ˆβ–€β–ˆβ–€β–„β–ˆ β–„β–„β–„β–„β–„ β–ˆβ–ˆβ”‚                                                       β”‚
β”‚ β”‚β–ˆβ–ˆ β–ˆ   β–ˆ β–ˆβ–€β–„β–„β–„β–ˆ β–€β–ˆ β–ˆ   β–ˆ β–ˆβ–ˆβ”‚                                                       β”‚
β”‚ β”‚β–ˆβ–ˆ β–ˆβ–„β–„β–„β–ˆ β–ˆβ–€β–„ β–€β–„β–„β–„β–ˆ β–ˆβ–„β–„β–„β–ˆ β–ˆβ–ˆβ”‚                                                       β”‚
β”‚ β”‚β–ˆβ–ˆβ–„β–„β–„β–„β–„β–„β–„β–ˆβ–„β–€ β–€β–„β–€β–„β–ˆβ–„β–„β–„β–„β–„β–„β–„β–ˆβ–ˆβ”‚                                                       β”‚
β”‚ β”‚β–ˆβ–ˆβ–ˆβ–€β–€β–€ β–ˆβ–„β–„β–ˆ β–€β–„   β–„β–€β–„β–ˆ   β–ˆβ–ˆβ–ˆβ”‚                                                       β”‚
β”‚ β”‚β–ˆβ–ˆβ–„β–ˆβ–ˆβ–„β–„β–ˆβ–„β–„β–€β–€β–ˆβ–ˆβ–„β–€ β–„β–„β–„ β–„β–€β–ˆβ–€β–ˆβ–ˆβ”‚                                                       β”‚
β”‚ β”‚β–ˆβ–ˆ β–„β–„β–„β–„β–„ β–ˆβ–„β–„β–„β–„ β–ˆ β–ˆβ–„β–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆβ”‚                                                       β”‚
β”‚ β”‚β–ˆβ–ˆ β–ˆ   β–ˆ β–ˆ β–ˆ  β–ˆ β–„β–„β–„  β–„β–€β–€ β–ˆβ–ˆβ”‚                                                       β”‚
β”‚ β”‚β–ˆβ–ˆ β–ˆβ–„β–„β–„β–ˆ β–ˆ β–„ β–„    β–„ β–€β–ˆ β–„β–ˆβ–ˆβ–ˆβ”‚                                                       β”‚
β”‚ β”‚β–ˆβ–ˆβ–„β–„β–„β–„β–„β–„β–„β–ˆβ–„β–„β–„β–„β–„β–„β–ˆβ–„β–„β–„β–„β–„β–ˆβ–„β–ˆβ–ˆβ–ˆβ”‚                                                       β”‚
β”‚ β”‚β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ”‚                                                       β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                       β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚Root password: cheesy-capital-unwell  # password (2)                             β”‚ β”‚
β”‚ β”‚Local network addresses:                                                         β”‚ β”‚
β”‚ β”‚enp1s0           UP    192.168.178.169/24 metric 1024 fe80::21e:6ff:fe45:3c92/64 β”‚ β”‚
β”‚ β”‚enp2s0           DOWN                                                            β”‚ β”‚
β”‚ β”‚wlan0            DOWN # connect to wlan (3)                                      β”‚ β”‚
β”‚ β”‚Onion address: 6evxy5yhzytwpnhc2vpscrbti3iktxdhpnf6yim6bbs25p4v6beemzyd.onion    β”‚ β”‚
β”‚ β”‚Multicast DNS: nixos-installer.local                                             β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ Press 'Ctrl-C' for console access                                                   β”‚
β”‚                                                                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  1. This is not an actual QR code, because it is displayed rather poorly on text sites. This would be the actual content of this specific QR code prettified:

    {
        "pass": "cheesy-capital-unwell",
        "tor": "6evxy5yhzytwpnhc2vpscrbti3iktxdhpnf6yim6bbs25p4v6beemzyd.onion",
        "addrs": [
        "2001:9e8:347:ca00:21e:6ff:fe45:3c92"
        ]
    }
    

    To generate the actual QR code, that would be displayed use:

    echo '{"pass":"cheesy-capital-unwell","tor":"6evxy5yhzytwpnhc2vpscrbti3iktxdhpnf6yim6bbs25p4v6beemzyd.onion","addrs":["2001:9e8:347:ca00:21e:6ff:fe45:3c92"]}' | nix run nixpkgs#qrencode -- -s 2 -m 2 -t utf8
    
    2. The root password for the installer medium. This password is autogenerated and meant to be easily typeable. 3. See how to connect to wlan.

Tip

Use KDE Connect for easyily sharing QR codes from phone to desktop

Cloud VMs

skip this if using a physical machine

Clan supports any cloud machine if it is reachable via SSH and supports kexec.

Steps:

  • Go to the configuration panel and note down how to connect to the machine via ssh.

NixOS can cause strange issues when booting in certain cloud environments.

If on Linode: Make sure that the system uses "Direct Disk boot kernel" (found in the configuration panel)

Setting targetHost

In your nix files set the targetHost (reachable ip) that you retrieved in the previous step.

clan.nix
{
  # Ensure this is unique among all clans you want to use.
  meta.name = "my-clan";

  inventory.machines = {
    # Define machines here.
    # The machine name will be used as the hostname.
    jon = {
        deploy.targetHost = "root@192.168.192.4"; # (1)
    };
  };
  # ...
  # elided
}
  1. Use the ip address of your targetMachine that you want to deploy. If using the flash-installer it should display its local ip-address when booted.

Warning

The use of root@ in the target address implies SSH access as the root user. Ensure that the root login is secured and only used when necessary.

See also how to set TargetHost for other methods.

Retrieve the hardware report

By default clan uses nixos-facter which captures detailed information about the machine or virtual environment.

To generate the hardware-report (facter.json) run:

clan machines update-hardware-config <machineName>

Example output:

$ clan machines update-hardware-config jon
[jon] $ nixos-facter
Successfully generated: ./machines/jon/facter.json

See update-hardware-config cli reference for further configuration possibilities if needed.

Configure your disk schema

By default clan uses disko which allows for declarative disk partitioning.

To setup a disk schema for a machine run

clan templates apply disk single-disk jon --set mainDisk ""

Which should fail and give the valid options for the specific hardware:

Invalid value  for placeholder mainDisk - Valid options:
/dev/disk/by-id/nvme-WD_PC_SN740_SDDQNQD-512G-1201_232557804368

Re-run the command with the correct disk:

clan templates apply disk single-disk jon --set mainDisk "/dev/disk/by-id/nvme-WD_PC_SN740_SDDQNQD-512G-1201_232557804368"

Should now be successful

Applied disk template 'single-disk' to machine 'jon'

A disko.nix file should be created in machines/jon You can have a look and customize it if needed.

Tip

For advanced partitioning, see Disko templates or Disko examples.

Danger

Don't change the disko.nix after the machine is installed for the first time.

Changing disko configuration requires wiping and reinstalling the machine.

Unless you really know what you are doing.

Deploy the machine

Finally deployment time! Use one of the following commands to build and deploy the image via SSH onto your machine.

Deployment Commands

Using password auth

clan machines install [MACHINE] --target-host <IP>

Using QR JSON

clan machines install [MACHINE] --json "[JSON]"

Using QR image file

clan machines install [MACHINE] --png [PATH]

Option B: Cloud VM

clan machines install [MACHINE] --target-host <IP>

Success

Your machine is all set up. πŸŽ‰ πŸš€

Post-Deployment: Updating Machines

Updating

Update a single machine:

clan machines update jon

Update all machines:

clan machines update

Build Host Configuration

If a machine is too resource-limited, use another host.

If the machine does not have enough resources to run the NixOS evaluation or build itself, it is also possible to specify a build host.

During an update, the CLI will SSH into the build host and run nixos-rebuild from there.

clan {
    # ...
    machines = {
        "jon" = {
            clan.core.networking.buildHost = "root@<host_or_ip>";
        };
    };
};

Excluding from Automatic Updates

To exclude machines from being updated when running clan machines update without any machines specified, one can set the clan.deployment.requireExplicitUpdate option to true:

clan {
    # ...
    machines = {
        "jon" = {
            clan.deployment.requireExplicitUpdate = true;
        };
    };
};

This is useful for machines that are not always online or are not part of the regular update cycle.