|
1 | 1 | { |
2 | | - description = "NixOS configuration with categorized hosts and centralized deployment"; |
| 2 | + description = "NixOS configuration with categorized hosts and multi-architecture support"; |
3 | 3 |
|
4 | 4 | inputs = { |
5 | 5 | nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; |
|
15 | 15 | url = "github:serokell/deploy-rs"; |
16 | 16 | inputs.nixpkgs.follows = "nixpkgs"; |
17 | 17 | }; |
| 18 | + nixvim = { |
| 19 | + url = "github:nix-community/nixvim"; |
| 20 | + inputs.nixpkgs.follows = "nixpkgs"; |
| 21 | + }; |
18 | 22 | }; |
19 | 23 |
|
20 | | - outputs = { self, nixpkgs, home-manager, sops-nix, deploy-rs, ... }@inputs: |
| 24 | + outputs = { self, nixpkgs, home-manager, sops-nix, deploy-rs, nixvim, ... }@inputs: |
21 | 25 | let |
22 | | - system = "x86_64-linux"; |
23 | | - pkgs = import nixpkgs { inherit system; }; |
| 26 | + # Machine-agnostic identity defaults (override via env when needed). |
| 27 | + defaultUser = |
| 28 | + let u = builtins.getEnv "NIXCFG_USER"; |
| 29 | + in if u != "" then u else "nixos"; |
| 30 | + defaultGitName = |
| 31 | + let n = builtins.getEnv "NIXCFG_GIT_NAME"; |
| 32 | + in if n != "" then n else defaultUser; |
| 33 | + defaultGitEmail = |
| 34 | + let e = builtins.getEnv "NIXCFG_GIT_EMAIL"; |
| 35 | + in if e != "" then e else "${defaultUser}@localhost"; |
| 36 | + |
| 37 | + # Supported architectures |
| 38 | + supportedSystems = [ |
| 39 | + "x86_64-linux" # Intel/AMD 64-bit |
| 40 | + "aarch64-linux" # ARM 64-bit (including Ampere) |
| 41 | + "x86_64-darwin" # Intel Mac |
| 42 | + "aarch64-darwin" # Apple Silicon (M1/M2/M3) |
| 43 | + ]; |
| 44 | + |
| 45 | + # Helper to generate attribute sets for all systems |
| 46 | + forAllSystems = nixpkgs.lib.genAttrs supportedSystems; |
24 | 47 |
|
25 | | - # Helper function to create NixOS configurations |
26 | | - mkHost = { hostname, category, extraModules ? [] }: |
| 48 | + # Per-system package sets |
| 49 | + pkgsFor = forAllSystems (system: |
| 50 | + import nixpkgs { |
| 51 | + inherit system; |
| 52 | + config.allowUnfree = true; |
| 53 | + } |
| 54 | + ); |
| 55 | + |
| 56 | + # Helper function to create NixOS configurations with architecture support |
| 57 | + mkHost = { |
| 58 | + hostname, |
| 59 | + category, |
| 60 | + system ? "x86_64-linux", # Default to x86_64-linux for backwards compatibility |
| 61 | + userName ? defaultUser, |
| 62 | + userGitName ? defaultGitName, |
| 63 | + userGitEmail ? defaultGitEmail, |
| 64 | + extraModules ? [] |
| 65 | + }: |
27 | 66 | nixpkgs.lib.nixosSystem { |
28 | | - system = "x86_64-linux"; |
29 | | - specialArgs = { inherit inputs; }; |
| 67 | + inherit system; |
| 68 | + specialArgs = { |
| 69 | + inherit |
| 70 | + inputs |
| 71 | + userName |
| 72 | + userGitName |
| 73 | + userGitEmail |
| 74 | + ; |
| 75 | + }; |
30 | 76 | modules = [ |
31 | 77 | ./hosts/${category}/${hostname}/configuration.nix |
32 | 78 | home-manager.nixosModules.home-manager |
33 | 79 | sops-nix.nixosModules.sops |
34 | 80 | { |
35 | 81 | home-manager.useGlobalPkgs = true; |
36 | 82 | home-manager.useUserPackages = true; |
37 | | - home-manager.users.giovanni = import ./modules/users/giovanni.nix; |
| 83 | + home-manager.users.${userName} = import ./modules/users/giovanni.nix; |
| 84 | + home-manager.sharedModules = [ |
| 85 | + nixvim.homeManagerModules.nixvim |
| 86 | + ]; |
38 | 87 | } |
39 | 88 | ] ++ extraModules; |
40 | 89 | }; |
41 | 90 |
|
42 | | - # Helper to create deploy-rs nodes |
43 | | - # Uses Tailscale hostnames for opaque addressing |
44 | | - mkDeployNode = { hostname, configName }: |
| 91 | + # Helper to create deploy-rs nodes with architecture awareness |
| 92 | + mkDeployNode = { |
| 93 | + hostname, |
| 94 | + configName, |
| 95 | + system ? "x86_64-linux", # Default to x86_64-linux |
| 96 | + sshUser ? defaultUser |
| 97 | + }: |
45 | 98 | { |
46 | | - # Use Tailscale hostname for maximum opacity |
47 | | - # Format: hostname.tailnet-name.ts.net |
48 | | - # Or just use the short name if configured in /etc/hosts or SSH config |
49 | | - hostname = "${hostname}"; # Override in hosts file or use Tailscale name |
| 99 | + # Use SSH config hostname (managed by our ssh-config module) |
| 100 | + hostname = "${hostname}"; |
50 | 101 |
|
51 | 102 | profiles.system = { |
52 | 103 | user = "root"; |
53 | | - sshUser = "giovanni"; |
54 | | - path = deploy-rs.lib.x86_64-linux.activate.nixos self.nixosConfigurations.${configName}; |
| 104 | + inherit sshUser; |
| 105 | + # Dynamically select the correct deploy-rs lib based on system |
| 106 | + path = deploy-rs.lib.${system}.activate.nixos self.nixosConfigurations.${configName}; |
55 | 107 | }; |
56 | 108 | }; |
57 | 109 | in |
58 | 110 | { |
59 | | - # NixOS Configurations organized by category |
| 111 | + # NixOS Configurations organized by category and architecture |
60 | 112 | nixosConfigurations = { |
61 | | - # === LAPTOPS === |
| 113 | + # === LAPTOPS (x86_64) === |
62 | 114 | bit = mkHost { |
63 | 115 | hostname = "bit"; |
64 | 116 | category = "laptops"; |
| 117 | + system = "x86_64-linux"; |
65 | 118 | }; |
66 | 119 |
|
67 | 120 | spark = mkHost { |
68 | 121 | hostname = "spark"; |
69 | 122 | category = "laptops"; |
| 123 | + system = "x86_64-linux"; |
70 | 124 | }; |
71 | 125 |
|
72 | 126 | hermes = mkHost { |
73 | 127 | hostname = "hermes"; |
74 | 128 | category = "laptops"; |
| 129 | + system = "x86_64-linux"; |
75 | 130 | }; |
76 | 131 |
|
77 | | - # === VPS === |
| 132 | + # === LAPTOPS (ARM - Apple Silicon example) === |
| 133 | + # Uncomment when you have ARM laptops |
| 134 | + # macbook = mkHost { |
| 135 | + # hostname = "macbook"; |
| 136 | + # category = "laptops"; |
| 137 | + # system = "aarch64-darwin"; |
| 138 | + # }; |
| 139 | + |
| 140 | + # === VPS (x86_64) === |
78 | 141 | vps-alpha = mkHost { |
79 | 142 | hostname = "example-vps"; |
80 | 143 | category = "vps"; |
| 144 | + system = "x86_64-linux"; |
81 | 145 | }; |
82 | 146 |
|
83 | | - # Add more VPS hosts here as needed |
84 | | - # vps-beta = mkHost { |
85 | | - # hostname = "vps-beta"; |
| 147 | + # === VPS (ARM/Ampere - Example) === |
| 148 | + # Uncomment when you have ARM-based VPS (e.g., Oracle Ampere, AWS Graviton) |
| 149 | + # vps-arm = mkHost { |
| 150 | + # hostname = "vps-arm"; |
86 | 151 | # category = "vps"; |
| 152 | + # system = "aarch64-linux"; |
87 | 153 | # }; |
88 | 154 |
|
89 | | - # === SERVERS === |
| 155 | + # === SERVERS (x86_64) === |
90 | 156 | server-alpha = mkHost { |
91 | 157 | hostname = "example-server"; |
92 | 158 | category = "servers"; |
| 159 | + system = "x86_64-linux"; |
93 | 160 | }; |
94 | 161 |
|
95 | | - # Add more servers here |
96 | | - # server-beta = mkHost { |
97 | | - # hostname = "server-beta"; |
| 162 | + # === SERVERS (ARM - Example for Raspberry Pi, Ampere, etc.) === |
| 163 | + # server-arm = mkHost { |
| 164 | + # hostname = "server-arm"; |
98 | 165 | # category = "servers"; |
| 166 | + # system = "aarch64-linux"; |
99 | 167 | # }; |
100 | 168 |
|
101 | 169 | # === EXPERIMENTS === |
102 | 170 | experiment-alpha = mkHost { |
103 | 171 | hostname = "example-experiment"; |
104 | 172 | category = "experiments"; |
| 173 | + system = "x86_64-linux"; |
105 | 174 | }; |
106 | 175 | }; |
107 | 176 |
|
108 | 177 | # Deploy-rs configuration for remote deployments |
109 | | - # Hostnames are intentionally opaque - use Tailscale or SSH config aliases |
| 178 | + # Architecture is automatically handled based on host system |
110 | 179 | deploy.nodes = { |
111 | | - # Laptops - typically deployed via Tailscale |
| 180 | + # Laptops (x86_64) |
112 | 181 | bit = mkDeployNode { |
113 | 182 | hostname = "bit"; |
114 | 183 | configName = "bit"; |
| 184 | + system = "x86_64-linux"; |
115 | 185 | }; |
116 | 186 |
|
117 | 187 | spark = mkDeployNode { |
118 | 188 | hostname = "spark"; |
119 | 189 | configName = "spark"; |
| 190 | + system = "x86_64-linux"; |
120 | 191 | }; |
121 | 192 |
|
122 | 193 | hermes = mkDeployNode { |
123 | 194 | hostname = "hermes"; |
124 | 195 | configName = "hermes"; |
| 196 | + system = "x86_64-linux"; |
125 | 197 | }; |
126 | 198 |
|
127 | | - # VPS - access via Tailscale or configure in ~/.ssh/config |
| 199 | + # VPS (x86_64) |
128 | 200 | vps-alpha = mkDeployNode { |
129 | 201 | hostname = "vps-alpha"; |
130 | 202 | configName = "vps-alpha"; |
| 203 | + system = "x86_64-linux"; |
131 | 204 | }; |
132 | 205 |
|
133 | | - # Servers |
| 206 | + # Servers (x86_64) |
134 | 207 | server-alpha = mkDeployNode { |
135 | 208 | hostname = "server-alpha"; |
136 | 209 | configName = "server-alpha"; |
| 210 | + system = "x86_64-linux"; |
137 | 211 | }; |
138 | 212 |
|
139 | 213 | # Experiments |
140 | 214 | experiment-alpha = mkDeployNode { |
141 | 215 | hostname = "experiment-alpha"; |
142 | 216 | configName = "experiment-alpha"; |
| 217 | + system = "x86_64-linux"; |
143 | 218 | }; |
| 219 | + |
| 220 | + # Example ARM deployments (uncomment as needed) |
| 221 | + # vps-arm = mkDeployNode { |
| 222 | + # hostname = "vps-arm"; |
| 223 | + # configName = "vps-arm"; |
| 224 | + # system = "aarch64-linux"; |
| 225 | + # }; |
144 | 226 | }; |
145 | 227 |
|
146 | 228 | # Deploy-rs checks |
147 | 229 | checks = builtins.mapAttrs (system: deployLib: deployLib.deployChecks self.deploy) deploy-rs.lib; |
148 | 230 |
|
149 | | - # Development shell with deployment tools |
150 | | - devShells.${system}.default = pkgs.mkShell { |
151 | | - buildInputs = with pkgs; [ |
152 | | - deploy-rs.packages.${system}.deploy-rs |
153 | | - just |
154 | | - nixos-anywhere |
155 | | - git |
156 | | - openssh |
157 | | - sops |
158 | | - age |
159 | | - gnupg |
160 | | - pre-commit |
161 | | - knockd # For port knocking |
162 | | - jq |
163 | | - mkpasswd |
164 | | - ]; |
165 | | - |
166 | | - shellHook = '' |
167 | | - echo "╔══════════════════════════════════════════════════════════╗" |
168 | | - echo "║ NixOS Configuration Development Environment ║" |
169 | | - echo "╚══════════════════════════════════════════════════════════╝" |
170 | | - echo "" |
171 | | - echo "Available Hosts:" |
172 | | - echo " Laptops: bit, spark, hermes" |
173 | | - echo " VPS: vps-alpha" |
174 | | - echo " Servers: server-alpha" |
175 | | - echo " Experiments: experiment-alpha" |
176 | | - echo "" |
177 | | - echo "Quick Start:" |
178 | | - echo " just --list - Show all commands" |
179 | | - echo " just install spark laptops IP - Install new host (zero manual steps)" |
180 | | - echo " just deploy bit - Deploy to host" |
181 | | - echo " just check - Validate configuration" |
182 | | - echo "" |
183 | | - echo "Installation Example:" |
184 | | - echo " just install spark laptops 192.168.1.100" |
185 | | - echo "" |
186 | | - echo "Documentation:" |
187 | | - echo " docs/WORKFLOW.md - Complete workflow guide" |
188 | | - echo " docs/AUTOMATED_INSTALLATION.md - Zero-touch install guide" |
189 | | - echo " docs/SOPS_GPG_SETUP.md - Secrets management" |
190 | | - echo "" |
191 | | - ''; |
192 | | - }; |
| 231 | + # Development shells for all supported architectures |
| 232 | + devShells = forAllSystems (system: |
| 233 | + let |
| 234 | + pkgs = pkgsFor.${system}; |
| 235 | + in |
| 236 | + { |
| 237 | + default = pkgs.mkShell { |
| 238 | + buildInputs = with pkgs; [ |
| 239 | + deploy-rs.packages.${system}.deploy-rs |
| 240 | + just |
| 241 | + nixos-anywhere |
| 242 | + git |
| 243 | + openssh |
| 244 | + sops |
| 245 | + age |
| 246 | + gnupg |
| 247 | + pre-commit |
| 248 | + jq |
| 249 | + asciinema |
| 250 | + mkpasswd |
| 251 | + ] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [ |
| 252 | + knockd # For port knocking (Linux only) |
| 253 | + ]; |
| 254 | + |
| 255 | + shellHook = '' |
| 256 | + echo "╔══════════════════════════════════════════════════════════╗" |
| 257 | + echo "║ NixOS Configuration Development Environment ║" |
| 258 | + echo "║ Architecture: ${system} ║" |
| 259 | + echo "╚══════════════════════════════════════════════════════════╝" |
| 260 | + echo "" |
| 261 | + echo "Available Hosts by Architecture:" |
| 262 | + echo " x86_64-linux:" |
| 263 | + echo " Laptops: bit, spark, hermes" |
| 264 | + echo " VPS: vps-alpha" |
| 265 | + echo " Servers: server-alpha" |
| 266 | + echo " Experiments: experiment-alpha" |
| 267 | + echo "" |
| 268 | + echo " aarch64-linux:" |
| 269 | + echo " (Add ARM hosts in flake.nix)" |
| 270 | + echo "" |
| 271 | + echo "Quick Start:" |
| 272 | + echo " just --list - Show all commands" |
| 273 | + echo " just install spark laptops IP - Install new host" |
| 274 | + echo " just deploy bit - Deploy to host" |
| 275 | + echo " just check - Validate configuration" |
| 276 | + echo "" |
| 277 | + echo "Adding ARM hosts:" |
| 278 | + echo " Edit flake.nix and set system = \"aarch64-linux\"" |
| 279 | + echo "" |
| 280 | + echo "Documentation:" |
| 281 | + echo " docs/WORKFLOW.md - Complete workflow guide" |
| 282 | + echo " docs/MULTI_ARCH.md - Multi-architecture guide" |
| 283 | + echo " docs/SOPS_GPG_SETUP.md - Secrets management" |
| 284 | + echo "" |
| 285 | + ''; |
| 286 | + }; |
| 287 | + } |
| 288 | + ); |
| 289 | + |
| 290 | + # Expose package sets for all systems |
| 291 | + packages = forAllSystems (system: { |
| 292 | + # Expose useful packages per-system |
| 293 | + default = pkgsFor.${system}.hello; |
| 294 | + }); |
| 295 | + |
| 296 | + # Formatter for all systems |
| 297 | + formatter = forAllSystems (system: pkgsFor.${system}.nixpkgs-fmt); |
193 | 298 | }; |
194 | 299 | } |
0 commit comments