Skip to content

Clan with flake-parts

Clan supports integration with flake.parts a tool which allows composing nixos modules in a modular way.

Here's how to set up Clan using nix flakes and flake-parts.

1. Update Your Flake Inputs

To begin, you'll need to add flake-parts as a new dependency in your flake's inputs. This is alongside the already existing dependencies, such as clan-core and nixpkgs. Here's how you can update your flake.nix file:

# flake.nix
inputs = {
  nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";

  # New flake-parts input
  flake-parts.url = "github:hercules-ci/flake-parts";
  flake-parts.inputs.nixpkgs-lib.follows = "nixpkgs";

  clan-core = {
    url = "git+https://git.clan.lol/clan/clan-core";
    inputs.nixpkgs.follows = "nixpkgs"; # Needed if your configuration uses nixpkgs unstable.
    # New
    inputs.flake-parts.follows = "flake-parts";
  };
}

2. Import Clan-Core Flake Module

After updating your flake inputs, the next step is to import the clan-core flake module. This will make the clan options available within mkFlake.

  outputs =
    inputs@{ flake-parts, ... }:
    flake-parts.lib.mkFlake { inherit inputs; } (
      {
        # 
        imports = [
          inputs.clan-core.flakeModules.default
        ];
      }
    );

3. Configure Clan Settings and Define Machines

Configure your clan settings and define machine configurations.

Below is a guide on how to structure this in your flake.nix:

  outputs = inputs@{ flake-parts, clan-core, ... }:
    flake-parts.lib.mkFlake { inherit inputs; } ({self, pkgs, ...}: {
      # We define our own systems below. you can still use this to add system specific outputs to your flake.
      # See: https://flake.parts/getting-started
      systems = [];

      # import clan-core modules
      imports = [
        clan-core.flakeModules.default
      ];
      # Define your clan
      clan = {
        # Clan wide settings. (Required)
        clanName = ""; # Ensure to choose a unique name.

        machines = {
          jon = {
            imports = [
              ./machines/jon/configuration.nix
              ./modules/disko.nix
              # ... more modules
            ];
            nixpkgs.hostPlatform = "x86_64-linux";

            # Set this for clan commands use ssh i.e. `clan machines update`
            clan.networking.targetHost = pkgs.lib.mkDefault "root@jon";

            # remote> lsblk --output NAME,ID-LINK,FSTYPE,SIZE,MOUNTPOINT
            disko.devices.disk.main = {
              device = "/dev/disk/by-id/nvme-eui.e8238fa6bf530001001b448b4aec2929";
            };

            # There needs to be exactly one controller per clan
            clan.networking.zerotier.controller.enable = true;

          };
        };
      };
    });

For detailed information about configuring flake-parts and the available options within Clan, refer to the Clan module documentation located here.

Whats next?