Merge pull request 'Update clan templates' (#4099) from update-templates-services into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/4099
This commit is contained in:
@@ -93,7 +93,7 @@ def test_clan_core_templates(
|
|||||||
]
|
]
|
||||||
clan_core_template_keys = list(clan_core_templates.keys())
|
clan_core_template_keys = list(clan_core_templates.keys())
|
||||||
|
|
||||||
expected_templates = ["default", "flake-parts", "minimal", "minimal-flake-parts"]
|
expected_templates = ["classic", "default", "minimal"]
|
||||||
assert clan_core_template_keys == expected_templates
|
assert clan_core_template_keys == expected_templates
|
||||||
|
|
||||||
vlist_temps = list_templates("clan", clan_dir)
|
vlist_temps = list_templates("clan", clan_dir)
|
||||||
@@ -112,17 +112,16 @@ def test_clan_core_templates(
|
|||||||
Path(default_template.src["path"]),
|
Path(default_template.src["path"]),
|
||||||
new_clan,
|
new_clan,
|
||||||
)
|
)
|
||||||
assert (new_clan / "flake.nix").exists()
|
flake_file = new_clan / "flake.nix"
|
||||||
assert (new_clan / "machines").is_dir()
|
|
||||||
assert (new_clan / "machines" / "jon").is_dir()
|
|
||||||
config_nix_p = new_clan / "machines" / "jon" / "configuration.nix"
|
|
||||||
assert (config_nix_p).is_file()
|
|
||||||
|
|
||||||
# Test if we can write to the configuration.nix file
|
assert (flake_file).exists()
|
||||||
with config_nix_p.open("r+") as f:
|
# Test if we can read + write files after the template was copied
|
||||||
|
with flake_file.open("r+") as f:
|
||||||
data = f.read()
|
data = f.read()
|
||||||
f.write(data)
|
f.write(data)
|
||||||
|
|
||||||
|
assert (new_clan / "machines").is_dir()
|
||||||
|
|
||||||
|
|
||||||
# Test Case 1: Minimal input with empty templates
|
# Test Case 1: Minimal input with empty templates
|
||||||
@pytest.mark.with_core
|
@pytest.mark.with_core
|
||||||
|
|||||||
@@ -23,8 +23,7 @@ def test_create_flake(
|
|||||||
|
|
||||||
cli.run(["flakes", "create", str(flake_dir), "--template=default", "--no-update"])
|
cli.run(["flakes", "create", str(flake_dir), "--template=default", "--no-update"])
|
||||||
|
|
||||||
assert (flake_dir / ".clan-flake").exists()
|
# Replace the inputs.clan-core.url in the template flake.nix
|
||||||
# Replace the inputs.clan.url in the template flake.nix
|
|
||||||
substitute(
|
substitute(
|
||||||
flake_dir / "flake.nix",
|
flake_dir / "flake.nix",
|
||||||
clan_core,
|
clan_core,
|
||||||
@@ -35,13 +34,6 @@ def test_create_flake(
|
|||||||
|
|
||||||
cli.run(["machines", "create", "machine1"])
|
cli.run(["machines", "create", "machine1"])
|
||||||
|
|
||||||
# create a hardware-configuration.nix that doesn't throw an eval error
|
|
||||||
|
|
||||||
for patch_machine in ["jon", "sara"]:
|
|
||||||
(
|
|
||||||
flake_dir / "machines" / f"{patch_machine}/hardware-configuration.nix"
|
|
||||||
).write_text("{}")
|
|
||||||
|
|
||||||
with capture_output as output:
|
with capture_output as output:
|
||||||
cli.run(["machines", "list"])
|
cli.run(["machines", "list"])
|
||||||
assert "machine1" in output.out
|
assert "machine1" in output.out
|
||||||
@@ -68,8 +60,7 @@ def test_create_flake_existing_git(
|
|||||||
|
|
||||||
cli.run(["flakes", "create", str(flake_dir), "--template=default", "--no-update"])
|
cli.run(["flakes", "create", str(flake_dir), "--template=default", "--no-update"])
|
||||||
|
|
||||||
assert (flake_dir / ".clan-flake").exists()
|
# Replace the inputs.clan-core.url in the template flake.nix
|
||||||
# Replace the inputs.clan.url in the template flake.nix
|
|
||||||
substitute(
|
substitute(
|
||||||
flake_dir / "flake.nix",
|
flake_dir / "flake.nix",
|
||||||
clan_core,
|
clan_core,
|
||||||
@@ -79,13 +70,6 @@ def test_create_flake_existing_git(
|
|||||||
monkeypatch.chdir(flake_dir)
|
monkeypatch.chdir(flake_dir)
|
||||||
cli.run(["machines", "create", "machine1"])
|
cli.run(["machines", "create", "machine1"])
|
||||||
|
|
||||||
# create a hardware-configuration.nix that doesn't throw an eval error
|
|
||||||
|
|
||||||
for patch_machine in ["jon", "sara"]:
|
|
||||||
(
|
|
||||||
flake_dir / "machines" / f"{patch_machine}/hardware-configuration.nix"
|
|
||||||
).write_text("{}")
|
|
||||||
|
|
||||||
with capture_output as output:
|
with capture_output as output:
|
||||||
cli.run(["machines", "list"])
|
cli.run(["machines", "list"])
|
||||||
assert "machine1" in output.out
|
assert "machine1" in output.out
|
||||||
@@ -111,7 +95,7 @@ def test_ui_template(
|
|||||||
|
|
||||||
cli.run(["flakes", "create", str(flake_dir), "--template=minimal", "--no-update"])
|
cli.run(["flakes", "create", str(flake_dir), "--template=minimal", "--no-update"])
|
||||||
|
|
||||||
# Replace the inputs.clan.url in the template flake.nix
|
# Replace the inputs.clan-core.url in the template flake.nix
|
||||||
substitute(
|
substitute(
|
||||||
flake_dir / "flake.nix",
|
flake_dir / "flake.nix",
|
||||||
clan_core,
|
clan_core,
|
||||||
|
|||||||
80
templates/clan/classic/flake.nix
Normal file
80
templates/clan/classic/flake.nix
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
{
|
||||||
|
inputs.clan-core.url = "https://git.clan.lol/clan/clan-core/archive/main.tar.gz";
|
||||||
|
inputs.nixpkgs.follows = "clan-core/nixpkgs";
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{ self, clan-core, ... }:
|
||||||
|
let
|
||||||
|
# Usage see: https://docs.clan.lol
|
||||||
|
clan = clan-core.clanLib.buildClan {
|
||||||
|
inherit self;
|
||||||
|
|
||||||
|
# Ensure this is unique among all clans you want to use.
|
||||||
|
meta.name = "__CHANGE_ME__";
|
||||||
|
|
||||||
|
# Information about your machines. Machines under ./machines will be auto-imported.
|
||||||
|
inventory.machines = {
|
||||||
|
somemachine.tags = [ "desktop" ];
|
||||||
|
somemachine.deploy.targetHost = "root@somemachine";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Clan services to use. See https://docs.clan.lol/reference/clanServices
|
||||||
|
inventory.instances = {
|
||||||
|
|
||||||
|
admin = {
|
||||||
|
module = {
|
||||||
|
name = "admin";
|
||||||
|
input = "clan";
|
||||||
|
};
|
||||||
|
roles.default.tags.all = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
zerotier = {
|
||||||
|
module = {
|
||||||
|
name = "zerotier";
|
||||||
|
input = "clan";
|
||||||
|
};
|
||||||
|
roles.peer.tags.all = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# A mapping of machine names to their nixos configuration. Allows specifying
|
||||||
|
# additional configuration.
|
||||||
|
machines = {
|
||||||
|
somemachine =
|
||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
environment.systemPackages = with pkgs; [ asciinema ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
# Expose clan structures as flake outputs. clanInternals is needed for
|
||||||
|
# the clan-cli. Exposing nixosConfigurations allows using `nixos-rebuild` as before.
|
||||||
|
inherit (clan)
|
||||||
|
nixosConfigurations
|
||||||
|
nixosModules
|
||||||
|
clanInternals
|
||||||
|
darwinConfigurations
|
||||||
|
darwinModules
|
||||||
|
;
|
||||||
|
|
||||||
|
# Add the Clan cli tool to the dev shell.
|
||||||
|
# Use "nix develop" to enter the dev shell.
|
||||||
|
devShells =
|
||||||
|
clan-core.inputs.nixpkgs.lib.genAttrs
|
||||||
|
[
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
"aarch64-darwin"
|
||||||
|
"x86_64-darwin"
|
||||||
|
]
|
||||||
|
(system: {
|
||||||
|
default = clan-core.inputs.nixpkgs.legacyPackages.${system}.mkShell {
|
||||||
|
packages = [ clan-core.packages.${system}.clan-cli ];
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
0
templates/clan/classic/machines/.gitkeep
Normal file
0
templates/clan/classic/machines/.gitkeep
Normal file
65
templates/clan/default/flake.nix
Normal file
65
templates/clan/default/flake.nix
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
inputs.clan-core.url = "https://git.clan.lol/clan/clan-core/archive/main.tar.gz";
|
||||||
|
inputs.nixpkgs.follows = "clan-core/nixpkgs";
|
||||||
|
inputs.flake-parts.follows = "clan-core/flake-parts";
|
||||||
|
inputs.flake-parts.inputs.nixpkgs-lib.follows = "clan-core/nixpkgs";
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
inputs@{ flake-parts, ... }:
|
||||||
|
flake-parts.lib.mkFlake { inherit inputs; } {
|
||||||
|
systems = [
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
"x86_64-darwin"
|
||||||
|
"aarch64-darwin"
|
||||||
|
];
|
||||||
|
imports = [ inputs.clan-core.flakeModules.default ];
|
||||||
|
# https://docs.clan.lol/guides/getting-started/flake-parts/
|
||||||
|
clan = {
|
||||||
|
|
||||||
|
# Ensure this is unique among all clans you want to use.
|
||||||
|
meta.name = "__CHANGE_ME__";
|
||||||
|
|
||||||
|
# Information about your machines. Machines under ./machines will be auto-imported.
|
||||||
|
inventory.machines = {
|
||||||
|
somemachine.tags = [ "desktop" ];
|
||||||
|
somemachine.deploy.targetHost = "root@somemachine";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Clan services to use. See https://docs.clan.lol/reference/clanServices
|
||||||
|
inventory.instances = {
|
||||||
|
|
||||||
|
admin = {
|
||||||
|
module = {
|
||||||
|
name = "admin";
|
||||||
|
input = "clan";
|
||||||
|
};
|
||||||
|
roles.default.tags.all = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
zerotier = {
|
||||||
|
module = {
|
||||||
|
name = "zerotier";
|
||||||
|
input = "clan";
|
||||||
|
};
|
||||||
|
roles.peer.tags.all = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# A mapping of machine names to their nixos configuration. Allows specifying
|
||||||
|
# additional configuration.
|
||||||
|
machines = {
|
||||||
|
somemachine =
|
||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
environment.systemPackages = with pkgs; [ asciinema ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
perSystem =
|
||||||
|
{ pkgs, inputs', ... }:
|
||||||
|
{
|
||||||
|
devShells.default = pkgs.mkShell { packages = [ inputs'.clan-core.packages.clan-cli ]; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
0
templates/clan/default/machines/.gitkeep
Normal file
0
templates/clan/default/machines/.gitkeep
Normal file
@@ -1,108 +0,0 @@
|
|||||||
{
|
|
||||||
inputs.clan-core.url = "https://git.clan.lol/clan/clan-core/archive/main.tar.gz";
|
|
||||||
inputs.nixpkgs.follows = "clan-core/nixpkgs";
|
|
||||||
inputs.flake-parts.url = "github:hercules-ci/flake-parts";
|
|
||||||
inputs.flake-parts.inputs.nixpkgs-lib.follows = "clan-core/nixpkgs";
|
|
||||||
|
|
||||||
outputs =
|
|
||||||
inputs@{
|
|
||||||
self,
|
|
||||||
flake-parts,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
flake-parts.lib.mkFlake { inherit inputs; } {
|
|
||||||
systems = [
|
|
||||||
"x86_64-linux"
|
|
||||||
"aarch64-linux"
|
|
||||||
"x86_64-darwin"
|
|
||||||
"aarch64-darwin"
|
|
||||||
];
|
|
||||||
imports = [ inputs.clan-core.flakeModules.default ];
|
|
||||||
# https://docs.clan.lol/guides/getting-started/flake-parts/
|
|
||||||
clan = {
|
|
||||||
meta.name = "__CHANGE_ME__"; # Ensure this is unique among all clans you want to use.
|
|
||||||
|
|
||||||
inherit self;
|
|
||||||
machines = {
|
|
||||||
# "jon" will be the hostname of the machine
|
|
||||||
jon =
|
|
||||||
{ pkgs, ... }:
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./modules/shared.nix
|
|
||||||
./modules/disko.nix
|
|
||||||
./machines/jon/configuration.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
nixpkgs.hostPlatform = "x86_64-linux";
|
|
||||||
|
|
||||||
# Set this for clan commands use ssh i.e. `clan machines update`
|
|
||||||
# If you change the hostname, you need to update this line to root@<new-hostname>
|
|
||||||
# This only works however if you have avahi running on your admin machine else use IP
|
|
||||||
clan.core.networking.targetHost = pkgs.lib.mkDefault "root@jon";
|
|
||||||
|
|
||||||
# You can get your disk id by running the following command on the installer:
|
|
||||||
# Replace <IP> with the IP of the installer printed on the screen or by running the `ip addr` command.
|
|
||||||
# ssh root@<IP> lsblk --output NAME,ID-LINK,FSTYPE,SIZE,MOUNTPOINT
|
|
||||||
disko.devices.disk.main = {
|
|
||||||
device = "/dev/disk/by-id/__CHANGE_ME__";
|
|
||||||
};
|
|
||||||
|
|
||||||
# IMPORTANT! Add your SSH key here
|
|
||||||
# e.g. > cat ~/.ssh/id_ed25519.pub
|
|
||||||
users.users.root.openssh.authorizedKeys.keys = throw ''
|
|
||||||
Don't forget to add your SSH key here!
|
|
||||||
users.users.root.openssh.authorizedKeys.keys = [ "<YOUR SSH_KEY>" ]
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Zerotier needs one controller to accept new nodes. Once accepted
|
|
||||||
# the controller can be offline and routing still works.
|
|
||||||
clan.core.networking.zerotier.controller.enable = true;
|
|
||||||
};
|
|
||||||
# "sara" will be the hostname of the machine
|
|
||||||
sara =
|
|
||||||
{ pkgs, ... }:
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./modules/shared.nix
|
|
||||||
./modules/disko.nix
|
|
||||||
./machines/sara/configuration.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
nixpkgs.hostPlatform = "x86_64-linux";
|
|
||||||
|
|
||||||
# Set this for clan commands use ssh i.e. `clan machines update`
|
|
||||||
# If you change the hostname, you need to update this line to root@<new-hostname>
|
|
||||||
# This only works however if you have avahi running on your admin machine else use IP
|
|
||||||
clan.core.networking.targetHost = pkgs.lib.mkDefault "root@sara";
|
|
||||||
|
|
||||||
# You can get your disk id by running the following command on the installer:
|
|
||||||
# Replace <IP> with the IP of the installer printed on the screen or by running the `ip addr` command.
|
|
||||||
# ssh root@<IP> lsblk --output NAME,ID-LINK,FSTYPE,SIZE,MOUNTPOINT
|
|
||||||
disko.devices.disk.main = {
|
|
||||||
device = "/dev/disk/by-id/__CHANGE_ME__";
|
|
||||||
};
|
|
||||||
|
|
||||||
# IMPORTANT! Add your SSH key here
|
|
||||||
# e.g. > cat ~/.ssh/id_ed25519.pub
|
|
||||||
users.users.root.openssh.authorizedKeys.keys = throw ''
|
|
||||||
Don't forget to add your SSH key here!
|
|
||||||
users.users.root.openssh.authorizedKeys.keys = [ "<YOUR SSH_KEY>" ]
|
|
||||||
'';
|
|
||||||
|
|
||||||
/*
|
|
||||||
After jon is deployed, uncomment the following line
|
|
||||||
This will allow sara to share the VPN overlay network with jon
|
|
||||||
The networkId is generated by the first deployment of jon
|
|
||||||
*/
|
|
||||||
# clan.core.networking.zerotier.networkId = builtins.readFile ../../vars/per-machine/jon/zerotier/zerotier-network-id/value;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
perSystem =
|
|
||||||
{ pkgs, inputs', ... }:
|
|
||||||
{
|
|
||||||
devShells.default = pkgs.mkShell { packages = [ inputs'.clan-core.packages.clan-cli ]; };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
{ config, ... }:
|
|
||||||
let
|
|
||||||
username = config.networking.hostName;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
imports = [ ./hardware-configuration.nix ];
|
|
||||||
|
|
||||||
# Locale service discovery and mDNS
|
|
||||||
services.avahi.enable = true;
|
|
||||||
|
|
||||||
services.xserver.enable = true;
|
|
||||||
services.xserver.desktopManager.gnome.enable = true;
|
|
||||||
services.xserver.displayManager.gdm.enable = true;
|
|
||||||
# Disable the default gnome apps to speed up deployment
|
|
||||||
services.gnome.core-utilities.enable = false;
|
|
||||||
|
|
||||||
# Enable automatic login for the user.
|
|
||||||
services.displayManager.autoLogin = {
|
|
||||||
enable = true;
|
|
||||||
user = username;
|
|
||||||
};
|
|
||||||
|
|
||||||
users.users.${username} = {
|
|
||||||
initialPassword = username;
|
|
||||||
isNormalUser = true;
|
|
||||||
extraGroups = [
|
|
||||||
"wheel"
|
|
||||||
"networkmanager"
|
|
||||||
"video"
|
|
||||||
"audio"
|
|
||||||
"input"
|
|
||||||
"dialout"
|
|
||||||
"disk"
|
|
||||||
];
|
|
||||||
uid = 1000;
|
|
||||||
openssh.authorizedKeys.keys = config.users.users.root.openssh.authorizedKeys.keys;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{ config, ... }:
|
|
||||||
|
|
||||||
let
|
|
||||||
username = config.networking.hostName;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
imports = [ ./hardware-configuration.nix ];
|
|
||||||
|
|
||||||
# Locale service discovery and mDNS
|
|
||||||
services.avahi.enable = true;
|
|
||||||
|
|
||||||
services.xserver.enable = true;
|
|
||||||
services.xserver.desktopManager.gnome.enable = true;
|
|
||||||
services.xserver.displayManager.gdm.enable = true;
|
|
||||||
# Disable the default gnome apps to speed up deployment
|
|
||||||
services.gnome.core-utilities.enable = false;
|
|
||||||
|
|
||||||
# Enable automatic login for the user.
|
|
||||||
services.displayManager.autoLogin = {
|
|
||||||
enable = true;
|
|
||||||
user = username;
|
|
||||||
};
|
|
||||||
|
|
||||||
users.users.${username} = {
|
|
||||||
initialPassword = username;
|
|
||||||
isNormalUser = true;
|
|
||||||
extraGroups = [
|
|
||||||
"wheel"
|
|
||||||
"networkmanager"
|
|
||||||
"video"
|
|
||||||
"audio"
|
|
||||||
"input"
|
|
||||||
"dialout"
|
|
||||||
"disk"
|
|
||||||
];
|
|
||||||
uid = 1000;
|
|
||||||
openssh.authorizedKeys.keys = config.users.users.root.openssh.authorizedKeys.keys;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
{ lib, clan-core, ... }:
|
|
||||||
|
|
||||||
let
|
|
||||||
suffix = config.clan.core.vars.generators.disk-id.files.diskId.value;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
clan-core.clanModules.disk-id
|
|
||||||
];
|
|
||||||
|
|
||||||
boot.loader.grub.efiSupport = lib.mkDefault true;
|
|
||||||
boot.loader.grub.efiInstallAsRemovable = lib.mkDefault true;
|
|
||||||
disko.devices = {
|
|
||||||
disk = {
|
|
||||||
"main" = {
|
|
||||||
# suffix is to prevent disk name collisions
|
|
||||||
name = "main-" + suffix;
|
|
||||||
type = "disk";
|
|
||||||
# Set the following in flake.nix for each maschine:
|
|
||||||
# device = <uuid>;
|
|
||||||
content = {
|
|
||||||
type = "gpt";
|
|
||||||
partitions = {
|
|
||||||
"boot" = {
|
|
||||||
size = "1M";
|
|
||||||
type = "EF02"; # for grub MBR
|
|
||||||
priority = 1;
|
|
||||||
};
|
|
||||||
"ESP" = {
|
|
||||||
size = "512M";
|
|
||||||
type = "EF00";
|
|
||||||
content = {
|
|
||||||
type = "filesystem";
|
|
||||||
format = "vfat";
|
|
||||||
mountpoint = "/boot";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
"root" = {
|
|
||||||
size = "100%";
|
|
||||||
content = {
|
|
||||||
type = "filesystem";
|
|
||||||
format = "ext4";
|
|
||||||
mountpoint = "/";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
clan-core,
|
|
||||||
# Optional, if you want to access other flakes:
|
|
||||||
# self,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
clan-core.clanModules.sshd
|
|
||||||
clan-core.clanModules.root-password
|
|
||||||
# You can access other flakes imported in your flake via `self` like this:
|
|
||||||
# self.inputs.nix-index-database.nixosModules.nix-index
|
|
||||||
];
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
{ self, ... }:
|
|
||||||
{
|
|
||||||
perSystem =
|
|
||||||
{
|
|
||||||
self',
|
|
||||||
lib,
|
|
||||||
system,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
checks =
|
|
||||||
let
|
|
||||||
nixosMachines = lib.mapAttrs' (
|
|
||||||
name: config: lib.nameValuePair "nixos-${name}" config.config.system.build.toplevel
|
|
||||||
) ((lib.filterAttrs (_: config: config.pkgs.system == system)) self.nixosConfigurations);
|
|
||||||
|
|
||||||
packages = lib.mapAttrs' (n: lib.nameValuePair "package-${n}") self'.packages;
|
|
||||||
devShells = lib.mapAttrs' (n: lib.nameValuePair "devShell-${n}") self'.devShells;
|
|
||||||
in
|
|
||||||
nixosMachines // packages // devShells;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
{ self, inputs, ... }:
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
inputs.clan.flakeModules.default
|
|
||||||
];
|
|
||||||
clan = {
|
|
||||||
meta.name = "__CHANGE_ME__";
|
|
||||||
inherit self;
|
|
||||||
specialArgs = {
|
|
||||||
inherit inputs;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
_: {
|
|
||||||
perSystem =
|
|
||||||
{
|
|
||||||
pkgs,
|
|
||||||
inputs',
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
devShells = {
|
|
||||||
default = pkgs.mkShellNoCC {
|
|
||||||
packages = [
|
|
||||||
inputs'.clan.packages.default
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
{
|
|
||||||
|
|
||||||
inputs = {
|
|
||||||
clan.url = "https://git.clan.lol/clan/clan-core/archive/main.tar.gz";
|
|
||||||
nixpkgs.follows = "clan/nixpkgs";
|
|
||||||
|
|
||||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
|
||||||
flake-parts.inputs.nixpkgs-lib.follows = "clan/nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
outputs =
|
|
||||||
inputs@{ flake-parts, ... }:
|
|
||||||
flake-parts.lib.mkFlake { inherit inputs; } (
|
|
||||||
{ ... }:
|
|
||||||
{
|
|
||||||
systems = [
|
|
||||||
"x86_64-linux"
|
|
||||||
"aarch64-linux"
|
|
||||||
"x86_64-darwin"
|
|
||||||
"aarch64-darwin"
|
|
||||||
];
|
|
||||||
|
|
||||||
imports = [
|
|
||||||
./checks.nix
|
|
||||||
./clan.nix
|
|
||||||
./devshells.nix
|
|
||||||
./formatter.nix
|
|
||||||
];
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
_: {
|
|
||||||
perSystem =
|
|
||||||
{
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
formatter = pkgs.nixfmt;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,15 +1,35 @@
|
|||||||
{
|
{
|
||||||
inputs.clan-core.url = "https://git.clan.lol/clan/clan-core/archive/main.tar.gz";
|
inputs = {
|
||||||
inputs.nixpkgs.follows = "clan-core/nixpkgs";
|
clan-core.url = "https://git.clan.lol/clan/clan-core/archive/main.tar.gz";
|
||||||
|
nixpkgs.follows = "clan-core/nixpkgs";
|
||||||
|
|
||||||
|
flake-parts.follows = "clan-core/flake-parts";
|
||||||
|
flake-parts.inputs.nixpkgs-lib.follows = "clan-core/nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
outputs =
|
outputs =
|
||||||
{ self, clan-core, ... }:
|
inputs@{ flake-parts, ... }:
|
||||||
let
|
flake-parts.lib.mkFlake { inherit inputs; } (
|
||||||
# Usage see: https://docs.clan.lol
|
{ self, lib, ... }:
|
||||||
clan = clan-core.clanLib.buildClan { inherit self; };
|
{
|
||||||
in
|
|
||||||
{
|
imports = [
|
||||||
# all machines managed by Clan
|
inputs.clan-core.flakeModules.default
|
||||||
inherit (clan) nixosConfigurations nixosModules clanInternals;
|
];
|
||||||
};
|
|
||||||
|
clan = {
|
||||||
|
inherit self;
|
||||||
|
specialArgs = { inherit inputs; };
|
||||||
|
# Ensure this is unique among all clans you want to use.
|
||||||
|
meta.name = lib.mkDefault "__CHANGE_ME__";
|
||||||
|
};
|
||||||
|
|
||||||
|
systems = [
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
"x86_64-darwin"
|
||||||
|
"aarch64-darwin"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"meta": { "name": "__CHANGE_ME__" },
|
|
||||||
"machines": {},
|
|
||||||
"services": {}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# DO NOT DELETE
|
|
||||||
# This file is used by the clan cli to discover a clan flake
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
{
|
|
||||||
inputs.clan-core.url = "https://git.clan.lol/clan/clan-core/archive/main.tar.gz";
|
|
||||||
inputs.nixpkgs.follows = "clan-core/nixpkgs";
|
|
||||||
|
|
||||||
outputs =
|
|
||||||
{ self, clan-core, ... }:
|
|
||||||
let
|
|
||||||
# Usage see: https://docs.clan.lol
|
|
||||||
clan = clan-core.clanLib.buildClan {
|
|
||||||
inherit self;
|
|
||||||
# Ensure this is unique among all clans you want to use.
|
|
||||||
meta.name = "__CHANGE_ME__";
|
|
||||||
|
|
||||||
# All machines in ./machines will be imported.
|
|
||||||
|
|
||||||
# Prerequisite: boot into the installer.
|
|
||||||
# See: https://docs.clan.lol/guides/getting-started/installer
|
|
||||||
# local> mkdir -p ./machines/machine1
|
|
||||||
# local> Edit ./machines/<machine>/configuration.nix to your liking.
|
|
||||||
machines = {
|
|
||||||
# You can also specify additional machines here.
|
|
||||||
# somemachine = {
|
|
||||||
# imports = [ ./some-machine/configuration.nix ];
|
|
||||||
# }
|
|
||||||
};
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
inherit (clan) nixosConfigurations nixosModules clanInternals;
|
|
||||||
# Add the Clan cli tool to the dev shell.
|
|
||||||
# Use "nix develop" to enter the dev shell.
|
|
||||||
devShells =
|
|
||||||
clan-core.inputs.nixpkgs.lib.genAttrs
|
|
||||||
[
|
|
||||||
"x86_64-linux"
|
|
||||||
"aarch64-linux"
|
|
||||||
"aarch64-darwin"
|
|
||||||
"x86_64-darwin"
|
|
||||||
]
|
|
||||||
(system: {
|
|
||||||
default = clan-core.inputs.nixpkgs.legacyPackages.${system}.mkShell {
|
|
||||||
packages = [ clan-core.packages.${system}.clan-cli ];
|
|
||||||
};
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
{
|
|
||||||
imports = [
|
|
||||||
# contains your disk format and partitioning configuration.
|
|
||||||
../../modules/disko.nix
|
|
||||||
# this file is shared among all machines
|
|
||||||
../../modules/shared.nix
|
|
||||||
# enables GNOME desktop (optional)
|
|
||||||
../../modules/gnome.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
# This is your user login name.
|
|
||||||
users.users.user.name = "<your-username>";
|
|
||||||
|
|
||||||
# Set this for clan commands use ssh i.e. `clan machines update`
|
|
||||||
# If you change the hostname, you need to update this line to root@<new-hostname>
|
|
||||||
# This only works however if you have avahi running on your admin machine else use IP
|
|
||||||
clan.core.networking.targetHost = "root@<IP>";
|
|
||||||
|
|
||||||
# You can get your disk id by running the following command on the installer:
|
|
||||||
# Replace <IP> with the IP of the installer printed on the screen or by running the `ip addr` command.
|
|
||||||
# ssh root@<IP> lsblk --output NAME,ID-LINK,FSTYPE,SIZE,MOUNTPOINT
|
|
||||||
disko.devices.disk.main.device = "/dev/disk/by-id/__CHANGE_ME__";
|
|
||||||
|
|
||||||
# IMPORTANT! Add your SSH key here
|
|
||||||
# e.g. > cat ~/.ssh/id_ed25519.pub
|
|
||||||
users.users.root.openssh.authorizedKeys.keys = [
|
|
||||||
''
|
|
||||||
__YOUR_SSH_KEY__
|
|
||||||
''
|
|
||||||
];
|
|
||||||
|
|
||||||
# Zerotier needs one controller to accept new nodes. Once accepted
|
|
||||||
# the controller can be offline and routing still works.
|
|
||||||
clan.core.networking.zerotier.controller.enable = true;
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
{
|
|
||||||
imports = [
|
|
||||||
../../modules/disko.nix
|
|
||||||
../../modules/shared.nix
|
|
||||||
# enables GNOME desktop (optional)
|
|
||||||
../../modules/gnome.nix
|
|
||||||
];
|
|
||||||
# Put your username here for login
|
|
||||||
users.users.user.name = "<your-username>";
|
|
||||||
|
|
||||||
# Set this for clan commands use ssh i.e. `clan machines update`
|
|
||||||
# If you change the hostname, you need to update this line to root@<new-hostname>
|
|
||||||
# This only works however if you have avahi running on your admin machine else use IP
|
|
||||||
clan.core.networking.targetHost = "root@<IP>";
|
|
||||||
|
|
||||||
# You can get your disk id by running the following command on the installer:
|
|
||||||
# Replace <IP> with the IP of the installer printed on the screen or by running the `ip addr` command.
|
|
||||||
# ssh root@<IP> lsblk --output NAME,ID-LINK,FSTYPE,SIZE,MOUNTPOINT
|
|
||||||
disko.devices.disk.main.device = "/dev/disk/by-id/__CHANGE_ME__";
|
|
||||||
|
|
||||||
# IMPORTANT! Add your SSH key here
|
|
||||||
# e.g. > cat ~/.ssh/id_ed25519.pub
|
|
||||||
users.users.root.openssh.authorizedKeys.keys = [
|
|
||||||
''
|
|
||||||
__YOUR_SSH_KEY__
|
|
||||||
''
|
|
||||||
];
|
|
||||||
/*
|
|
||||||
After jon is deployed, uncomment the following line
|
|
||||||
This will allow sara to share the VPN overlay network with jon
|
|
||||||
The networkId is generated by the first deployment of jon
|
|
||||||
*/
|
|
||||||
# clan.core.networking.zerotier.networkId = builtins.readFile ../../vars/per-machine/jon/zerotier/zerotier-network-id/value;
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
{
|
|
||||||
lib,
|
|
||||||
clan-core,
|
|
||||||
config,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
suffix = config.clan.core.vars.generators.disk-id.files.diskId.value;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
clan-core.clanModules.disk-id
|
|
||||||
];
|
|
||||||
|
|
||||||
# DO NOT EDIT THIS FILE AFTER INSTALLATION of a machine
|
|
||||||
# Otherwise your system might not boot because of missing partitions / filesystems
|
|
||||||
boot.loader.grub.efiSupport = lib.mkDefault true;
|
|
||||||
boot.loader.grub.efiInstallAsRemovable = lib.mkDefault true;
|
|
||||||
disko.devices = {
|
|
||||||
disk = {
|
|
||||||
"main" = {
|
|
||||||
# suffix is to prevent disk name collisions
|
|
||||||
name = "main-" + suffix;
|
|
||||||
type = "disk";
|
|
||||||
# Set the following in flake.nix for each maschine:
|
|
||||||
# device = <uuid>;
|
|
||||||
content = {
|
|
||||||
type = "gpt";
|
|
||||||
partitions = {
|
|
||||||
"boot" = {
|
|
||||||
size = "1M";
|
|
||||||
type = "EF02"; # for grub MBR
|
|
||||||
priority = 1;
|
|
||||||
};
|
|
||||||
"ESP" = {
|
|
||||||
size = "512M";
|
|
||||||
type = "EF00";
|
|
||||||
content = {
|
|
||||||
type = "filesystem";
|
|
||||||
format = "vfat";
|
|
||||||
mountpoint = "/boot";
|
|
||||||
mountOptions = [ "nofail" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
"root" = {
|
|
||||||
size = "100%";
|
|
||||||
content = {
|
|
||||||
type = "filesystem";
|
|
||||||
format = "ext4";
|
|
||||||
# format = "btrfs";
|
|
||||||
# format = "bcachefs";
|
|
||||||
mountpoint = "/";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
services.xserver.enable = true;
|
|
||||||
services.xserver.desktopManager.gnome.enable = true;
|
|
||||||
services.xserver.displayManager.gdm.enable = true;
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
clan-core,
|
|
||||||
# Optional, if you want to access other flakes:
|
|
||||||
# self,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
# Enables the OpenSSH server for remote access
|
|
||||||
clan-core.clanModules.sshd
|
|
||||||
# Set a root password
|
|
||||||
clan-core.clanModules.root-password
|
|
||||||
clan-core.clanModules.user-password
|
|
||||||
clan-core.clanModules.state-version
|
|
||||||
|
|
||||||
# You can access other flakes imported in your flake via `self` like this:
|
|
||||||
# self.inputs.nix-index-database.nixosModules.nix-index
|
|
||||||
];
|
|
||||||
|
|
||||||
# Locale service discovery and mDNS
|
|
||||||
services.avahi.enable = true;
|
|
||||||
|
|
||||||
# generate a random password for our user below
|
|
||||||
# can be read using `clan secrets get <machine-name>-user-password` command
|
|
||||||
clan.user-password.user = "user";
|
|
||||||
users.users.user = {
|
|
||||||
isNormalUser = true;
|
|
||||||
extraGroups = [
|
|
||||||
"wheel"
|
|
||||||
"networkmanager"
|
|
||||||
"video"
|
|
||||||
"input"
|
|
||||||
];
|
|
||||||
uid = 1000;
|
|
||||||
openssh.authorizedKeys.keys = config.users.users.root.openssh.authorizedKeys.keys;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -26,6 +26,7 @@
|
|||||||
EOF
|
EOF
|
||||||
'';
|
'';
|
||||||
evaled = (import "${initialized}/flake.nix").outputs {
|
evaled = (import "${initialized}/flake.nix").outputs {
|
||||||
|
flake-parts = inputs.flake-parts;
|
||||||
self = evaled // {
|
self = evaled // {
|
||||||
outPath = initialized;
|
outPath = initialized;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,20 +25,18 @@
|
|||||||
clan = {
|
clan = {
|
||||||
default = {
|
default = {
|
||||||
description = "Initialize a new clan flake";
|
description = "Initialize a new clan flake";
|
||||||
path = ./clan/new-clan;
|
path = ./clan/default;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
classic = {
|
||||||
|
description = "Initialize a new clan flake (no flake-parts)";
|
||||||
|
path = ./clan/classic;
|
||||||
|
};
|
||||||
|
|
||||||
minimal = {
|
minimal = {
|
||||||
description = "for clans managed via (G)UI";
|
description = "for clans managed via (G)UI";
|
||||||
path = ./clan/minimal;
|
path = ./clan/minimal;
|
||||||
};
|
};
|
||||||
flake-parts = {
|
|
||||||
description = "Flake-parts";
|
|
||||||
path = ./clan/flake-parts;
|
|
||||||
};
|
|
||||||
minimal-flake-parts = {
|
|
||||||
description = "Minimal flake-parts clan template";
|
|
||||||
path = ./clan/minimal-flake-parts;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user