From 42fdbeb1a0f45a787c66a0def19efe6f625285c8 Mon Sep 17 00:00:00 2001 From: mikl Date: Fri, 26 Jun 2026 23:28:31 +0300 Subject: [PATCH] initial scaffold: multi-host flake (poppy, muscari, rosemary) - flake.nix with mkNixos + mkDarwin dispatchers - hosts/common/{default.nix} (NixOS shared) - hosts/common-darwin/{default.nix} (darwin shared) - hosts/poppy/ (M1 MacBook Air, nix-darwin) - hosts/muscari/ (k3s server, placeholder) - hosts/rosemary/ (backup VM, placeholder) - home/default.nix (home-manager for mikl) - README.md, garden.md (host naming scheme: plants) - secrets/.gitkeep old muscari-only config moved to nix-config-legacy/ --- .gitignore | 8 ++++ README.md | 15 +++++++ flake.nix | 77 +++++++++++++++++++++++++++++++++ garden.md | 32 ++++++++++++++ home/default.nix | 13 ++++++ hosts/common-darwin/default.nix | 20 +++++++++ hosts/common/default.nix | 18 ++++++++ hosts/muscari/default.nix | 6 +++ hosts/poppy/default.nix | 9 ++++ hosts/rosemary/default.nix | 4 ++ secrets/.gitkeep | 0 11 files changed, 202 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 flake.nix create mode 100644 garden.md create mode 100644 home/default.nix create mode 100644 hosts/common-darwin/default.nix create mode 100644 hosts/common/default.nix create mode 100644 hosts/muscari/default.nix create mode 100644 hosts/poppy/default.nix create mode 100644 hosts/rosemary/default.nix create mode 100644 secrets/.gitkeep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c7d5d95 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +*.swp +*.bak +result +result-* +.direnv/ +*.local.nix +nh-output/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9019a1d --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# nix-config + +Nix configurations for iscg infra hosts. + +Hosts and naming scheme: see [garden.md](./garden.md). + +## rebuild + +```bash +# poppy (macOS) +darwin-rebuild switch --flake .#poppy + +# muscari, rosemary (NixOS) +sudo nixos-rebuild switch --flake .# +``` \ No newline at end of file diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..76ca943 --- /dev/null +++ b/flake.nix @@ -0,0 +1,77 @@ +{ + description = "nix-config — multi-host Nix configurations"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + + nix-darwin = { + url = "github:LnL7/nix-darwin"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + sops-nix = { + url = "github:Mic92/sops-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + disko = { + url = "github:nix-community/disko"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = + { self, nixpkgs, nix-darwin, home-manager, sops-nix, disko, ... }: + let + mkNixos = hostname: + nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ + ./hosts/common + ./hosts/${hostname} + sops-nix.nixosModules.sops + disko.nixosModules.disko + home-manager.nixosModules.home-manager + { + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + users.mikl = import ./home; + }; + } + ]; + }; + + mkDarwin = hostname: + nix-darwin.lib.darwinSystem { + system = "aarch64-darwin"; + modules = [ + ./hosts/common-darwin + ./hosts/${hostname} + home-manager.darwinModules.home-manager + { + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + users.mikl = import ./home; + }; + } + ]; + }; + in + { + nixosConfigurations = { + muscari = mkNixos "muscari"; + rosemary = mkNixos "rosemary"; + }; + + darwinConfigurations = { + poppy = mkDarwin "poppy"; + }; + }; +} \ No newline at end of file diff --git a/garden.md b/garden.md new file mode 100644 index 0000000..07d9b06 --- /dev/null +++ b/garden.md @@ -0,0 +1,32 @@ +# garden + +Hosts in this repo are named after plants and flowers. + +## hosts + +### poppy *(active)* +- **role:** MacBook Air M1, personal/work machine +- **system:** nix-darwin, aarch64-darwin +- **location:** daily driver + +### muscari *(planned migration)* +- **role:** linux server, k3s cluster +- **system:** NixOS, x86_64-linux +- **location:** iscg infra + +### rosemary *(planned)* +- **role:** backup VM +- **system:** NixOS, x86_64-linux + +## structure + +- `flake.nix` — entry point, dispatches `mkNixos` and `mkDarwin` per host +- `hosts//default.nix` — per-host config +- `hosts/common/default.nix` — shared NixOS config +- `hosts/common-darwin/default.nix` — shared darwin config +- `home/default.nix` — shared home-manager config for user `mikl` +- `secrets/` — sops-encrypted secrets per host + +## migrations + +- `nix-config-legacy/` — previous muscari-only config (preserved for reference) \ No newline at end of file diff --git a/home/default.nix b/home/default.nix new file mode 100644 index 0000000..8dd75fe --- /dev/null +++ b/home/default.nix @@ -0,0 +1,13 @@ +{ pkgs, ... }: +{ + home.stateVersion = "25.11"; + + programs.zsh.enable = true; + + programs.git.enable = true; + + home.packages = [ + pkgs.ripgrep + pkgs.fd + ]; +} \ No newline at end of file diff --git a/hosts/common-darwin/default.nix b/hosts/common-darwin/default.nix new file mode 100644 index 0000000..95fdeca --- /dev/null +++ b/hosts/common-darwin/default.nix @@ -0,0 +1,20 @@ +{ pkgs, ... }: +{ + # flake + nix-command + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + + # nix daemon (multi-user install) + services.nix-daemon.enable = true; + + users.users.mikl = { + home = "/Users/mikl"; + shell = pkgs.zsh; + }; + + environment.systemPackages = [ + pkgs.vim + ]; +} \ No newline at end of file diff --git a/hosts/common/default.nix b/hosts/common/default.nix new file mode 100644 index 0000000..d3862f2 --- /dev/null +++ b/hosts/common/default.nix @@ -0,0 +1,18 @@ +{ pkgs, ... }: +{ + # flake + nix-command + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + + users.users.mikl = { + isNormalUser = true; + shell = pkgs.zsh; + home = "/home/mikl"; + }; + + environment.systemPackages = [ + pkgs.vim + ]; +} \ No newline at end of file diff --git a/hosts/muscari/default.nix b/hosts/muscari/default.nix new file mode 100644 index 0000000..519c33f --- /dev/null +++ b/hosts/muscari/default.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + networking.hostName = "muscari"; + + # TODO: migrate from nix-config-legacy/hosts/muscari +} \ No newline at end of file diff --git a/hosts/poppy/default.nix b/hosts/poppy/default.nix new file mode 100644 index 0000000..7e0008b --- /dev/null +++ b/hosts/poppy/default.nix @@ -0,0 +1,9 @@ +{ ... }: +{ + networking.hostName = "poppy"; + + # Allow unfree packages (some macOS-ported tools need it) + nixpkgs.config.allowUnfree = true; + + system.primaryUser = "mikl"; +} \ No newline at end of file diff --git a/hosts/rosemary/default.nix b/hosts/rosemary/default.nix new file mode 100644 index 0000000..dd6df1f --- /dev/null +++ b/hosts/rosemary/default.nix @@ -0,0 +1,4 @@ +{ ... }: +{ + networking.hostName = "rosemary"; +} \ No newline at end of file diff --git a/secrets/.gitkeep b/secrets/.gitkeep new file mode 100644 index 0000000..e69de29